From 36e053f4f0a2f63c08f7c28b9492c067f1ca42bc Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Wed, 27 May 2026 00:53:18 -0700 Subject: migrate pinapelz.moe -> pinapelz.com --- indieweb-micro/hugo.toml | 8 +- .../MinIndie/layouts/partials/webmentions.html | 2 +- micro.pinapelz.com/categories/default/index.html | 141 ++++ micro.pinapelz.com/categories/default/index.xml | 56 ++ micro.pinapelz.com/categories/games/index.html | 134 ++++ micro.pinapelz.com/categories/games/index.xml | 49 ++ micro.pinapelz.com/categories/index.html | 101 +++ micro.pinapelz.com/categories/index.xml | 42 ++ micro.pinapelz.com/categories/life/index.html | 106 +++ micro.pinapelz.com/categories/life/index.xml | 21 + micro.pinapelz.com/categories/tools/index.html | 106 +++ micro.pinapelz.com/categories/tools/index.xml | 21 + micro.pinapelz.com/css/style.css | 296 ++++++++ micro.pinapelz.com/index.html | 340 ++++++++++ micro.pinapelz.com/index.xml | 112 +++ micro.pinapelz.com/indie/follows/index.html | 288 ++++++++ micro.pinapelz.com/indie/index.html | 158 +++++ micro.pinapelz.com/indie/index.xml | 21 + micro.pinapelz.com/indie/page/1/index.html | 9 + micro.pinapelz.com/page/1/index.html | 9 + micro.pinapelz.com/page/2/index.html | 163 +++++ .../posts/2025-12-01-hello-world/index.html | 501 ++++++++++++++ .../posts/2025-12-02-china-town-fair/gloves.webp | Bin 0 -> 431668 bytes .../posts/2025-12-02-china-town-fair/index.html | 506 ++++++++++++++ .../2025-12-02-china-town-fair/inside-ctf.webp | Bin 0 -> 1020876 bytes .../2025-12-02-china-town-fair/outside-ctf.webp | Bin 0 -> 355348 bytes .../posts/2025-12-02-power-bank-recall/index.html | 499 ++++++++++++++ .../posts/2025-12-03-04-yt-music-rewind/index.html | 492 ++++++++++++++ .../posts/2025-12-04-procon2-hid-tool/index.html | 634 +++++++++++++++++ .../posts/2025-12-06-first-sdvx-18/18.webp | Bin 0 -> 339632 bytes .../posts/2025-12-06-first-sdvx-18/index.html | 496 ++++++++++++++ .../2025-12-18-07-arcade-monsters-sd/cab1.webp | Bin 0 -> 506938 bytes .../2025-12-18-07-arcade-monsters-sd/cab2.webp | Bin 0 -> 379430 bytes .../2025-12-18-07-arcade-monsters-sd/danevo.webp | Bin 0 -> 384012 bytes .../2025-12-18-07-arcade-monsters-sd/index.html | 537 +++++++++++++++ .../2025-12-18-07-arcade-monsters-sd/view1.webp | Bin 0 -> 952802 bytes .../2025-12-18-07-arcade-monsters-sd/view2.webp | Bin 0 -> 436422 bytes .../posts/2025-12-19-08-ffxiv-patch-7-4/index.html | 520 ++++++++++++++ .../posts/2025-12-31-09-dbox-review/index.html | 497 ++++++++++++++ .../posts/2026-02-19-10-discord-rant/index.html | 501 ++++++++++++++ .../index.html | 516 ++++++++++++++ .../playtime.png | Bin 0 -> 25402 bytes .../posts/2026-04-26-12-april-playlog/index.html | 574 ++++++++++++++++ .../2026-04-29-13-dac-vs-wireless-dap/index.html | 541 +++++++++++++++ micro.pinapelz.com/posts/index.html | 551 +++++++++++++++ micro.pinapelz.com/posts/index.xml | 105 +++ micro.pinapelz.com/posts/page/1/index.html | 9 + micro.pinapelz.com/posts/page/2/index.html | 238 +++++++ micro.pinapelz.com/sitemap.xml | 92 +++ micro.pinapelz.com/tags/anime/index.html | 106 +++ micro.pinapelz.com/tags/anime/index.xml | 21 + micro.pinapelz.com/tags/arcade/index.html | 120 ++++ micro.pinapelz.com/tags/arcade/index.xml | 35 + micro.pinapelz.com/tags/code/index.html | 106 +++ micro.pinapelz.com/tags/code/index.xml | 21 + micro.pinapelz.com/tags/default/index.html | 134 ++++ micro.pinapelz.com/tags/default/index.xml | 49 ++ micro.pinapelz.com/tags/index.html | 105 +++ micro.pinapelz.com/tags/index.xml | 56 ++ micro.pinapelz.com/tags/nintendo/index.html | 106 +++ micro.pinapelz.com/tags/nintendo/index.xml | 21 + micro.pinapelz.com/tags/playlog/index.html | 120 ++++ micro.pinapelz.com/tags/playlog/index.xml | 35 + micro.pinapelz.moe/categories/default/index.html | 141 ---- micro.pinapelz.moe/categories/default/index.xml | 56 -- micro.pinapelz.moe/categories/games/index.html | 134 ---- micro.pinapelz.moe/categories/games/index.xml | 49 -- micro.pinapelz.moe/categories/index.html | 101 --- micro.pinapelz.moe/categories/index.xml | 42 -- micro.pinapelz.moe/categories/life/index.html | 106 --- micro.pinapelz.moe/categories/life/index.xml | 21 - micro.pinapelz.moe/categories/tools/index.html | 106 --- micro.pinapelz.moe/categories/tools/index.xml | 21 - micro.pinapelz.moe/css/follows.css | 31 - micro.pinapelz.moe/css/style.css | 296 -------- micro.pinapelz.moe/index.html | 340 ---------- micro.pinapelz.moe/index.xml | 112 --- micro.pinapelz.moe/indie/follows/index.html | 288 -------- micro.pinapelz.moe/indie/index.html | 158 ----- micro.pinapelz.moe/indie/index.xml | 21 - micro.pinapelz.moe/indie/likes/follows/index.html | 223 ------ micro.pinapelz.moe/indie/page/1/index.html | 9 - micro.pinapelz.moe/page/1/index.html | 9 - micro.pinapelz.moe/page/2/index.html | 163 ----- .../posts/2025-12-01-hello-world/index.html | 501 -------------- .../posts/2025-12-02-china-town-fair/gloves.webp | Bin 431668 -> 0 bytes .../posts/2025-12-02-china-town-fair/index.html | 506 -------------- .../2025-12-02-china-town-fair/inside-ctf.webp | Bin 1020876 -> 0 bytes .../2025-12-02-china-town-fair/outside-ctf.webp | Bin 355348 -> 0 bytes .../posts/2025-12-02-power-bank-recall/index.html | 499 -------------- .../posts/2025-12-03-04-yt-music-rewind/index.html | 492 -------------- .../posts/2025-12-04-procon2-hid-tool/index.html | 634 ----------------- .../posts/2025-12-06-first-sdvx-18/18.webp | Bin 339632 -> 0 bytes .../posts/2025-12-06-first-sdvx-18/index.html | 496 -------------- .../2025-12-18-07-arcade-monsters-sd/cab1.webp | Bin 506938 -> 0 bytes .../2025-12-18-07-arcade-monsters-sd/cab2.webp | Bin 379430 -> 0 bytes .../2025-12-18-07-arcade-monsters-sd/danevo.webp | Bin 384012 -> 0 bytes .../2025-12-18-07-arcade-monsters-sd/index.html | 537 --------------- .../2025-12-18-07-arcade-monsters-sd/view1.webp | Bin 952802 -> 0 bytes .../2025-12-18-07-arcade-monsters-sd/view2.webp | Bin 436422 -> 0 bytes .../posts/2025-12-19-08-ffxiv-patch-7-4/index.html | 520 -------------- .../posts/2025-12-31-09-dbox-review/index.html | 497 -------------- .../posts/2026-02-19-10-discord-rant/index.html | 501 -------------- .../index.html | 516 -------------- .../playtime.png | Bin 25402 -> 0 bytes .../posts/2026-04-26-12-april-playlog/index.html | 574 ---------------- .../2026-04-29-13-dac-vs-wireless-dap/index.html | 541 --------------- micro.pinapelz.moe/posts/index.html | 551 --------------- micro.pinapelz.moe/posts/index.xml | 105 --- micro.pinapelz.moe/posts/page/1/index.html | 9 - micro.pinapelz.moe/posts/page/2/index.html | 238 ------- micro.pinapelz.moe/sitemap.xml | 92 --- micro.pinapelz.moe/tags/anime/index.html | 106 --- micro.pinapelz.moe/tags/anime/index.xml | 21 - micro.pinapelz.moe/tags/arcade/index.html | 120 ---- micro.pinapelz.moe/tags/arcade/index.xml | 35 - micro.pinapelz.moe/tags/code/index.html | 106 --- micro.pinapelz.moe/tags/code/index.xml | 21 - micro.pinapelz.moe/tags/default/index.html | 134 ---- micro.pinapelz.moe/tags/default/index.xml | 49 -- micro.pinapelz.moe/tags/index.html | 105 --- micro.pinapelz.moe/tags/index.xml | 56 -- micro.pinapelz.moe/tags/nintendo/index.html | 106 --- micro.pinapelz.moe/tags/nintendo/index.xml | 21 - micro.pinapelz.moe/tags/playlog/index.html | 120 ---- micro.pinapelz.moe/tags/playlog/index.xml | 35 - micro.pinapelz.moe/tags/rhythm-games/index.html | 106 --- micro.pinapelz.moe/tags/rhythm-games/index.xml | 21 - micro.pinapelz.moe/tags/sdvx/index.html | 94 --- micro.pinapelz.moe/tags/sdvx/index.xml | 13 - moe.pinapelz.com/about.html | 288 ++++++++ moe.pinapelz.com/assets/603.webp | Bin 0 -> 13325 bytes moe.pinapelz.com/assets/aiba.webp | Bin 0 -> 373230 bytes moe.pinapelz.com/assets/chuni.png | Bin 0 -> 82502 bytes moe.pinapelz.com/assets/eri.jpg | Bin 0 -> 9401 bytes moe.pinapelz.com/assets/gc.jpg | Bin 0 -> 9501 bytes moe.pinapelz.com/assets/growing.gif | Bin 0 -> 2163778 bytes moe.pinapelz.com/assets/pfp.webp | Bin 0 -> 27886 bytes moe.pinapelz.com/assets/pso2.webp | Bin 0 -> 188626 bytes moe.pinapelz.com/assets/rappy.webp | Bin 0 -> 35516 bytes moe.pinapelz.com/assets/reine.jpg | Bin 0 -> 9657 bytes moe.pinapelz.com/assets/rg-tier.gif | Bin 0 -> 2857882 bytes moe.pinapelz.com/assets/sayo-fries.gif | Bin 0 -> 214754 bytes moe.pinapelz.com/assets/sdvx.png | Bin 0 -> 30104 bytes moe.pinapelz.com/assets/usami.webp | Bin 0 -> 72126 bytes moe.pinapelz.com/assets/vuln.jpg | Bin 0 -> 7688 bytes moe.pinapelz.com/assets/xiv.webp | Bin 0 -> 59376 bytes moe.pinapelz.com/assets/xqcl.webp | Bin 0 -> 17480 bytes moe.pinapelz.com/encoded-take-no1.html | 31 + moe.pinapelz.com/encoded-take-no2.html | 31 + moe.pinapelz.com/index.html | 340 ++++++++++ moe.pinapelz.com/projects.html | 171 +++++ moe.pinapelz.com/rhythm-games-tierlist.html | 712 +++++++++++++++++++ moe.pinapelz.com/scripts/index.js | 129 ++++ moe.pinapelz.com/styles/bg.webp | Bin 0 -> 19612 bytes moe.pinapelz.com/styles/border.webp | Bin 0 -> 534 bytes moe.pinapelz.com/styles/carbon.css | 755 +++++++++++++++++++++ moe.pinapelz.com/styles/clock.css | 43 ++ moe.pinapelz.com/styles/projects.css | 76 +++ moe.pinapelz.com/styles/styles.css | 475 +++++++++++++ pinapelz.moe/about.html | 288 -------- pinapelz.moe/assets/603.webp | Bin 13325 -> 0 bytes pinapelz.moe/assets/aiba.webp | Bin 373230 -> 0 bytes pinapelz.moe/assets/chuni.png | Bin 82502 -> 0 bytes pinapelz.moe/assets/eri.jpg | Bin 9401 -> 0 bytes pinapelz.moe/assets/gc.jpg | Bin 9501 -> 0 bytes pinapelz.moe/assets/growing.gif | Bin 2163778 -> 0 bytes pinapelz.moe/assets/pfp.webp | Bin 27886 -> 0 bytes pinapelz.moe/assets/pso2.webp | Bin 188626 -> 0 bytes pinapelz.moe/assets/rappy.webp | Bin 35516 -> 0 bytes pinapelz.moe/assets/reine.jpg | Bin 9657 -> 0 bytes pinapelz.moe/assets/rg-tier.gif | Bin 2857882 -> 0 bytes pinapelz.moe/assets/sayo-fries.gif | Bin 214754 -> 0 bytes pinapelz.moe/assets/sdvx.png | Bin 30104 -> 0 bytes pinapelz.moe/assets/usami.webp | Bin 72126 -> 0 bytes pinapelz.moe/assets/vuln.jpg | Bin 7688 -> 0 bytes pinapelz.moe/assets/xiv.webp | Bin 59376 -> 0 bytes pinapelz.moe/assets/xqcl.webp | Bin 17480 -> 0 bytes pinapelz.moe/encoded-take-no1.html | 31 - pinapelz.moe/encoded-take-no2.html | 31 - pinapelz.moe/index.html | 340 ---------- pinapelz.moe/projects.html | 171 ----- pinapelz.moe/rhythm-games-tierlist.html | 712 ------------------- pinapelz.moe/scripts/index.js | 129 ---- pinapelz.moe/styles/bg.webp | Bin 19612 -> 0 bytes pinapelz.moe/styles/border.webp | Bin 534 -> 0 bytes pinapelz.moe/styles/carbon.css | 755 --------------------- pinapelz.moe/styles/clock.css | 43 -- pinapelz.moe/styles/projects.css | 76 --- pinapelz.moe/styles/styles.css | 475 ------------- sticker.pinapelz.com/esinstall.js | 23 + sticker.pinapelz.com/index.html | 23 + sticker.pinapelz.com/lib/htm/preact.js | 7 + sticker.pinapelz.com/package.json | 19 + sticker.pinapelz.com/packs/.gitkeep | 0 sticker.pinapelz.com/packs/dank.json | 1 + sticker.pinapelz.com/packs/index.json | 7 + .../packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP | Bin 0 -> 47309 bytes .../packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws | Bin 0 -> 29637 bytes .../packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc | Bin 0 -> 31164 bytes .../packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR | Bin 0 -> 35734 bytes .../packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC | Bin 0 -> 52103 bytes .../packs/thumbnails/OddXtQLRutxvLZWWxNicguMc | Bin 0 -> 28353 bytes .../packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP | Bin 0 -> 90928 bytes .../packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr | Bin 0 -> 17080 bytes .../packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb | Bin 0 -> 37322 bytes .../packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg | Bin 0 -> 58621 bytes .../packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc | Bin 0 -> 26042 bytes .../packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB | Bin 0 -> 45997 bytes .../packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx | Bin 0 -> 39863 bytes .../packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck | Bin 0 -> 89762 bytes .../packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP | Bin 0 -> 93010 bytes sticker.pinapelz.com/packs/weeb.json | 1 + sticker.pinapelz.com/res/favorite.svg | 1 + sticker.pinapelz.com/res/giphy-dark.svg | 55 ++ sticker.pinapelz.com/res/giphy-light.svg | 54 ++ sticker.pinapelz.com/res/powered-by-giphy.png | Bin 0 -> 7741 bytes sticker.pinapelz.com/res/recent.svg | 1 + sticker.pinapelz.com/res/search.svg | 1 + sticker.pinapelz.com/res/settings.svg | 1 + sticker.pinapelz.com/src/frequently-used.js | 34 + sticker.pinapelz.com/src/giphy.js | 107 +++ sticker.pinapelz.com/src/index.js | 400 +++++++++++ sticker.pinapelz.com/src/search-box.js | 26 + sticker.pinapelz.com/src/spinner.js | 41 ++ sticker.pinapelz.com/src/widget-api.js | 77 +++ sticker.pinapelz.com/style/index.css | 1 + sticker.pinapelz.com/style/index.sass | 227 +++++++ sticker.pinapelz.com/style/spinner.css | 1 + sticker.pinapelz.com/style/spinner.sass | 68 ++ sticker.pinapelz.com/yarn.lock | 719 ++++++++++++++++++++ sticker.pinapelz.moe/esinstall.js | 23 - sticker.pinapelz.moe/index.html | 23 - sticker.pinapelz.moe/lib/htm/preact.js | 7 - sticker.pinapelz.moe/package.json | 19 - sticker.pinapelz.moe/packs/.gitkeep | 0 sticker.pinapelz.moe/packs/dank.json | 1 - sticker.pinapelz.moe/packs/index.json | 7 - .../packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP | Bin 47309 -> 0 bytes .../packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws | Bin 29637 -> 0 bytes .../packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc | Bin 31164 -> 0 bytes .../packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR | Bin 35734 -> 0 bytes .../packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC | Bin 52103 -> 0 bytes .../packs/thumbnails/OddXtQLRutxvLZWWxNicguMc | Bin 28353 -> 0 bytes .../packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP | Bin 90928 -> 0 bytes .../packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr | Bin 17080 -> 0 bytes .../packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb | Bin 37322 -> 0 bytes .../packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg | Bin 58621 -> 0 bytes .../packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc | Bin 26042 -> 0 bytes .../packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB | Bin 45997 -> 0 bytes .../packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx | Bin 39863 -> 0 bytes .../packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck | Bin 89762 -> 0 bytes .../packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP | Bin 93010 -> 0 bytes sticker.pinapelz.moe/packs/weeb.json | 1 - sticker.pinapelz.moe/res/favorite.svg | 1 - sticker.pinapelz.moe/res/giphy-dark.svg | 55 -- sticker.pinapelz.moe/res/giphy-light.svg | 54 -- sticker.pinapelz.moe/res/powered-by-giphy.png | Bin 7741 -> 0 bytes sticker.pinapelz.moe/res/recent.svg | 1 - sticker.pinapelz.moe/res/search.svg | 1 - sticker.pinapelz.moe/res/settings.svg | 1 - sticker.pinapelz.moe/src/frequently-used.js | 34 - sticker.pinapelz.moe/src/giphy.js | 107 --- sticker.pinapelz.moe/src/index.js | 400 ----------- sticker.pinapelz.moe/src/search-box.js | 26 - sticker.pinapelz.moe/src/spinner.js | 41 -- sticker.pinapelz.moe/src/widget-api.js | 77 --- sticker.pinapelz.moe/style/index.css | 1 - sticker.pinapelz.moe/style/index.sass | 227 ------- sticker.pinapelz.moe/style/spinner.css | 1 - sticker.pinapelz.moe/style/spinner.sass | 68 -- sticker.pinapelz.moe/yarn.lock | 719 -------------------- 272 files changed, 15968 insertions(+), 16456 deletions(-) create mode 100644 micro.pinapelz.com/categories/default/index.html create mode 100644 micro.pinapelz.com/categories/default/index.xml create mode 100644 micro.pinapelz.com/categories/games/index.html create mode 100644 micro.pinapelz.com/categories/games/index.xml create mode 100644 micro.pinapelz.com/categories/index.html create mode 100644 micro.pinapelz.com/categories/index.xml create mode 100644 micro.pinapelz.com/categories/life/index.html create mode 100644 micro.pinapelz.com/categories/life/index.xml create mode 100644 micro.pinapelz.com/categories/tools/index.html create mode 100644 micro.pinapelz.com/categories/tools/index.xml create mode 100644 micro.pinapelz.com/css/style.css create mode 100644 micro.pinapelz.com/index.html create mode 100644 micro.pinapelz.com/index.xml create mode 100644 micro.pinapelz.com/indie/follows/index.html create mode 100644 micro.pinapelz.com/indie/index.html create mode 100644 micro.pinapelz.com/indie/index.xml create mode 100644 micro.pinapelz.com/indie/page/1/index.html create mode 100644 micro.pinapelz.com/page/1/index.html create mode 100644 micro.pinapelz.com/page/2/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-01-hello-world/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-02-china-town-fair/gloves.webp create mode 100644 micro.pinapelz.com/posts/2025-12-02-china-town-fair/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-02-china-town-fair/inside-ctf.webp create mode 100644 micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp create mode 100644 micro.pinapelz.com/posts/2025-12-02-power-bank-recall/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp create mode 100644 micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view1.webp create mode 100644 micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view2.webp create mode 100644 micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/index.html create mode 100644 micro.pinapelz.com/posts/2025-12-31-09-dbox-review/index.html create mode 100644 micro.pinapelz.com/posts/2026-02-19-10-discord-rant/index.html create mode 100644 micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html create mode 100644 micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png create mode 100644 micro.pinapelz.com/posts/2026-04-26-12-april-playlog/index.html create mode 100644 micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/index.html create mode 100644 micro.pinapelz.com/posts/index.html create mode 100644 micro.pinapelz.com/posts/index.xml create mode 100644 micro.pinapelz.com/posts/page/1/index.html create mode 100644 micro.pinapelz.com/posts/page/2/index.html create mode 100644 micro.pinapelz.com/sitemap.xml create mode 100644 micro.pinapelz.com/tags/anime/index.html create mode 100644 micro.pinapelz.com/tags/anime/index.xml create mode 100644 micro.pinapelz.com/tags/arcade/index.html create mode 100644 micro.pinapelz.com/tags/arcade/index.xml create mode 100644 micro.pinapelz.com/tags/code/index.html create mode 100644 micro.pinapelz.com/tags/code/index.xml create mode 100644 micro.pinapelz.com/tags/default/index.html create mode 100644 micro.pinapelz.com/tags/default/index.xml create mode 100644 micro.pinapelz.com/tags/index.html create mode 100644 micro.pinapelz.com/tags/index.xml create mode 100644 micro.pinapelz.com/tags/nintendo/index.html create mode 100644 micro.pinapelz.com/tags/nintendo/index.xml create mode 100644 micro.pinapelz.com/tags/playlog/index.html create mode 100644 micro.pinapelz.com/tags/playlog/index.xml delete mode 100644 micro.pinapelz.moe/categories/default/index.html delete mode 100644 micro.pinapelz.moe/categories/default/index.xml delete mode 100644 micro.pinapelz.moe/categories/games/index.html delete mode 100644 micro.pinapelz.moe/categories/games/index.xml delete mode 100644 micro.pinapelz.moe/categories/index.html delete mode 100644 micro.pinapelz.moe/categories/index.xml delete mode 100644 micro.pinapelz.moe/categories/life/index.html delete mode 100644 micro.pinapelz.moe/categories/life/index.xml delete mode 100644 micro.pinapelz.moe/categories/tools/index.html delete mode 100644 micro.pinapelz.moe/categories/tools/index.xml delete mode 100644 micro.pinapelz.moe/css/follows.css delete mode 100644 micro.pinapelz.moe/css/style.css delete mode 100644 micro.pinapelz.moe/index.html delete mode 100644 micro.pinapelz.moe/index.xml delete mode 100644 micro.pinapelz.moe/indie/follows/index.html delete mode 100644 micro.pinapelz.moe/indie/index.html delete mode 100644 micro.pinapelz.moe/indie/index.xml delete mode 100644 micro.pinapelz.moe/indie/likes/follows/index.html delete mode 100644 micro.pinapelz.moe/indie/page/1/index.html delete mode 100644 micro.pinapelz.moe/page/1/index.html delete mode 100644 micro.pinapelz.moe/page/2/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-01-hello-world/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-02-china-town-fair/gloves.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-02-china-town-fair/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-02-china-town-fair/inside-ctf.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view1.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view2.webp delete mode 100644 micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/index.html delete mode 100644 micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/index.html delete mode 100644 micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/index.html delete mode 100644 micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html delete mode 100644 micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png delete mode 100644 micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/index.html delete mode 100644 micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/index.html delete mode 100644 micro.pinapelz.moe/posts/index.html delete mode 100644 micro.pinapelz.moe/posts/index.xml delete mode 100644 micro.pinapelz.moe/posts/page/1/index.html delete mode 100644 micro.pinapelz.moe/posts/page/2/index.html delete mode 100644 micro.pinapelz.moe/sitemap.xml delete mode 100644 micro.pinapelz.moe/tags/anime/index.html delete mode 100644 micro.pinapelz.moe/tags/anime/index.xml delete mode 100644 micro.pinapelz.moe/tags/arcade/index.html delete mode 100644 micro.pinapelz.moe/tags/arcade/index.xml delete mode 100644 micro.pinapelz.moe/tags/code/index.html delete mode 100644 micro.pinapelz.moe/tags/code/index.xml delete mode 100644 micro.pinapelz.moe/tags/default/index.html delete mode 100644 micro.pinapelz.moe/tags/default/index.xml delete mode 100644 micro.pinapelz.moe/tags/index.html delete mode 100644 micro.pinapelz.moe/tags/index.xml delete mode 100644 micro.pinapelz.moe/tags/nintendo/index.html delete mode 100644 micro.pinapelz.moe/tags/nintendo/index.xml delete mode 100644 micro.pinapelz.moe/tags/playlog/index.html delete mode 100644 micro.pinapelz.moe/tags/playlog/index.xml delete mode 100644 micro.pinapelz.moe/tags/rhythm-games/index.html delete mode 100644 micro.pinapelz.moe/tags/rhythm-games/index.xml delete mode 100644 micro.pinapelz.moe/tags/sdvx/index.html delete mode 100644 micro.pinapelz.moe/tags/sdvx/index.xml create mode 100644 moe.pinapelz.com/about.html create mode 100644 moe.pinapelz.com/assets/603.webp create mode 100644 moe.pinapelz.com/assets/aiba.webp create mode 100644 moe.pinapelz.com/assets/chuni.png create mode 100644 moe.pinapelz.com/assets/eri.jpg create mode 100644 moe.pinapelz.com/assets/gc.jpg create mode 100644 moe.pinapelz.com/assets/growing.gif create mode 100644 moe.pinapelz.com/assets/pfp.webp create mode 100644 moe.pinapelz.com/assets/pso2.webp create mode 100644 moe.pinapelz.com/assets/rappy.webp create mode 100644 moe.pinapelz.com/assets/reine.jpg create mode 100644 moe.pinapelz.com/assets/rg-tier.gif create mode 100644 moe.pinapelz.com/assets/sayo-fries.gif create mode 100644 moe.pinapelz.com/assets/sdvx.png create mode 100644 moe.pinapelz.com/assets/usami.webp create mode 100644 moe.pinapelz.com/assets/vuln.jpg create mode 100644 moe.pinapelz.com/assets/xiv.webp create mode 100644 moe.pinapelz.com/assets/xqcl.webp create mode 100644 moe.pinapelz.com/encoded-take-no1.html create mode 100644 moe.pinapelz.com/encoded-take-no2.html create mode 100644 moe.pinapelz.com/index.html create mode 100644 moe.pinapelz.com/projects.html create mode 100644 moe.pinapelz.com/rhythm-games-tierlist.html create mode 100644 moe.pinapelz.com/scripts/index.js create mode 100644 moe.pinapelz.com/styles/bg.webp create mode 100644 moe.pinapelz.com/styles/border.webp create mode 100644 moe.pinapelz.com/styles/carbon.css create mode 100644 moe.pinapelz.com/styles/clock.css create mode 100644 moe.pinapelz.com/styles/projects.css create mode 100644 moe.pinapelz.com/styles/styles.css delete mode 100644 pinapelz.moe/about.html delete mode 100644 pinapelz.moe/assets/603.webp delete mode 100644 pinapelz.moe/assets/aiba.webp delete mode 100644 pinapelz.moe/assets/chuni.png delete mode 100644 pinapelz.moe/assets/eri.jpg delete mode 100644 pinapelz.moe/assets/gc.jpg delete mode 100644 pinapelz.moe/assets/growing.gif delete mode 100644 pinapelz.moe/assets/pfp.webp delete mode 100644 pinapelz.moe/assets/pso2.webp delete mode 100644 pinapelz.moe/assets/rappy.webp delete mode 100644 pinapelz.moe/assets/reine.jpg delete mode 100644 pinapelz.moe/assets/rg-tier.gif delete mode 100644 pinapelz.moe/assets/sayo-fries.gif delete mode 100644 pinapelz.moe/assets/sdvx.png delete mode 100644 pinapelz.moe/assets/usami.webp delete mode 100644 pinapelz.moe/assets/vuln.jpg delete mode 100644 pinapelz.moe/assets/xiv.webp delete mode 100644 pinapelz.moe/assets/xqcl.webp delete mode 100644 pinapelz.moe/encoded-take-no1.html delete mode 100644 pinapelz.moe/encoded-take-no2.html delete mode 100644 pinapelz.moe/index.html delete mode 100644 pinapelz.moe/projects.html delete mode 100644 pinapelz.moe/rhythm-games-tierlist.html delete mode 100644 pinapelz.moe/scripts/index.js delete mode 100644 pinapelz.moe/styles/bg.webp delete mode 100644 pinapelz.moe/styles/border.webp delete mode 100644 pinapelz.moe/styles/carbon.css delete mode 100644 pinapelz.moe/styles/clock.css delete mode 100644 pinapelz.moe/styles/projects.css delete mode 100644 pinapelz.moe/styles/styles.css create mode 100644 sticker.pinapelz.com/esinstall.js create mode 100644 sticker.pinapelz.com/index.html create mode 100644 sticker.pinapelz.com/lib/htm/preact.js create mode 100644 sticker.pinapelz.com/package.json create mode 100644 sticker.pinapelz.com/packs/.gitkeep create mode 100644 sticker.pinapelz.com/packs/dank.json create mode 100644 sticker.pinapelz.com/packs/index.json create mode 100644 sticker.pinapelz.com/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP create mode 100644 sticker.pinapelz.com/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws create mode 100644 sticker.pinapelz.com/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc create mode 100644 sticker.pinapelz.com/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR create mode 100644 sticker.pinapelz.com/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC create mode 100644 sticker.pinapelz.com/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc create mode 100644 sticker.pinapelz.com/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP create mode 100644 sticker.pinapelz.com/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr create mode 100644 sticker.pinapelz.com/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb create mode 100644 sticker.pinapelz.com/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg create mode 100644 sticker.pinapelz.com/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc create mode 100644 sticker.pinapelz.com/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB create mode 100644 sticker.pinapelz.com/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx create mode 100644 sticker.pinapelz.com/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck create mode 100644 sticker.pinapelz.com/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP create mode 100644 sticker.pinapelz.com/packs/weeb.json create mode 100644 sticker.pinapelz.com/res/favorite.svg create mode 100644 sticker.pinapelz.com/res/giphy-dark.svg create mode 100644 sticker.pinapelz.com/res/giphy-light.svg create mode 100644 sticker.pinapelz.com/res/powered-by-giphy.png create mode 100644 sticker.pinapelz.com/res/recent.svg create mode 100644 sticker.pinapelz.com/res/search.svg create mode 100644 sticker.pinapelz.com/res/settings.svg create mode 100644 sticker.pinapelz.com/src/frequently-used.js create mode 100644 sticker.pinapelz.com/src/giphy.js create mode 100644 sticker.pinapelz.com/src/index.js create mode 100644 sticker.pinapelz.com/src/search-box.js create mode 100644 sticker.pinapelz.com/src/spinner.js create mode 100644 sticker.pinapelz.com/src/widget-api.js create mode 100644 sticker.pinapelz.com/style/index.css create mode 100644 sticker.pinapelz.com/style/index.sass create mode 100644 sticker.pinapelz.com/style/spinner.css create mode 100644 sticker.pinapelz.com/style/spinner.sass create mode 100644 sticker.pinapelz.com/yarn.lock delete mode 100644 sticker.pinapelz.moe/esinstall.js delete mode 100644 sticker.pinapelz.moe/index.html delete mode 100644 sticker.pinapelz.moe/lib/htm/preact.js delete mode 100644 sticker.pinapelz.moe/package.json delete mode 100644 sticker.pinapelz.moe/packs/.gitkeep delete mode 100644 sticker.pinapelz.moe/packs/dank.json delete mode 100644 sticker.pinapelz.moe/packs/index.json delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck delete mode 100644 sticker.pinapelz.moe/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP delete mode 100644 sticker.pinapelz.moe/packs/weeb.json delete mode 100644 sticker.pinapelz.moe/res/favorite.svg delete mode 100644 sticker.pinapelz.moe/res/giphy-dark.svg delete mode 100644 sticker.pinapelz.moe/res/giphy-light.svg delete mode 100644 sticker.pinapelz.moe/res/powered-by-giphy.png delete mode 100644 sticker.pinapelz.moe/res/recent.svg delete mode 100644 sticker.pinapelz.moe/res/search.svg delete mode 100644 sticker.pinapelz.moe/res/settings.svg delete mode 100644 sticker.pinapelz.moe/src/frequently-used.js delete mode 100644 sticker.pinapelz.moe/src/giphy.js delete mode 100644 sticker.pinapelz.moe/src/index.js delete mode 100644 sticker.pinapelz.moe/src/search-box.js delete mode 100644 sticker.pinapelz.moe/src/spinner.js delete mode 100644 sticker.pinapelz.moe/src/widget-api.js delete mode 100644 sticker.pinapelz.moe/style/index.css delete mode 100644 sticker.pinapelz.moe/style/index.sass delete mode 100644 sticker.pinapelz.moe/style/spinner.css delete mode 100644 sticker.pinapelz.moe/style/spinner.sass delete mode 100644 sticker.pinapelz.moe/yarn.lock diff --git a/indieweb-micro/hugo.toml b/indieweb-micro/hugo.toml index 4e41ee0..69b6d05 100644 --- a/indieweb-micro/hugo.toml +++ b/indieweb-micro/hugo.toml @@ -1,8 +1,8 @@ languageCode = 'en-us' -title = 'micro.pinapelz.moe' +title = 'micro.pinapelz.com' theme = "MinIndie" -baseURL = "https://micro.pinapelz.moe" -publishDir = "../micro.pinapelz.moe" +baseURL = "https://micro.pinapelz.com" +publishDir = "../micro.pinapelz.com" [params] subtitle = "check it out. I'm in the house like carpet" @@ -24,7 +24,7 @@ dateFmt = "Monday, January 2, 2006" [params.indieweb] authorizationEndpoint = "https://indieauth.com/auth" tokenEndpoint = "https://tokens.indieauth.com/token" - webmentionEndpoint = "https://webmention.io/micro.pinapelz.moe/webmention" + webmentionEndpoint = "https://webmention.io/micro.pinapelz.com/webmention" relmepgp = "https://pinapelz.com/Yukai_Shan.asc" [[params.indieweb.relme]] url = "https://github.com/pinapelz" diff --git a/indieweb-micro/themes/MinIndie/layouts/partials/webmentions.html b/indieweb-micro/themes/MinIndie/layouts/partials/webmentions.html index 2b9ba7d..1576106 100644 --- a/indieweb-micro/themes/MinIndie/layouts/partials/webmentions.html +++ b/indieweb-micro/themes/MinIndie/layouts/partials/webmentions.html @@ -182,7 +182,7 @@ const PAGE_URL = "{{ .Permalink }}"; async function loadMentions() { const url = - "https://webmention.io/api/mentions.jf2?domain=micro.pinapelz.moe&token=hdjQAqlZwgJmSuPSiU8h8w"; + "https://webmention.io/api/mentions.jf2?domain=micro.pinapelz.com&token=hdjQAqlZwgJmSuPSiU8h8w"; const res = await fetch(url); const data = await res.json(); diff --git a/micro.pinapelz.com/categories/default/index.html b/micro.pinapelz.com/categories/default/index.html new file mode 100644 index 0000000..f4b489e --- /dev/null +++ b/micro.pinapelz.com/categories/default/index.html @@ -0,0 +1,141 @@ + + + + + + + + Default | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Default + + RSS icon + +

+
+ +

Content linked to the taxonomy term « DEFAULT »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/categories/default/index.xml b/micro.pinapelz.com/categories/default/index.xml new file mode 100644 index 0000000..4034513 --- /dev/null +++ b/micro.pinapelz.com/categories/default/index.xml @@ -0,0 +1,56 @@ + + + + Default on micro.pinapelz.com + https://micro.pinapelz.com/categories/default/ + Recent content in Default on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Portable Audio: Phone, Wireless DAC, or DAP + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> + + + Discord Rant + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> + + + DBOX Movie Seats + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> + + + YouTube Music Recap 2025 + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> + + + INIU Power Bank Gets Recall + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> + + + Hello World - Why This + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> + + + diff --git a/micro.pinapelz.com/categories/games/index.html b/micro.pinapelz.com/categories/games/index.html new file mode 100644 index 0000000..4b0578c --- /dev/null +++ b/micro.pinapelz.com/categories/games/index.html @@ -0,0 +1,134 @@ + + + + + + + + Games | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Games + + RSS icon + +

+
+ +

Content linked to the taxonomy term « GAMES »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/categories/games/index.xml b/micro.pinapelz.com/categories/games/index.xml new file mode 100644 index 0000000..389bb37 --- /dev/null +++ b/micro.pinapelz.com/categories/games/index.xml @@ -0,0 +1,49 @@ + + + + Games on micro.pinapelz.com + https://micro.pinapelz.com/categories/games/ + Recent content in Games on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 26 Apr 2026 18:20:09 -0700 + + + Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> + + + Playlog: Hundred Lines Last Defense Academy + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.com//tags/ffxiv" class="p-category">#ffxiv</a> + + + Arcade Monsters + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> + + + First MXM 18 Cleared! + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.com//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> + + + diff --git a/micro.pinapelz.com/categories/index.html b/micro.pinapelz.com/categories/index.html new file mode 100644 index 0000000..9e0ad57 --- /dev/null +++ b/micro.pinapelz.com/categories/index.html @@ -0,0 +1,101 @@ + + + + + + + + Categories | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Categories + + RSS icon + +

+
+ +
+
+
+ +
+ + + + diff --git a/micro.pinapelz.com/categories/index.xml b/micro.pinapelz.com/categories/index.xml new file mode 100644 index 0000000..c5f4043 --- /dev/null +++ b/micro.pinapelz.com/categories/index.xml @@ -0,0 +1,42 @@ + + + + Categories on micro.pinapelz.com + https://micro.pinapelz.com/categories/ + Recent content in Categories on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Default + https://micro.pinapelz.com/categories/default/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/categories/default/ + + + + Games + https://micro.pinapelz.com/categories/games/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/categories/games/ + + + + Tools + https://micro.pinapelz.com/categories/tools/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/categories/tools/ + + + + Life + https://micro.pinapelz.com/categories/life/ + Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/categories/life/ + + + + diff --git a/micro.pinapelz.com/categories/life/index.html b/micro.pinapelz.com/categories/life/index.html new file mode 100644 index 0000000..f4dd09b --- /dev/null +++ b/micro.pinapelz.com/categories/life/index.html @@ -0,0 +1,106 @@ + + + + + + + + Life | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Life + + RSS icon + +

+
+ +

Content linked to the taxonomy term « LIFE »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/categories/life/index.xml b/micro.pinapelz.com/categories/life/index.xml new file mode 100644 index 0000000..22d554e --- /dev/null +++ b/micro.pinapelz.com/categories/life/index.xml @@ -0,0 +1,21 @@ + + + + Life on micro.pinapelz.com + https://micro.pinapelz.com/categories/life/ + Recent content in Life on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Tue, 02 Dec 2025 00:22:32 -0800 + + + China Town Fair + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> + + + diff --git a/micro.pinapelz.com/categories/tools/index.html b/micro.pinapelz.com/categories/tools/index.html new file mode 100644 index 0000000..6129986 --- /dev/null +++ b/micro.pinapelz.com/categories/tools/index.html @@ -0,0 +1,106 @@ + + + + + + + + Tools | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Tools + + RSS icon + +

+
+ +

Content linked to the taxonomy term « TOOLS »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/categories/tools/index.xml b/micro.pinapelz.com/categories/tools/index.xml new file mode 100644 index 0000000..2f3564d --- /dev/null +++ b/micro.pinapelz.com/categories/tools/index.xml @@ -0,0 +1,21 @@ + + + + Tools on micro.pinapelz.com + https://micro.pinapelz.com/categories/tools/ + Recent content in Tools on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Thu, 04 Dec 2025 23:19:29 -0800 + + + Enable HID Mode on Nintendo Pro Controller 2 + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> + + + diff --git a/micro.pinapelz.com/css/style.css b/micro.pinapelz.com/css/style.css new file mode 100644 index 0000000..4a930c1 --- /dev/null +++ b/micro.pinapelz.com/css/style.css @@ -0,0 +1,296 @@ +html { + overflow-y: scroll; +} + +/* 🌸 PASTEL PALETTE */ +:root { + --bgcolor: #fff7fb; + --fontcolor: #3a2c3d; + + --linkcolor: #ff77c8; + --visitedcolor: #d76dff; + + --precolor: #4a3e4f; + --prebgcolor: #ffe6f4; + + --alertbgcolor: #ffe0f1; + --hrcolor: #ffbde6; + + --blockquotecolor: #ffe8f6; + --pcodecolor: #f7d2f0; + + --sitetitlecolor: #ff99dd; + --titlecolor: #c77fff; +} + +/* 🌙 DARK MODE PASTEL NIGHT */ +@media (prefers-color-scheme: dark) { + :root { + --bgcolor: #241b2b; + --fontcolor: #f8e8ff; + + --linkcolor: #ff9be9; + --visitedcolor: #e49cff; + + --precolor: #ffeefe; + --prebgcolor: #35263f; + + --alertbgcolor: #3f304a; + --hrcolor: #f4cfff; + + --blockquotecolor: #3a2b45; + --pcodecolor: #614c70; + + --sitetitlecolor: #ffd1f6; + --titlecolor: #d9a7ff; + } +} + +/* 🌸 TYPO + BASE */ +body { + max-width: 800px; + margin: 40px auto; + padding: 0 10px; + + font: 15px/1.6 "IBM Plex Mono", "Fira Mono", monospace; + color: var(--fontcolor); + background: var(--bgcolor); + + transition: background 0.3s ease, color 0.3s ease; +} + +/* 🌸 LINKS */ +a { + color: var(--linkcolor); + text-decoration: none; + transition: color 0.2s ease, text-shadow 0.2s ease; +} + +a:hover { + color: var(--visitedcolor); + text-shadow: 0 0 6px currentColor; +} + +a:visited { + color: var(--visitedcolor); +} + +/* 🌸 HEADERS */ +h1, h2, h3 { + line-height: 1.25; + color: var(--titlecolor); + margin-top: 1.6rem; + font-weight: 700; +} + +h1.site-title { + color: var(--sitetitlecolor); + text-align: center; + font-size: 2rem; + margin-bottom: 1rem; +} + +/* 🌸 PARAGRAPHS */ +p { + margin-top: 1.3rem; +} + +/* 🌸 INLINE CODE */ +p > code, +li > code { + color: var(--precolor); + background: var(--pcodecolor); + padding: 3px 5px; + border-radius: 6px; +} + +/* 🌸 FULL CODE */ +code { + color: var(--precolor); + background: var(--prebgcolor); + padding: 3px 5px; + border-radius: 6px; +} + +pre { + color: var(--precolor); + background: var(--prebgcolor); + padding: 24px; + overflow-x: auto; + border-radius: 12px; + box-shadow: 0 0 10px rgba(255, 180, 220, 0.25); +} + +/* 🌸 ARTICLES */ +article { + padding: 24px 0; +} + +/* 🌸 IMAGES */ +img { + display: block; + max-width: 100%; + height: auto; + margin: auto; + border-radius: 12px; +} + +/* cute avatar */ +.avatar { + width: 100px; + height: 100px; + border-radius: 50%; + box-shadow: 0 0 8px rgba(255, 140, 200, 0.4); + border: 4px solid var(--bgcolor); + transition: transform 0.3s ease; +} + +/* Banner with overlay avatar */ +.banner { + position: relative; + margin-bottom: 1rem; +} + +.banner img:first-child { + width: 100%; + max-width: 600px; + height: auto; + border-radius: 8px; + opacity: 0.85; +} + +.banner .avatar { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 2; + width: 120px; + height: 120px; + box-shadow: 0 0 20px rgba(255, 140, 200, 0.6); +} + +.banner .avatar:hover { + transform: translate(-50%, -50%) scale(1.05); +} + +/* 🌸 ALERTS */ +.alert { + color: var(--fontcolor); + background: var(--alertbgcolor); + padding: 20px; + border-radius: 12px; + box-shadow: 0 0 12px rgba(255, 180, 220, 0.3); + overflow-x: auto; +} + +/* 🌸 NEXT/PREV */ +.article-nextprev { + display: flex; + flex-flow: row wrap-reverse; + justify-content: space-between; +} + +/* 🌸 DIVIDERS */ +hr { + margin: 35px 33% 15px; + border-color: var(--hrcolor); + border-width: 3px; + border-radius: 3px; +} + +hr.small { + margin: 35px 44% 25px; + border: 1px dashed var(--hrcolor); +} + +/* 🌸 BLOCKQUOTE */ +blockquote { + background: var(--blockquotecolor); + margin: 1.2rem 0; + padding: 12px 20px; + border-radius: 12px; + box-shadow: 0 0 8px rgba(255, 200, 240, 0.25); + border-left: 4px solid var(--hrcolor); +} + +/* 🌸 LISTS */ +ol, ul { + padding-left: 1.1rem; +} + +ol > li, +ul > li { + margin-bottom: 0.8rem; +} + +ul > li { + list-style-type: disclosure-closed; +} + +/* 🌸 TABLES */ +table { + text-align: left; + border: 1px solid var(--hrcolor); + border-radius: 10px; + overflow: hidden; +} + +thead th, tfoot th, tfoot td { + padding: 6px 10px; + background-color: var(--alertbgcolor); + color: var(--titlecolor); +} + +td { + padding: 8px 10px; +} + +tbody tr:nth-child(even) { + background-color: var(--alertbgcolor); +} + +/* 🌸 RESPONSIVE MOE */ +@media all and (max-width: 800px) { + .bio-card .bio { + justify-content: space-around; + flex-direction: column; + } + .bio-card .bio > img { + align-self: center; + margin: auto; + } + .bio-card .bio > p { + align-self: center; + text-align: center; + } + + /* Smaller avatar on mobile */ + .banner .avatar { + width: 90px; + height: 90px; + } + + .banner img:first-child { + border-radius: 6px; + } +} + +/* PRINT */ +@media print { + a, a:visited { + color: #000; + text-decoration: none; + } + a::after { + content: " (" attr(href) ") "; + } + nav, footer, hr, .noprint { + display: none !important; + } + pre, blockquote, code { + background: #fff; + border: none; + box-shadow: none; + } +} diff --git a/micro.pinapelz.com/index.html b/micro.pinapelz.com/index.html new file mode 100644 index 0000000..45fb1d9 --- /dev/null +++ b/micro.pinapelz.com/index.html @@ -0,0 +1,340 @@ + + + + + + + + + micro.pinapelz.com | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + +
+
+

micro.pinapelz.com

+ + + +
+

yo! and he's more than a cover he's a quilt
+ General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)
+ Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)
+ I Watch only slice of life (and Bandori)
+ Arch Linux + Hyprland user (btw)
+ Hi from the indieweb, if you are seeing me bridged elsewhere!

+
+

Pinapelz

+
+
+ + +
+

Portable Audio: Phone, Wireless DAC, or DAP

+ + + default + +
+

Supposedly, there’s been a resurgence in the popularity of the iPod in the recent months for all sorts of reasons. While I’m well aware of “MP3 Players”, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a “new-gen” audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.

+ + Read more... + +
+
+ + +
+

Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body)

+ + + playlog + +
+

I’ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).

+ + Read more... + +
+
+ + +
+

Playlog: Hundred Lines Last Defense Academy

+ + + playlog + +
+

After about a year of playing on and off, I’ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. +

105 hours or more played +
+

+

Core Mechanics

+
    +
  • This is basically a visual novel, there’s very little fun to be had if you are a “cutscene skipper”. If you enjoyed Kodaka’s other works like Danganronpa then you’ll be right at home.
  • +
  • There’s a bunch of smaller “minigames” but are mostly a one-off thing, they feel mostly like an afterthought (+25)
  • +
+

Structure

+
    +
  • There’s 2 main parts of the game, the battling and the story itself
  • +
  • The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you’re not careful for some of them
  • +
  • In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you’ve already done
  • +
  • As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular “route” which is centered around a particular storyline, each one is also explicitly named in the game’s flowchart. (+20)
  • +
+

Content

+
    +
  • The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the “core” of the plot. Some of them basically lead to nothing and are there just for fun.
  • +
  • Everyone has to play through which basically acts as a very long prologue for the actual game
  • +
  • Not Necessary: Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route
  • +
  • I would recommend playing through the prologue, then explicitly following a guide for the , then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)
  • +
+

Technical Execution

+

Its fine overall. You can def. tell they didn’t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)

+ + Read more... + +
+
+ + +
+

Discord Rant

+ + + default + +
+

We’ve seen time and time again that there is “no such thing as a free lunch”. The same is true for Discord.

+
    +
  1. Offer a service that is much better than all the competitors
  2. +
  3. Attract a bunch of users
  4. +
  5. Burn VC money
  6. +
  7. Repeat 1-3 until its time to pay them back
  8. +
  9. Figure out how to make money
  10. +
+

Nitro doesn’t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to “what value do I get out of it”.

+ + Read more... + +
+
+ + +
+

DBOX Movie Seats

+ + + default + +
+

There’s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.

+

I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn’t a bad experience but given the markup, I don’t think its worth it:

+
    +
  • First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble
  • +
  • However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying
  • +
  • For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I’d much rather just go to a theater that has the big comfy recliner seats
  • +
  • I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you’re really looking forward to
  • +
  • Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?
  • +
+

Generally, though… I think I’ll live without them.

+ +
+
+ + +
+

Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers)

+ + + playlog + +
+

This is primarily focused on the content of the patch, not so much the features they’ve added.

+

Story

+
    +
  • Mistwake Dungeon was a good difficulty. Although I’m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.
  • +
  • Cutscene quality def. got better. As in animations and uniqueness.
  • +
  • Love the look and feel (Treno). There’s a ton of good spots for “gpose-ing”. Music is nice too.
  • +
  • Seriously Krile? You parents were the ones who dropped you into the Source. I don’t think they’d care if you wanted to stay in the Source (just make up your mind) -> well glad that got sorted out
  • +
  • “Hell on Rails” Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the “sucking” mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.
  • +
  • The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.
  • +
  • The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth’s meteor.
  • +
  • Cool so we just get to keep the key. If this were any bit realistic, we’ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story… Well I guess it can go either way.
  • +
  • I’m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn’t something more unique.
  • +
  • And what do you know. Ascians. I hope we get something unqiue for 8.0… I guess thats fine but please lets not have it just be SHB all over again.
  • +
+

Raid

+
    +
  • “Feral Fandom” -> Yep thats FF14 NA playerbase for you.
  • +
  • Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we’d stop with mechanics that are designed to trick people even when read correctly.
  • +
  • Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.
  • +
  • Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.
  • +
  • Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There’s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe…
  • +
  • Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.
  • +
  • Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!
  • +
+

Misc

+
    +
  • The new Frontline map is “dangerous”. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they’re needed too (to spice things up/allow for a turning point).
  • +
  • The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -> B (but partially I guess this is done cause the map does feel smaller than Onsal).
  • +
+ + +#ffxiv + +
+
+ + +
+

Arcade Monsters

+ + + arcade + +
+

If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I’ve found is taking the Pacific Surfliner train down to San Diego.

+

Getting There

+

There are a number of departures in the morning, and while not as fast as a car when there’s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.

+ + Read more... + +
+
+ + +
+

First MXM 18 Cleared!

+ + + arcade + +
+

Cleared my first 18 difficulty chart in + +#sdvx +

+

Albeit its not a very difficult one, but I think I’m finally starting to chip away at the 17-18 difficulty wall. +

Sound Voltex Enchant 6 Clear +
+

+ +
+
+ + +
+

Enable HID Mode on Nintendo Pro Controller 2

+ + + code + + nintendo + +
+

Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn’t work out of box on PC (Linux) for me like it’s predacessor. Until there’s actual better driver support for this thing in the kernel (or Valve does something), here’s a hacky Python script to initialize HID-mode on the controller

+

Steps

+ + Read more... + +
+
+ + +
+

YouTube Music Recap 2025

+ + + anime + +
+

Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.

+
YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia +
+ +
+
+ + +
+ +1 of 2 + + Next Page + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/index.xml b/micro.pinapelz.com/index.xml new file mode 100644 index 0000000..00b178b --- /dev/null +++ b/micro.pinapelz.com/index.xml @@ -0,0 +1,112 @@ + + + + micro.pinapelz.com + https://micro.pinapelz.com/ + Recent content on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Portable Audio: Phone, Wireless DAC, or DAP + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> + + + Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> + + + Playlog: Hundred Lines Last Defense Academy + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> + + + Discord Rant + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> + + + DBOX Movie Seats + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.com//tags/ffxiv" class="p-category">#ffxiv</a> + + + Arcade Monsters + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> + + + First MXM 18 Cleared! + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.com//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> + + + Enable HID Mode on Nintendo Pro Controller 2 + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> + + + YouTube Music Recap 2025 + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> + + + Follows + https://micro.pinapelz.com/indie/follows/ + Wed, 03 Dec 2025 01:17:39 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/indie/follows/ + <p>Here are all the pages/accounts I follow.</p> <p>This is mostly here for pages that can receive <a href="https://indieweb.org/webmention">Webmentions</a> and the <a href="https://fed.brid.gy">Bridgy Fed</a> service.</p> <h2 id="fediverse">Fediverse</h2> <p> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@Mofumatic"> https://sakurajima.moe/@Mofumatic </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mathstodon.xyz/@tao"> https://mathstodon.xyz/@tao </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@chikorita157"> https://sakurajima.moe/@chikorita157 </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@sakurajima"> https://sakurajima.moe/@sakurajima </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://floss.social/@kde"> https://floss.social/@kde </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@gamingonlinux"> https://mastodon.social/@gamingonlinux </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://threads.net/@nintendeal"> https://threads.net/@nintendeal </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@Mastodon"> https://mastodon.social/@Mastodon </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://jvns.ca/@b0rk"> https://jvns.ca/@b0rk </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://tippy.rabbithouse.garden/@serebii"> https://tippy.rabbithouse.garden/@serebii </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://retro.pizza/@outofprintarchive"> https://retro.pizza/@outofprintarchive </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://peoplemaking.games/@nindiespotlight"> https://peoplemaking.games/@nindiespotlight </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> </p> <h2 id="bluesky">Bluesky</h2> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://bsky.app/profile/anew.social"> https://bsky.app/profile/anew.social </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <blockquote> <p>Learn more about the <a href="https://indieweb.org">Indieweb</a></p> + + + INIU Power Bank Gets Recall + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> + + + China Town Fair + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> + + + Hello World - Why This + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> + + + diff --git a/micro.pinapelz.com/indie/follows/index.html b/micro.pinapelz.com/indie/follows/index.html new file mode 100644 index 0000000..4d54ca1 --- /dev/null +++ b/micro.pinapelz.com/indie/follows/index.html @@ -0,0 +1,288 @@ + + + + + + + + Follows | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Follows

+
+

Here are all the pages/accounts I follow.

+

This is mostly here for pages that can receive Webmentions and the Bridgy Fed service.

+

Fediverse

+

+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+

Bluesky

+ + + + + +
+

Learn more about the Indieweb

+
+ +
+ + + + + + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/indie/index.html b/micro.pinapelz.com/indie/index.html new file mode 100644 index 0000000..79eec48 --- /dev/null +++ b/micro.pinapelz.com/indie/index.html @@ -0,0 +1,158 @@ + + + + + + + + Indies | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + +
+ + +
+ +

+ Indies + +RSS icon + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ +
+

December 2025

+
    + + +
  • + +
    + : + + + Follows + +
    +
  • + + + + +
+
+ + +
+ +1 of 1 + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/indie/index.xml b/micro.pinapelz.com/indie/index.xml new file mode 100644 index 0000000..4c39c90 --- /dev/null +++ b/micro.pinapelz.com/indie/index.xml @@ -0,0 +1,21 @@ + + + + Indies on micro.pinapelz.com + https://micro.pinapelz.com/indie/ + Recent content in Indies on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Wed, 03 Dec 2025 01:17:39 -0800 + + + Follows + https://micro.pinapelz.com/indie/follows/ + Wed, 03 Dec 2025 01:17:39 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/indie/follows/ + <p>Here are all the pages/accounts I follow.</p> <p>This is mostly here for pages that can receive <a href="https://indieweb.org/webmention">Webmentions</a> and the <a href="https://fed.brid.gy">Bridgy Fed</a> service.</p> <h2 id="fediverse">Fediverse</h2> <p> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@Mofumatic"> https://sakurajima.moe/@Mofumatic </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mathstodon.xyz/@tao"> https://mathstodon.xyz/@tao </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@chikorita157"> https://sakurajima.moe/@chikorita157 </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@sakurajima"> https://sakurajima.moe/@sakurajima </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://floss.social/@kde"> https://floss.social/@kde </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@gamingonlinux"> https://mastodon.social/@gamingonlinux </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://threads.net/@nintendeal"> https://threads.net/@nintendeal </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@Mastodon"> https://mastodon.social/@Mastodon </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://jvns.ca/@b0rk"> https://jvns.ca/@b0rk </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://tippy.rabbithouse.garden/@serebii"> https://tippy.rabbithouse.garden/@serebii </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://retro.pizza/@outofprintarchive"> https://retro.pizza/@outofprintarchive </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://peoplemaking.games/@nindiespotlight"> https://peoplemaking.games/@nindiespotlight </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> </p> <h2 id="bluesky">Bluesky</h2> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://bsky.app/profile/anew.social"> https://bsky.app/profile/anew.social </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <blockquote> <p>Learn more about the <a href="https://indieweb.org">Indieweb</a></p> + + + diff --git a/micro.pinapelz.com/indie/page/1/index.html b/micro.pinapelz.com/indie/page/1/index.html new file mode 100644 index 0000000..13c45ec --- /dev/null +++ b/micro.pinapelz.com/indie/page/1/index.html @@ -0,0 +1,9 @@ + + + + https://micro.pinapelz.com/indie/ + + + + + diff --git a/micro.pinapelz.com/page/1/index.html b/micro.pinapelz.com/page/1/index.html new file mode 100644 index 0000000..2e6aac4 --- /dev/null +++ b/micro.pinapelz.com/page/1/index.html @@ -0,0 +1,9 @@ + + + + https://micro.pinapelz.com/ + + + + + diff --git a/micro.pinapelz.com/page/2/index.html b/micro.pinapelz.com/page/2/index.html new file mode 100644 index 0000000..8bae8aa --- /dev/null +++ b/micro.pinapelz.com/page/2/index.html @@ -0,0 +1,163 @@ + + + + + + + + + micro.pinapelz.com | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + +
+
+

micro.pinapelz.com

+ + + +
+

yo! and he's more than a cover he's a quilt
+ General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)
+ Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)
+ I Watch only slice of life (and Bandori)
+ Arch Linux + Hyprland user (btw)
+ Hi from the indieweb, if you are seeing me bridged elsewhere!

+
+

Pinapelz

+
+
+ + +
+

INIU Power Bank Gets Recall

+ + + default + +
+

It would seem that I, along with what seems like the entirety of Reddit bought the same cheap 10000mAh power bank and now its getting recalled.

+

I wonder if it has anything to do with the poor quality they found in that viral Haribo Powerbank. Not sure since I’ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.

+ + Read more... + +
+
+ + +
+

China Town Fair

+ + + arcade + +
+

Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.

+
China Town Fair Outside +
+ +

Also yep you’re reading that right, it indeed once home to a dancing chicken as well as one that played tic tac toe.

+

But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.

+ + Read more... + +
+
+ + +
+

Hello World - Why This

+ + + default + +
+

I think having control of your own data is great. The same is true for decentralized social media. I’ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and “decentralized” approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of “social media”.

+

Twitter/X

+

This is fairly self explanatory. The rebranding of Twitter to X and Musk’s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn’t a particular fan of. You can’t view anything without signing in either, so goodbye viewing stuff anonymously. There’s just a lot of “features” here I’m not a fan of. Needless to say, there’s a lot of reasons to not post stuff there.

+ + Read more... + +
+
+ + +
+ + Previous Page + +2 of 2 + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-01-hello-world/index.html b/micro.pinapelz.com/posts/2025-12-01-hello-world/index.html new file mode 100644 index 0000000..51eb74c --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-01-hello-world/index.html @@ -0,0 +1,501 @@ + + + + + + + + Hello World - Why This | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Hello World - Why This

+ + + +
+ + - Permalink +
+
+

I think having control of your own data is great. The same is true for decentralized social media. I’ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and “decentralized” approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of “social media”.

+

Twitter/X

+

This is fairly self explanatory. The rebranding of Twitter to X and Musk’s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn’t a particular fan of. You can’t view anything without signing in either, so goodbye viewing stuff anonymously. There’s just a lot of “features” here I’m not a fan of. Needless to say, there’s a lot of reasons to not post stuff there.

+

Fediverse

+

I initially moved to the Fediverse (on Misskey/Sharkey). Interoperability between different platforms is very cool, and the wide variety of platforms to choose from means that picking any platform never made me feel like “missing out” elsewhere.

+

However, this in itself has a problem. If you create an account on someone else’s instance, you are a part of their walled garden. Now I’m sure that they are a wonderful person who equally values data ownership/agency, however it doesn’t change the fact that someone else holds your content/data and you rely on them for that service.

+

So then the alternative here is self-hosting a single person instance. This solves everything, BUT the fact that its quite expensive to pay for the bandwidth + storage if you are a small instance and end up federating with a lot of instances. This wasn’t a compromise I wanted, since the name of the game with the Fediverse is being able to connect cross-platform. Great if you have the resources, but not particularly worth it for a single person starting fresh. There’s not really a good way to handle this right now, which is why federation with a very large platform like Threads is limited.

+

Bluesky

+

Bluesky is one of the drop-in alternatives for Twitter. Its built on the AT-Protocol, which does actually solve a lot of the problems of ActivityPub (Fediverse) in terms of handling small self-hosted instance with large ones. +AtProto allows you to host a PDS (Personal Data Server) which stores all your own posts, profile info, and follows. This boils down to meaning that you really only need to be responsible for serving your own content, which you also own on your own machine. There’s also a lot of fine-grain features that help with not getting overwhelmed by firehose traffic.

+

While this is great, the issue is that the service is not truly “federated” (yet?). Its still early days for the platform and protocol, Most people are still on bsky.social. This means that to get anything to read at all you’d still need to pull from the big central relay. Even if we were successful in this, its not entirely clear what the costs would be for running all these components together (is it even worth it for a single person?). I think AtProto is promising, but its still early days and who knows where it’ll go…

+

Now What

+

Its time to try something new. From a surface view the idea of IndieWeb is a good solution from the perspective of creating the content. You basically just build a website/blog (which nowadays is dirt cheap to host something static), you then just add some special HTML (microformats) and now you’ve got a common protocol similar to a post (only now you can leverage the power of HTML/CSS and customize it however you want). Then implemtning webmentions gives the ability for other people to interact with your content. Using a bridging/syndication service like Bridgy Fed you can post to the Fediverse and Bluesky as well as allow others from there to interact with your post.

+

So that’s what this is. Let’s see how it goes.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-02-china-town-fair/gloves.webp b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/gloves.webp new file mode 100644 index 0000000..fd42b6c Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/gloves.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-02-china-town-fair/index.html b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/index.html new file mode 100644 index 0000000..8c6ccfb --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/index.html @@ -0,0 +1,506 @@ + + + + + + + + China Town Fair | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

China Town Fair

+ + + +
+ + - Permalink +
+
+

Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.

+
China Town Fair Outside +
+ +

Also yep you’re reading that right, it indeed once home to a dancing chicken as well as one that played tic tac toe.

+

But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.

+

Then it re-opened under new management and became a complete shell of its former self. These days its pretty much all redemption slop in there. Very few actual “games” in there; there’s a DDR A3 cab, PIU, a singular jubeat with a broken audio mod, a fully broken down SDVX Nemsys, and 3 Wangan 5DX+ (not sure what happened to the 4th one).

+
China Town Fair Inside +
+ +

Anyways, its pretty tiny in there and feels like its not doing amazing. A single credit for jubeat was like 3-4 USD I think, and one of the machines to reload cards was fully broken down (tbh just go to Round1 and play).

+

If you want some actual rhythm games though, walk like 6 minutes and the newly opened “Akiba House” store has private networked maimai DX, WACCA (modded), and CHUNITHM.

+
Chinese maimai gloves +
+ +

Also I was absolutely not ready for the New York winter temps. Thankfully I always keep my rhythm game gloves on me which saved my hands from freezing.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-02-china-town-fair/inside-ctf.webp b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/inside-ctf.webp new file mode 100644 index 0000000..d08d15f Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/inside-ctf.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp new file mode 100644 index 0000000..aacc4e2 Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-02-power-bank-recall/index.html b/micro.pinapelz.com/posts/2025-12-02-power-bank-recall/index.html new file mode 100644 index 0000000..d0e5ac6 --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-02-power-bank-recall/index.html @@ -0,0 +1,499 @@ + + + + + + + + INIU Power Bank Gets Recall | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

INIU Power Bank Gets Recall

+ + + +
+ + - Permalink +
+
+

It would seem that I, along with what seems like the entirety of Reddit bought the same cheap 10000mAh power bank and now its getting recalled.

+

I wonder if it has anything to do with the poor quality they found in that viral Haribo Powerbank. Not sure since I’ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.

+

But I’d definetly prefer for it not to blow up on me

+

Here’s the full notice:

+
+

Dear Amazon Customer,

+

We have learned of a potential safety issue regarding certain product(s) that our records indicate you purchased through the Amazon.com website.

+

For more details on what you should do, please contact INIU at recall@iniu.shop.

+

Product: INIU Portable Charger, Slimmest 10000mAh 5V/3A Power Bank, USB C in&out High-Speed Charging Battery Pack, External Phone Powerbank Compatible with iPhone 16 15 14 13 12 Samsung S22 S21 Google iPad etc

+

If you made this purchase for someone else, please notify the recipient immediately and provide them with the information.

+

We regret any inconvenience this may cause you but trust you will understand that the safety and satisfaction of our customers is our highest priority.

+
+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/index.html b/micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/index.html new file mode 100644 index 0000000..d389cdc --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/index.html @@ -0,0 +1,492 @@ + + + + + + + + YouTube Music Recap 2025 | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

YouTube Music Recap 2025

+ + + +
+ + - Permalink +
+
+

Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.

+
YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia +
+ + +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/index.html b/micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/index.html new file mode 100644 index 0000000..7d1a70f --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/index.html @@ -0,0 +1,634 @@ + + + + + + + + Enable HID Mode on Nintendo Pro Controller 2 | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Enable HID Mode on Nintendo Pro Controller 2

+ + + +
+ + - Permalink +
+
+

Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn’t work out of box on PC (Linux) for me like it’s predacessor. Until there’s actual better driver support for this thing in the kernel (or Valve does something), here’s a hacky Python script to initialize HID-mode on the controller

+
# I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?
+import usb.core # install pyusb first: pip install pyusb
+import usb.util
+import time
+import sys
+
+VENDOR_ID = 0x057E
+PRODUCT_IDS = {
+    0x2066: "Joy-Con (L)",
+    0x2067: "Joy-Con (R)",
+    0x2069: "Pro Controller",
+    0x2073: "GCN Controller"
+}
+
+USB_INTERFACE_NUMBER = 1
+
+INIT_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
+UNKNOWN_COMMAND_0x07 = bytes([0x07, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
+UNKNOWN_COMMAND_0x16 = bytes([0x16, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
+REQUEST_CONTROLLER_MAC = bytes([0x15, 0x91, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
+LTK_REQUEST = bytes([0x15, 0x91, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
+UNKNOWN_COMMAND_0x15_ARG_0x03 = bytes([0x15, 0x91, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00])
+UNKNOWN_COMMAND_0x09 = bytes([0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+IMU_COMMAND_0x02 = bytes([0x0c, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00])
+OUT_UNKNOWN_COMMAND_0x11 = bytes([0x11, 0x91, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00])
+UNKNOWN_COMMAND_0x0A = bytes([0x0a, 0x91, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
+IMU_COMMAND_0x04 = bytes([0x0c, 0x91, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00])
+ENABLE_HAPTICS = bytes([0x03, 0x91, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00])
+OUT_UNKNOWN_COMMAND_0x10 = bytes([0x10, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
+OUT_UNKNOWN_COMMAND_0x01 = bytes([0x01, 0x91, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00])
+OUT_UNKNOWN_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00])
+OUT_UNKNOWN_COMMAND_0x0A_ALT = bytes([0x0a, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00])
+
+def send_usb_data(ep_out, ep_in, data, description=""):
+    try:
+        ep_out.write(data)
+        time.sleep(0.01)
+        try:
+            response = ep_in.read(32, timeout=100)
+            hex_resp = " ".join([f"{x:02x}" for x in response])
+            print(f"[{description}] Response: {hex_resp}")
+        except usb.core.USBError as e:
+            if e.errno == 110:
+                print(f"[{description}] No response (Timeout)")
+            else:
+                print(f"[{description}] Read Error: {e}")
+
+    except usb.core.USBError as e:
+        print(f"[{description}] Write Error: {e}")
+        raise
+
+def set_player_leds(ep_out, ep_in, led_mask):
+    command = [
+        0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00,
+        led_mask,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+    ]
+    send_usb_data(ep_out, ep_in, bytes(command), f"Set LED Mask: 0x{led_mask:02x}")
+
+def connect_usb():
+    print("Searching for Nintendo Switch Controllers...")
+    def match_device(dev):
+        return dev.idVendor == VENDOR_ID and dev.idProduct in PRODUCT_IDS
+    dev = usb.core.find(custom_match=match_device)
+    if dev is None:
+        raise ValueError("Device not found")
+
+    product_name = PRODUCT_IDS.get(dev.idProduct, "Unknown Device")
+    print(f"Found {product_name} (ID: {dev.idProduct:04x})")
+    if dev.is_kernel_driver_active(USB_INTERFACE_NUMBER):
+        try:
+            print("Detaching kernel driver...")
+            dev.detach_kernel_driver(USB_INTERFACE_NUMBER)
+        except usb.core.USBError as e:
+            sys.exit(f"Could not detach kernel driver: {e}")
+    try:
+        dev.set_configuration()
+        print("Configuration set.")
+    except usb.core.USBError as e:
+        print(f"Error setting configuration: {e}")
+    try:
+        usb.util.claim_interface(dev, USB_INTERFACE_NUMBER)
+        print(f"Interface {USB_INTERFACE_NUMBER} claimed.")
+    except usb.core.USBError as e:
+        sys.exit(f"Could not claim interface: {e}")
+    cfg = dev.get_active_configuration()
+    intf = cfg[(USB_INTERFACE_NUMBER,0)]
+    ep_out = usb.util.find_descriptor(
+        intf,
+        custom_match = lambda e:  usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT)
+
+    ep_in = usb.util.find_descriptor(
+        intf,
+        custom_match =
+        lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN
+    )
+
+    if not ep_out:
+        sys.exit("Could not find OUT endpoint")
+
+    print(f"Found Endpoint OUT: 0x{ep_out.bEndpointAddress:02x}")
+    print("Starting Initialization Sequence...")
+
+    try:
+        send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, "Init 0x03")
+        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, "Unknown 0x07")
+        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, "Unknown 0x16")
+        send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, "Req MAC")
+        send_usb_data(ep_out, ep_in, LTK_REQUEST, "Req LTK")
+        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, "Unknown 0x15")
+        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, "Unknown 0x09")
+        send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, "IMU 0x02")
+        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, "OUT Unknown 0x11")
+        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, "Unknown 0x0A")
+        send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, "IMU 0x04")
+        send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, "Enable Haptics")
+        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, "OUT Unknown 0x10")
+        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, "OUT Unknown 0x01")
+        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, "OUT Unknown 0x03")
+        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, "OUT Unknown 0x0A Alt")
+        set_player_leds(ep_out, ep_in, 0x0F)
+
+        print("Controller initialization sequence complete! All LEDs should be on.")
+
+    except Exception as e:
+        print(f"Error during sequence: {e}")
+
+if __name__ == "__main__":
+    try:
+        connect_usb()
+    except ValueError as e:
+        print(e)
+    except Exception as e:
+        print(f"Unexpected error: {e}")
+

Steps

+
    +
  1. (Optional) First Create a virtual environment
  2. +
  3. Install pyusb via pip install pyusb
  4. +
  5. Plug your Pro Controller 2 in via USB
  6. +
  7. Run the script
  8. +
+

If all 4 of the player indicator LEDs light up (the square ones near the charging port), then that means you should be good to go!

+

You’ll need to re-run this script each time you plug/unplug or restart your machine.

+

This is pretty much a copy of the online Procon 2 Enabler Tool but WebHID is dodgy on the Firefox fork I’m using, plus its annoying having to open this page each time.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp b/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp new file mode 100644 index 0000000..83768f7 Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/index.html b/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/index.html new file mode 100644 index 0000000..0d0594a --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/index.html @@ -0,0 +1,496 @@ + + + + + + + + First MXM 18 Cleared! | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

First MXM 18 Cleared!

+ + + +
+ + - Permalink +
+
+

Cleared my first 18 difficulty chart in + +#sdvx +

+

Albeit its not a very difficult one, but I think I’m finally starting to chip away at the 17-18 difficulty wall. +

Sound Voltex Enchant 6 Clear +
+

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp new file mode 100644 index 0000000..6f30510 Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp new file mode 100644 index 0000000..6b5f02f Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp new file mode 100644 index 0000000..c15d1f5 Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/index.html b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/index.html new file mode 100644 index 0000000..28b63d0 --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/index.html @@ -0,0 +1,537 @@ + + + + + + + + Arcade Monsters | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Arcade Monsters

+ + + +
+ + - Permalink +
+
+

If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I’ve found is taking the Pacific Surfliner train down to San Diego.

+

Getting There

+

There are a number of departures in the morning, and while not as fast as a car when there’s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.

+

Once you get there, you can either take the trolley or walk 20 minutes to the arcade. I prefer the walk since you can grab some food/coffee on the way.

+

Plus the view is excellent.

+

Ocean view from the Pacific Surfliner +
+ +
Ocean view from the Pacific Surfliner +
+

+

Value

+

So is this trip worth it and what is the cost?

+

Arcade Monsters games operate all on “Free Play”, you pay a set fee for entry and can stay for as long as you’d like. Its $25 to enter, or $35 if you want to be able to leave and come back.

+

Since there aren’t exactly a lot of “retro” arcades anymore, I’ll compare the value proposition here to Round1:

+

At Round1 a standard rhythm games is roughly 8.6 credits per play. If we estimate the value of a Round1 credit to be around $0.15 (assuming standard non-member $120 package for 777 credits), this would put 1 play at around $1.29. This means it takes roughly 20 plays to hit $25.

+

Let’s also say that a single play at any rhythm game takes roughly 10 minutes. Assuming you continuously played games This means $25 of Round1 credits would last you roughly 3.3 hours. So just this on its own, without considering anything else I’d say that this is great value just on its own.

+

But if you were to include transportation costs, assuming around $60 for a round-trip ticket via train, it becomes a little more difficult to justify since for the same price since you’d be able to play 46 rounds of something else at Round1.

+

However, with the variety of games in there (even rarer ones), I’d say this is still an excellent trip. I personally could easily stay 5+ hours in there (cause I’m a degenerate and they also sell food + drinks in there).

+
Arcade Cabinets +
+ +

Quality

+

Most of the retro stuff is very well maintained and in great working condition. Also many of the modern games are networked and have card saving features.

+

However, it’d be dishonest to say that these cabs are in excellent condition:

+
    +
  • The Sound Voltex knobs are basically falling off, the switches don’t feel great
  • +
  • The pads ghosts on Dancerush and the navigation keys are broken
  • +
  • FutureTomTom drums have sensitivity issues
  • +
  • Small things like how the stool for Ongeki doesn’t match the height of the standard seat.
  • +
+

Also it gets busy in there and is also a popular spot for families (kids get loud).

+
Arcade Cabinets +
+ +

Conclusion

+

Overall, as a once in a while its great value. You get to try out a ton of games, some of which are even considered rare to come by in Japan. If you also just want to go in and hardcore grind out some CHUNITHM, I can see that as a pretty good option too.

+

Check out the list of games here

+
Arcade Cabinets +
+ + + +#arcade + + +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view1.webp b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view1.webp new file mode 100644 index 0000000..b7463ba Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view1.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view2.webp b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view2.webp new file mode 100644 index 0000000..21956d9 Binary files /dev/null and b/micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/view2.webp differ diff --git a/micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/index.html b/micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/index.html new file mode 100644 index 0000000..dbe44e6 --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/index.html @@ -0,0 +1,520 @@ + + + + + + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers)

+ + + +
+ + - Permalink +
+
+

This is primarily focused on the content of the patch, not so much the features they’ve added.

+

Story

+
    +
  • Mistwake Dungeon was a good difficulty. Although I’m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.
  • +
  • Cutscene quality def. got better. As in animations and uniqueness.
  • +
  • Love the look and feel (Treno). There’s a ton of good spots for “gpose-ing”. Music is nice too.
  • +
  • Seriously Krile? You parents were the ones who dropped you into the Source. I don’t think they’d care if you wanted to stay in the Source (just make up your mind) -> well glad that got sorted out
  • +
  • “Hell on Rails” Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the “sucking” mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.
  • +
  • The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.
  • +
  • The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth’s meteor.
  • +
  • Cool so we just get to keep the key. If this were any bit realistic, we’ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story… Well I guess it can go either way.
  • +
  • I’m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn’t something more unique.
  • +
  • And what do you know. Ascians. I hope we get something unqiue for 8.0… I guess thats fine but please lets not have it just be SHB all over again.
  • +
+

Raid

+
    +
  • “Feral Fandom” -> Yep thats FF14 NA playerbase for you.
  • +
  • Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we’d stop with mechanics that are designed to trick people even when read correctly.
  • +
  • Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.
  • +
  • Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.
  • +
  • Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There’s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe…
  • +
  • Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.
  • +
  • Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!
  • +
+

Misc

+
    +
  • The new Frontline map is “dangerous”. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they’re needed too (to spice things up/allow for a turning point).
  • +
  • The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -> B (but partially I guess this is done cause the map does feel smaller than Onsal).
  • +
+ + +#ffxiv + + +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2025-12-31-09-dbox-review/index.html b/micro.pinapelz.com/posts/2025-12-31-09-dbox-review/index.html new file mode 100644 index 0000000..643ed74 --- /dev/null +++ b/micro.pinapelz.com/posts/2025-12-31-09-dbox-review/index.html @@ -0,0 +1,497 @@ + + + + + + + + DBOX Movie Seats | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

DBOX Movie Seats

+ + + +
+ + - Permalink +
+
+

There’s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.

+

I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn’t a bad experience but given the markup, I don’t think its worth it:

+
    +
  • First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble
  • +
  • However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying
  • +
  • For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I’d much rather just go to a theater that has the big comfy recliner seats
  • +
  • I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you’re really looking forward to
  • +
  • Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?
  • +
+

Generally, though… I think I’ll live without them.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2026-02-19-10-discord-rant/index.html b/micro.pinapelz.com/posts/2026-02-19-10-discord-rant/index.html new file mode 100644 index 0000000..53119e9 --- /dev/null +++ b/micro.pinapelz.com/posts/2026-02-19-10-discord-rant/index.html @@ -0,0 +1,501 @@ + + + + + + + + Discord Rant | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Discord Rant

+ + + +
+ + - Permalink +
+
+

We’ve seen time and time again that there is “no such thing as a free lunch”. The same is true for Discord.

+
    +
  1. Offer a service that is much better than all the competitors
  2. +
  3. Attract a bunch of users
  4. +
  5. Burn VC money
  6. +
  7. Repeat 1-3 until its time to pay them back
  8. +
  9. Figure out how to make money
  10. +
+

Nitro doesn’t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to “what value do I get out of it”.

+

Look, free is free, and nothing can and will ever beat the value of free. There’s still plenty of reasons to move even if you are a free user, but that’s not the point of this. What I want to take a look at is what value you are actually getting as a paying user.

+

If you wanted to take advantage of ALL of Discord’s features, such as the higher quality screen share + audio or vanity for servers; you need to buy Nitro and boost your server. Nitro comes out to $99.99 a year for Nitro and around $490 a year for the 14 boosts to Tier 3. For me, it feels like the company if scavenging for opportunities to make money, making features like server banners and vanity links paid (which I suppose is how capitalism works, but for what you get at that price point it seems ridiculous). Even if we lower it down to no Nitro and just 2 boosts to get the additional custom emoji slots on a server, that’s still around $6 a month.

+

Let’s say you do opt for this $6 price point. Is it good value? I suppose it depends. I can spin up Teamspeak 6 and Matrix on a CPX11 for 6 Euros a month from Hetzner. Services that give me all the features from the start without all the paywalling BS. In fact, Discord can capture this as well if they changed their pricing model, but I believe their too deep into this situation where they now have to fund the free users or risk everyone migrating elsewhere.

+

Not to mention, the Discord client has gotten progressively worse over the years, all these accessories and animations do is lag out the client which they don’t even seem to understand the codebase of anymore.

+

What Discord sells is convenience, regardless of the Face ID or data collection, the value is not there and hasn’t been there from a “running a small community” perspective. There’s much better options where you have much more agency over your data, as well as have more fine-grain control over optimizing cost. I suppose you can think of it as going to McDonalds or actually making dinner.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html new file mode 100644 index 0000000..c702832 --- /dev/null +++ b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html @@ -0,0 +1,516 @@ + + + + + + + + Playlog: Hundred Lines Last Defense Academy | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Playlog: Hundred Lines Last Defense Academy

+ + + +
+ + - Permalink +
+
+

After about a year of playing on and off, I’ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. +

105 hours or more played +
+

+

Core Mechanics

+
    +
  • This is basically a visual novel, there’s very little fun to be had if you are a “cutscene skipper”. If you enjoyed Kodaka’s other works like Danganronpa then you’ll be right at home.
  • +
  • There’s a bunch of smaller “minigames” but are mostly a one-off thing, they feel mostly like an afterthought (+25)
  • +
+

Structure

+
    +
  • There’s 2 main parts of the game, the battling and the story itself
  • +
  • The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you’re not careful for some of them
  • +
  • In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you’ve already done
  • +
  • As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular “route” which is centered around a particular storyline, each one is also explicitly named in the game’s flowchart. (+20)
  • +
+

Content

+
    +
  • The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the “core” of the plot. Some of them basically lead to nothing and are there just for fun.
  • +
  • Everyone has to play through Last Defense Academy 1 which basically acts as a very long prologue for the actual game
  • +
  • Not Necessary: Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route
  • +
  • I would recommend playing through the prologue, then explicitly following a guide for the Last Defense Academy 2nd Scenario, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)
  • +
+

Technical Execution

+

Its fine overall. You can def. tell they didn’t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)

+

Presentation

+

Was good since I’m a Danganronpa fan. I would’ve liked to see a few more tracks or at least variations in boss fights. It does get a bit repetitive after 100 times… Still a surprising number of lines were voiced so props to them! (+14)

+

(86/100)

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png new file mode 100644 index 0000000..bde1097 Binary files /dev/null and b/micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png differ diff --git a/micro.pinapelz.com/posts/2026-04-26-12-april-playlog/index.html b/micro.pinapelz.com/posts/2026-04-26-12-april-playlog/index.html new file mode 100644 index 0000000..cbdfcb5 --- /dev/null +++ b/micro.pinapelz.com/posts/2026-04-26-12-april-playlog/index.html @@ -0,0 +1,574 @@ + + + + + + + + Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body)

+ + + +
+ + - Permalink +
+
+

I’ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).

+
mirror-switch () {
+    dev=${1:-/dev/video6}
+    nohup ffplay -f v4l2 -framerate 100 -video_size 1920x1080 -i "$dev" \
+        -fflags nobuffer -flags low_delay -framedrop >/dev/null 2>&1 &
+}
+

The delay is actually pretty good, I’m able to play something like Fall Guys on it just fine! Now onto the playlog.

+

No Sleep for Kaname Date – From AI: The Somnium Files

+

This is a spin-off game that takes place in between the first and second AI: The Somnium Files game. Its relatively short.

+

+

+ +
+ + +

+

1. Core Mechanics

+

The game has a similar style to the first and second game, where you enter Sommnium (the dream world) of people to uncover some truth. However, it also introduces an escape room mechanic where you need to solve puzzles to escape a given room. This is essentially the same mechanic as what’s in the “Zero Escape” series, so much so that each escape room opens with the same “Seek a way out” screen.

+

+

+ +
+ + +

+

For the puzzle solving, that’s just entirely dependent on how good you are at reading between the lines. For most of them, once you eventually do figure out how to do it you’ll feel dumb not noticing earlier. The Sommnium exploration segment though is still in my opinion plagued with the issue of where you are sort of just “guessing and checking” based on very loose clues. I suppose that’s intended, but I wish that the correct options to pick become a bit more apparent not just from exploring around Sommnium but also from clues in the real outside world. (+32)

+

2. Structure

+

The progression of the story is near identical to the first and second game. You read through the story visual novel style, then jump into Sommnium. Only now it alternates between Sommnium and an escape room. The challenges in both are well designed and interesting, but I personally felt that some of the escape rooms were a bit random? I mean the rooms bared little relevance to the AI The Sommnium world for the most part (which I wish it did). (+20)

+

3. Content

+

The game follows Kaname Date and AIBA the AI-Ball, who are investigating a new case where Iris Sagan (from the first game) goes missing. A mysterious figure named Akemi tells Iris that she is participating in the “Third Eye Game”.

+

The story explains some details of what’s been going on between the first and second game. Even the tiny details. The story is pretty self-contained for the most part, and its sorta like a mini-adventure. There is indeed an actual twist like every Uchikoshi game so pay attention to your surroundings. Very enjoyable to play through (+15)

+

4. Technical Execution (15)

+

No issues here, plays great on the Switch 2. (+15)

+

5. Presentation (15)

+

In my opinion, the game is a bit on the short side considering the price point. The content is good though. I’d say grab it if its on sale for 40 USD rather than 50 USD (+13)

+

92/100

+
+

Xenoblade 1: DE

+

Covers the base game, not including the DLC.

+

+

+ +
+ + +

+

1. Core Mechanics

+

Combat is much more simple than the second game and for me it sorta gets repetitive quick. Found myself avoiding monsters towards the end of the game. I’d say definetly try playing different characters to keep things fresh. The friendship tree thing is kind of useless and confusing, same with the gemstones. It just feels like they aren’t really needed and just add onto the things to do. In my opinion they should’ve kept it to just upgrading gear and obtaining arts. (+28)

+

2. Structure

+

This game is grindy. Doesn’t matter what people say, you do need to stop and kill stuff as well as do side quests otherwise the enemy level outpaces you fast. This kinda got old for me so what I did was I would grind levels on casual mode and then switch back to normal mode when progressing through the story. Other than that the progression in the game is fairly linear and follows a central plot. The one side quest that may be worth doing is restoring Colony 6 which sorta acts like a big sidequest spanning multiple chapters in the story. Other than just for world building, much of the sidequests are just fetch-quests and are kind of drab. (+15)

+

3. Content

+

I thought the story was just alright for me. It does end up being quite “anime”, I would say it only really ramps up towards the last couple chapters. Before that we’re largely just adventures, adventuring around. It does provide good context for the second game. Shulk as a character definetly has some serious plot armor, even in some cases he just sorta comes back from the dead. Still, I do think the story is worth seeing (+15)

+

4. Technical Execution

+

No issues here, plays great on the Switch 2. (+15)

+

5. Presentation

+

The voice acting and dialogue… it certainly leaves something to be desired. Well the second game sorta suffered the same issue. I played on full English though. YMMV. (+10)

+

83/100

+
+

Catherine Full Body

+

It’s a puzzle game. But more erotic.

+

+

+ +
+ + +

+

1. Core Mechanics

+

Absolutely no qualms here. Its a genius little puzzle game with lots of strategy involved. You’d really have to watch some footage of it to understand how it works. (+35)

+

+

+ +
+ + +

+

2. Structure

+

For me, the puzzles aren’t too repetitive. There’s a nice break in between each one, and each night (after a set of puzzles) you get to watch a bit more of the story. Most of the game outside of the puzzle takes place in the “stray sheep” bar, the best way I can describe it is like Persona 3/4/5 “Free Time” where you can go around talking to your friends or others in the bar. Despite the small area there’s a fair amount of extra lore here, since you’ll start noticing that many of the people you talk to are also the ones appearing in your nightmare.

+

The only thing I didn’t like is that it wasn’t really clear who you had to talk to if you wanted to “progress time”. It may seem a bit confusing, but essentially once you have done everything in the bar, people get up and leave and new people walk in (this effectively progresses the night in free-time). (+23)

+

3. Content

+

The story of the game revolves around the main character Vincent. Its a short game about dealing with societal pressures. I say that but the game is quite funny, and it doesn’t take too long to beat. Vincent himself is a bit of a bozo, most of the game is linear and decided for you up until the very end. Essentially the game has you answer questions that make you reflect on your personal morals, then at the end this decides which ending you get. I don’t think this is a bad thing, but I would’ve liked to see more player agency at different points of the game rather than only at the end. Not a huge deal though (+13).

+

4. Technical Execution

+

The only thing that annoyed me was that for some reason the spike blocks are kinda laggy on the Switch 2? Not sure why. (+14)

+

5. Presentation

+

Based on the start of the game I thought this game would be extremely “goon-bait” but actually it wasn’t. Very fun with lots of replayability (in terms of challenge yourself to puzzles + multiplayer) (+15)

+

If you see this game on sale, definelty give it a try. Not sure if its worth at full-price but when its on sale for less than 10 bucks its a steal!

+

95/100

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/index.html b/micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/index.html new file mode 100644 index 0000000..c6c0c37 --- /dev/null +++ b/micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/index.html @@ -0,0 +1,541 @@ + + + + + + + + Portable Audio: Phone, Wireless DAC, or DAP | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+ +

Portable Audio: Phone, Wireless DAC, or DAP

+ + + +
+ + - Permalink +
+
+

Supposedly, there’s been a resurgence in the popularity of the iPod in the recent months for all sorts of reasons. While I’m well aware of “MP3 Players”, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a “new-gen” audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.

+
+

PREFACE

+

I’ll assume that you already have some basic audiophile knowledge, and that you have your own reasons for maintaining an audio library independent of streaming services.

+
+

I’ve reduced it down to 3 main categories: 1. Using your phone with a dongle DAC (Digital to Analog Converter), 2. Wireless DAC (via Bluetooth), 3. Dedicated DAP. Now that I own one of each, I’d like to share my opinions on each one.

+

Phone with Dongle DAC

+

This is probably something most people are familiar with so I won’t go into too much detail.

+
+ easy access to streaming services
++ excellent user interface (software)
++ excellent audio quality so long as you don't buy a SUPER cheap dongle
+- distractions whether from notifications or having to fiddle with app
+- drains your battery
+- dongles/cables are annoying when tethered to your phone
+- if you maintain your own music library, it will take up additional storage/use data (especially for FLACs)
+- minimal physical button media controls
+

Wireless DAC

+

A wireless DAC is exactly what it sounds like. Rather than a traditional dongle DAC that plugs into your phone, a wireless DAC connects to your phone over Bluetooth. Your headphones/IEMs then plug into the DAC itself which is what makes it a wireless experience.

+

This effectively allows you to use any IEM or Headphone as a wireless one, and provides a largely tangle free experience since you’re free to leave the DAC in your pocket while you take your phone out to do things.

+

For reference I have the FiiO BTR7, so most of the points below will be focused on that.

+
+ connects to phone, so easy streaming, great UI
++ largely tangle-free, you can take your phone in and out of your pockets without the dongle getting in the way
++ can also be used as a wired DAC with PC or phone
++ EQ customization, even if your phone doesn't support it software-wise
++ support for high bit-rate coding technologies (such as Sony's LDAC which supports up to 990kbps) (1)
++ drives high-impedance headphones
+- still drains your battery a lot
+- have to charge it, or else its no better than a dongle DAC
+- better physical button media controls, but for most DACs its minimal
+- can get pricey (relatively to what you are getting)
+- you still need to use data/storage whether you are streaming or listening to files
+

(1) If you're on iOS only AAC is supported, thanks Apple (250-260kbps)

+

This option alone has been excellent for using my IEMs on the go just for the sake of not having to fiddle with a dongle. Usually the battery life on these things are fantastic, and they last a really long time. Most streaming services also likely won’t exceed 990kbps regardless, so its not a huge compromise either.

+

The biggest caveat here is that it suffers from a lot of the same issues with battery and data/storage usage that listening from a smartphone has.

+

Dedicated Audio Player

+

There is a wide variety of DAPs out there. Some of them even run Android which almost makes them a phone. I’ll focus more on a budget option, that being the Snowsky Echo Mini.

+
+ distraction free listening, hassle free in terms of tangling
++ physical buttons to control media + volume
++ stores your music, doesn't take up storage
++ EQ customization
++ looks cool :)
+- need to charge it or else its a brick
+- can get pricey as well, but lots of budget friendly options
+- you'll probably have to buy a micro-sd or equiv. to expand the storage on it
+- need to manually add music to it (duh...)
+- doesn't do streaming (2)
+
+

Side Note

+

Depending on how expensive your DAP is it may have other limitations such as only supporting a certain bit depth or not supporting ReplayGain. If you don’t have a decently organized library this can be annoying to work around

+
+

(2) Some DAPs also have the option to do music streaming, although in my opinion that largely defeats the whole purpose since it would probably be more worth it to pick up a cheap phone just for that

+

Another benefit of the Echo Mini is that it can also be used as a dongle DAC if necessary. The main caveat here is that you need to be good about maintaining/tagging your audio library, and of course you don’t get any audio from your phone (although that’s a plus in terms of cutting out distractions for me, if I need to take a call I’ll just use the built-in speaker as is)

+

Conclusion

+

I find myself using my DAP the most, since it doesn’t drain my phone’s battery and has been helpful in training my patience in terms of not doomscrolling (since I literately will not be able to hear the audio). Although I do usually bring the wireless DAP along too on most days in case I want to watch a video or something. Both devices are tiny so its no big deal.

+ +
+ + + + + + +
+

Webmentions

+
Loading…
+
+ + + + + +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/index.html b/micro.pinapelz.com/posts/index.html new file mode 100644 index 0000000..953da2d --- /dev/null +++ b/micro.pinapelz.com/posts/index.html @@ -0,0 +1,551 @@ + + + + + + + + Posts | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + +
+ + +
+ +

+ Posts + +RSS icon + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ +
+

May 2026

+
    + + +
  • + +
    + : + + + Portable Audio: Phone, Wireless DAC, or DAP + +
    +
  • + + + + + + + + + + + +
+
+ +
+

April 2026

+ +
+ +
+

March 2026

+
    + + +
  • + +
    + : + + + Playlog: Hundred Lines Last Defense Academy + +
    +
  • + + + + + + + + + + + +
+
+ +
+

February 2026

+
    + + +
  • + +
    + : + + + Discord Rant + +
    +
  • + + + + + + + + + + + +
+
+ +
+

December 2025

+
    + + +
  • + +
    + : + + + DBOX Movie Seats + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + Arcade Monsters + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + First MXM 18 Cleared! + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + Enable HID Mode on Nintendo Pro Controller 2 + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + YouTube Music Recap 2025 + +
    +
  • + + + + +
+
+ + +
+ +1 of 2 + + Next Page + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/posts/index.xml b/micro.pinapelz.com/posts/index.xml new file mode 100644 index 0000000..bf543b5 --- /dev/null +++ b/micro.pinapelz.com/posts/index.xml @@ -0,0 +1,105 @@ + + + + Posts on micro.pinapelz.com + https://micro.pinapelz.com/posts/ + Recent content in Posts on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Portable Audio: Phone, Wireless DAC, or DAP + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> + + + Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> + + + Playlog: Hundred Lines Last Defense Academy + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> + + + Discord Rant + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> + + + DBOX Movie Seats + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.com//tags/ffxiv" class="p-category">#ffxiv</a> + + + Arcade Monsters + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> + + + First MXM 18 Cleared! + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.com//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> + + + Enable HID Mode on Nintendo Pro Controller 2 + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> + + + YouTube Music Recap 2025 + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> + + + INIU Power Bank Gets Recall + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> + + + China Town Fair + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> + + + Hello World - Why This + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> + + + diff --git a/micro.pinapelz.com/posts/page/1/index.html b/micro.pinapelz.com/posts/page/1/index.html new file mode 100644 index 0000000..803dfa8 --- /dev/null +++ b/micro.pinapelz.com/posts/page/1/index.html @@ -0,0 +1,9 @@ + + + + https://micro.pinapelz.com/posts/ + + + + + diff --git a/micro.pinapelz.com/posts/page/2/index.html b/micro.pinapelz.com/posts/page/2/index.html new file mode 100644 index 0000000..ff3e49b --- /dev/null +++ b/micro.pinapelz.com/posts/page/2/index.html @@ -0,0 +1,238 @@ + + + + + + + + Posts | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + +
+ + +
+ +

+ Posts + +RSS icon + + +

+ + +
+ + +
+ + + + + + + + + + + +
+ +
+

December 2025

+
    + + +
  • + +
    + : + + + INIU Power Bank Gets Recall + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + China Town Fair + +
    +
  • + + + + + + + + + +
  • + +
    + : + + + Hello World - Why This + +
    +
  • + + + + +
+
+ + +
+ + Previous Page + +2 of 2 + +
+ +
+ +
+ + + + diff --git a/micro.pinapelz.com/sitemap.xml b/micro.pinapelz.com/sitemap.xml new file mode 100644 index 0000000..710170a --- /dev/null +++ b/micro.pinapelz.com/sitemap.xml @@ -0,0 +1,92 @@ + + + + https://micro.pinapelz.com/categories/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/categories/default/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/tags/default/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/posts/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/tags/ + 2026-05-03T03:16:09-07:00 + + https://micro.pinapelz.com/categories/games/ + 2026-04-26T18:20:09-07:00 + + https://micro.pinapelz.com/tags/playlog/ + 2026-04-26T18:20:09-07:00 + + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + 2026-04-26T18:20:09-07:00 + + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + 2026-03-17T17:19:03-07:00 + + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + 2026-02-19T19:17:04-08:00 + + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + 2025-12-31T22:03:51-08:00 + + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + 2025-12-19T22:15:50-08:00 + + https://micro.pinapelz.com/tags/arcade/ + 2025-12-18T21:38:23-08:00 + + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + 2025-12-18T21:38:23-08:00 + + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + 2025-12-06T22:33:23-08:00 + + https://micro.pinapelz.com/tags/code/ + 2025-12-04T23:19:29-08:00 + + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + 2025-12-04T23:19:29-08:00 + + https://micro.pinapelz.com/tags/nintendo/ + 2025-12-04T23:19:29-08:00 + + https://micro.pinapelz.com/categories/tools/ + 2025-12-04T23:19:29-08:00 + + https://micro.pinapelz.com/tags/anime/ + 2025-12-03T19:38:52-08:00 + + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + 2025-12-03T19:38:52-08:00 + + https://micro.pinapelz.com/indie/follows/ + 2025-12-03T01:17:39-08:00 + + https://micro.pinapelz.com/indie/ + 2025-12-03T01:17:39-08:00 + + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + 2025-12-02T19:45:01-08:00 + + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + 2025-12-02T00:22:32-08:00 + + https://micro.pinapelz.com/categories/life/ + 2025-12-02T00:22:32-08:00 + + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + 2025-12-01T20:11:57-08:00 + + diff --git a/micro.pinapelz.com/tags/anime/index.html b/micro.pinapelz.com/tags/anime/index.html new file mode 100644 index 0000000..a8099e4 --- /dev/null +++ b/micro.pinapelz.com/tags/anime/index.html @@ -0,0 +1,106 @@ + + + + + + + + Anime | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Anime + + RSS icon + +

+
+ +

Content linked to the taxonomy term « ANIME »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/anime/index.xml b/micro.pinapelz.com/tags/anime/index.xml new file mode 100644 index 0000000..147c917 --- /dev/null +++ b/micro.pinapelz.com/tags/anime/index.xml @@ -0,0 +1,21 @@ + + + + Anime on micro.pinapelz.com + https://micro.pinapelz.com/tags/anime/ + Recent content in Anime on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Wed, 03 Dec 2025 19:38:52 -0800 + + + YouTube Music Recap 2025 + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-03-04-yt-music-rewind/ + <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> + + + diff --git a/micro.pinapelz.com/tags/arcade/index.html b/micro.pinapelz.com/tags/arcade/index.html new file mode 100644 index 0000000..88530d8 --- /dev/null +++ b/micro.pinapelz.com/tags/arcade/index.html @@ -0,0 +1,120 @@ + + + + + + + + Arcade | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Arcade + + RSS icon + +

+
+ +

Content linked to the taxonomy term « ARCADE »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/arcade/index.xml b/micro.pinapelz.com/tags/arcade/index.xml new file mode 100644 index 0000000..350799e --- /dev/null +++ b/micro.pinapelz.com/tags/arcade/index.xml @@ -0,0 +1,35 @@ + + + + Arcade on micro.pinapelz.com + https://micro.pinapelz.com/tags/arcade/ + Recent content in Arcade on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Thu, 18 Dec 2025 21:38:23 -0800 + + + Arcade Monsters + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-18-07-arcade-monsters-sd/ + <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> + + + First MXM 18 Cleared! + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/ + <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.com//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.com/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> + + + China Town Fair + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/ + <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.com/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> + + + diff --git a/micro.pinapelz.com/tags/code/index.html b/micro.pinapelz.com/tags/code/index.html new file mode 100644 index 0000000..31787a6 --- /dev/null +++ b/micro.pinapelz.com/tags/code/index.html @@ -0,0 +1,106 @@ + + + + + + + + Code | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Code + + RSS icon + +

+
+ +

Content linked to the taxonomy term « CODE »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/code/index.xml b/micro.pinapelz.com/tags/code/index.xml new file mode 100644 index 0000000..98c9ee1 --- /dev/null +++ b/micro.pinapelz.com/tags/code/index.xml @@ -0,0 +1,21 @@ + + + + Code on micro.pinapelz.com + https://micro.pinapelz.com/tags/code/ + Recent content in Code on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Thu, 04 Dec 2025 23:19:29 -0800 + + + Enable HID Mode on Nintendo Pro Controller 2 + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> + + + diff --git a/micro.pinapelz.com/tags/default/index.html b/micro.pinapelz.com/tags/default/index.html new file mode 100644 index 0000000..7f46721 --- /dev/null +++ b/micro.pinapelz.com/tags/default/index.html @@ -0,0 +1,134 @@ + + + + + + + + Default | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Default + + RSS icon + +

+
+ +

Content linked to the taxonomy term « DEFAULT »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/default/index.xml b/micro.pinapelz.com/tags/default/index.xml new file mode 100644 index 0000000..05adfba --- /dev/null +++ b/micro.pinapelz.com/tags/default/index.xml @@ -0,0 +1,49 @@ + + + + Default on micro.pinapelz.com + https://micro.pinapelz.com/tags/default/ + Recent content in Default on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Portable Audio: Phone, Wireless DAC, or DAP + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-29-13-dac-vs-wireless-dap/ + <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> + + + Discord Rant + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-02-19-10-discord-rant/ + <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> + + + DBOX Movie Seats + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-31-09-dbox-review/ + <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> + + + INIU Power Bank Gets Recall + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-02-power-bank-recall/ + <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> + + + Hello World - Why This + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-01-hello-world/ + <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> + + + diff --git a/micro.pinapelz.com/tags/index.html b/micro.pinapelz.com/tags/index.html new file mode 100644 index 0000000..eb9d972 --- /dev/null +++ b/micro.pinapelz.com/tags/index.html @@ -0,0 +1,105 @@ + + + + + + + + Tags | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Tags + + RSS icon + +

+
+ +
+
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/index.xml b/micro.pinapelz.com/tags/index.xml new file mode 100644 index 0000000..1c45ade --- /dev/null +++ b/micro.pinapelz.com/tags/index.xml @@ -0,0 +1,56 @@ + + + + Tags on micro.pinapelz.com + https://micro.pinapelz.com/tags/ + Recent content in Tags on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 03 May 2026 03:16:09 -0700 + + + Default + https://micro.pinapelz.com/tags/default/ + Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/default/ + + + + Playlog + https://micro.pinapelz.com/tags/playlog/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/playlog/ + + + + Arcade + https://micro.pinapelz.com/tags/arcade/ + Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/arcade/ + + + + Code + https://micro.pinapelz.com/tags/code/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/code/ + + + + Nintendo + https://micro.pinapelz.com/tags/nintendo/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/nintendo/ + + + + Anime + https://micro.pinapelz.com/tags/anime/ + Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/tags/anime/ + + + + diff --git a/micro.pinapelz.com/tags/nintendo/index.html b/micro.pinapelz.com/tags/nintendo/index.html new file mode 100644 index 0000000..3027e31 --- /dev/null +++ b/micro.pinapelz.com/tags/nintendo/index.html @@ -0,0 +1,106 @@ + + + + + + + + Nintendo | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Nintendo + + RSS icon + +

+
+ +

Content linked to the taxonomy term « NINTENDO »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/nintendo/index.xml b/micro.pinapelz.com/tags/nintendo/index.xml new file mode 100644 index 0000000..2e42f5e --- /dev/null +++ b/micro.pinapelz.com/tags/nintendo/index.xml @@ -0,0 +1,21 @@ + + + + Nintendo on micro.pinapelz.com + https://micro.pinapelz.com/tags/nintendo/ + Recent content in Nintendo on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Thu, 04 Dec 2025 23:19:29 -0800 + + + Enable HID Mode on Nintendo Pro Controller 2 + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-04-procon2-hid-tool/ + <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> + + + diff --git a/micro.pinapelz.com/tags/playlog/index.html b/micro.pinapelz.com/tags/playlog/index.html new file mode 100644 index 0000000..a01aef7 --- /dev/null +++ b/micro.pinapelz.com/tags/playlog/index.html @@ -0,0 +1,120 @@ + + + + + + + + Playlog | micro.pinapelz.com + + + + + + + + + + + + + + + + + + +
+
+
+ ==============
+ == Pinapelz ==
+ ============== +
+
check it out. I'm in the house like carpet
+
+ +
+ + + +
+
+

+ Playlog + + RSS icon + +

+
+ +

Content linked to the taxonomy term « PLAYLOG »:

+ + + + +
+

Posts

+ +
+
+ +
+ + + + diff --git a/micro.pinapelz.com/tags/playlog/index.xml b/micro.pinapelz.com/tags/playlog/index.xml new file mode 100644 index 0000000..52291c0 --- /dev/null +++ b/micro.pinapelz.com/tags/playlog/index.xml @@ -0,0 +1,35 @@ + + + + Playlog on micro.pinapelz.com + https://micro.pinapelz.com/tags/playlog/ + Recent content in Playlog on micro.pinapelz.com + Hugo + en-us + yukais@pinapelz.com (Pinapelz) + yukais@pinapelz.com (Pinapelz) + Sun, 26 Apr 2026 18:20:09 -0700 + + + Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-04-26-12-april-playlog/ + <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> + + + Playlog: Hundred Lines Last Defense Academy + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ + <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.com/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> + + + Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) + https://micro.pinapelz.com/posts/2025-12-19-08-ffxiv-patch-7-4/ + <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.com//tags/ffxiv" class="p-category">#ffxiv</a> + + + diff --git a/micro.pinapelz.moe/categories/default/index.html b/micro.pinapelz.moe/categories/default/index.html deleted file mode 100644 index 6bbe273..0000000 --- a/micro.pinapelz.moe/categories/default/index.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - Default | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Default - - RSS icon - -

-
- -

Content linked to the taxonomy term « DEFAULT »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/categories/default/index.xml b/micro.pinapelz.moe/categories/default/index.xml deleted file mode 100644 index c1b6323..0000000 --- a/micro.pinapelz.moe/categories/default/index.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - Default on micro.pinapelz.moe - https://micro.pinapelz.moe/categories/default/ - Recent content in Default on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Portable Audio: Phone, Wireless DAC, or DAP - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> - - - Discord Rant - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> - - - DBOX Movie Seats - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> - - - YouTube Music Recap 2025 - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> - - - INIU Power Bank Gets Recall - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> - - - Hello World - Why This - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> - - - diff --git a/micro.pinapelz.moe/categories/games/index.html b/micro.pinapelz.moe/categories/games/index.html deleted file mode 100644 index 4bf24d1..0000000 --- a/micro.pinapelz.moe/categories/games/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - Games | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Games - - RSS icon - -

-
- -

Content linked to the taxonomy term « GAMES »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/categories/games/index.xml b/micro.pinapelz.moe/categories/games/index.xml deleted file mode 100644 index 7b641ea..0000000 --- a/micro.pinapelz.moe/categories/games/index.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - Games on micro.pinapelz.moe - https://micro.pinapelz.moe/categories/games/ - Recent content in Games on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 26 Apr 2026 18:20:09 -0700 - - - Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> - - - Playlog: Hundred Lines Last Defense Academy - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.moe//tags/ffxiv" class="p-category">#ffxiv</a> - - - Arcade Monsters - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> - - - First MXM 18 Cleared! - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.moe//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> - - - diff --git a/micro.pinapelz.moe/categories/index.html b/micro.pinapelz.moe/categories/index.html deleted file mode 100644 index b44b7a8..0000000 --- a/micro.pinapelz.moe/categories/index.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - Categories | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Categories - - RSS icon - -

-
- -
-
-
- -
- - - - diff --git a/micro.pinapelz.moe/categories/index.xml b/micro.pinapelz.moe/categories/index.xml deleted file mode 100644 index a03a527..0000000 --- a/micro.pinapelz.moe/categories/index.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - Categories on micro.pinapelz.moe - https://micro.pinapelz.moe/categories/ - Recent content in Categories on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Default - https://micro.pinapelz.moe/categories/default/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/categories/default/ - - - - Games - https://micro.pinapelz.moe/categories/games/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/categories/games/ - - - - Tools - https://micro.pinapelz.moe/categories/tools/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/categories/tools/ - - - - Life - https://micro.pinapelz.moe/categories/life/ - Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/categories/life/ - - - - diff --git a/micro.pinapelz.moe/categories/life/index.html b/micro.pinapelz.moe/categories/life/index.html deleted file mode 100644 index 774fe28..0000000 --- a/micro.pinapelz.moe/categories/life/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Life | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Life - - RSS icon - -

-
- -

Content linked to the taxonomy term « LIFE »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/categories/life/index.xml b/micro.pinapelz.moe/categories/life/index.xml deleted file mode 100644 index c7e231b..0000000 --- a/micro.pinapelz.moe/categories/life/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Life on micro.pinapelz.moe - https://micro.pinapelz.moe/categories/life/ - Recent content in Life on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Tue, 02 Dec 2025 00:22:32 -0800 - - - China Town Fair - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> - - - diff --git a/micro.pinapelz.moe/categories/tools/index.html b/micro.pinapelz.moe/categories/tools/index.html deleted file mode 100644 index b3d0968..0000000 --- a/micro.pinapelz.moe/categories/tools/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Tools | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Tools - - RSS icon - -

-
- -

Content linked to the taxonomy term « TOOLS »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/categories/tools/index.xml b/micro.pinapelz.moe/categories/tools/index.xml deleted file mode 100644 index f006057..0000000 --- a/micro.pinapelz.moe/categories/tools/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Tools on micro.pinapelz.moe - https://micro.pinapelz.moe/categories/tools/ - Recent content in Tools on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Thu, 04 Dec 2025 23:19:29 -0800 - - - Enable HID Mode on Nintendo Pro Controller 2 - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> - - - diff --git a/micro.pinapelz.moe/css/follows.css b/micro.pinapelz.moe/css/follows.css deleted file mode 100644 index a6673af..0000000 --- a/micro.pinapelz.moe/css/follows.css +++ /dev/null @@ -1,31 +0,0 @@ -.follow-card { - display: flex; - flex-direction: column; - padding: 0.6rem 0.8rem; - margin: 0.6rem 0 0.6rem 0; - background: var(--card-bg, #f9f9f9); - border-radius: 8px; - border: 1px solid #e5e5e5; - font-size: 0.9rem; -} - -.follow-card:hover { - background: var(--card-bg-hover, #f2f2f2); -} - -.follow-target { - font-weight: 600; - text-decoration: none; - color: var(--link-color, #3366cc); - word-break: break-all; -} - -.follow-target:hover { - text-decoration: underline; -} - -.follow-date { - color: #777; - font-size: 0.8rem; - margin-top: 0.25rem; -} diff --git a/micro.pinapelz.moe/css/style.css b/micro.pinapelz.moe/css/style.css deleted file mode 100644 index 4a930c1..0000000 --- a/micro.pinapelz.moe/css/style.css +++ /dev/null @@ -1,296 +0,0 @@ -html { - overflow-y: scroll; -} - -/* 🌸 PASTEL PALETTE */ -:root { - --bgcolor: #fff7fb; - --fontcolor: #3a2c3d; - - --linkcolor: #ff77c8; - --visitedcolor: #d76dff; - - --precolor: #4a3e4f; - --prebgcolor: #ffe6f4; - - --alertbgcolor: #ffe0f1; - --hrcolor: #ffbde6; - - --blockquotecolor: #ffe8f6; - --pcodecolor: #f7d2f0; - - --sitetitlecolor: #ff99dd; - --titlecolor: #c77fff; -} - -/* 🌙 DARK MODE PASTEL NIGHT */ -@media (prefers-color-scheme: dark) { - :root { - --bgcolor: #241b2b; - --fontcolor: #f8e8ff; - - --linkcolor: #ff9be9; - --visitedcolor: #e49cff; - - --precolor: #ffeefe; - --prebgcolor: #35263f; - - --alertbgcolor: #3f304a; - --hrcolor: #f4cfff; - - --blockquotecolor: #3a2b45; - --pcodecolor: #614c70; - - --sitetitlecolor: #ffd1f6; - --titlecolor: #d9a7ff; - } -} - -/* 🌸 TYPO + BASE */ -body { - max-width: 800px; - margin: 40px auto; - padding: 0 10px; - - font: 15px/1.6 "IBM Plex Mono", "Fira Mono", monospace; - color: var(--fontcolor); - background: var(--bgcolor); - - transition: background 0.3s ease, color 0.3s ease; -} - -/* 🌸 LINKS */ -a { - color: var(--linkcolor); - text-decoration: none; - transition: color 0.2s ease, text-shadow 0.2s ease; -} - -a:hover { - color: var(--visitedcolor); - text-shadow: 0 0 6px currentColor; -} - -a:visited { - color: var(--visitedcolor); -} - -/* 🌸 HEADERS */ -h1, h2, h3 { - line-height: 1.25; - color: var(--titlecolor); - margin-top: 1.6rem; - font-weight: 700; -} - -h1.site-title { - color: var(--sitetitlecolor); - text-align: center; - font-size: 2rem; - margin-bottom: 1rem; -} - -/* 🌸 PARAGRAPHS */ -p { - margin-top: 1.3rem; -} - -/* 🌸 INLINE CODE */ -p > code, -li > code { - color: var(--precolor); - background: var(--pcodecolor); - padding: 3px 5px; - border-radius: 6px; -} - -/* 🌸 FULL CODE */ -code { - color: var(--precolor); - background: var(--prebgcolor); - padding: 3px 5px; - border-radius: 6px; -} - -pre { - color: var(--precolor); - background: var(--prebgcolor); - padding: 24px; - overflow-x: auto; - border-radius: 12px; - box-shadow: 0 0 10px rgba(255, 180, 220, 0.25); -} - -/* 🌸 ARTICLES */ -article { - padding: 24px 0; -} - -/* 🌸 IMAGES */ -img { - display: block; - max-width: 100%; - height: auto; - margin: auto; - border-radius: 12px; -} - -/* cute avatar */ -.avatar { - width: 100px; - height: 100px; - border-radius: 50%; - box-shadow: 0 0 8px rgba(255, 140, 200, 0.4); - border: 4px solid var(--bgcolor); - transition: transform 0.3s ease; -} - -/* Banner with overlay avatar */ -.banner { - position: relative; - margin-bottom: 1rem; -} - -.banner img:first-child { - width: 100%; - max-width: 600px; - height: auto; - border-radius: 8px; - opacity: 0.85; -} - -.banner .avatar { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 2; - width: 120px; - height: 120px; - box-shadow: 0 0 20px rgba(255, 140, 200, 0.6); -} - -.banner .avatar:hover { - transform: translate(-50%, -50%) scale(1.05); -} - -/* 🌸 ALERTS */ -.alert { - color: var(--fontcolor); - background: var(--alertbgcolor); - padding: 20px; - border-radius: 12px; - box-shadow: 0 0 12px rgba(255, 180, 220, 0.3); - overflow-x: auto; -} - -/* 🌸 NEXT/PREV */ -.article-nextprev { - display: flex; - flex-flow: row wrap-reverse; - justify-content: space-between; -} - -/* 🌸 DIVIDERS */ -hr { - margin: 35px 33% 15px; - border-color: var(--hrcolor); - border-width: 3px; - border-radius: 3px; -} - -hr.small { - margin: 35px 44% 25px; - border: 1px dashed var(--hrcolor); -} - -/* 🌸 BLOCKQUOTE */ -blockquote { - background: var(--blockquotecolor); - margin: 1.2rem 0; - padding: 12px 20px; - border-radius: 12px; - box-shadow: 0 0 8px rgba(255, 200, 240, 0.25); - border-left: 4px solid var(--hrcolor); -} - -/* 🌸 LISTS */ -ol, ul { - padding-left: 1.1rem; -} - -ol > li, -ul > li { - margin-bottom: 0.8rem; -} - -ul > li { - list-style-type: disclosure-closed; -} - -/* 🌸 TABLES */ -table { - text-align: left; - border: 1px solid var(--hrcolor); - border-radius: 10px; - overflow: hidden; -} - -thead th, tfoot th, tfoot td { - padding: 6px 10px; - background-color: var(--alertbgcolor); - color: var(--titlecolor); -} - -td { - padding: 8px 10px; -} - -tbody tr:nth-child(even) { - background-color: var(--alertbgcolor); -} - -/* 🌸 RESPONSIVE MOE */ -@media all and (max-width: 800px) { - .bio-card .bio { - justify-content: space-around; - flex-direction: column; - } - .bio-card .bio > img { - align-self: center; - margin: auto; - } - .bio-card .bio > p { - align-self: center; - text-align: center; - } - - /* Smaller avatar on mobile */ - .banner .avatar { - width: 90px; - height: 90px; - } - - .banner img:first-child { - border-radius: 6px; - } -} - -/* PRINT */ -@media print { - a, a:visited { - color: #000; - text-decoration: none; - } - a::after { - content: " (" attr(href) ") "; - } - nav, footer, hr, .noprint { - display: none !important; - } - pre, blockquote, code { - background: #fff; - border: none; - box-shadow: none; - } -} diff --git a/micro.pinapelz.moe/index.html b/micro.pinapelz.moe/index.html deleted file mode 100644 index 48c7a75..0000000 --- a/micro.pinapelz.moe/index.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - micro.pinapelz.moe | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - -
-
-

micro.pinapelz.moe

- - - -
-

yo! and he's more than a cover he's a quilt
- General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)
- Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)
- I Watch only slice of life (and Bandori)
- Arch Linux + Hyprland user (btw)
- Hi from the indieweb, if you are seeing me bridged elsewhere!

-
-

Pinapelz

-
-
- - -
-

Portable Audio: Phone, Wireless DAC, or DAP

- - - default - -
-

Supposedly, there’s been a resurgence in the popularity of the iPod in the recent months for all sorts of reasons. While I’m well aware of “MP3 Players”, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a “new-gen” audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.

- - Read more... - -
-
- - -
-

Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body)

- - - playlog - -
-

I’ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).

- - Read more... - -
-
- - -
-

Playlog: Hundred Lines Last Defense Academy

- - - playlog - -
-

After about a year of playing on and off, I’ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. -

105 hours or more played -
-

-

Core Mechanics

-
    -
  • This is basically a visual novel, there’s very little fun to be had if you are a “cutscene skipper”. If you enjoyed Kodaka’s other works like Danganronpa then you’ll be right at home.
  • -
  • There’s a bunch of smaller “minigames” but are mostly a one-off thing, they feel mostly like an afterthought (+25)
  • -
-

Structure

-
    -
  • There’s 2 main parts of the game, the battling and the story itself
  • -
  • The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you’re not careful for some of them
  • -
  • In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you’ve already done
  • -
  • As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular “route” which is centered around a particular storyline, each one is also explicitly named in the game’s flowchart. (+20)
  • -
-

Content

-
    -
  • The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the “core” of the plot. Some of them basically lead to nothing and are there just for fun.
  • -
  • Everyone has to play through which basically acts as a very long prologue for the actual game
  • -
  • Not Necessary: Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route
  • -
  • I would recommend playing through the prologue, then explicitly following a guide for the , then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)
  • -
-

Technical Execution

-

Its fine overall. You can def. tell they didn’t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)

- - Read more... - -
-
- - -
-

Discord Rant

- - - default - -
-

We’ve seen time and time again that there is “no such thing as a free lunch”. The same is true for Discord.

-
    -
  1. Offer a service that is much better than all the competitors
  2. -
  3. Attract a bunch of users
  4. -
  5. Burn VC money
  6. -
  7. Repeat 1-3 until its time to pay them back
  8. -
  9. Figure out how to make money
  10. -
-

Nitro doesn’t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to “what value do I get out of it”.

- - Read more... - -
-
- - -
-

DBOX Movie Seats

- - - default - -
-

There’s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.

-

I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn’t a bad experience but given the markup, I don’t think its worth it:

-
    -
  • First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble
  • -
  • However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying
  • -
  • For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I’d much rather just go to a theater that has the big comfy recliner seats
  • -
  • I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you’re really looking forward to
  • -
  • Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?
  • -
-

Generally, though… I think I’ll live without them.

- -
-
- - -
-

Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers)

- - - playlog - -
-

This is primarily focused on the content of the patch, not so much the features they’ve added.

-

Story

-
    -
  • Mistwake Dungeon was a good difficulty. Although I’m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.
  • -
  • Cutscene quality def. got better. As in animations and uniqueness.
  • -
  • Love the look and feel (Treno). There’s a ton of good spots for “gpose-ing”. Music is nice too.
  • -
  • Seriously Krile? You parents were the ones who dropped you into the Source. I don’t think they’d care if you wanted to stay in the Source (just make up your mind) -> well glad that got sorted out
  • -
  • “Hell on Rails” Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the “sucking” mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.
  • -
  • The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.
  • -
  • The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth’s meteor.
  • -
  • Cool so we just get to keep the key. If this were any bit realistic, we’ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story… Well I guess it can go either way.
  • -
  • I’m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn’t something more unique.
  • -
  • And what do you know. Ascians. I hope we get something unqiue for 8.0… I guess thats fine but please lets not have it just be SHB all over again.
  • -
-

Raid

-
    -
  • “Feral Fandom” -> Yep thats FF14 NA playerbase for you.
  • -
  • Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we’d stop with mechanics that are designed to trick people even when read correctly.
  • -
  • Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.
  • -
  • Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.
  • -
  • Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There’s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe…
  • -
  • Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.
  • -
  • Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!
  • -
-

Misc

-
    -
  • The new Frontline map is “dangerous”. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they’re needed too (to spice things up/allow for a turning point).
  • -
  • The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -> B (but partially I guess this is done cause the map does feel smaller than Onsal).
  • -
- - -#ffxiv - -
-
- - -
-

Arcade Monsters

- - - arcade - -
-

If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I’ve found is taking the Pacific Surfliner train down to San Diego.

-

Getting There

-

There are a number of departures in the morning, and while not as fast as a car when there’s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.

- - Read more... - -
-
- - -
-

First MXM 18 Cleared!

- - - arcade - -
-

Cleared my first 18 difficulty chart in - -#sdvx -

-

Albeit its not a very difficult one, but I think I’m finally starting to chip away at the 17-18 difficulty wall. -

Sound Voltex Enchant 6 Clear -
-

- -
-
- - -
-

Enable HID Mode on Nintendo Pro Controller 2

- - - code - - nintendo - -
-

Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn’t work out of box on PC (Linux) for me like it’s predacessor. Until there’s actual better driver support for this thing in the kernel (or Valve does something), here’s a hacky Python script to initialize HID-mode on the controller

-

Steps

- - Read more... - -
-
- - -
-

YouTube Music Recap 2025

- - - anime - -
-

Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.

-
YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia -
- -
-
- - -
- -1 of 2 - - Next Page - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/index.xml b/micro.pinapelz.moe/index.xml deleted file mode 100644 index bd38adb..0000000 --- a/micro.pinapelz.moe/index.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - micro.pinapelz.moe - https://micro.pinapelz.moe/ - Recent content on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Portable Audio: Phone, Wireless DAC, or DAP - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> - - - Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> - - - Playlog: Hundred Lines Last Defense Academy - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> - - - Discord Rant - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> - - - DBOX Movie Seats - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.moe//tags/ffxiv" class="p-category">#ffxiv</a> - - - Arcade Monsters - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> - - - First MXM 18 Cleared! - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.moe//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> - - - Enable HID Mode on Nintendo Pro Controller 2 - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> - - - YouTube Music Recap 2025 - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> - - - Follows - https://micro.pinapelz.moe/indie/follows/ - Wed, 03 Dec 2025 01:17:39 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/indie/follows/ - <p>Here are all the pages/accounts I follow.</p> <p>This is mostly here for pages that can receive <a href="https://indieweb.org/webmention">Webmentions</a> and the <a href="https://fed.brid.gy">Bridgy Fed</a> service.</p> <h2 id="fediverse">Fediverse</h2> <p> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@Mofumatic"> https://sakurajima.moe/@Mofumatic </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mathstodon.xyz/@tao"> https://mathstodon.xyz/@tao </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@chikorita157"> https://sakurajima.moe/@chikorita157 </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@sakurajima"> https://sakurajima.moe/@sakurajima </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://floss.social/@kde"> https://floss.social/@kde </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@gamingonlinux"> https://mastodon.social/@gamingonlinux </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://threads.net/@nintendeal"> https://threads.net/@nintendeal </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@Mastodon"> https://mastodon.social/@Mastodon </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://jvns.ca/@b0rk"> https://jvns.ca/@b0rk </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://tippy.rabbithouse.garden/@serebii"> https://tippy.rabbithouse.garden/@serebii </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://retro.pizza/@outofprintarchive"> https://retro.pizza/@outofprintarchive </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://peoplemaking.games/@nindiespotlight"> https://peoplemaking.games/@nindiespotlight </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> </p> <h2 id="bluesky">Bluesky</h2> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://bsky.app/profile/anew.social"> https://bsky.app/profile/anew.social </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <blockquote> <p>Learn more about the <a href="https://indieweb.org">Indieweb</a></p> - - - INIU Power Bank Gets Recall - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> - - - China Town Fair - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> - - - Hello World - Why This - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> - - - diff --git a/micro.pinapelz.moe/indie/follows/index.html b/micro.pinapelz.moe/indie/follows/index.html deleted file mode 100644 index a2d2502..0000000 --- a/micro.pinapelz.moe/indie/follows/index.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - Follows | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Follows

-
-

Here are all the pages/accounts I follow.

-

This is mostly here for pages that can receive Webmentions and the Bridgy Fed service.

-

Fediverse

-

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-

Bluesky

- - - - - -
-

Learn more about the Indieweb

-
- -
- - - - - - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/indie/index.html b/micro.pinapelz.moe/indie/index.html deleted file mode 100644 index 6f09757..0000000 --- a/micro.pinapelz.moe/indie/index.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - Indies | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - -
- - -
- -

- Indies - -RSS icon - - -

- - -
- - -
- - - - - - - - - - - -
- -
-

December 2025

-
    - - -
  • - -
    - : - - - Follows - -
    -
  • - - - - -
-
- - -
- -1 of 1 - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/indie/index.xml b/micro.pinapelz.moe/indie/index.xml deleted file mode 100644 index e338b2d..0000000 --- a/micro.pinapelz.moe/indie/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Indies on micro.pinapelz.moe - https://micro.pinapelz.moe/indie/ - Recent content in Indies on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Wed, 03 Dec 2025 01:17:39 -0800 - - - Follows - https://micro.pinapelz.moe/indie/follows/ - Wed, 03 Dec 2025 01:17:39 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/indie/follows/ - <p>Here are all the pages/accounts I follow.</p> <p>This is mostly here for pages that can receive <a href="https://indieweb.org/webmention">Webmentions</a> and the <a href="https://fed.brid.gy">Bridgy Fed</a> service.</p> <h2 id="fediverse">Fediverse</h2> <p> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@Mofumatic"> https://sakurajima.moe/@Mofumatic </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mathstodon.xyz/@tao"> https://mathstodon.xyz/@tao </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@chikorita157"> https://sakurajima.moe/@chikorita157 </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://sakurajima.moe/@sakurajima"> https://sakurajima.moe/@sakurajima </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://floss.social/@kde"> https://floss.social/@kde </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@gamingonlinux"> https://mastodon.social/@gamingonlinux </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://threads.net/@nintendeal"> https://threads.net/@nintendeal </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://mastodon.social/@Mastodon"> https://mastodon.social/@Mastodon </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://jvns.ca/@b0rk"> https://jvns.ca/@b0rk </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://tippy.rabbithouse.garden/@serebii"> https://tippy.rabbithouse.garden/@serebii </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://retro.pizza/@outofprintarchive"> https://retro.pizza/@outofprintarchive </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://peoplemaking.games/@nindiespotlight"> https://peoplemaking.games/@nindiespotlight </a> <time class="follow-date dt-published" datetime="2025-12-04T00:00:00Z"> 2025-12-04 </time> </div> </p> <h2 id="bluesky">Bluesky</h2> <div class="follow-card"> <a class="follow-target u-follow-of" href="https://bsky.app/profile/anew.social"> https://bsky.app/profile/anew.social </a> <time class="follow-date dt-published" datetime="2025-12-03T00:00:00Z"> 2025-12-03 </time> </div> <blockquote> <p>Learn more about the <a href="https://indieweb.org">Indieweb</a></p> - - - diff --git a/micro.pinapelz.moe/indie/likes/follows/index.html b/micro.pinapelz.moe/indie/likes/follows/index.html deleted file mode 100644 index 08fdbfc..0000000 --- a/micro.pinapelz.moe/indie/likes/follows/index.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - Follows | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Follows

-
-

Here are all the pages/accounts I follow.

-

This is mostly here for pages that can receive Webmentions and the Bridgy Fed service.

-

Fediverse

-

- - -

- - - - - - - - - - - - - - - - - - - - - - - - - -

-

Bluesky

-

- - -

- - - - - -

-
-

Learn more about the Indieweb

-
- -
- - - - - - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/indie/page/1/index.html b/micro.pinapelz.moe/indie/page/1/index.html deleted file mode 100644 index cdf2090..0000000 --- a/micro.pinapelz.moe/indie/page/1/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - https://micro.pinapelz.moe/indie/ - - - - - diff --git a/micro.pinapelz.moe/page/1/index.html b/micro.pinapelz.moe/page/1/index.html deleted file mode 100644 index cc34fa8..0000000 --- a/micro.pinapelz.moe/page/1/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - https://micro.pinapelz.moe/ - - - - - diff --git a/micro.pinapelz.moe/page/2/index.html b/micro.pinapelz.moe/page/2/index.html deleted file mode 100644 index c25e8fd..0000000 --- a/micro.pinapelz.moe/page/2/index.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - micro.pinapelz.moe | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - -
-
-

micro.pinapelz.moe

- - - -
-

yo! and he's more than a cover he's a quilt
- General arcade rhythm game enjoyer (SDVX, IIDX, CHUNITHM)
- Mostly play MMOs (FFXIV, OSRS), JRPGs, and VNs (anything with a good story)
- I Watch only slice of life (and Bandori)
- Arch Linux + Hyprland user (btw)
- Hi from the indieweb, if you are seeing me bridged elsewhere!

-
-

Pinapelz

-
-
- - -
-

INIU Power Bank Gets Recall

- - - default - -
-

It would seem that I, along with what seems like the entirety of Reddit bought the same cheap 10000mAh power bank and now its getting recalled.

-

I wonder if it has anything to do with the poor quality they found in that viral Haribo Powerbank. Not sure since I’ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.

- - Read more... - -
-
- - -
-

China Town Fair

- - - arcade - -
-

Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.

-
China Town Fair Outside -
- -

Also yep you’re reading that right, it indeed once home to a dancing chicken as well as one that played tic tac toe.

-

But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.

- - Read more... - -
-
- - -
-

Hello World - Why This

- - - default - -
-

I think having control of your own data is great. The same is true for decentralized social media. I’ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and “decentralized” approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of “social media”.

-

Twitter/X

-

This is fairly self explanatory. The rebranding of Twitter to X and Musk’s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn’t a particular fan of. You can’t view anything without signing in either, so goodbye viewing stuff anonymously. There’s just a lot of “features” here I’m not a fan of. Needless to say, there’s a lot of reasons to not post stuff there.

- - Read more... - -
-
- - -
- - Previous Page - -2 of 2 - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-01-hello-world/index.html b/micro.pinapelz.moe/posts/2025-12-01-hello-world/index.html deleted file mode 100644 index 779d6dd..0000000 --- a/micro.pinapelz.moe/posts/2025-12-01-hello-world/index.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - - Hello World - Why This | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Hello World - Why This

- - - -
- - - Permalink -
-
-

I think having control of your own data is great. The same is true for decentralized social media. I’ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and “decentralized” approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of “social media”.

-

Twitter/X

-

This is fairly self explanatory. The rebranding of Twitter to X and Musk’s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn’t a particular fan of. You can’t view anything without signing in either, so goodbye viewing stuff anonymously. There’s just a lot of “features” here I’m not a fan of. Needless to say, there’s a lot of reasons to not post stuff there.

-

Fediverse

-

I initially moved to the Fediverse (on Misskey/Sharkey). Interoperability between different platforms is very cool, and the wide variety of platforms to choose from means that picking any platform never made me feel like “missing out” elsewhere.

-

However, this in itself has a problem. If you create an account on someone else’s instance, you are a part of their walled garden. Now I’m sure that they are a wonderful person who equally values data ownership/agency, however it doesn’t change the fact that someone else holds your content/data and you rely on them for that service.

-

So then the alternative here is self-hosting a single person instance. This solves everything, BUT the fact that its quite expensive to pay for the bandwidth + storage if you are a small instance and end up federating with a lot of instances. This wasn’t a compromise I wanted, since the name of the game with the Fediverse is being able to connect cross-platform. Great if you have the resources, but not particularly worth it for a single person starting fresh. There’s not really a good way to handle this right now, which is why federation with a very large platform like Threads is limited.

-

Bluesky

-

Bluesky is one of the drop-in alternatives for Twitter. Its built on the AT-Protocol, which does actually solve a lot of the problems of ActivityPub (Fediverse) in terms of handling small self-hosted instance with large ones. -AtProto allows you to host a PDS (Personal Data Server) which stores all your own posts, profile info, and follows. This boils down to meaning that you really only need to be responsible for serving your own content, which you also own on your own machine. There’s also a lot of fine-grain features that help with not getting overwhelmed by firehose traffic.

-

While this is great, the issue is that the service is not truly “federated” (yet?). Its still early days for the platform and protocol, Most people are still on bsky.social. This means that to get anything to read at all you’d still need to pull from the big central relay. Even if we were successful in this, its not entirely clear what the costs would be for running all these components together (is it even worth it for a single person?). I think AtProto is promising, but its still early days and who knows where it’ll go…

-

Now What

-

Its time to try something new. From a surface view the idea of IndieWeb is a good solution from the perspective of creating the content. You basically just build a website/blog (which nowadays is dirt cheap to host something static), you then just add some special HTML (microformats) and now you’ve got a common protocol similar to a post (only now you can leverage the power of HTML/CSS and customize it however you want). Then implemtning webmentions gives the ability for other people to interact with your content. Using a bridging/syndication service like Bridgy Fed you can post to the Fediverse and Bluesky as well as allow others from there to interact with your post.

-

So that’s what this is. Let’s see how it goes.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/gloves.webp b/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/gloves.webp deleted file mode 100644 index fd42b6c..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/gloves.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/index.html b/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/index.html deleted file mode 100644 index d19c277..0000000 --- a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/index.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - China Town Fair | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

China Town Fair

- - - -
- - - Permalink -
-
-

Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.

-
China Town Fair Outside -
- -

Also yep you’re reading that right, it indeed once home to a dancing chicken as well as one that played tic tac toe.

-

But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.

-

Then it re-opened under new management and became a complete shell of its former self. These days its pretty much all redemption slop in there. Very few actual “games” in there; there’s a DDR A3 cab, PIU, a singular jubeat with a broken audio mod, a fully broken down SDVX Nemsys, and 3 Wangan 5DX+ (not sure what happened to the 4th one).

-
China Town Fair Inside -
- -

Anyways, its pretty tiny in there and feels like its not doing amazing. A single credit for jubeat was like 3-4 USD I think, and one of the machines to reload cards was fully broken down (tbh just go to Round1 and play).

-

If you want some actual rhythm games though, walk like 6 minutes and the newly opened “Akiba House” store has private networked maimai DX, WACCA (modded), and CHUNITHM.

-
Chinese maimai gloves -
- -

Also I was absolutely not ready for the New York winter temps. Thankfully I always keep my rhythm game gloves on me which saved my hands from freezing.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/inside-ctf.webp b/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/inside-ctf.webp deleted file mode 100644 index d08d15f..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/inside-ctf.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp b/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp deleted file mode 100644 index aacc4e2..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/index.html b/micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/index.html deleted file mode 100644 index d2d503f..0000000 --- a/micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/index.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - - - INIU Power Bank Gets Recall | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

INIU Power Bank Gets Recall

- - - -
- - - Permalink -
-
-

It would seem that I, along with what seems like the entirety of Reddit bought the same cheap 10000mAh power bank and now its getting recalled.

-

I wonder if it has anything to do with the poor quality they found in that viral Haribo Powerbank. Not sure since I’ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.

-

But I’d definetly prefer for it not to blow up on me

-

Here’s the full notice:

-
-

Dear Amazon Customer,

-

We have learned of a potential safety issue regarding certain product(s) that our records indicate you purchased through the Amazon.com website.

-

For more details on what you should do, please contact INIU at recall@iniu.shop.

-

Product: INIU Portable Charger, Slimmest 10000mAh 5V/3A Power Bank, USB C in&out High-Speed Charging Battery Pack, External Phone Powerbank Compatible with iPhone 16 15 14 13 12 Samsung S22 S21 Google iPad etc

-

If you made this purchase for someone else, please notify the recipient immediately and provide them with the information.

-

We regret any inconvenience this may cause you but trust you will understand that the safety and satisfaction of our customers is our highest priority.

-
- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/index.html b/micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/index.html deleted file mode 100644 index 1d1e1a0..0000000 --- a/micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/index.html +++ /dev/null @@ -1,492 +0,0 @@ - - - - - - - - YouTube Music Recap 2025 | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

YouTube Music Recap 2025

- - - -
- - - Permalink -
-
-

Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.

-
YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia -
- - -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/index.html b/micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/index.html deleted file mode 100644 index 921301e..0000000 --- a/micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/index.html +++ /dev/null @@ -1,634 +0,0 @@ - - - - - - - - Enable HID Mode on Nintendo Pro Controller 2 | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Enable HID Mode on Nintendo Pro Controller 2

- - - -
- - - Permalink -
-
-

Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn’t work out of box on PC (Linux) for me like it’s predacessor. Until there’s actual better driver support for this thing in the kernel (or Valve does something), here’s a hacky Python script to initialize HID-mode on the controller

-
# I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?
-import usb.core # install pyusb first: pip install pyusb
-import usb.util
-import time
-import sys
-
-VENDOR_ID = 0x057E
-PRODUCT_IDS = {
-    0x2066: "Joy-Con (L)",
-    0x2067: "Joy-Con (R)",
-    0x2069: "Pro Controller",
-    0x2073: "GCN Controller"
-}
-
-USB_INTERFACE_NUMBER = 1
-
-INIT_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x0d, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
-UNKNOWN_COMMAND_0x07 = bytes([0x07, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
-UNKNOWN_COMMAND_0x16 = bytes([0x16, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
-REQUEST_CONTROLLER_MAC = bytes([0x15, 0x91, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
-LTK_REQUEST = bytes([0x15, 0x91, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
-UNKNOWN_COMMAND_0x15_ARG_0x03 = bytes([0x15, 0x91, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00])
-UNKNOWN_COMMAND_0x09 = bytes([0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
-IMU_COMMAND_0x02 = bytes([0x0c, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00])
-OUT_UNKNOWN_COMMAND_0x11 = bytes([0x11, 0x91, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00])
-UNKNOWN_COMMAND_0x0A = bytes([0x0a, 0x91, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
-IMU_COMMAND_0x04 = bytes([0x0c, 0x91, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00])
-ENABLE_HAPTICS = bytes([0x03, 0x91, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00])
-OUT_UNKNOWN_COMMAND_0x10 = bytes([0x10, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00])
-OUT_UNKNOWN_COMMAND_0x01 = bytes([0x01, 0x91, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00])
-OUT_UNKNOWN_COMMAND_0x03 = bytes([0x03, 0x91, 0x00, 0x01, 0x00, 0x00, 0x00])
-OUT_UNKNOWN_COMMAND_0x0A_ALT = bytes([0x0a, 0x91, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00])
-
-def send_usb_data(ep_out, ep_in, data, description=""):
-    try:
-        ep_out.write(data)
-        time.sleep(0.01)
-        try:
-            response = ep_in.read(32, timeout=100)
-            hex_resp = " ".join([f"{x:02x}" for x in response])
-            print(f"[{description}] Response: {hex_resp}")
-        except usb.core.USBError as e:
-            if e.errno == 110:
-                print(f"[{description}] No response (Timeout)")
-            else:
-                print(f"[{description}] Read Error: {e}")
-
-    except usb.core.USBError as e:
-        print(f"[{description}] Write Error: {e}")
-        raise
-
-def set_player_leds(ep_out, ep_in, led_mask):
-    command = [
-        0x09, 0x91, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00,
-        led_mask,
-        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-    ]
-    send_usb_data(ep_out, ep_in, bytes(command), f"Set LED Mask: 0x{led_mask:02x}")
-
-def connect_usb():
-    print("Searching for Nintendo Switch Controllers...")
-    def match_device(dev):
-        return dev.idVendor == VENDOR_ID and dev.idProduct in PRODUCT_IDS
-    dev = usb.core.find(custom_match=match_device)
-    if dev is None:
-        raise ValueError("Device not found")
-
-    product_name = PRODUCT_IDS.get(dev.idProduct, "Unknown Device")
-    print(f"Found {product_name} (ID: {dev.idProduct:04x})")
-    if dev.is_kernel_driver_active(USB_INTERFACE_NUMBER):
-        try:
-            print("Detaching kernel driver...")
-            dev.detach_kernel_driver(USB_INTERFACE_NUMBER)
-        except usb.core.USBError as e:
-            sys.exit(f"Could not detach kernel driver: {e}")
-    try:
-        dev.set_configuration()
-        print("Configuration set.")
-    except usb.core.USBError as e:
-        print(f"Error setting configuration: {e}")
-    try:
-        usb.util.claim_interface(dev, USB_INTERFACE_NUMBER)
-        print(f"Interface {USB_INTERFACE_NUMBER} claimed.")
-    except usb.core.USBError as e:
-        sys.exit(f"Could not claim interface: {e}")
-    cfg = dev.get_active_configuration()
-    intf = cfg[(USB_INTERFACE_NUMBER,0)]
-    ep_out = usb.util.find_descriptor(
-        intf,
-        custom_match = lambda e:  usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT)
-
-    ep_in = usb.util.find_descriptor(
-        intf,
-        custom_match =
-        lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN
-    )
-
-    if not ep_out:
-        sys.exit("Could not find OUT endpoint")
-
-    print(f"Found Endpoint OUT: 0x{ep_out.bEndpointAddress:02x}")
-    print("Starting Initialization Sequence...")
-
-    try:
-        send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, "Init 0x03")
-        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, "Unknown 0x07")
-        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, "Unknown 0x16")
-        send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, "Req MAC")
-        send_usb_data(ep_out, ep_in, LTK_REQUEST, "Req LTK")
-        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, "Unknown 0x15")
-        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, "Unknown 0x09")
-        send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, "IMU 0x02")
-        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, "OUT Unknown 0x11")
-        send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, "Unknown 0x0A")
-        send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, "IMU 0x04")
-        send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, "Enable Haptics")
-        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, "OUT Unknown 0x10")
-        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, "OUT Unknown 0x01")
-        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, "OUT Unknown 0x03")
-        send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, "OUT Unknown 0x0A Alt")
-        set_player_leds(ep_out, ep_in, 0x0F)
-
-        print("Controller initialization sequence complete! All LEDs should be on.")
-
-    except Exception as e:
-        print(f"Error during sequence: {e}")
-
-if __name__ == "__main__":
-    try:
-        connect_usb()
-    except ValueError as e:
-        print(e)
-    except Exception as e:
-        print(f"Unexpected error: {e}")
-

Steps

-
    -
  1. (Optional) First Create a virtual environment
  2. -
  3. Install pyusb via pip install pyusb
  4. -
  5. Plug your Pro Controller 2 in via USB
  6. -
  7. Run the script
  8. -
-

If all 4 of the player indicator LEDs light up (the square ones near the charging port), then that means you should be good to go!

-

You’ll need to re-run this script each time you plug/unplug or restart your machine.

-

This is pretty much a copy of the online Procon 2 Enabler Tool but WebHID is dodgy on the Firefox fork I’m using, plus its annoying having to open this page each time.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp b/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp deleted file mode 100644 index 83768f7..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/index.html b/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/index.html deleted file mode 100644 index f566c15..0000000 --- a/micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/index.html +++ /dev/null @@ -1,496 +0,0 @@ - - - - - - - - First MXM 18 Cleared! | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

First MXM 18 Cleared!

- - - -
- - - Permalink -
-
-

Cleared my first 18 difficulty chart in - -#sdvx -

-

Albeit its not a very difficult one, but I think I’m finally starting to chip away at the 17-18 difficulty wall. -

Sound Voltex Enchant 6 Clear -
-

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp deleted file mode 100644 index 6f30510..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab1.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp deleted file mode 100644 index 6b5f02f..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/cab2.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp deleted file mode 100644 index c15d1f5..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/danevo.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/index.html b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/index.html deleted file mode 100644 index 8fcdded..0000000 --- a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/index.html +++ /dev/null @@ -1,537 +0,0 @@ - - - - - - - - Arcade Monsters | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Arcade Monsters

- - - -
- - - Permalink -
-
-

If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I’ve found is taking the Pacific Surfliner train down to San Diego.

-

Getting There

-

There are a number of departures in the morning, and while not as fast as a car when there’s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.

-

Once you get there, you can either take the trolley or walk 20 minutes to the arcade. I prefer the walk since you can grab some food/coffee on the way.

-

Plus the view is excellent.

-

Ocean view from the Pacific Surfliner -
- -
Ocean view from the Pacific Surfliner -
-

-

Value

-

So is this trip worth it and what is the cost?

-

Arcade Monsters games operate all on “Free Play”, you pay a set fee for entry and can stay for as long as you’d like. Its $25 to enter, or $35 if you want to be able to leave and come back.

-

Since there aren’t exactly a lot of “retro” arcades anymore, I’ll compare the value proposition here to Round1:

-

At Round1 a standard rhythm games is roughly 8.6 credits per play. If we estimate the value of a Round1 credit to be around $0.15 (assuming standard non-member $120 package for 777 credits), this would put 1 play at around $1.29. This means it takes roughly 20 plays to hit $25.

-

Let’s also say that a single play at any rhythm game takes roughly 10 minutes. Assuming you continuously played games This means $25 of Round1 credits would last you roughly 3.3 hours. So just this on its own, without considering anything else I’d say that this is great value just on its own.

-

But if you were to include transportation costs, assuming around $60 for a round-trip ticket via train, it becomes a little more difficult to justify since for the same price since you’d be able to play 46 rounds of something else at Round1.

-

However, with the variety of games in there (even rarer ones), I’d say this is still an excellent trip. I personally could easily stay 5+ hours in there (cause I’m a degenerate and they also sell food + drinks in there).

-
Arcade Cabinets -
- -

Quality

-

Most of the retro stuff is very well maintained and in great working condition. Also many of the modern games are networked and have card saving features.

-

However, it’d be dishonest to say that these cabs are in excellent condition:

-
    -
  • The Sound Voltex knobs are basically falling off, the switches don’t feel great
  • -
  • The pads ghosts on Dancerush and the navigation keys are broken
  • -
  • FutureTomTom drums have sensitivity issues
  • -
  • Small things like how the stool for Ongeki doesn’t match the height of the standard seat.
  • -
-

Also it gets busy in there and is also a popular spot for families (kids get loud).

-
Arcade Cabinets -
- -

Conclusion

-

Overall, as a once in a while its great value. You get to try out a ton of games, some of which are even considered rare to come by in Japan. If you also just want to go in and hardcore grind out some CHUNITHM, I can see that as a pretty good option too.

-

Check out the list of games here

-
Arcade Cabinets -
- - - -#arcade - - -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view1.webp b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view1.webp deleted file mode 100644 index b7463ba..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view1.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view2.webp b/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view2.webp deleted file mode 100644 index 21956d9..0000000 Binary files a/micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/view2.webp and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/index.html b/micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/index.html deleted file mode 100644 index 7db18f5..0000000 --- a/micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/index.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers)

- - - -
- - - Permalink -
-
-

This is primarily focused on the content of the patch, not so much the features they’ve added.

-

Story

-
    -
  • Mistwake Dungeon was a good difficulty. Although I’m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.
  • -
  • Cutscene quality def. got better. As in animations and uniqueness.
  • -
  • Love the look and feel (Treno). There’s a ton of good spots for “gpose-ing”. Music is nice too.
  • -
  • Seriously Krile? You parents were the ones who dropped you into the Source. I don’t think they’d care if you wanted to stay in the Source (just make up your mind) -> well glad that got sorted out
  • -
  • “Hell on Rails” Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the “sucking” mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.
  • -
  • The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.
  • -
  • The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth’s meteor.
  • -
  • Cool so we just get to keep the key. If this were any bit realistic, we’ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story… Well I guess it can go either way.
  • -
  • I’m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn’t something more unique.
  • -
  • And what do you know. Ascians. I hope we get something unqiue for 8.0… I guess thats fine but please lets not have it just be SHB all over again.
  • -
-

Raid

-
    -
  • “Feral Fandom” -> Yep thats FF14 NA playerbase for you.
  • -
  • Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we’d stop with mechanics that are designed to trick people even when read correctly.
  • -
  • Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.
  • -
  • Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.
  • -
  • Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There’s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe…
  • -
  • Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.
  • -
  • Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!
  • -
-

Misc

-
    -
  • The new Frontline map is “dangerous”. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they’re needed too (to spice things up/allow for a turning point).
  • -
  • The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -> B (but partially I guess this is done cause the map does feel smaller than Onsal).
  • -
- - -#ffxiv - - -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/index.html b/micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/index.html deleted file mode 100644 index f2578f3..0000000 --- a/micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/index.html +++ /dev/null @@ -1,497 +0,0 @@ - - - - - - - - DBOX Movie Seats | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

DBOX Movie Seats

- - - -
- - - Permalink -
-
-

There’s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.

-

I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn’t a bad experience but given the markup, I don’t think its worth it:

-
    -
  • First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble
  • -
  • However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying
  • -
  • For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I’d much rather just go to a theater that has the big comfy recliner seats
  • -
  • I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you’re really looking forward to
  • -
  • Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?
  • -
-

Generally, though… I think I’ll live without them.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/index.html b/micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/index.html deleted file mode 100644 index 7aa4b3b..0000000 --- a/micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/index.html +++ /dev/null @@ -1,501 +0,0 @@ - - - - - - - - Discord Rant | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Discord Rant

- - - -
- - - Permalink -
-
-

We’ve seen time and time again that there is “no such thing as a free lunch”. The same is true for Discord.

-
    -
  1. Offer a service that is much better than all the competitors
  2. -
  3. Attract a bunch of users
  4. -
  5. Burn VC money
  6. -
  7. Repeat 1-3 until its time to pay them back
  8. -
  9. Figure out how to make money
  10. -
-

Nitro doesn’t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to “what value do I get out of it”.

-

Look, free is free, and nothing can and will ever beat the value of free. There’s still plenty of reasons to move even if you are a free user, but that’s not the point of this. What I want to take a look at is what value you are actually getting as a paying user.

-

If you wanted to take advantage of ALL of Discord’s features, such as the higher quality screen share + audio or vanity for servers; you need to buy Nitro and boost your server. Nitro comes out to $99.99 a year for Nitro and around $490 a year for the 14 boosts to Tier 3. For me, it feels like the company if scavenging for opportunities to make money, making features like server banners and vanity links paid (which I suppose is how capitalism works, but for what you get at that price point it seems ridiculous). Even if we lower it down to no Nitro and just 2 boosts to get the additional custom emoji slots on a server, that’s still around $6 a month.

-

Let’s say you do opt for this $6 price point. Is it good value? I suppose it depends. I can spin up Teamspeak 6 and Matrix on a CPX11 for 6 Euros a month from Hetzner. Services that give me all the features from the start without all the paywalling BS. In fact, Discord can capture this as well if they changed their pricing model, but I believe their too deep into this situation where they now have to fund the free users or risk everyone migrating elsewhere.

-

Not to mention, the Discord client has gotten progressively worse over the years, all these accessories and animations do is lag out the client which they don’t even seem to understand the codebase of anymore.

-

What Discord sells is convenience, regardless of the Face ID or data collection, the value is not there and hasn’t been there from a “running a small community” perspective. There’s much better options where you have much more agency over your data, as well as have more fine-grain control over optimizing cost. I suppose you can think of it as going to McDonalds or actually making dinner.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html b/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html deleted file mode 100644 index 2828da9..0000000 --- a/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/index.html +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - Playlog: Hundred Lines Last Defense Academy | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Playlog: Hundred Lines Last Defense Academy

- - - -
- - - Permalink -
-
-

After about a year of playing on and off, I’ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. -

105 hours or more played -
-

-

Core Mechanics

-
    -
  • This is basically a visual novel, there’s very little fun to be had if you are a “cutscene skipper”. If you enjoyed Kodaka’s other works like Danganronpa then you’ll be right at home.
  • -
  • There’s a bunch of smaller “minigames” but are mostly a one-off thing, they feel mostly like an afterthought (+25)
  • -
-

Structure

-
    -
  • There’s 2 main parts of the game, the battling and the story itself
  • -
  • The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you’re not careful for some of them
  • -
  • In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you’ve already done
  • -
  • As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular “route” which is centered around a particular storyline, each one is also explicitly named in the game’s flowchart. (+20)
  • -
-

Content

-
    -
  • The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the “core” of the plot. Some of them basically lead to nothing and are there just for fun.
  • -
  • Everyone has to play through Last Defense Academy 1 which basically acts as a very long prologue for the actual game
  • -
  • Not Necessary: Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route
  • -
  • I would recommend playing through the prologue, then explicitly following a guide for the Last Defense Academy 2nd Scenario, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)
  • -
-

Technical Execution

-

Its fine overall. You can def. tell they didn’t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)

-

Presentation

-

Was good since I’m a Danganronpa fan. I would’ve liked to see a few more tracks or at least variations in boss fights. It does get a bit repetitive after 100 times… Still a surprising number of lines were voiced so props to them! (+14)

-

(86/100)

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png b/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png deleted file mode 100644 index bde1097..0000000 Binary files a/micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png and /dev/null differ diff --git a/micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/index.html b/micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/index.html deleted file mode 100644 index cad48a4..0000000 --- a/micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/index.html +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - - - Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body)

- - - -
- - - Permalink -
-
-

I’ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).

-
mirror-switch () {
-    dev=${1:-/dev/video6}
-    nohup ffplay -f v4l2 -framerate 100 -video_size 1920x1080 -i "$dev" \
-        -fflags nobuffer -flags low_delay -framedrop >/dev/null 2>&1 &
-}
-

The delay is actually pretty good, I’m able to play something like Fall Guys on it just fine! Now onto the playlog.

-

No Sleep for Kaname Date – From AI: The Somnium Files

-

This is a spin-off game that takes place in between the first and second AI: The Somnium Files game. Its relatively short.

-

-

- -
- - -

-

1. Core Mechanics

-

The game has a similar style to the first and second game, where you enter Sommnium (the dream world) of people to uncover some truth. However, it also introduces an escape room mechanic where you need to solve puzzles to escape a given room. This is essentially the same mechanic as what’s in the “Zero Escape” series, so much so that each escape room opens with the same “Seek a way out” screen.

-

-

- -
- - -

-

For the puzzle solving, that’s just entirely dependent on how good you are at reading between the lines. For most of them, once you eventually do figure out how to do it you’ll feel dumb not noticing earlier. The Sommnium exploration segment though is still in my opinion plagued with the issue of where you are sort of just “guessing and checking” based on very loose clues. I suppose that’s intended, but I wish that the correct options to pick become a bit more apparent not just from exploring around Sommnium but also from clues in the real outside world. (+32)

-

2. Structure

-

The progression of the story is near identical to the first and second game. You read through the story visual novel style, then jump into Sommnium. Only now it alternates between Sommnium and an escape room. The challenges in both are well designed and interesting, but I personally felt that some of the escape rooms were a bit random? I mean the rooms bared little relevance to the AI The Sommnium world for the most part (which I wish it did). (+20)

-

3. Content

-

The game follows Kaname Date and AIBA the AI-Ball, who are investigating a new case where Iris Sagan (from the first game) goes missing. A mysterious figure named Akemi tells Iris that she is participating in the “Third Eye Game”.

-

The story explains some details of what’s been going on between the first and second game. Even the tiny details. The story is pretty self-contained for the most part, and its sorta like a mini-adventure. There is indeed an actual twist like every Uchikoshi game so pay attention to your surroundings. Very enjoyable to play through (+15)

-

4. Technical Execution (15)

-

No issues here, plays great on the Switch 2. (+15)

-

5. Presentation (15)

-

In my opinion, the game is a bit on the short side considering the price point. The content is good though. I’d say grab it if its on sale for 40 USD rather than 50 USD (+13)

-

92/100

-
-

Xenoblade 1: DE

-

Covers the base game, not including the DLC.

-

-

- -
- - -

-

1. Core Mechanics

-

Combat is much more simple than the second game and for me it sorta gets repetitive quick. Found myself avoiding monsters towards the end of the game. I’d say definetly try playing different characters to keep things fresh. The friendship tree thing is kind of useless and confusing, same with the gemstones. It just feels like they aren’t really needed and just add onto the things to do. In my opinion they should’ve kept it to just upgrading gear and obtaining arts. (+28)

-

2. Structure

-

This game is grindy. Doesn’t matter what people say, you do need to stop and kill stuff as well as do side quests otherwise the enemy level outpaces you fast. This kinda got old for me so what I did was I would grind levels on casual mode and then switch back to normal mode when progressing through the story. Other than that the progression in the game is fairly linear and follows a central plot. The one side quest that may be worth doing is restoring Colony 6 which sorta acts like a big sidequest spanning multiple chapters in the story. Other than just for world building, much of the sidequests are just fetch-quests and are kind of drab. (+15)

-

3. Content

-

I thought the story was just alright for me. It does end up being quite “anime”, I would say it only really ramps up towards the last couple chapters. Before that we’re largely just adventures, adventuring around. It does provide good context for the second game. Shulk as a character definetly has some serious plot armor, even in some cases he just sorta comes back from the dead. Still, I do think the story is worth seeing (+15)

-

4. Technical Execution

-

No issues here, plays great on the Switch 2. (+15)

-

5. Presentation

-

The voice acting and dialogue… it certainly leaves something to be desired. Well the second game sorta suffered the same issue. I played on full English though. YMMV. (+10)

-

83/100

-
-

Catherine Full Body

-

It’s a puzzle game. But more erotic.

-

-

- -
- - -

-

1. Core Mechanics

-

Absolutely no qualms here. Its a genius little puzzle game with lots of strategy involved. You’d really have to watch some footage of it to understand how it works. (+35)

-

-

- -
- - -

-

2. Structure

-

For me, the puzzles aren’t too repetitive. There’s a nice break in between each one, and each night (after a set of puzzles) you get to watch a bit more of the story. Most of the game outside of the puzzle takes place in the “stray sheep” bar, the best way I can describe it is like Persona 3/4/5 “Free Time” where you can go around talking to your friends or others in the bar. Despite the small area there’s a fair amount of extra lore here, since you’ll start noticing that many of the people you talk to are also the ones appearing in your nightmare.

-

The only thing I didn’t like is that it wasn’t really clear who you had to talk to if you wanted to “progress time”. It may seem a bit confusing, but essentially once you have done everything in the bar, people get up and leave and new people walk in (this effectively progresses the night in free-time). (+23)

-

3. Content

-

The story of the game revolves around the main character Vincent. Its a short game about dealing with societal pressures. I say that but the game is quite funny, and it doesn’t take too long to beat. Vincent himself is a bit of a bozo, most of the game is linear and decided for you up until the very end. Essentially the game has you answer questions that make you reflect on your personal morals, then at the end this decides which ending you get. I don’t think this is a bad thing, but I would’ve liked to see more player agency at different points of the game rather than only at the end. Not a huge deal though (+13).

-

4. Technical Execution

-

The only thing that annoyed me was that for some reason the spike blocks are kinda laggy on the Switch 2? Not sure why. (+14)

-

5. Presentation

-

Based on the start of the game I thought this game would be extremely “goon-bait” but actually it wasn’t. Very fun with lots of replayability (in terms of challenge yourself to puzzles + multiplayer) (+15)

-

If you see this game on sale, definelty give it a try. Not sure if its worth at full-price but when its on sale for less than 10 bucks its a steal!

-

95/100

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/index.html b/micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/index.html deleted file mode 100644 index 9b15840..0000000 --- a/micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/index.html +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - - Portable Audio: Phone, Wireless DAC, or DAP | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
- -

Portable Audio: Phone, Wireless DAC, or DAP

- - - -
- - - Permalink -
-
-

Supposedly, there’s been a resurgence in the popularity of the iPod in the recent months for all sorts of reasons. While I’m well aware of “MP3 Players”, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a “new-gen” audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.

-
-

PREFACE

-

I’ll assume that you already have some basic audiophile knowledge, and that you have your own reasons for maintaining an audio library independent of streaming services.

-
-

I’ve reduced it down to 3 main categories: 1. Using your phone with a dongle DAC (Digital to Analog Converter), 2. Wireless DAC (via Bluetooth), 3. Dedicated DAP. Now that I own one of each, I’d like to share my opinions on each one.

-

Phone with Dongle DAC

-

This is probably something most people are familiar with so I won’t go into too much detail.

-
+ easy access to streaming services
-+ excellent user interface (software)
-+ excellent audio quality so long as you don't buy a SUPER cheap dongle
-- distractions whether from notifications or having to fiddle with app
-- drains your battery
-- dongles/cables are annoying when tethered to your phone
-- if you maintain your own music library, it will take up additional storage/use data (especially for FLACs)
-- minimal physical button media controls
-

Wireless DAC

-

A wireless DAC is exactly what it sounds like. Rather than a traditional dongle DAC that plugs into your phone, a wireless DAC connects to your phone over Bluetooth. Your headphones/IEMs then plug into the DAC itself which is what makes it a wireless experience.

-

This effectively allows you to use any IEM or Headphone as a wireless one, and provides a largely tangle free experience since you’re free to leave the DAC in your pocket while you take your phone out to do things.

-

For reference I have the FiiO BTR7, so most of the points below will be focused on that.

-
+ connects to phone, so easy streaming, great UI
-+ largely tangle-free, you can take your phone in and out of your pockets without the dongle getting in the way
-+ can also be used as a wired DAC with PC or phone
-+ EQ customization, even if your phone doesn't support it software-wise
-+ support for high bit-rate coding technologies (such as Sony's LDAC which supports up to 990kbps) (1)
-+ drives high-impedance headphones
-- still drains your battery a lot
-- have to charge it, or else its no better than a dongle DAC
-- better physical button media controls, but for most DACs its minimal
-- can get pricey (relatively to what you are getting)
-- you still need to use data/storage whether you are streaming or listening to files
-

(1) If you're on iOS only AAC is supported, thanks Apple (250-260kbps)

-

This option alone has been excellent for using my IEMs on the go just for the sake of not having to fiddle with a dongle. Usually the battery life on these things are fantastic, and they last a really long time. Most streaming services also likely won’t exceed 990kbps regardless, so its not a huge compromise either.

-

The biggest caveat here is that it suffers from a lot of the same issues with battery and data/storage usage that listening from a smartphone has.

-

Dedicated Audio Player

-

There is a wide variety of DAPs out there. Some of them even run Android which almost makes them a phone. I’ll focus more on a budget option, that being the Snowsky Echo Mini.

-
+ distraction free listening, hassle free in terms of tangling
-+ physical buttons to control media + volume
-+ stores your music, doesn't take up storage
-+ EQ customization
-+ looks cool :)
-- need to charge it or else its a brick
-- can get pricey as well, but lots of budget friendly options
-- you'll probably have to buy a micro-sd or equiv. to expand the storage on it
-- need to manually add music to it (duh...)
-- doesn't do streaming (2)
-
-

Side Note

-

Depending on how expensive your DAP is it may have other limitations such as only supporting a certain bit depth or not supporting ReplayGain. If you don’t have a decently organized library this can be annoying to work around

-
-

(2) Some DAPs also have the option to do music streaming, although in my opinion that largely defeats the whole purpose since it would probably be more worth it to pick up a cheap phone just for that

-

Another benefit of the Echo Mini is that it can also be used as a dongle DAC if necessary. The main caveat here is that you need to be good about maintaining/tagging your audio library, and of course you don’t get any audio from your phone (although that’s a plus in terms of cutting out distractions for me, if I need to take a call I’ll just use the built-in speaker as is)

-

Conclusion

-

I find myself using my DAP the most, since it doesn’t drain my phone’s battery and has been helpful in training my patience in terms of not doomscrolling (since I literately will not be able to hear the audio). Although I do usually bring the wireless DAP along too on most days in case I want to watch a video or something. Both devices are tiny so its no big deal.

- -
- - - - - - -
-

Webmentions

-
Loading…
-
- - - - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/posts/index.html b/micro.pinapelz.moe/posts/index.html deleted file mode 100644 index bbe67fa..0000000 --- a/micro.pinapelz.moe/posts/index.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - - - - Posts | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - -
- - -
- -

- Posts - -RSS icon - - -

- - -
- - -
- - - - - - - - - - - -
- -
-

May 2026

-
    - - -
  • - -
    - : - - - Portable Audio: Phone, Wireless DAC, or DAP - -
    -
  • - - - - - - - - - - - -
-
- -
-

April 2026

- -
- -
-

March 2026

-
    - - -
  • - -
    - : - - - Playlog: Hundred Lines Last Defense Academy - -
    -
  • - - - - - - - - - - - -
-
- -
-

February 2026

-
    - - -
  • - -
    - : - - - Discord Rant - -
    -
  • - - - - - - - - - - - -
-
- -
-

December 2025

-
    - - -
  • - -
    - : - - - DBOX Movie Seats - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - Arcade Monsters - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - First MXM 18 Cleared! - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - Enable HID Mode on Nintendo Pro Controller 2 - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - YouTube Music Recap 2025 - -
    -
  • - - - - -
-
- - -
- -1 of 2 - - Next Page - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/posts/index.xml b/micro.pinapelz.moe/posts/index.xml deleted file mode 100644 index 22c2a93..0000000 --- a/micro.pinapelz.moe/posts/index.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - Posts on micro.pinapelz.moe - https://micro.pinapelz.moe/posts/ - Recent content in Posts on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Portable Audio: Phone, Wireless DAC, or DAP - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> - - - Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> - - - Playlog: Hundred Lines Last Defense Academy - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> - - - Discord Rant - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> - - - DBOX Movie Seats - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.moe//tags/ffxiv" class="p-category">#ffxiv</a> - - - Arcade Monsters - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> - - - First MXM 18 Cleared! - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.moe//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> - - - Enable HID Mode on Nintendo Pro Controller 2 - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> - - - YouTube Music Recap 2025 - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> - - - INIU Power Bank Gets Recall - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> - - - China Town Fair - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> - - - Hello World - Why This - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> - - - diff --git a/micro.pinapelz.moe/posts/page/1/index.html b/micro.pinapelz.moe/posts/page/1/index.html deleted file mode 100644 index 1c21f92..0000000 --- a/micro.pinapelz.moe/posts/page/1/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - https://micro.pinapelz.moe/posts/ - - - - - diff --git a/micro.pinapelz.moe/posts/page/2/index.html b/micro.pinapelz.moe/posts/page/2/index.html deleted file mode 100644 index fde0ec4..0000000 --- a/micro.pinapelz.moe/posts/page/2/index.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - Posts | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - -
- - -
- -

- Posts - -RSS icon - - -

- - -
- - -
- - - - - - - - - - - -
- -
-

December 2025

-
    - - -
  • - -
    - : - - - INIU Power Bank Gets Recall - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - China Town Fair - -
    -
  • - - - - - - - - - -
  • - -
    - : - - - Hello World - Why This - -
    -
  • - - - - -
-
- - -
- - Previous Page - -2 of 2 - -
- -
- -
- - - - diff --git a/micro.pinapelz.moe/sitemap.xml b/micro.pinapelz.moe/sitemap.xml deleted file mode 100644 index 38d387c..0000000 --- a/micro.pinapelz.moe/sitemap.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - https://micro.pinapelz.moe/categories/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/categories/default/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/tags/default/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/posts/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/tags/ - 2026-05-03T03:16:09-07:00 - - https://micro.pinapelz.moe/categories/games/ - 2026-04-26T18:20:09-07:00 - - https://micro.pinapelz.moe/tags/playlog/ - 2026-04-26T18:20:09-07:00 - - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - 2026-04-26T18:20:09-07:00 - - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - 2026-03-17T17:19:03-07:00 - - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - 2026-02-19T19:17:04-08:00 - - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - 2025-12-31T22:03:51-08:00 - - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - 2025-12-19T22:15:50-08:00 - - https://micro.pinapelz.moe/tags/arcade/ - 2025-12-18T21:38:23-08:00 - - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - 2025-12-18T21:38:23-08:00 - - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - 2025-12-06T22:33:23-08:00 - - https://micro.pinapelz.moe/tags/code/ - 2025-12-04T23:19:29-08:00 - - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - 2025-12-04T23:19:29-08:00 - - https://micro.pinapelz.moe/tags/nintendo/ - 2025-12-04T23:19:29-08:00 - - https://micro.pinapelz.moe/categories/tools/ - 2025-12-04T23:19:29-08:00 - - https://micro.pinapelz.moe/tags/anime/ - 2025-12-03T19:38:52-08:00 - - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - 2025-12-03T19:38:52-08:00 - - https://micro.pinapelz.moe/indie/follows/ - 2025-12-03T01:17:39-08:00 - - https://micro.pinapelz.moe/indie/ - 2025-12-03T01:17:39-08:00 - - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - 2025-12-02T19:45:01-08:00 - - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - 2025-12-02T00:22:32-08:00 - - https://micro.pinapelz.moe/categories/life/ - 2025-12-02T00:22:32-08:00 - - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - 2025-12-01T20:11:57-08:00 - - diff --git a/micro.pinapelz.moe/tags/anime/index.html b/micro.pinapelz.moe/tags/anime/index.html deleted file mode 100644 index 3d22213..0000000 --- a/micro.pinapelz.moe/tags/anime/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Anime | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Anime - - RSS icon - -

-
- -

Content linked to the taxonomy term « ANIME »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/anime/index.xml b/micro.pinapelz.moe/tags/anime/index.xml deleted file mode 100644 index 66a1547..0000000 --- a/micro.pinapelz.moe/tags/anime/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Anime on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/anime/ - Recent content in Anime on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Wed, 03 Dec 2025 19:38:52 -0800 - - - YouTube Music Recap 2025 - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-03-04-yt-music-rewind/ - <p>Its all Bandori. At least 75% of that MyGO!!!!! listening time was probably Haruhikage since I came back to Bandori and had to catch up before watching Ave Mujica anime.</p> <figure><img src="https://files.catbox.moe/tsquqc.jpg" alt="YouTube Music Recap Top 5 Artists In Order: MyGO!!!!!, Yumenokessho, Ave Mujica, KMNZ, Roselia" width="300"> </figure> - - - diff --git a/micro.pinapelz.moe/tags/arcade/index.html b/micro.pinapelz.moe/tags/arcade/index.html deleted file mode 100644 index 1c2374f..0000000 --- a/micro.pinapelz.moe/tags/arcade/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - Arcade | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Arcade - - RSS icon - -

-
- -

Content linked to the taxonomy term « ARCADE »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/arcade/index.xml b/micro.pinapelz.moe/tags/arcade/index.xml deleted file mode 100644 index 0845666..0000000 --- a/micro.pinapelz.moe/tags/arcade/index.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - Arcade on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/arcade/ - Recent content in Arcade on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Thu, 18 Dec 2025 21:38:23 -0800 - - - Arcade Monsters - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-18-07-arcade-monsters-sd/ - <p>If you live in Socal and are also into arcade gaming (both retro and modern), one of the great weekend day-trips I&rsquo;ve found is taking the Pacific Surfliner train down to San Diego.</p> <h1 id="getting-there">Getting There</h1> <p>There are a number of departures in the morning, and while not as fast as a car when there&rsquo;s no traffic, you can save your energy and do other stuff on the train. The timetable also works nicely since you can pretty much get there around opening if you want to beat the crowds.</p> - - - First MXM 18 Cleared! - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/ - <p>Cleared my first 18 difficulty chart in <a href="https://micro.pinapelz.moe//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="https://micro.pinapelz.moe/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> - - - China Town Fair - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - Tue, 02 Dec 2025 00:22:32 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/ - <p>Visited New York during the Thanksgiving break and had a chance to stopped by one of the most legendary landmarks North American arcade gaming history.</p> <figure><img src="https://micro.pinapelz.moe/posts/2025-12-02-china-town-fair/outside-ctf.webp" alt="China Town Fair Outside"> </figure> <p>Also yep you&rsquo;re reading that right, it indeed once home to a <a href="https://davidpotorti.substack.com/p/the-dancing-chicken">dancing chicken as well as one that played tic tac toe</a>.</p> <p>But apart from just being an old arcade, it was also home to one of the largest competitive arcade game fighting scene (Marvel vs Capcom, Street Fighter, etc.). Many of NAs top players frequented this arcade. However, as we all already know video arcades began to die down during the early 2000s and China Town Fair was no exception having closed in 2011.</p> - - - diff --git a/micro.pinapelz.moe/tags/code/index.html b/micro.pinapelz.moe/tags/code/index.html deleted file mode 100644 index 364c5f4..0000000 --- a/micro.pinapelz.moe/tags/code/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Code | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Code - - RSS icon - -

-
- -

Content linked to the taxonomy term « CODE »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/code/index.xml b/micro.pinapelz.moe/tags/code/index.xml deleted file mode 100644 index 342d678..0000000 --- a/micro.pinapelz.moe/tags/code/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Code on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/code/ - Recent content in Code on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Thu, 04 Dec 2025 23:19:29 -0800 - - - Enable HID Mode on Nintendo Pro Controller 2 - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> - - - diff --git a/micro.pinapelz.moe/tags/default/index.html b/micro.pinapelz.moe/tags/default/index.html deleted file mode 100644 index 3fde53c..0000000 --- a/micro.pinapelz.moe/tags/default/index.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - Default | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Default - - RSS icon - -

-
- -

Content linked to the taxonomy term « DEFAULT »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/default/index.xml b/micro.pinapelz.moe/tags/default/index.xml deleted file mode 100644 index a024505..0000000 --- a/micro.pinapelz.moe/tags/default/index.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - Default on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/default/ - Recent content in Default on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Portable Audio: Phone, Wireless DAC, or DAP - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-29-13-dac-vs-wireless-dap/ - <p>Supposedly, there&rsquo;s been a <a href="https://www.facebook.com/APNews/videos/secondhand-sales-of-apple-ipods-are-surging-four-years-after-it-was-killed-off-w/1278247987103509/">resurgence in the popularity of the iPod</a> in the recent months for all sorts of reasons. While I&rsquo;m well aware of &ldquo;MP3 Players&rdquo;, such as the original iPod and the old Sony Walkman, these are not devices I grew up using. As a &ldquo;new-gen&rdquo; audiophile myself, getting a DAP (Dedicated Audio Player, its the new term for these sort of devices as they can play much more than just MP3s) was certainly an interesting idea. However, modern day audiophiles now have an arsenal of methods to enjoy music, even when it comes to portable playback.</p> - - - Discord Rant - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - Thu, 19 Feb 2026 19:17:04 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-02-19-10-discord-rant/ - <p>We&rsquo;ve seen time and time again that there is &ldquo;no such thing as a free lunch&rdquo;. The same is true for Discord.</p> <ol> <li>Offer a service that is much better than all the competitors</li> <li>Attract a bunch of users</li> <li>Burn VC money</li> <li>Repeat 1-3 until its time to pay them back</li> <li>Figure out how to make money</li> </ol> <p>Nitro doesn&rsquo;t fund the platform, hosting free voice and screenshare is more expensive than you think. Ultimately, any choice of software for me boils down to &ldquo;what value do I get out of it&rdquo;.</p> - - - DBOX Movie Seats - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - Wed, 31 Dec 2025 22:03:51 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-31-09-dbox-review/ - <p>There&rsquo;s a thing here in Canada where certain theaters have these special seats that rumble and move in motion with whats happening on screen.</p> <p>I recently saw the new Avatar (Fire and Ash) in one of these seats. It wasn&rsquo;t a bad experience but given the markup, I don&rsquo;t think its worth it:</p> <ul> <li>First it is fun (sometimes). For example when they were flying through the air, the seat would tilt in the motion of them flying. Or when there was an explosion/gunfire, the seat would rumble</li> <li>However, for me I think they overdid it at times, literately the seat would move and rumble for the smallest things. So it was kind of like a constant thing throughout the whole film. For me its a bit annoying</li> <li>For the $10-15 extra (I think I paid a bit more cause the movie was also in 3D), I&rsquo;d much rather just go to a theater that has the big comfy recliner seats</li> <li>I think for the right movie (maybe something heavy on action or horror) this could be a solid purchase if its a movie you&rsquo;re really looking forward to</li> <li>Or I also know that some people see movies multiple times, so maybe this can be a good option for a 2nd viewing?</li> </ul> <p>Generally, though&hellip; I think I&rsquo;ll live without them.</p> - - - INIU Power Bank Gets Recall - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - Tue, 02 Dec 2025 19:45:01 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-02-power-bank-recall/ - <p>It would seem that I, along with what seems like the entirety of <a href="https://www.reddit.com/r/amazonprime/comments/1pcq5ug/how_to_get_customer_support_for_recall_iniu/">Reddit</a> bought the same cheap 10000mAh power bank and now its getting recalled.</p> <p>I wonder if it has anything to do with the poor quality they found in that viral <a href="https://www.lumafield.com/first-article/posts/whats-hiding-inside-haribos-power-bank-and-headphones">Haribo Powerbank</a>. Not sure since I&rsquo;ve had this one for a long time. I guess I really got what I paid for, shame cause it really is super slim and works well.</p> - - - Hello World - Why This - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - Mon, 01 Dec 2025 20:11:57 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-01-hello-world/ - <p>I think having control of your own data is great. The same is true for decentralized social media. I&rsquo;ve always been a primary user of microblog platforms (like Twitter/X). Having experienced both the traditional and &ldquo;decentralized&rdquo; approaches to microblogs, they both have some particular shortcoming in terms of what I want to get out of &ldquo;social media&rdquo;.</p> <h2 id="twitterx">Twitter/X</h2> <p>This is fairly self explanatory. The rebranding of Twitter to X and Musk&rsquo;s new ownership of the platform shifted the direction of the platform to be ever more political. X Premium boosting visibility is also something I wasn&rsquo;t a particular fan of. You can&rsquo;t view anything without signing in either, so goodbye viewing stuff anonymously. There&rsquo;s just a lot of &ldquo;features&rdquo; here I&rsquo;m not a fan of. Needless to say, there&rsquo;s a lot of reasons to not post stuff there.</p> - - - diff --git a/micro.pinapelz.moe/tags/index.html b/micro.pinapelz.moe/tags/index.html deleted file mode 100644 index a384a4d..0000000 --- a/micro.pinapelz.moe/tags/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - Tags | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Tags - - RSS icon - -

-
- -
-
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/index.xml b/micro.pinapelz.moe/tags/index.xml deleted file mode 100644 index 915c838..0000000 --- a/micro.pinapelz.moe/tags/index.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - Tags on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/ - Recent content in Tags on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 03 May 2026 03:16:09 -0700 - - - Default - https://micro.pinapelz.moe/tags/default/ - Sun, 03 May 2026 03:16:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/default/ - - - - Playlog - https://micro.pinapelz.moe/tags/playlog/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/playlog/ - - - - Arcade - https://micro.pinapelz.moe/tags/arcade/ - Thu, 18 Dec 2025 21:38:23 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/arcade/ - - - - Code - https://micro.pinapelz.moe/tags/code/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/code/ - - - - Nintendo - https://micro.pinapelz.moe/tags/nintendo/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/nintendo/ - - - - Anime - https://micro.pinapelz.moe/tags/anime/ - Wed, 03 Dec 2025 19:38:52 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/tags/anime/ - - - - diff --git a/micro.pinapelz.moe/tags/nintendo/index.html b/micro.pinapelz.moe/tags/nintendo/index.html deleted file mode 100644 index 3680dcf..0000000 --- a/micro.pinapelz.moe/tags/nintendo/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Nintendo | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Nintendo - - RSS icon - -

-
- -

Content linked to the taxonomy term « NINTENDO »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/nintendo/index.xml b/micro.pinapelz.moe/tags/nintendo/index.xml deleted file mode 100644 index 11ee8d4..0000000 --- a/micro.pinapelz.moe/tags/nintendo/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Nintendo on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/nintendo/ - Recent content in Nintendo on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Thu, 04 Dec 2025 23:19:29 -0800 - - - Enable HID Mode on Nintendo Pro Controller 2 - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - Thu, 04 Dec 2025 23:19:29 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-04-procon2-hid-tool/ - <p>Switch 2 Pro Controller is very comfy in my hands, but unfortunately it didn&rsquo;t work out of box on PC (Linux) for me like it&rsquo;s predacessor. Until there&rsquo;s actual better driver support for this thing in the kernel (or Valve does something), here&rsquo;s a hacky Python script to initialize HID-mode on the controller</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># I only tested this script on Linux w/ Steam but in theory it shoud work on Windows?</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.core <span style="color:#75715e"># install pyusb first: pip install pyusb</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> usb.util </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> sys </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>VENDOR_ID <span style="color:#f92672">=</span> <span style="color:#ae81ff">0x057E</span> </span></span><span style="display:flex;"><span>PRODUCT_IDS <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2066</span>: <span style="color:#e6db74">&#34;Joy-Con (L)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2067</span>: <span style="color:#e6db74">&#34;Joy-Con (R)&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2069</span>: <span style="color:#e6db74">&#34;Pro Controller&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x2073</span>: <span style="color:#e6db74">&#34;GCN Controller&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>USB_INTERFACE_NUMBER <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>INIT_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0d</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x07 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x16 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x16</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>REQUEST_CONTROLLER_MAC <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0e</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>LTK_REQUEST <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>, <span style="color:#ae81ff">0xFF</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x15_ARG_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x15</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x09 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x02 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x11 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x11</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>UNKNOWN_COMMAND_0x0A <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x14</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0xff</span>, <span style="color:#ae81ff">0x35</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x46</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>IMU_COMMAND_0x04 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x27</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>ENABLE_HAPTICS <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x10 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x10</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x01 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x0c</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x03 <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x01</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span>OUT_UNKNOWN_COMMAND_0x0A_ALT <span style="color:#f92672">=</span> bytes([<span style="color:#ae81ff">0x0a</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x02</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x04</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x03</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">send_usb_data</span>(ep_out, ep_in, data, description<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;&#34;</span>): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> ep_out<span style="color:#f92672">.</span>write(data) </span></span><span style="display:flex;"><span> time<span style="color:#f92672">.</span>sleep(<span style="color:#ae81ff">0.01</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> response <span style="color:#f92672">=</span> ep_in<span style="color:#f92672">.</span>read(<span style="color:#ae81ff">32</span>, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">100</span>) </span></span><span style="display:flex;"><span> hex_resp <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34; &#34;</span><span style="color:#f92672">.</span>join([<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>x<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> <span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> response]) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Response: </span><span style="color:#e6db74">{</span>hex_resp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> e<span style="color:#f92672">.</span>errno <span style="color:#f92672">==</span> <span style="color:#ae81ff">110</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] No response (Timeout)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">else</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Read Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;[</span><span style="color:#e6db74">{</span>description<span style="color:#e6db74">}</span><span style="color:#e6db74">] Write Error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">set_player_leds</span>(ep_out, ep_in, led_mask): </span></span><span style="display:flex;"><span> command <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x09</span>, <span style="color:#ae81ff">0x91</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x07</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x08</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, </span></span><span style="display:flex;"><span> led_mask, </span></span><span style="display:flex;"><span> <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span>, <span style="color:#ae81ff">0x00</span> </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, bytes(command), <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Set LED Mask: 0x</span><span style="color:#e6db74">{</span>led_mask<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">connect_usb</span>(): </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Searching for Nintendo Switch Controllers...&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">match_device</span>(dev): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">return</span> dev<span style="color:#f92672">.</span>idVendor <span style="color:#f92672">==</span> VENDOR_ID <span style="color:#f92672">and</span> dev<span style="color:#f92672">.</span>idProduct <span style="color:#f92672">in</span> PRODUCT_IDS </span></span><span style="display:flex;"><span> dev <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>find(custom_match<span style="color:#f92672">=</span>match_device) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev <span style="color:#f92672">is</span> <span style="color:#66d9ef">None</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">raise</span> <span style="color:#a6e22e">ValueError</span>(<span style="color:#e6db74">&#34;Device not found&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> product_name <span style="color:#f92672">=</span> PRODUCT_IDS<span style="color:#f92672">.</span>get(dev<span style="color:#f92672">.</span>idProduct, <span style="color:#e6db74">&#34;Unknown Device&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found </span><span style="color:#e6db74">{</span>product_name<span style="color:#e6db74">}</span><span style="color:#e6db74"> (ID: </span><span style="color:#e6db74">{</span>dev<span style="color:#f92672">.</span>idProduct<span style="color:#e6db74">:</span><span style="color:#e6db74">04x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> dev<span style="color:#f92672">.</span>is_kernel_driver_active(USB_INTERFACE_NUMBER): </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Detaching kernel driver...&#34;</span>) </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>detach_kernel_driver(USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not detach kernel driver: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> dev<span style="color:#f92672">.</span>set_configuration() </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Configuration set.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error setting configuration: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>claim_interface(dev, USB_INTERFACE_NUMBER) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Interface </span><span style="color:#e6db74">{</span>USB_INTERFACE_NUMBER<span style="color:#e6db74">}</span><span style="color:#e6db74"> claimed.&#34;</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> usb<span style="color:#f92672">.</span>core<span style="color:#f92672">.</span>USBError <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Could not claim interface: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> cfg <span style="color:#f92672">=</span> dev<span style="color:#f92672">.</span>get_active_configuration() </span></span><span style="display:flex;"><span> intf <span style="color:#f92672">=</span> cfg[(USB_INTERFACE_NUMBER,<span style="color:#ae81ff">0</span>)] </span></span><span style="display:flex;"><span> ep_out <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_OUT) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> ep_in <span style="color:#f92672">=</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>find_descriptor( </span></span><span style="display:flex;"><span> intf, </span></span><span style="display:flex;"><span> custom_match <span style="color:#f92672">=</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">lambda</span> e: usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>endpoint_direction(e<span style="color:#f92672">.</span>bEndpointAddress) <span style="color:#f92672">==</span> usb<span style="color:#f92672">.</span>util<span style="color:#f92672">.</span>ENDPOINT_IN </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> ep_out: </span></span><span style="display:flex;"><span> sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Could not find OUT endpoint&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Found Endpoint OUT: 0x</span><span style="color:#e6db74">{</span>ep_out<span style="color:#f92672">.</span>bEndpointAddress<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Starting Initialization Sequence...&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, INIT_COMMAND_0x03, <span style="color:#e6db74">&#34;Init 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x07, <span style="color:#e6db74">&#34;Unknown 0x07&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x16, <span style="color:#e6db74">&#34;Unknown 0x16&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, REQUEST_CONTROLLER_MAC, <span style="color:#e6db74">&#34;Req MAC&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, LTK_REQUEST, <span style="color:#e6db74">&#34;Req LTK&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x15_ARG_0x03, <span style="color:#e6db74">&#34;Unknown 0x15&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x09, <span style="color:#e6db74">&#34;Unknown 0x09&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x02, <span style="color:#e6db74">&#34;IMU 0x02&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x11, <span style="color:#e6db74">&#34;OUT Unknown 0x11&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, UNKNOWN_COMMAND_0x0A, <span style="color:#e6db74">&#34;Unknown 0x0A&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, IMU_COMMAND_0x04, <span style="color:#e6db74">&#34;IMU 0x04&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, ENABLE_HAPTICS, <span style="color:#e6db74">&#34;Enable Haptics&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x10, <span style="color:#e6db74">&#34;OUT Unknown 0x10&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x01, <span style="color:#e6db74">&#34;OUT Unknown 0x01&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x03, <span style="color:#e6db74">&#34;OUT Unknown 0x03&#34;</span>) </span></span><span style="display:flex;"><span> send_usb_data(ep_out, ep_in, OUT_UNKNOWN_COMMAND_0x0A_ALT, <span style="color:#e6db74">&#34;OUT Unknown 0x0A Alt&#34;</span>) </span></span><span style="display:flex;"><span> set_player_leds(ep_out, ep_in, <span style="color:#ae81ff">0x0F</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">&#34;Controller initialization sequence complete! All LEDs should be on.&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Error during sequence: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>: </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span>: </span></span><span style="display:flex;"><span> connect_usb() </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(e) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">Exception</span> <span style="color:#66d9ef">as</span> e: </span></span><span style="display:flex;"><span> print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Unexpected error: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>) </span></span></code></pre></div><p><strong>Steps</strong></p> - - - diff --git a/micro.pinapelz.moe/tags/playlog/index.html b/micro.pinapelz.moe/tags/playlog/index.html deleted file mode 100644 index 60cee03..0000000 --- a/micro.pinapelz.moe/tags/playlog/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - Playlog | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Playlog - - RSS icon - -

-
- -

Content linked to the taxonomy term « PLAYLOG »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/playlog/index.xml b/micro.pinapelz.moe/tags/playlog/index.xml deleted file mode 100644 index 2b114f1..0000000 --- a/micro.pinapelz.moe/tags/playlog/index.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - Playlog on micro.pinapelz.moe - https://micro.pinapelz.moe/tags/playlog/ - Recent content in Playlog on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sun, 26 Apr 2026 18:20:09 -0700 - - - Playlog: April 2026 (No Sleep for Kaname Date, Xenoblade 1 DE, Catherine Full Body) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - Sun, 26 Apr 2026 18:20:09 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-04-26-12-april-playlog/ - <p>I&rsquo;ve gotten quite good at actually making progress on my backlog. Turns out the answer was to just uninstall all social media and get rid of doom scrolling. I invested in a rudimentary capture card as well so that I can have my Switch games show up as an application on my PC rather than having to swap display inputs (which makes it easy to get up and running for a quick session).</p> - - - Playlog: Hundred Lines Last Defense Academy - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - Tue, 17 Mar 2026 17:19:03 -0700yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/ - <p>After about a year of playing on and off, I&rsquo;ve finally finished all 100 (and 1, counting the first one). In total it took roughly 105 hours or so. <figure><img src="https://micro.pinapelz.moe/posts/2026-03-17-11-hundred-lines-last-defense-playlog/playtime.png" alt="105 hours or more played"> </figure> </p> <h2 id="core-mechanics">Core Mechanics</h2> <ul> <li>This is basically a visual novel, there&rsquo;s very little fun to be had if you are a &ldquo;cutscene skipper&rdquo;. If you enjoyed Kodaka&rsquo;s other works like Danganronpa then you&rsquo;ll be right at home.</li> <li>There&rsquo;s a bunch of smaller &ldquo;minigames&rdquo; but are mostly a one-off thing, they feel mostly like an afterthought (+25)</li> </ul> <h2 id="structure">Structure</h2> <ul> <li>There&rsquo;s 2 main parts of the game, the battling and the story itself</li> <li>The battling itself has a decent amount of strategy to it, and you can in fact easily lose if you&rsquo;re not careful for some of them</li> <li>In my opinion though given how little variety there is it kinda gets old fast, luckily the 2nd half of the game lets you skip battles you&rsquo;ve already done</li> <li>As far as the story goes, its standard visual novel stuff but with a Kodaka twist. Each ending belongs to a particular &ldquo;route&rdquo; which is centered around a particular storyline, each one is also explicitly named in the game&rsquo;s flowchart. (+20)</li> </ul> <h2 id="content">Content</h2> <ul> <li>The story itself is quite good, but not all the routes are really worth doing if you just want what I consider to be the &ldquo;core&rdquo; of the plot. Some of them basically lead to nothing and are there just for fun.</li> <li>Everyone has to play through <code>Last Defense Academy 1</code> which basically acts as a very long prologue for the actual game</li> <li><strong>Not Necessary:</strong> Serial Battles Route (PLEASE skip this one, the game forces you to play unskippable battles and it forshadows literately the tiniest thing), Box of Blessings, Conspiracy (does nothing but is very quick to do), Romance, Comedy, V’ehxness Route (mainly character building), Reset Route</li> <li>I would recommend playing through the prologue, then explicitly following a guide for the <code>Last Defense Academy 2nd Scenario</code>, then if you still want more start the S.F Route and follow a guide to unlock the pre-requisite routes while you progress through that. Everything else is largely optional IMO and is just for world-building. (12)</li> </ul> <h2 id="technical-execution">Technical Execution</h2> <p>Its fine overall. You can def. tell they didn&rsquo;t have as big of a budget as Danganronpa to work with. There were some issues with leaving the game in suspense for too long on Switch but no major performance issues (+15)</p> - - - Playlog: FFXIV Dawntrail Patch 7.4 Thoughts (spoilers) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - Fri, 19 Dec 2025 22:15:50 -0800yukais@pinapelz.com (Pinapelz) - https://micro.pinapelz.moe/posts/2025-12-19-08-ffxiv-patch-7-4/ - <p><em>This is primarily focused on the content of the patch, not so much the features they&rsquo;ve added.</em></p> <h1 id="story">Story</h1> <ul> <li>Mistwake Dungeon was a good difficulty. Although I&rsquo;m not a fan of the electricity star AOEs, very hard to read for no apparent reason. Please just stick with the old one.</li> <li>Cutscene quality def. got better. As in animations and uniqueness.</li> <li>Love the look and feel (Treno). There&rsquo;s a ton of good spots for &ldquo;gpose-ing&rdquo;. Music is nice too.</li> <li>Seriously Krile? You parents were the ones who dropped you into the Source. I don&rsquo;t think they&rsquo;d care if you wanted to stay in the Source (just make up your mind) -&gt; well glad that got sorted out</li> <li>&ldquo;Hell on Rails&rdquo; Trial (Doomtrain) is very nicely designed. Its got some nice unique mechanics, the &ldquo;sucking&rdquo; mechanic definetly trips you up the first time because the distance to move back + timing has been tuned so that you need to pre-position for it.</li> <li>The transition from inside the engine to outside was really cool!!! This is probably one of my top normal trials now.</li> <li>The instance battle was well done too. The roleplaying part was on point, and when it was finally time to fight a real boss you get to play as yourelf (I think this is the best flow). Love the idea using the spriggan to avoid Behemoth&rsquo;s meteor.</li> <li>Cool so we just get to keep the key. If this were any bit realistic, we&rsquo;ve surely learned that no one this powerful should be allowed to keep the key on themsleves 24/7. Because surely the WoL being the most powerful being will never run rogue with a interdimensional travel capable tool. Then again, seeing how stuff gets stolen all the time in the story&hellip; Well I guess it can go either way.</li> <li>I&rsquo;m guessing this key is gonna be how the writers justify being able to travel to new worlds for post-Zodiark/Hydaelyn story. Its fine I guess, but a little disappointing it isn&rsquo;t something more unique.</li> <li>And what do you know. Ascians. I hope we get something unqiue for 8.0&hellip; I guess thats fine but please lets not have it just be SHB all over again.</li> </ul> <h1 id="raid">Raid</h1> <ul> <li>&ldquo;Feral Fandom&rdquo; -&gt; Yep thats FF14 NA playerbase for you.</li> <li>Heavyweight 1 (Vamp Fatale) Raid was cool and unique, but a bit too flashy imo. That Half Moon is needlessly large, wish we&rsquo;d stop with mechanics that are designed to trick people even when read correctly.</li> <li>Heavyweight 2 (Xtremes) I take it back, this is the one with the blinding effects MY EYES. Fire and water one after another. This is a pretty hard normal fight actually (the first time you run it blind). Really punishing for bad AOE placement positions since you can effectively be cut off from the team.</li> <li>Holy wow these cutscenes are in serious need of voice acting. Its a good story but so dry and awkward without it.</li> <li>Heavyweight 3 (Tyrant). Really? Behemoth again, double dipping from the instance battle. There&rsquo;s so many other cool FF monsters. I like the arena, it fits the guy well, all about history of the Arcadion/tradition. Fight is underwhelming and too easy imo, apart from 1 single trick mechanic that can cause a wipe&hellip;</li> <li>Heavyweight 4 (Lindwurm). EVERYTHING BURNS. This fight was honestly too easy, zero deaths everything can be read. 2nd phase was underhelming.</li> <li>Overall the story here while not as in depth and relevant to the story as Endwalker raids, still had a nice little twist at the end I def did not expect. Enjoyed it!</li> </ul> <h1 id="misc">Misc</h1> <ul> <li>The new Frontline map is &ldquo;dangerous&rdquo;. Overall the new capturing point system is far better than a non-interruptable interact like in Onsal Hakir. The snowman and aurora events are also good, and I think they come in right when they&rsquo;re needed too (to spice things up/allow for a turning point).</li> <li>The map design however is far too complex, all these bridges and everywhere and invisible walls. It does add a lot of chokepoints but also makes it difficult to navigate from point A -&gt; B (but partially I guess this is done cause the map does feel smaller than Onsal).</li> </ul> <a href="https://micro.pinapelz.moe//tags/ffxiv" class="p-category">#ffxiv</a> - - - diff --git a/micro.pinapelz.moe/tags/rhythm-games/index.html b/micro.pinapelz.moe/tags/rhythm-games/index.html deleted file mode 100644 index f0ee4be..0000000 --- a/micro.pinapelz.moe/tags/rhythm-games/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - Rhythm-Games | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Rhythm-Games - - RSS icon - -

-
- -

Content linked to the taxonomy term « RHYTHM-GAMES »:

- - - - -
-

Posts

- -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/rhythm-games/index.xml b/micro.pinapelz.moe/tags/rhythm-games/index.xml deleted file mode 100644 index 7bf0730..0000000 --- a/micro.pinapelz.moe/tags/rhythm-games/index.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Rhythm-Games on micro.pinapelz.moe - http://localhost:1313/tags/rhythm-games/ - Recent content in Rhythm-Games on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - Sat, 06 Dec 2025 22:33:23 -0800 - - - First MXM 18 Cleared! - http://localhost:1313/posts/2025-12-06-first-sdvx-18/ - Sat, 06 Dec 2025 22:33:23 -0800yukais@pinapelz.com (Pinapelz) - http://localhost:1313/posts/2025-12-06-first-sdvx-18/ - <p>Cleared my first 18 difficulty chart in <a href="http://localhost:1313//tags/sdvx" class="p-category">#sdvx</a> </p> <p>Albeit its not a very difficult one, but I think I&rsquo;m finally starting to chip away at the 17-18 difficulty wall. <figure><img src="http://localhost:1313/posts/2025-12-06-first-sdvx-18/18.webp" alt="Sound Voltex Enchant 6 Clear" width="500"> </figure> </p> - - - diff --git a/micro.pinapelz.moe/tags/sdvx/index.html b/micro.pinapelz.moe/tags/sdvx/index.html deleted file mode 100644 index b8c7ff1..0000000 --- a/micro.pinapelz.moe/tags/sdvx/index.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - Sdvx | micro.pinapelz.moe - - - - - - - - - - - - - - - - - - -
-
-
- ==============
- == Pinapelz ==
- ============== -
-
check it out. I'm in the house like carpet
-
- -
- - - -
-
-

- Sdvx - - RSS icon - -

-
- -

Content linked to the taxonomy term « SDVX »:

- - - -
-
- -
- - - - diff --git a/micro.pinapelz.moe/tags/sdvx/index.xml b/micro.pinapelz.moe/tags/sdvx/index.xml deleted file mode 100644 index bb4ea2d..0000000 --- a/micro.pinapelz.moe/tags/sdvx/index.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - Sdvx on micro.pinapelz.moe - http://localhost:1313/tags/sdvx/ - Recent content in Sdvx on micro.pinapelz.moe - Hugo - en-us - yukais@pinapelz.com (Pinapelz) - yukais@pinapelz.com (Pinapelz) - - - diff --git a/moe.pinapelz.com/about.html b/moe.pinapelz.com/about.html new file mode 100644 index 0000000..06568f2 --- /dev/null +++ b/moe.pinapelz.com/about.html @@ -0,0 +1,288 @@ + + + + + + ok for some reason u want to know about me + + + + + + + +
+ +
+
+
+ + About Me + +
+ + + +
+
+
+

⚡ info ⚡

+
    +
  • 🐧 daily drives linux (endeavour os)
  • +
  • 💻 mainly uses hyprland and cosmic
  • +
  • 📺 anime/manga, rhythm game, mmorpg enjoyer
  • +
  • 🧠 im tryna unrot my brain rn
  • + +
+

I post a lot of random stuff
on my "microblog" at: https://micro.pinapelz.com

+
+ +
+

🎮 games 🎮

+
    +
  • + MMOs - FFXIV, PSO2 +
  • +
  • + (J)RPGs - Persona, + Xenoblade +
  • +
  • + Visual Novel/Adventure + - Danganronpa, AI The Somnium, 999 +
  • +
+

basically stuff that is heavy on the story

+

+ right now i'm trying to make progress on my backlog +

+
+ +
+
+

📚 anime/manga

+

+ I pretty much only watch/ read slice of life... + yuru camp, k-on, nichijou that sorta thing +

+
+ +
+

🎭 vtubers

+

+ mostly watch erina makina (pc), rosemi lovelock (now miki), and pavolia reine (holo) +
(I still hang around sometimes but certainly don't watch as much anymore) +

+
+ +
+

⚙️ tech stack

+

+ whatever seems fun (but usually next js + + tailwind + flask if I just want to build something super fast) +

+
+
+

KPOP

+

+ i recently got into kpop. I listen to YENA, NMIXX, IVE, LE SSERAFIM the most +

+
+
+ + +
+ + + Not much else to say... if you want some random + technical rambling go to + my blog + +
+
+
+ +
+ + diff --git a/moe.pinapelz.com/assets/603.webp b/moe.pinapelz.com/assets/603.webp new file mode 100644 index 0000000..1296b09 Binary files /dev/null and b/moe.pinapelz.com/assets/603.webp differ diff --git a/moe.pinapelz.com/assets/aiba.webp b/moe.pinapelz.com/assets/aiba.webp new file mode 100644 index 0000000..86049ee Binary files /dev/null and b/moe.pinapelz.com/assets/aiba.webp differ diff --git a/moe.pinapelz.com/assets/chuni.png b/moe.pinapelz.com/assets/chuni.png new file mode 100644 index 0000000..6d2dd8e Binary files /dev/null and b/moe.pinapelz.com/assets/chuni.png differ diff --git a/moe.pinapelz.com/assets/eri.jpg b/moe.pinapelz.com/assets/eri.jpg new file mode 100644 index 0000000..0993c28 Binary files /dev/null and b/moe.pinapelz.com/assets/eri.jpg differ diff --git a/moe.pinapelz.com/assets/gc.jpg b/moe.pinapelz.com/assets/gc.jpg new file mode 100644 index 0000000..08ed48f Binary files /dev/null and b/moe.pinapelz.com/assets/gc.jpg differ diff --git a/moe.pinapelz.com/assets/growing.gif b/moe.pinapelz.com/assets/growing.gif new file mode 100644 index 0000000..09d0ae2 Binary files /dev/null and b/moe.pinapelz.com/assets/growing.gif differ diff --git a/moe.pinapelz.com/assets/pfp.webp b/moe.pinapelz.com/assets/pfp.webp new file mode 100644 index 0000000..e6c723e Binary files /dev/null and b/moe.pinapelz.com/assets/pfp.webp differ diff --git a/moe.pinapelz.com/assets/pso2.webp b/moe.pinapelz.com/assets/pso2.webp new file mode 100644 index 0000000..2998816 Binary files /dev/null and b/moe.pinapelz.com/assets/pso2.webp differ diff --git a/moe.pinapelz.com/assets/rappy.webp b/moe.pinapelz.com/assets/rappy.webp new file mode 100644 index 0000000..714de31 Binary files /dev/null and b/moe.pinapelz.com/assets/rappy.webp differ diff --git a/moe.pinapelz.com/assets/reine.jpg b/moe.pinapelz.com/assets/reine.jpg new file mode 100644 index 0000000..a9466ba Binary files /dev/null and b/moe.pinapelz.com/assets/reine.jpg differ diff --git a/moe.pinapelz.com/assets/rg-tier.gif b/moe.pinapelz.com/assets/rg-tier.gif new file mode 100644 index 0000000..6735da7 Binary files /dev/null and b/moe.pinapelz.com/assets/rg-tier.gif differ diff --git a/moe.pinapelz.com/assets/sayo-fries.gif b/moe.pinapelz.com/assets/sayo-fries.gif new file mode 100644 index 0000000..ad20b75 Binary files /dev/null and b/moe.pinapelz.com/assets/sayo-fries.gif differ diff --git a/moe.pinapelz.com/assets/sdvx.png b/moe.pinapelz.com/assets/sdvx.png new file mode 100644 index 0000000..4be26b7 Binary files /dev/null and b/moe.pinapelz.com/assets/sdvx.png differ diff --git a/moe.pinapelz.com/assets/usami.webp b/moe.pinapelz.com/assets/usami.webp new file mode 100644 index 0000000..6e1a34e Binary files /dev/null and b/moe.pinapelz.com/assets/usami.webp differ diff --git a/moe.pinapelz.com/assets/vuln.jpg b/moe.pinapelz.com/assets/vuln.jpg new file mode 100644 index 0000000..1cbb192 Binary files /dev/null and b/moe.pinapelz.com/assets/vuln.jpg differ diff --git a/moe.pinapelz.com/assets/xiv.webp b/moe.pinapelz.com/assets/xiv.webp new file mode 100644 index 0000000..4b3fb0d Binary files /dev/null and b/moe.pinapelz.com/assets/xiv.webp differ diff --git a/moe.pinapelz.com/assets/xqcl.webp b/moe.pinapelz.com/assets/xqcl.webp new file mode 100644 index 0000000..f0e4e2d Binary files /dev/null and b/moe.pinapelz.com/assets/xqcl.webp differ diff --git a/moe.pinapelz.com/encoded-take-no1.html b/moe.pinapelz.com/encoded-take-no1.html new file mode 100644 index 0000000..6358152 --- /dev/null +++ b/moe.pinapelz.com/encoded-take-no1.html @@ -0,0 +1,31 @@ + + + + + + encoded take no 1 + + + + +
+
+
🔒
+

Protected Content

+

Enter the passphrase to unlock this post.

+ +
+
+
+ + + + + + diff --git a/moe.pinapelz.com/encoded-take-no2.html b/moe.pinapelz.com/encoded-take-no2.html new file mode 100644 index 0000000..3eb30ea --- /dev/null +++ b/moe.pinapelz.com/encoded-take-no2.html @@ -0,0 +1,31 @@ + + + + + + encoded take no 2 + + + + +
+
+
🔒
+

Protected Content

+

Enter the passphrase to unlock this post.

+ +
+
+
+ + + + + + diff --git a/moe.pinapelz.com/index.html b/moe.pinapelz.com/index.html new file mode 100644 index 0000000..bd634d2 --- /dev/null +++ b/moe.pinapelz.com/index.html @@ -0,0 +1,340 @@ + + + + + + pinapelz.moe - u found it + + + + + + + + + + + + + +
+
+
+
+ welcome to pinapelz.moe +
+
+ rosemi + erina + reine + usami + vuln + gnomechild + rappy + aiba + sdvx +
+
+
+
+ + +
+
+

Welcome!

+

+ Ahoy! Thanks for visiting! I thought the + old Linktree like site was pretty boring for a + .moe domain, so I took + matters into my own hands and "moeifyed" it! +

+

+ Hope you enjoy your stay! + xqcL +

+
+ +
+
+

Patchwork Radio

+ +
+

Now Playing:

+

Loading... 123

+

+ plz be patient. radio might be down +

+ Powered by Patchwork Archive +
+
+
+ Rosemi Lovelock good morning +
+
+

micro.pinapelz.com

+ + Sayo Hikawa eating fries + + +

my indieweb micro blog bridged with fediverse and bluesky. short thoughts, updates, and random stuff

+ check it out here +
+
+
+
+
+ Grace from SDVX +

Rhythm Game Tierlist

+

my personal tierlist for rhythm games. I try to judge a series as a whole since most of them keep the same mechanics in sequels

+ check it out here +
+
+

Recent Links (cause im lazy to make navigation)

+

Not everything is public, but if you gain access i guess its public for u. +

+
+
+ +
+
+

GitHub

+

+ nerdge programming
+ + open source stuff 🤓 +

+ + GitHub Logo + github.com/pinapelz + +
+ +
+

"Technical" Blog

+

+ random long-form rambling
+ (usually technical or niche stuff) +

+ + blog.pinapelz.com + +
+
+

Super Secret Link

+

+ mystery link for true vtuber degens
+ I'll change it from time to time +

+ + 🔒 https://link.moekyun.me/Y4z40E + +
+
+
+
+ + + diff --git a/moe.pinapelz.com/projects.html b/moe.pinapelz.com/projects.html new file mode 100644 index 0000000..730fe6a --- /dev/null +++ b/moe.pinapelz.com/projects.html @@ -0,0 +1,171 @@ + + + + + + projects - very cool stuff yep + + + + + + + +
+ +
+ +
+
+ + fun stuff (maybe) + +
+
+
+

cool and interesting stuff

+

or at least i think they're pretty cool :( go check them out!

+
    +
  • +

    + Patchwork Archive +

    +

    + A running archive of VTuber music. Trying to archive every + music/cover created by the VTuber community. Over 15K songs/covers + and counting! +

    +
    + Patchwork Archive 1 + Patchwork Archive 2 +
    +
  • +
  • +

    PhaseTracker

    +
    + PhaseTracker 1 + PhaseTracker 2 +
    +

    + The UNOFFICIAL Phase Connect subscriber tracker. I know some + people don't like number sites, but I still thought that it would + be awesome to track the growth of one of my favorite VTuber + groups. +

    +
  • +
  • +

    573-UPDATES

    +
    + 573-UPDATES Main Feed +
    +

    + 573-UPDATES is a news aggreator for JP arcade games (mostly rhythm). It only pulls data from + official sources. Its called 573 cause it sounds like KONAMI if you shuffle around how you read those numbers in JP + (yep, KONAMI's arcade games inspired this). Use it to browse the latest news or share permalinks to posts with friends! +

    +
  • +
  • +

    + Malmstone Calculator +

    +
    + FFXIV-Malmstone Screenshot +
    +

    + A FFXIV Dalamud plugin that helps with calculating how much more + pvp you got left to play before hitting the next level in the + battlepass system. Made it cause I was tired of always having to + use an online calculator and plugging in the numbers manually. +

    +
  • +
  • +

    + JHolodex +

    +

    + Its a wrapper for the Holodex API for Java. Uhhh, maybe this will be useful for the 2 people out there + who need VTuber data in their application and are for some forbidden reason choosing Java as the language + to do that in. (i really love jvm) +

    +
  • +
    +

    + yep not seeing a trend here at all with any of my interests... if you like this sorta thing, the rest of it + is over on my + GitHub +

    +
+
+
+ + + +
+ Fullscreen Image +
+ + + + + + diff --git a/moe.pinapelz.com/rhythm-games-tierlist.html b/moe.pinapelz.com/rhythm-games-tierlist.html new file mode 100644 index 0000000..02699e1 --- /dev/null +++ b/moe.pinapelz.com/rhythm-games-tierlist.html @@ -0,0 +1,712 @@ + + + + + Exported Tier List + + + + + + +
+

My TierList

+
+ GitHub +
+
+
+
+
+
+
+
+
+ + + + + diff --git a/moe.pinapelz.com/scripts/index.js b/moe.pinapelz.com/scripts/index.js new file mode 100644 index 0000000..dbd7ade --- /dev/null +++ b/moe.pinapelz.com/scripts/index.js @@ -0,0 +1,129 @@ +function fetchDiscordStatus(userId) { + const API_URL = `https://api.lanyard.rest/v1/users/${userId}`; + + fetch(API_URL) + .then(response => response.json()) + .then(data => { + const discordStatus = data.data.discord_status; + + const statusColors = { + online: "#43b581", + idle: "#faa61a", + dnd: "#f04747", + offline: "#747f8d", + }; + + const statusText = { + online: "Online", + idle: "Idle", + dnd: "Do Not Disturb", + offline: "Offline", + }; + + const statusSection = document.getElementById(`discord-status`); + const statusTextElement = statusSection.querySelector(".status-text"); + + statusSection.style.backgroundColor = statusColors[discordStatus]; + statusTextElement.textContent = "Currently: " + statusText[discordStatus]; + }) + .catch(error => console.error("Error fetching Discord status:", error)); + } + +document.addEventListener("DOMContentLoaded", () => { + const quotes = [ + "Give a man a fish, learn him how to eat, give a man- learn a man how to - xQc", + "Yeah I'm GAY, Good at Yugioh - Rosemi Lovelock", + "yipee - Erina Makina", + "Your friend doesn't like Vtubers? Tell your friend to get some taste - Pavolia Reine", + ]; + + function getRandomQuote() { + const randomIndex = Math.floor(Math.random() * quotes.length); + return quotes[randomIndex]; + } + + const quoteElement = document.getElementById("quote"); + quoteElement.innerHTML = `${getRandomQuote()}`; +}); +function updateClock() { + const clockElement = document.getElementById('clock'); + const now = new Date(); + const pstTime = new Date(now.toLocaleString("en-US", {timeZone: "America/Los_Angeles"})); + const hours = String(pstTime.getHours()).padStart(2, '0'); + const minutes = String(pstTime.getMinutes()).padStart(2, '0'); + const seconds = String(pstTime.getSeconds()).padStart(2, '0'); + const day = String(pstTime.getDate()).padStart(2, '0'); + const month = String(pstTime.getMonth() + 1).padStart(2, '0'); + const year = pstTime.getFullYear(); + let message = "good day!"; + if (pstTime.getHours() >= 0 && pstTime.getHours() < 7) { + message = "(its late for me)"; + } else if (pstTime.getHours() < 12) { + message = "its morning for me"; + } else if (pstTime.getHours() >= 12 && pstTime.getHours() < 18) { + message = "its afternoon for me"; + } else if (pstTime.getHours() >= 18) { + message = "evening rn for me"; + } + clockElement.innerHTML = `${month}/${day}/${year} ${hours}:${minutes}:${seconds} ` + message; +} + +document.addEventListener("DOMContentLoaded", () => { + const images = document.querySelectorAll(".random-float"); + const positions = []; + + images.forEach((img) => { + let randomTop, randomLeft; + let overlap; + + do { + overlap = false; + randomTop = Math.random() * 100; + randomLeft = Math.random() * 100; + if (randomTop > 30 && randomTop < 70) { + overlap = true; + } + if (randomLeft > 30 && randomLeft < 70) { + overlap = true; + } + positions.forEach(pos => { + const distance = Math.sqrt(Math.pow(randomTop - pos.top, 2) + Math.pow(randomLeft - pos.left, 2)); + if (distance < 10) { + overlap = true; + } + }); + } while (overlap); + + positions.push({ top: randomTop, left: randomLeft }); + + const randomDuration = Math.random() * 10 + 3; + + img.style.top = `${randomTop}%`; + img.style.left = `${randomLeft}%`; + img.style.animationDuration = `${randomDuration}s`; + }); +}); + +document.addEventListener('DOMContentLoaded', function() { + function fetchNowPlaying() { + fetch('https://a4.asurahosting.com/api/nowplaying_static/patchworkarchive.json') // Replace with the actual API endpoint + .then(response => response.json()) + .then(data => { + const nowPlaying = data.now_playing.song; + document.getElementById('song-title').textContent = nowPlaying.title; + document.getElementById('song-artist').textContent = nowPlaying.artist; + const songArt = document.getElementById('song-art'); + songArt.src = nowPlaying.art; + songArt.style.display = 'block'; + }) + .catch(error => { + console.error('Error fetching now playing data:', error); + }); + } + + fetchNowPlaying(); + setInterval(fetchNowPlaying, 60000); +}); + +setInterval(updateClock, 1000); +updateClock(); diff --git a/moe.pinapelz.com/styles/bg.webp b/moe.pinapelz.com/styles/bg.webp new file mode 100644 index 0000000..3ed366d Binary files /dev/null and b/moe.pinapelz.com/styles/bg.webp differ diff --git a/moe.pinapelz.com/styles/border.webp b/moe.pinapelz.com/styles/border.webp new file mode 100644 index 0000000..14dca4d Binary files /dev/null and b/moe.pinapelz.com/styles/border.webp differ diff --git a/moe.pinapelz.com/styles/carbon.css b/moe.pinapelz.com/styles/carbon.css new file mode 100644 index 0000000..8d90e2a --- /dev/null +++ b/moe.pinapelz.com/styles/carbon.css @@ -0,0 +1,755 @@ +/*Carbon themed CSS*/ +:root { + --primary-bg: #1a1a1a; + --secondary-bg: #252525; + --tertiary-bg: #2d2d2d; + --accent-gold: #c9aa71; + --accent-blue: #5b8fc7; + --text-primary: #e2e2e2; + --text-secondary: #b8b8b8; + --text-dim: #888888; + --border-color: #3a3a3a; + --link-color: #7db8e8; + --link-hover: #a5d0f0; + --header-gradient-start: #2a2a2a; + --header-gradient-end: #1a1a1a; + --nav-bg: #1f1f1f; + --nav-hover: #333333; +} + +/* Reset and base styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Meiryo", "Segoe UI", "Helvetica Neue", Arial, sans-serif; + background-color: var(--primary-bg); + color: var(--text-primary); + line-height: 1.7; + min-height: 100vh; + display: flex; + background-image: repeating-linear-gradient( + 45deg, + transparent, + transparent 10px, + rgba(255, 255, 255, 0.01) 10px, + rgba(255, 255, 255, 0.01) 20px + ); +} + +/* Navigation sidebar */ +.nav-sidebar { + width: 250px; + background-color: var(--nav-bg); + border-right: 1px solid var(--border-color); + height: 100vh; + position: fixed; + overflow-y: auto; + padding: 20px 0; + box-shadow: 2px 0 10px rgba(0, 0, 0, 0.2); +} + +.nav-logo { + padding: 15px 20px; + margin-bottom: 20px; + border-bottom: 1px solid var(--border-color); + text-align: center; +} + +.nav-logo h3 { + color: var(--accent-gold); + font-size: 1.2em; + margin: 0; +} + +.nav-menu { + list-style-type: none; + padding: 0; + margin: 0; +} + +.nav-menu li { + margin: 0; +} + +.nav-menu a { + display: block; + padding: 10px 20px; + color: var(--text-secondary); + text-decoration: none; + border-left: 3px solid transparent; + transition: all 0.3s ease; +} + +.nav-menu a:hover { + background-color: var(--nav-hover); + color: var(--accent-gold); + border-left-color: var(--accent-gold); + text-shadow: none; +} + +.nav-menu a::after { + display: none; +} + +.nav-menu h4 { + padding: 15px 20px 5px; + color: var(--accent-gold); + font-size: 1em; + text-transform: uppercase; + letter-spacing: 1px; +} + +.nav-submenu { + list-style-type: none; + padding: 0; + margin: 0; +} + +/* Indentation for nested submenu items */ +.nav-submenu li.level-2 a { + padding-left: 30px; +} + +.nav-submenu li.level-3 a { + padding-left: 40px; +} + +.nav-submenu li.level-4 a { + padding-left: 50px; +} + +.nav-submenu li.level-5 a { + padding-left: 60px; +} + +.nav-submenu li.level-6 a { + padding-left: 70px; +} + +/* Main content */ +.main-content { + flex: 1; + margin-left: 250px; + width: calc(100% - 250px); +} + +/* Container */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 40px 20px; + background-color: rgba(26, 26, 26, 0.95); + min-height: 100vh; + box-shadow: 0 0 50px rgba(0, 0, 0, 0.5); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; + color: var(--accent-gold); + margin-top: 1.5em; + margin-bottom: 0.8em; + font-weight: 500; + letter-spacing: 0.5px; + position: relative; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); +} + +h1 { + font-size: 2.2em; + padding-bottom: 0.5em; + border-bottom: 3px solid var(--accent-gold); + background: var(--accent-gold); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + text-shadow: none; + margin-top: 0.5em; +} + +h1::after { + content: ""; + display: block; + position: absolute; + bottom: -3px; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, var(--accent-gold), transparent 70%); +} + +h2 { + font-size: 1.8em; + color: var(--accent-blue); + padding-left: 15px; + border-left: 4px solid var(--accent-blue); + margin-left: -15px; +} + +h3 { + font-size: 1.4em; + color: var(--text-primary); +} + +h4 { + font-size: 1.2em; + color: var(--text-secondary); +} + +h5, +h6 { + font-size: 1.1em; + color: var(--text-secondary); +} + +/* Paragraphs and text */ +p { + margin-bottom: 1.2em; + color: var(--text-secondary); + text-align: left; +} + +/* Links with FFXIV styling */ +a { + color: var(--link-color); + text-decoration: none; + position: relative; + transition: color 0.3s ease; + font-weight: 500; +} + +a:hover { + color: var(--link-hover); + text-shadow: 0 0 10px rgba(125, 184, 232, 0.5); +} + +a::after { + content: ""; + position: absolute; + bottom: -2px; + left: 0; + width: 0; + height: 1px; + background-color: var(--link-hover); + transition: width 0.3s ease; +} + +a:hover::after { + width: 100%; +} + +/* Bold and Italic */ +strong, +b { + color: var(--accent-gold); + font-weight: 600; +} + +em, +i { + color: var(--text-primary); + font-style: italic; +} + +/* Lists with FFXIV styling */ +ul, +ol { + margin-left: 30px; + margin-bottom: 1.2em; +} + +li { + margin-bottom: 0.5em; + color: var(--text-secondary); +} + +ul li::marker { + color: var(--accent-gold); +} + +ol li::marker { + color: var(--accent-blue); + font-weight: bold; +} + + +blockquote { + border-left: 4px solid var(--accent-gold); + background: linear-gradient(90deg, rgba(201, 170, 113, 0.1), transparent); + padding: 15px 20px; + margin: 1.5em 0; + color: var(--text-secondary); + position: relative; +} + +blockquote::before { + font-size: 3em; + color: var(--accent-gold); + opacity: 0.3; + position: absolute; +} + +table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + margin: 1.5em 0; + background-color: var(--secondary-bg); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); +} + +thead { + background: linear-gradient( + 180deg, + var(--tertiary-bg), + var(--secondary-bg) + ); +} + +th { + padding: 12px 15px; + text-align: left; + color: var(--accent-gold); + font-weight: 600; + border-bottom: 2px solid var(--accent-gold); + text-transform: uppercase; + font-size: 0.9em; + letter-spacing: 1px; +} + +td { + padding: 10px 15px; + color: var(--text-secondary); + border-bottom: 1px solid var(--border-color); +} + +tr:hover td { + background-color: rgba(201, 170, 113, 0.05); +} + +hr { + border: none; + height: 2px; + background: linear-gradient( + 90deg, + transparent, + var(--accent-gold) 20%, + var(--accent-gold) 50%, + var(--accent-gold) 80%, + transparent + ); + margin: 2em 0; + position: relative; +} + +hr::before { + content: "◆"; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + background-color: var(--primary-bg); + color: var(--accent-gold); + padding: 0 10px; + font-size: 1.2em; +} + +/* Images */ +img { + max-width: 100%; + height: auto; + display: block; + margin: 1.5em auto; + border: 2px solid var(--border-color); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5); +} + +/* Wiki-style additional elements */ +.wiki-infobox { + float: right; + width: 300px; + margin: 0 0 20px 20px; + background-color: var(--secondary-bg); + border: 1px solid var(--border-color); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); +} + +.wiki-infobox-header { + background-color: var(--tertiary-bg); + color: var(--accent-gold); + padding: 10px 15px; + text-align: center; + font-weight: bold; + border-bottom: 1px solid var(--border-color); +} + +.wiki-infobox-content { + padding: 15px; +} + +.wiki-infobox-row { + display: flex; + margin-bottom: 10px; +} + +.wiki-infobox-label { + flex: 1; + font-weight: bold; + color: var(--accent-blue); +} + +.wiki-infobox-value { + flex: 2; + color: var(--text-secondary); +} + +/* Article meta information */ +.article-meta { + border-top: 1px solid var(--border-color); + margin-top: 40px; + padding-top: 20px; + font-size: 0.9em; + color: var(--text-dim); +} + +.article-categories { + margin-top: 10px; +} + +.article-category { + display: inline-block; + background-color: var(--tertiary-bg); + color: var(--accent-gold); + padding: 3px 10px; + margin-right: 5px; + margin-bottom: 5px; + border-radius: 3px; + font-size: 0.85em; +} + +/* Scrollbar styling */ +::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +::-webkit-scrollbar-track { + background: var(--secondary-bg); + border: 1px solid var(--border-color); +} + +::-webkit-scrollbar-thumb { + background: var(--accent-gold); + border: 1px solid var(--border-color); +} + +::-webkit-scrollbar-thumb:hover { + background: var(--accent-blue); +} + +/* Selection styling */ +::selection { + background-color: rgba(201, 170, 113, 0.3); + color: var(--text-primary); +} + +::-moz-selection { + background-color: rgba(201, 170, 113, 0.3); + color: var(--text-primary); +} + +/* Custom Figure styling */ +.custom-figure { + margin: 2.5rem auto; + padding: 1.5rem; + background-color: var(--secondary-bg); + border: 1px solid var(--border-color); + border-radius: 5px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4); + position: relative; + overflow: hidden; + max-width: 95%; +} + +/* Image gallery layout for multiple images */ +.custom-figure .image-gallery { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + grid-gap: 1rem; + margin-bottom: 1.5rem; +} + +/* Single image in figure */ +.custom-figure img { + margin: 0 auto 1rem; + border: 1px solid var(--border-color); + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3); + transition: + transform 0.3s ease, + box-shadow 0.3s ease; + max-height: 500px; + width: auto; +} + +/* Hover effect for images */ +.custom-figure img:hover { + transform: scale(1.02); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + border-color: var(--accent-gold); +} + +/* Image titles (from title attribute) */ +.custom-figure .image-title { + display: block; + text-align: center; + font-style: italic; + color: var(--accent-gold); + font-size: 0.9em; + margin-top: 0.5rem; + margin-bottom: 1rem; +} + +/* Caption styling */ +.custom-figure figcaption { + font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; + text-align: center; + color: var(--text-primary); + font-size: 1.1em; + padding: 0.8rem 0; + border-top: 1px solid rgba(201, 170, 113, 0.3); + margin-top: 0.5rem; + position: relative; +} + +/* Special styling for captions to match FFXIV aesthetic */ +.custom-figure figcaption::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 4px; + background: linear-gradient(90deg, var(--accent-gold), var(--accent-blue)); +} + +/* Responsive design */ +@media (max-width: 1200px) { + .container { + max-width: 100%; + } +} + +@media (max-width: 992px) { + .nav-sidebar { + width: 200px; + } + + .main-content { + margin-left: 200px; + width: calc(100% - 200px); + } +} + +@media (max-width: 768px) { + body { + flex-direction: column; + } + + .nav-sidebar { + width: 100%; + height: auto; + position: relative; + border-right: none; + border-bottom: 1px solid var(--border-color); + } + + .main-content { + margin-left: 0; + width: 100%; + } + + .container { + padding: 20px 15px; + } + + .wiki-infobox { + float: none; + width: 100%; + margin: 1.5em 0; + } + + h1 { + font-size: 2em; + } + + h2 { + font-size: 1.6em; + } + + h3 { + font-size: 1.3em; + } +} +/* Animation for page load */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } + + .custom-figure { + padding: 1rem; + margin: 2rem auto; + } + + .custom-figure .image-gallery { + grid-template-columns: 1fr; + } + + .custom-figure img { + max-height: 350px; + } +} + +.main-content > * { + animation: fadeIn 0.6s ease-out; +} + +/* ============================================================ + Lock screen — encrypted posts + ============================================================ */ + +/* The data holder is invisible; only the lock UI is shown */ +#encrypted-content { + display: none; +} + +/* Full-viewport overlay */ +#lock-screen { + position: fixed; + inset: 0; + background-color: var(--primary-bg); + background-image: repeating-linear-gradient( + 45deg, + transparent, + transparent 10px, + rgba(255, 255, 255, 0.01) 10px, + rgba(255, 255, 255, 0.01) 20px + ); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + animation: fadeIn 0.4s ease-out; +} + +/* Card */ +#lock-box { + background-color: var(--secondary-bg); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 2.75rem 3rem; + width: 90%; + max-width: 400px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + gap: 1.1rem; + box-shadow: + 0 12px 50px rgba(0, 0, 0, 0.7), + 0 0 0 1px rgba(201, 170, 113, 0.07); + position: relative; + overflow: hidden; +} + +/* Gradient top-accent bar */ +#lock-box::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 3px; + background: linear-gradient(90deg, var(--accent-gold), var(--accent-blue)); +} + +/* Lock emoji */ +.lock-icon { + font-size: 2.6rem; + line-height: 1; + margin-bottom: 0.15rem; +} + +/* Override the global h2 blue/border-left styles inside the lock box */ +#lock-box h2 { + font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; + font-size: 1.35rem; + font-weight: 500; + letter-spacing: 1px; + color: var(--accent-gold); + -webkit-text-fill-color: var(--accent-gold); + background: none; + -webkit-background-clip: unset; + background-clip: unset; + text-shadow: none; + border-left: none; + padding-left: 0; + margin-left: 0; + margin-top: 0; + margin-bottom: 0; + position: static; +} + +#lock-box p { + color: var(--text-dim); + font-size: 0.87rem; + margin: 0; + text-align: center; +} + +/* Password input */ +#enc-input { + background-color: var(--tertiary-bg); + color: var(--text-primary); + border: 1px solid var(--border-color); + padding: 0.65rem 1rem; + border-radius: 6px; + width: 100%; + font-size: 0.95rem; + font-family: inherit; + text-align: center; + letter-spacing: 0.05em; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +#enc-input::placeholder { + color: var(--text-dim); + letter-spacing: 0; +} + +#enc-input:focus { + outline: none; + border-color: var(--accent-blue); + box-shadow: + 0 0 0 3px rgba(91, 143, 199, 0.12), + inset 0 1px 3px rgba(0, 0, 0, 0.3); +} + +@media (max-width: 480px) { + #lock-box { + padding: 2rem 1.5rem; + } +} diff --git a/moe.pinapelz.com/styles/clock.css b/moe.pinapelz.com/styles/clock.css new file mode 100644 index 0000000..a69c22c --- /dev/null +++ b/moe.pinapelz.com/styles/clock.css @@ -0,0 +1,43 @@ +.clock-widget { + font-size: 2em; + color: #ff69b4; + text-align: center; + margin-top: 20px; + padding: 20px; + border: 2px dashed #ff69b4; + background: #ffe4e1; + border-radius: 15px; + box-shadow: 0 0 10px rgba(255, 105, 180, 0.5); + position: relative; + overflow: hidden; + animation: glitter 3s infinite alternate; + border-width:20px; + padding:10px; + border-style:solid; + border-image: url("https://foollovers.com/mat/plate/pl035-plate-j03.gif") 55 fill round; +} + +.clock-widget::before { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: linear-gradient(135deg, rgba(255, 105, 180, 0.2), rgba(255, 228, 225, 0.2)); + animation: rotate 6s linear infinite; +} + +.clock-widget span { + position: relative; + z-index: 1; +} + +@keyframes rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/moe.pinapelz.com/styles/projects.css b/moe.pinapelz.com/styles/projects.css new file mode 100644 index 0000000..5b00204 --- /dev/null +++ b/moe.pinapelz.com/styles/projects.css @@ -0,0 +1,76 @@ +.projects-section { + margin-top: 20px; + padding: 10px; + background: #ffebf0; + border: solid #ffb6c1 2px; +} +.projects-section h3 { + color: #ff69b4; + text-shadow: 1px 1px 2px #fff; +} +.projects-section ul { + list-style-type: disc; + padding-left: 20px; +} +.projects-section ul li { + margin-bottom: 10px; +} + +.projects-section .image-container { + display: flex; + flex-wrap: wrap; + gap: 10px; +} +.projects-section .image-container img { + max-width: 100%; + height: auto; + cursor: pointer; + transition: transform 0.2s; +} +.projects-section .image-container img:hover { + transform: scale(1.05); +} + +.fullscreen-img { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.9); + justify-content: center; + align-items: center; + z-index: 1000; +} +.fullscreen-img img { + max-width: 90%; + max-height: 90%; +} + +@media (max-width: 768px) { + .projects-section { + padding: 5px; + } + + .projects-section h3 { + font-size: 1.5em; + } + + .projects-section ul { + padding-left: 10px; + } + + .projects-section ul li { + margin-bottom: 5px; + } + + .projects-section .image-container { + flex-direction: column; + align-items: center; + } + .projects-section .image-container img { + width: 100%; + height: auto; + } +} \ No newline at end of file diff --git a/moe.pinapelz.com/styles/styles.css b/moe.pinapelz.com/styles/styles.css new file mode 100644 index 0000000..a8a4f48 --- /dev/null +++ b/moe.pinapelz.com/styles/styles.css @@ -0,0 +1,475 @@ +body { + background: url("bg.webp"); + background-size: + 100px 100px, + 100% 100%; + font-family: "Courier New", monospace; + color: #333; + background-color: pink; + cursor: url("cursor.gif"), auto; +} +.container { + border-width: 10px; + border-style: solid; + border-image: url("border.webp") 9 fill round; + z-index: -999; +} + +.sidebar { + padding: 10px; + margin-top: 30px; + border: solid #ffb6c1 2px; + background: #ffe4e1; + text-align: center; + overflow-wrap: break-word; +} + +.sidebar ul { + list-style-type: none; + padding: 0; + margin: 0; + text-align: center; +} + +.sidebar ul li { + margin-bottom: 2px; +} + +.sidebar ul li a { + color: #ff69b4; + text-decoration: none; +} + +.sidebar ul li a:hover { + text-decoration: underline; +} + +.content { + padding: 10px; + overflow-wrap: break-word; + word-wrap: break-word; +} +.footer { + text-align: center; + padding-top: 30px; + margin-top: 20px; + font-size: 0.8em; + overflow-wrap: break-word; + word-wrap: break-word; +} +a { + color: #ff69b4; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +.glitter { + color: #ff69b4; + font-weight: bold; + animation: glitter 3s infinite alternate; +} +@keyframes glitter { + 0% { + color: #ff69b4; + } + 25% { + color: #ff1493; + } + 50% { + color: #db7093; + } + 75% { + color: #ff69b4; + } + 100% { + color: #ffa07a; + } +} + +.border-img { + max-width: 100%; + border: solid #ff69b4 2px; +} + +marquee { + font-size: 1.2em; + color: #ff69b4; + margin-bottom: 10px; +} + +blink { + color: #ff1493; + animation: blinker 1.5s linear infinite; +} +@keyframes blinker { + 50% { + opacity: 0; + } +} + +.welcome-box { + border-style: dashed; + border: 2px dashed #ff69b4; + padding: 20px; +} + +.general-section { + margin-top: 20px; + padding: 10px; + background: #ffebf0; + border: solid #ffb6c1 2px; + overflow-wrap: break-word; + word-wrap: break-word; +} + +.general-section h3 { + color: #ff69b4; + text-shadow: 1px 1px 2px #fff; +} + +.general-section ul { + list-style-type: disc; + padding-left: 20px; +} + +.general-section ul li { + margin-bottom: 10px; +} + +.contacts-section { + margin-top: 20px; + padding: 10px; + background: #ffe4e1; + border: solid #ffb6c1 2px; +} +.contacts-section h3 { + color: #ff69b4; + text-shadow: 1px 1px 2px #fff; +} +.contacts-section ul { + list-style-type: none; + padding: 0; +} +.contacts-section ul li { + margin-bottom: 5px; +} + +.discord-status { + display: flex; + align-items: center; + padding: 15px; + border-radius: 10px; + color: white; + transition: background-color 0.3s ease-in-out; + margin-top: 20px; + margin-bottom: 10px; + background: #7289da; +} + +.discord-status img { + width: 50px; + height: 50px; + border-radius: 50%; + margin-right: 20px; +} + +.discord-status h2 { + font-size: 1.2rem; +} + +.discord-status p { + font-size: 1rem; + opacity: 0.8; +} + +@keyframes crazy-animation { + 0% { + transform: rotate(0deg) scale(1) translateX(0) skew(0deg) rotateY(0deg); + filter: hue-rotate(0deg) blur(0px); + opacity: 1; + } + 10% { + transform: rotate(30deg) scale(1.3) translateX(10px) skew(10deg) + rotateY(90deg); + filter: hue-rotate(50deg) blur(2px); + opacity: 0.8; + } + 25% { + transform: rotate(45deg) scale(1.5) translateX(20px) skew(-10deg) + rotateY(180deg); + filter: hue-rotate(120deg) blur(4px); + opacity: 0.6; + } + 50% { + transform: rotate(-45deg) scale(0.8) translateX(-30px) skew(15deg) + rotateY(270deg); + filter: hue-rotate(200deg) blur(6px); + opacity: 1; + } + 75% { + transform: rotate(90deg) scale(1.8) translateX(15px) skew(-15deg) + rotateY(360deg); + filter: hue-rotate(300deg) blur(3px); + opacity: 0.7; + } + 100% { + transform: rotate(0deg) scale(1) translateX(0) skew(0deg) rotateY(0deg); + filter: hue-rotate(360deg) blur(0px); + opacity: 1; + } +} + +.crazy-image:hover { + animation: crazy-animation 3s ease-in-out infinite; +} + +.fullscreen-text { + top: 0; + left: 0; + color: black; + display: flex; + justify-content: center; + align-items: center; + font-size: 2em; + opacity: 0; + visibility: hidden; + transition: + opacity 0.5s, + visibility 0.5s; + z-index: 10; +} + +.crazy-image:hover + .fullscreen-text { + opacity: 1; + visibility: visible; +} + +/* Mobile-specific overrides for custom elements */ +@media (max-width: 768px) { + .header-animation img { + width: 30px; + height: 30px; + } + + .discord-status { + flex-direction: column; + align-items: flex-start; + } + + .discord-status img { + margin-right: 0; + margin-bottom: 10px; + } + + .discord-status h2 { + font-size: 1rem; + } + + .discord-status p { + font-size: 0.9rem; + } + + .crazy-image { + max-width: 200px; + } + + /* Ensure no horizontal overflow */ + body { + overflow-x: hidden; + } + + .container { + max-width: 100%; + overflow-x: hidden; + } +} + +@media (max-width: 480px) { + .header-animation img { + width: 25px; + height: 25px; + } + + .crazy-image { + max-width: 150px; + } + + /* Further mobile optimizations */ + .general-section { + padding: 8px; + margin-top: 15px; + } + + .sidebar { + padding: 8px; + margin-top: 20px; + } + + .content { + padding: 8px; + } +} + +.center { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; +} + +.music-player { + margin-top: 20px; + padding: 10px; + background: #ffebf0; + border: dotted #ffb6c1 2px; +} + +.music-player h3 { + color: #ff69b4; + text-shadow: 1px 1px 2px #fff; + margin-bottom: 10px; + text-align: center; +} + +.music-player audio { + width: 100%; +} + +.now-playing { + margin-top: 10px; + padding: 10px; + text-align: center; +} + +.now-playing h4 { + margin: 0; + font-size: 1.2em; +} + +.now-playing p { + margin: 5px 0; +} + +.header { + position: relative; + text-align: center; + font-size: 2em; + color: #ff69b4; + text-shadow: + 1px 1px 2px #fff, + 2px 2px 4px #ffa07a; + animation: glitter 3s infinite alternate; + overflow: hidden; +} + +.header-content { + position: relative; + z-index: 1; +} + +.header-animation { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: -997; +} + +.header-animation img { + position: absolute; + width: 50px; + height: 50px; + opacity: 0.8; + animation: float 5s infinite ease-in-out; +} + +@keyframes float { + 0% { + transform: translateY(0); + } + 50% { + transform: translateY(-40px); + } + 100% { + transform: translateY(0); + } +} + +.random-image-container { + display: flex; + justify-content: center; + align-items: center; +} + +.random-image-container img { + max-width: 100%; + height: auto; + display: block; +} +.top-navbar { + background-color: rgba(0, 0, 0, 0.8); + padding: 10px 0; + position: sticky; + top: 0; + z-index: 100; + backdrop-filter: blur(5px); +} + +.top-navbar nav { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; +} + +.top-navbar ul { + display: flex; + justify-content: center; + align-items: center; + gap: 30px; + list-style: none; + margin: 0; + padding: 0; +} + +.top-navbar li { + margin: 0; +} + +.top-navbar a { + color: white; + text-decoration: none; + padding: 8px 16px; + border-radius: 20px; + transition: all 0.3s ease; + font-weight: 500; + display: block; +} + +.top-navbar a:hover, +.top-navbar a:focus { + background-color: #ff69b4; + outline: none; + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(255, 105, 180, 0.3); +} + +.top-navbar a[aria-current="page"] { + background-color: #ff69b4; + color: white; + font-weight: bold; +} + +@media (max-width: 768px) { + .top-navbar ul { + flex-direction: column; + gap: 10px; + } + + .top-navbar { + padding: 15px 0; + } +} diff --git a/pinapelz.moe/about.html b/pinapelz.moe/about.html deleted file mode 100644 index 88c2652..0000000 --- a/pinapelz.moe/about.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - ok for some reason u want to know about me - - - - - - - -
- -
-
-
- - About Me - -
- - - -
-
-
-

⚡ info ⚡

-
    -
  • 🐧 daily drives linux (endeavour os)
  • -
  • 💻 mainly uses hyprland and cosmic
  • -
  • 📺 anime/manga, rhythm game, mmorpg enjoyer
  • -
  • 🧠 im tryna unrot my brain rn
  • - -
-

I post a lot of random stuff
on my "microblog" at: https://micro.pinapelz.moe

-
- -
-

🎮 games 🎮

-
    -
  • - MMOs - FFXIV, PSO2 -
  • -
  • - (J)RPGs - Persona, - Xenoblade -
  • -
  • - Visual Novel/Adventure - - Danganronpa, AI The Somnium, 999 -
  • -
-

basically stuff that is heavy on the story

-

- right now i'm trying to make progress on my backlog -

-
- -
-
-

📚 anime/manga

-

- I pretty much only watch/ read slice of life... - yuru camp, k-on, nichijou that sorta thing -

-
- -
-

🎭 vtubers

-

- mostly watch erina makina (pc), rosemi lovelock (now miki), and pavolia reine (holo) -
(I still hang around sometimes but certainly don't watch as much anymore) -

-
- -
-

⚙️ tech stack

-

- whatever seems fun (but usually next js + - tailwind + flask if I just want to build something super fast) -

-
-
-

KPOP

-

- i recently got into kpop. I listen to YENA, NMIXX, IVE, LE SSERAFIM the most -

-
-
- - -
- - - Not much else to say... if you want some random - technical rambling go to - my blog - -
-
-
- -
- - diff --git a/pinapelz.moe/assets/603.webp b/pinapelz.moe/assets/603.webp deleted file mode 100644 index 1296b09..0000000 Binary files a/pinapelz.moe/assets/603.webp and /dev/null differ diff --git a/pinapelz.moe/assets/aiba.webp b/pinapelz.moe/assets/aiba.webp deleted file mode 100644 index 86049ee..0000000 Binary files a/pinapelz.moe/assets/aiba.webp and /dev/null differ diff --git a/pinapelz.moe/assets/chuni.png b/pinapelz.moe/assets/chuni.png deleted file mode 100644 index 6d2dd8e..0000000 Binary files a/pinapelz.moe/assets/chuni.png and /dev/null differ diff --git a/pinapelz.moe/assets/eri.jpg b/pinapelz.moe/assets/eri.jpg deleted file mode 100644 index 0993c28..0000000 Binary files a/pinapelz.moe/assets/eri.jpg and /dev/null differ diff --git a/pinapelz.moe/assets/gc.jpg b/pinapelz.moe/assets/gc.jpg deleted file mode 100644 index 08ed48f..0000000 Binary files a/pinapelz.moe/assets/gc.jpg and /dev/null differ diff --git a/pinapelz.moe/assets/growing.gif b/pinapelz.moe/assets/growing.gif deleted file mode 100644 index 09d0ae2..0000000 Binary files a/pinapelz.moe/assets/growing.gif and /dev/null differ diff --git a/pinapelz.moe/assets/pfp.webp b/pinapelz.moe/assets/pfp.webp deleted file mode 100644 index e6c723e..0000000 Binary files a/pinapelz.moe/assets/pfp.webp and /dev/null differ diff --git a/pinapelz.moe/assets/pso2.webp b/pinapelz.moe/assets/pso2.webp deleted file mode 100644 index 2998816..0000000 Binary files a/pinapelz.moe/assets/pso2.webp and /dev/null differ diff --git a/pinapelz.moe/assets/rappy.webp b/pinapelz.moe/assets/rappy.webp deleted file mode 100644 index 714de31..0000000 Binary files a/pinapelz.moe/assets/rappy.webp and /dev/null differ diff --git a/pinapelz.moe/assets/reine.jpg b/pinapelz.moe/assets/reine.jpg deleted file mode 100644 index a9466ba..0000000 Binary files a/pinapelz.moe/assets/reine.jpg and /dev/null differ diff --git a/pinapelz.moe/assets/rg-tier.gif b/pinapelz.moe/assets/rg-tier.gif deleted file mode 100644 index 6735da7..0000000 Binary files a/pinapelz.moe/assets/rg-tier.gif and /dev/null differ diff --git a/pinapelz.moe/assets/sayo-fries.gif b/pinapelz.moe/assets/sayo-fries.gif deleted file mode 100644 index ad20b75..0000000 Binary files a/pinapelz.moe/assets/sayo-fries.gif and /dev/null differ diff --git a/pinapelz.moe/assets/sdvx.png b/pinapelz.moe/assets/sdvx.png deleted file mode 100644 index 4be26b7..0000000 Binary files a/pinapelz.moe/assets/sdvx.png and /dev/null differ diff --git a/pinapelz.moe/assets/usami.webp b/pinapelz.moe/assets/usami.webp deleted file mode 100644 index 6e1a34e..0000000 Binary files a/pinapelz.moe/assets/usami.webp and /dev/null differ diff --git a/pinapelz.moe/assets/vuln.jpg b/pinapelz.moe/assets/vuln.jpg deleted file mode 100644 index 1cbb192..0000000 Binary files a/pinapelz.moe/assets/vuln.jpg and /dev/null differ diff --git a/pinapelz.moe/assets/xiv.webp b/pinapelz.moe/assets/xiv.webp deleted file mode 100644 index 4b3fb0d..0000000 Binary files a/pinapelz.moe/assets/xiv.webp and /dev/null differ diff --git a/pinapelz.moe/assets/xqcl.webp b/pinapelz.moe/assets/xqcl.webp deleted file mode 100644 index f0e4e2d..0000000 Binary files a/pinapelz.moe/assets/xqcl.webp and /dev/null differ diff --git a/pinapelz.moe/encoded-take-no1.html b/pinapelz.moe/encoded-take-no1.html deleted file mode 100644 index 6358152..0000000 --- a/pinapelz.moe/encoded-take-no1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - encoded take no 1 - - - - -
-
-
🔒
-

Protected Content

-

Enter the passphrase to unlock this post.

- -
-
-
- - - - - - diff --git a/pinapelz.moe/encoded-take-no2.html b/pinapelz.moe/encoded-take-no2.html deleted file mode 100644 index 3eb30ea..0000000 --- a/pinapelz.moe/encoded-take-no2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - encoded take no 2 - - - - -
-
-
🔒
-

Protected Content

-

Enter the passphrase to unlock this post.

- -
-
-
- - - - - - diff --git a/pinapelz.moe/index.html b/pinapelz.moe/index.html deleted file mode 100644 index 3541bf1..0000000 --- a/pinapelz.moe/index.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - pinapelz.moe - u found it - - - - - - - - - - - - - -
-
-
-
- welcome to pinapelz.moe -
-
- rosemi - erina - reine - usami - vuln - gnomechild - rappy - aiba - sdvx -
-
-
-
- - -
-
-

Welcome!

-

- Ahoy! Thanks for visiting! I thought the - old Linktree like site was pretty boring for a - .moe domain, so I took - matters into my own hands and "moeifyed" it! -

-

- Hope you enjoy your stay! - xqcL -

-
- -
-
-

Patchwork Radio

- -
-

Now Playing:

-

Loading... 123

-

- plz be patient. radio might be down -

- Powered by Patchwork Archive -
-
-
- Rosemi Lovelock good morning -
-
-

micro.pinapelz.moe

- - Sayo Hikawa eating fries - - -

my indieweb micro blog bridged with fediverse and bluesky. short thoughts, updates, and random stuff

- check it out here -
-
-
-
-
- Grace from SDVX -

Rhythm Game Tierlist

-

my personal tierlist for rhythm games. I try to judge a series as a whole since most of them keep the same mechanics in sequels

- check it out here -
-
-

Recent Links (cause im lazy to make navigation)

-

Not everything is public, but if you gain access i guess its public for u. -

-
-
- -
-
-

GitHub

-

- nerdge programming
- + open source stuff 🤓 -

- - GitHub Logo - github.com/pinapelz - -
- -
-

"Technical" Blog

-

- random long-form rambling
- (usually technical or niche stuff) -

- - blog.pinapelz.com - -
-
-

Super Secret Link

-

- mystery link for true vtuber degens
- I'll change it from time to time -

- - 🔒 https://link.moekyun.me/Y4z40E - -
-
-
-
- - - diff --git a/pinapelz.moe/projects.html b/pinapelz.moe/projects.html deleted file mode 100644 index 730fe6a..0000000 --- a/pinapelz.moe/projects.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - projects - very cool stuff yep - - - - - - - -
- -
- -
-
- - fun stuff (maybe) - -
-
-
-

cool and interesting stuff

-

or at least i think they're pretty cool :( go check them out!

-
    -
  • -

    - Patchwork Archive -

    -

    - A running archive of VTuber music. Trying to archive every - music/cover created by the VTuber community. Over 15K songs/covers - and counting! -

    -
    - Patchwork Archive 1 - Patchwork Archive 2 -
    -
  • -
  • -

    PhaseTracker

    -
    - PhaseTracker 1 - PhaseTracker 2 -
    -

    - The UNOFFICIAL Phase Connect subscriber tracker. I know some - people don't like number sites, but I still thought that it would - be awesome to track the growth of one of my favorite VTuber - groups. -

    -
  • -
  • -

    573-UPDATES

    -
    - 573-UPDATES Main Feed -
    -

    - 573-UPDATES is a news aggreator for JP arcade games (mostly rhythm). It only pulls data from - official sources. Its called 573 cause it sounds like KONAMI if you shuffle around how you read those numbers in JP - (yep, KONAMI's arcade games inspired this). Use it to browse the latest news or share permalinks to posts with friends! -

    -
  • -
  • -

    - Malmstone Calculator -

    -
    - FFXIV-Malmstone Screenshot -
    -

    - A FFXIV Dalamud plugin that helps with calculating how much more - pvp you got left to play before hitting the next level in the - battlepass system. Made it cause I was tired of always having to - use an online calculator and plugging in the numbers manually. -

    -
  • -
  • -

    - JHolodex -

    -

    - Its a wrapper for the Holodex API for Java. Uhhh, maybe this will be useful for the 2 people out there - who need VTuber data in their application and are for some forbidden reason choosing Java as the language - to do that in. (i really love jvm) -

    -
  • -
    -

    - yep not seeing a trend here at all with any of my interests... if you like this sorta thing, the rest of it - is over on my - GitHub -

    -
-
-
- - - -
- Fullscreen Image -
- - - - - - diff --git a/pinapelz.moe/rhythm-games-tierlist.html b/pinapelz.moe/rhythm-games-tierlist.html deleted file mode 100644 index 02699e1..0000000 --- a/pinapelz.moe/rhythm-games-tierlist.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - Exported Tier List - - - - - - -
-

My TierList

-
- GitHub -
-
-
-
-
-
-
-
-
- - - - - diff --git a/pinapelz.moe/scripts/index.js b/pinapelz.moe/scripts/index.js deleted file mode 100644 index dbd7ade..0000000 --- a/pinapelz.moe/scripts/index.js +++ /dev/null @@ -1,129 +0,0 @@ -function fetchDiscordStatus(userId) { - const API_URL = `https://api.lanyard.rest/v1/users/${userId}`; - - fetch(API_URL) - .then(response => response.json()) - .then(data => { - const discordStatus = data.data.discord_status; - - const statusColors = { - online: "#43b581", - idle: "#faa61a", - dnd: "#f04747", - offline: "#747f8d", - }; - - const statusText = { - online: "Online", - idle: "Idle", - dnd: "Do Not Disturb", - offline: "Offline", - }; - - const statusSection = document.getElementById(`discord-status`); - const statusTextElement = statusSection.querySelector(".status-text"); - - statusSection.style.backgroundColor = statusColors[discordStatus]; - statusTextElement.textContent = "Currently: " + statusText[discordStatus]; - }) - .catch(error => console.error("Error fetching Discord status:", error)); - } - -document.addEventListener("DOMContentLoaded", () => { - const quotes = [ - "Give a man a fish, learn him how to eat, give a man- learn a man how to - xQc", - "Yeah I'm GAY, Good at Yugioh - Rosemi Lovelock", - "yipee - Erina Makina", - "Your friend doesn't like Vtubers? Tell your friend to get some taste - Pavolia Reine", - ]; - - function getRandomQuote() { - const randomIndex = Math.floor(Math.random() * quotes.length); - return quotes[randomIndex]; - } - - const quoteElement = document.getElementById("quote"); - quoteElement.innerHTML = `${getRandomQuote()}`; -}); -function updateClock() { - const clockElement = document.getElementById('clock'); - const now = new Date(); - const pstTime = new Date(now.toLocaleString("en-US", {timeZone: "America/Los_Angeles"})); - const hours = String(pstTime.getHours()).padStart(2, '0'); - const minutes = String(pstTime.getMinutes()).padStart(2, '0'); - const seconds = String(pstTime.getSeconds()).padStart(2, '0'); - const day = String(pstTime.getDate()).padStart(2, '0'); - const month = String(pstTime.getMonth() + 1).padStart(2, '0'); - const year = pstTime.getFullYear(); - let message = "good day!"; - if (pstTime.getHours() >= 0 && pstTime.getHours() < 7) { - message = "(its late for me)"; - } else if (pstTime.getHours() < 12) { - message = "its morning for me"; - } else if (pstTime.getHours() >= 12 && pstTime.getHours() < 18) { - message = "its afternoon for me"; - } else if (pstTime.getHours() >= 18) { - message = "evening rn for me"; - } - clockElement.innerHTML = `${month}/${day}/${year} ${hours}:${minutes}:${seconds} ` + message; -} - -document.addEventListener("DOMContentLoaded", () => { - const images = document.querySelectorAll(".random-float"); - const positions = []; - - images.forEach((img) => { - let randomTop, randomLeft; - let overlap; - - do { - overlap = false; - randomTop = Math.random() * 100; - randomLeft = Math.random() * 100; - if (randomTop > 30 && randomTop < 70) { - overlap = true; - } - if (randomLeft > 30 && randomLeft < 70) { - overlap = true; - } - positions.forEach(pos => { - const distance = Math.sqrt(Math.pow(randomTop - pos.top, 2) + Math.pow(randomLeft - pos.left, 2)); - if (distance < 10) { - overlap = true; - } - }); - } while (overlap); - - positions.push({ top: randomTop, left: randomLeft }); - - const randomDuration = Math.random() * 10 + 3; - - img.style.top = `${randomTop}%`; - img.style.left = `${randomLeft}%`; - img.style.animationDuration = `${randomDuration}s`; - }); -}); - -document.addEventListener('DOMContentLoaded', function() { - function fetchNowPlaying() { - fetch('https://a4.asurahosting.com/api/nowplaying_static/patchworkarchive.json') // Replace with the actual API endpoint - .then(response => response.json()) - .then(data => { - const nowPlaying = data.now_playing.song; - document.getElementById('song-title').textContent = nowPlaying.title; - document.getElementById('song-artist').textContent = nowPlaying.artist; - const songArt = document.getElementById('song-art'); - songArt.src = nowPlaying.art; - songArt.style.display = 'block'; - }) - .catch(error => { - console.error('Error fetching now playing data:', error); - }); - } - - fetchNowPlaying(); - setInterval(fetchNowPlaying, 60000); -}); - -setInterval(updateClock, 1000); -updateClock(); diff --git a/pinapelz.moe/styles/bg.webp b/pinapelz.moe/styles/bg.webp deleted file mode 100644 index 3ed366d..0000000 Binary files a/pinapelz.moe/styles/bg.webp and /dev/null differ diff --git a/pinapelz.moe/styles/border.webp b/pinapelz.moe/styles/border.webp deleted file mode 100644 index 14dca4d..0000000 Binary files a/pinapelz.moe/styles/border.webp and /dev/null differ diff --git a/pinapelz.moe/styles/carbon.css b/pinapelz.moe/styles/carbon.css deleted file mode 100644 index 8d90e2a..0000000 --- a/pinapelz.moe/styles/carbon.css +++ /dev/null @@ -1,755 +0,0 @@ -/*Carbon themed CSS*/ -:root { - --primary-bg: #1a1a1a; - --secondary-bg: #252525; - --tertiary-bg: #2d2d2d; - --accent-gold: #c9aa71; - --accent-blue: #5b8fc7; - --text-primary: #e2e2e2; - --text-secondary: #b8b8b8; - --text-dim: #888888; - --border-color: #3a3a3a; - --link-color: #7db8e8; - --link-hover: #a5d0f0; - --header-gradient-start: #2a2a2a; - --header-gradient-end: #1a1a1a; - --nav-bg: #1f1f1f; - --nav-hover: #333333; -} - -/* Reset and base styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: "Meiryo", "Segoe UI", "Helvetica Neue", Arial, sans-serif; - background-color: var(--primary-bg); - color: var(--text-primary); - line-height: 1.7; - min-height: 100vh; - display: flex; - background-image: repeating-linear-gradient( - 45deg, - transparent, - transparent 10px, - rgba(255, 255, 255, 0.01) 10px, - rgba(255, 255, 255, 0.01) 20px - ); -} - -/* Navigation sidebar */ -.nav-sidebar { - width: 250px; - background-color: var(--nav-bg); - border-right: 1px solid var(--border-color); - height: 100vh; - position: fixed; - overflow-y: auto; - padding: 20px 0; - box-shadow: 2px 0 10px rgba(0, 0, 0, 0.2); -} - -.nav-logo { - padding: 15px 20px; - margin-bottom: 20px; - border-bottom: 1px solid var(--border-color); - text-align: center; -} - -.nav-logo h3 { - color: var(--accent-gold); - font-size: 1.2em; - margin: 0; -} - -.nav-menu { - list-style-type: none; - padding: 0; - margin: 0; -} - -.nav-menu li { - margin: 0; -} - -.nav-menu a { - display: block; - padding: 10px 20px; - color: var(--text-secondary); - text-decoration: none; - border-left: 3px solid transparent; - transition: all 0.3s ease; -} - -.nav-menu a:hover { - background-color: var(--nav-hover); - color: var(--accent-gold); - border-left-color: var(--accent-gold); - text-shadow: none; -} - -.nav-menu a::after { - display: none; -} - -.nav-menu h4 { - padding: 15px 20px 5px; - color: var(--accent-gold); - font-size: 1em; - text-transform: uppercase; - letter-spacing: 1px; -} - -.nav-submenu { - list-style-type: none; - padding: 0; - margin: 0; -} - -/* Indentation for nested submenu items */ -.nav-submenu li.level-2 a { - padding-left: 30px; -} - -.nav-submenu li.level-3 a { - padding-left: 40px; -} - -.nav-submenu li.level-4 a { - padding-left: 50px; -} - -.nav-submenu li.level-5 a { - padding-left: 60px; -} - -.nav-submenu li.level-6 a { - padding-left: 70px; -} - -/* Main content */ -.main-content { - flex: 1; - margin-left: 250px; - width: calc(100% - 250px); -} - -/* Container */ -.container { - max-width: 1200px; - margin: 0 auto; - padding: 40px 20px; - background-color: rgba(26, 26, 26, 0.95); - min-height: 100vh; - box-shadow: 0 0 50px rgba(0, 0, 0, 0.5); -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; - color: var(--accent-gold); - margin-top: 1.5em; - margin-bottom: 0.8em; - font-weight: 500; - letter-spacing: 0.5px; - position: relative; - text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); -} - -h1 { - font-size: 2.2em; - padding-bottom: 0.5em; - border-bottom: 3px solid var(--accent-gold); - background: var(--accent-gold); - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - text-shadow: none; - margin-top: 0.5em; -} - -h1::after { - content: ""; - display: block; - position: absolute; - bottom: -3px; - left: 0; - width: 100%; - height: 3px; - background: linear-gradient(90deg, var(--accent-gold), transparent 70%); -} - -h2 { - font-size: 1.8em; - color: var(--accent-blue); - padding-left: 15px; - border-left: 4px solid var(--accent-blue); - margin-left: -15px; -} - -h3 { - font-size: 1.4em; - color: var(--text-primary); -} - -h4 { - font-size: 1.2em; - color: var(--text-secondary); -} - -h5, -h6 { - font-size: 1.1em; - color: var(--text-secondary); -} - -/* Paragraphs and text */ -p { - margin-bottom: 1.2em; - color: var(--text-secondary); - text-align: left; -} - -/* Links with FFXIV styling */ -a { - color: var(--link-color); - text-decoration: none; - position: relative; - transition: color 0.3s ease; - font-weight: 500; -} - -a:hover { - color: var(--link-hover); - text-shadow: 0 0 10px rgba(125, 184, 232, 0.5); -} - -a::after { - content: ""; - position: absolute; - bottom: -2px; - left: 0; - width: 0; - height: 1px; - background-color: var(--link-hover); - transition: width 0.3s ease; -} - -a:hover::after { - width: 100%; -} - -/* Bold and Italic */ -strong, -b { - color: var(--accent-gold); - font-weight: 600; -} - -em, -i { - color: var(--text-primary); - font-style: italic; -} - -/* Lists with FFXIV styling */ -ul, -ol { - margin-left: 30px; - margin-bottom: 1.2em; -} - -li { - margin-bottom: 0.5em; - color: var(--text-secondary); -} - -ul li::marker { - color: var(--accent-gold); -} - -ol li::marker { - color: var(--accent-blue); - font-weight: bold; -} - - -blockquote { - border-left: 4px solid var(--accent-gold); - background: linear-gradient(90deg, rgba(201, 170, 113, 0.1), transparent); - padding: 15px 20px; - margin: 1.5em 0; - color: var(--text-secondary); - position: relative; -} - -blockquote::before { - font-size: 3em; - color: var(--accent-gold); - opacity: 0.3; - position: absolute; -} - -table { - width: 100%; - border-collapse: separate; - border-spacing: 0; - margin: 1.5em 0; - background-color: var(--secondary-bg); - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); -} - -thead { - background: linear-gradient( - 180deg, - var(--tertiary-bg), - var(--secondary-bg) - ); -} - -th { - padding: 12px 15px; - text-align: left; - color: var(--accent-gold); - font-weight: 600; - border-bottom: 2px solid var(--accent-gold); - text-transform: uppercase; - font-size: 0.9em; - letter-spacing: 1px; -} - -td { - padding: 10px 15px; - color: var(--text-secondary); - border-bottom: 1px solid var(--border-color); -} - -tr:hover td { - background-color: rgba(201, 170, 113, 0.05); -} - -hr { - border: none; - height: 2px; - background: linear-gradient( - 90deg, - transparent, - var(--accent-gold) 20%, - var(--accent-gold) 50%, - var(--accent-gold) 80%, - transparent - ); - margin: 2em 0; - position: relative; -} - -hr::before { - content: "◆"; - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - background-color: var(--primary-bg); - color: var(--accent-gold); - padding: 0 10px; - font-size: 1.2em; -} - -/* Images */ -img { - max-width: 100%; - height: auto; - display: block; - margin: 1.5em auto; - border: 2px solid var(--border-color); - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5); -} - -/* Wiki-style additional elements */ -.wiki-infobox { - float: right; - width: 300px; - margin: 0 0 20px 20px; - background-color: var(--secondary-bg); - border: 1px solid var(--border-color); - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); -} - -.wiki-infobox-header { - background-color: var(--tertiary-bg); - color: var(--accent-gold); - padding: 10px 15px; - text-align: center; - font-weight: bold; - border-bottom: 1px solid var(--border-color); -} - -.wiki-infobox-content { - padding: 15px; -} - -.wiki-infobox-row { - display: flex; - margin-bottom: 10px; -} - -.wiki-infobox-label { - flex: 1; - font-weight: bold; - color: var(--accent-blue); -} - -.wiki-infobox-value { - flex: 2; - color: var(--text-secondary); -} - -/* Article meta information */ -.article-meta { - border-top: 1px solid var(--border-color); - margin-top: 40px; - padding-top: 20px; - font-size: 0.9em; - color: var(--text-dim); -} - -.article-categories { - margin-top: 10px; -} - -.article-category { - display: inline-block; - background-color: var(--tertiary-bg); - color: var(--accent-gold); - padding: 3px 10px; - margin-right: 5px; - margin-bottom: 5px; - border-radius: 3px; - font-size: 0.85em; -} - -/* Scrollbar styling */ -::-webkit-scrollbar { - width: 12px; - height: 12px; -} - -::-webkit-scrollbar-track { - background: var(--secondary-bg); - border: 1px solid var(--border-color); -} - -::-webkit-scrollbar-thumb { - background: var(--accent-gold); - border: 1px solid var(--border-color); -} - -::-webkit-scrollbar-thumb:hover { - background: var(--accent-blue); -} - -/* Selection styling */ -::selection { - background-color: rgba(201, 170, 113, 0.3); - color: var(--text-primary); -} - -::-moz-selection { - background-color: rgba(201, 170, 113, 0.3); - color: var(--text-primary); -} - -/* Custom Figure styling */ -.custom-figure { - margin: 2.5rem auto; - padding: 1.5rem; - background-color: var(--secondary-bg); - border: 1px solid var(--border-color); - border-radius: 5px; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4); - position: relative; - overflow: hidden; - max-width: 95%; -} - -/* Image gallery layout for multiple images */ -.custom-figure .image-gallery { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - grid-gap: 1rem; - margin-bottom: 1.5rem; -} - -/* Single image in figure */ -.custom-figure img { - margin: 0 auto 1rem; - border: 1px solid var(--border-color); - box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3); - transition: - transform 0.3s ease, - box-shadow 0.3s ease; - max-height: 500px; - width: auto; -} - -/* Hover effect for images */ -.custom-figure img:hover { - transform: scale(1.02); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - border-color: var(--accent-gold); -} - -/* Image titles (from title attribute) */ -.custom-figure .image-title { - display: block; - text-align: center; - font-style: italic; - color: var(--accent-gold); - font-size: 0.9em; - margin-top: 0.5rem; - margin-bottom: 1rem; -} - -/* Caption styling */ -.custom-figure figcaption { - font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; - text-align: center; - color: var(--text-primary); - font-size: 1.1em; - padding: 0.8rem 0; - border-top: 1px solid rgba(201, 170, 113, 0.3); - margin-top: 0.5rem; - position: relative; -} - -/* Special styling for captions to match FFXIV aesthetic */ -.custom-figure figcaption::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 4px; - background: linear-gradient(90deg, var(--accent-gold), var(--accent-blue)); -} - -/* Responsive design */ -@media (max-width: 1200px) { - .container { - max-width: 100%; - } -} - -@media (max-width: 992px) { - .nav-sidebar { - width: 200px; - } - - .main-content { - margin-left: 200px; - width: calc(100% - 200px); - } -} - -@media (max-width: 768px) { - body { - flex-direction: column; - } - - .nav-sidebar { - width: 100%; - height: auto; - position: relative; - border-right: none; - border-bottom: 1px solid var(--border-color); - } - - .main-content { - margin-left: 0; - width: 100%; - } - - .container { - padding: 20px 15px; - } - - .wiki-infobox { - float: none; - width: 100%; - margin: 1.5em 0; - } - - h1 { - font-size: 2em; - } - - h2 { - font-size: 1.6em; - } - - h3 { - font-size: 1.3em; - } -} -/* Animation for page load */ -@keyframes fadeIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } - - .custom-figure { - padding: 1rem; - margin: 2rem auto; - } - - .custom-figure .image-gallery { - grid-template-columns: 1fr; - } - - .custom-figure img { - max-height: 350px; - } -} - -.main-content > * { - animation: fadeIn 0.6s ease-out; -} - -/* ============================================================ - Lock screen — encrypted posts - ============================================================ */ - -/* The data holder is invisible; only the lock UI is shown */ -#encrypted-content { - display: none; -} - -/* Full-viewport overlay */ -#lock-screen { - position: fixed; - inset: 0; - background-color: var(--primary-bg); - background-image: repeating-linear-gradient( - 45deg, - transparent, - transparent 10px, - rgba(255, 255, 255, 0.01) 10px, - rgba(255, 255, 255, 0.01) 20px - ); - display: flex; - align-items: center; - justify-content: center; - z-index: 9999; - animation: fadeIn 0.4s ease-out; -} - -/* Card */ -#lock-box { - background-color: var(--secondary-bg); - border: 1px solid var(--border-color); - border-radius: 8px; - padding: 2.75rem 3rem; - width: 90%; - max-width: 400px; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - gap: 1.1rem; - box-shadow: - 0 12px 50px rgba(0, 0, 0, 0.7), - 0 0 0 1px rgba(201, 170, 113, 0.07); - position: relative; - overflow: hidden; -} - -/* Gradient top-accent bar */ -#lock-box::before { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 3px; - background: linear-gradient(90deg, var(--accent-gold), var(--accent-blue)); -} - -/* Lock emoji */ -.lock-icon { - font-size: 2.6rem; - line-height: 1; - margin-bottom: 0.15rem; -} - -/* Override the global h2 blue/border-left styles inside the lock box */ -#lock-box h2 { - font-family: "Jupiter Pro", "Cinzel", "Georgia", serif; - font-size: 1.35rem; - font-weight: 500; - letter-spacing: 1px; - color: var(--accent-gold); - -webkit-text-fill-color: var(--accent-gold); - background: none; - -webkit-background-clip: unset; - background-clip: unset; - text-shadow: none; - border-left: none; - padding-left: 0; - margin-left: 0; - margin-top: 0; - margin-bottom: 0; - position: static; -} - -#lock-box p { - color: var(--text-dim); - font-size: 0.87rem; - margin: 0; - text-align: center; -} - -/* Password input */ -#enc-input { - background-color: var(--tertiary-bg); - color: var(--text-primary); - border: 1px solid var(--border-color); - padding: 0.65rem 1rem; - border-radius: 6px; - width: 100%; - font-size: 0.95rem; - font-family: inherit; - text-align: center; - letter-spacing: 0.05em; - transition: border-color 0.2s ease, box-shadow 0.2s ease; -} - -#enc-input::placeholder { - color: var(--text-dim); - letter-spacing: 0; -} - -#enc-input:focus { - outline: none; - border-color: var(--accent-blue); - box-shadow: - 0 0 0 3px rgba(91, 143, 199, 0.12), - inset 0 1px 3px rgba(0, 0, 0, 0.3); -} - -@media (max-width: 480px) { - #lock-box { - padding: 2rem 1.5rem; - } -} diff --git a/pinapelz.moe/styles/clock.css b/pinapelz.moe/styles/clock.css deleted file mode 100644 index a69c22c..0000000 --- a/pinapelz.moe/styles/clock.css +++ /dev/null @@ -1,43 +0,0 @@ -.clock-widget { - font-size: 2em; - color: #ff69b4; - text-align: center; - margin-top: 20px; - padding: 20px; - border: 2px dashed #ff69b4; - background: #ffe4e1; - border-radius: 15px; - box-shadow: 0 0 10px rgba(255, 105, 180, 0.5); - position: relative; - overflow: hidden; - animation: glitter 3s infinite alternate; - border-width:20px; - padding:10px; - border-style:solid; - border-image: url("https://foollovers.com/mat/plate/pl035-plate-j03.gif") 55 fill round; -} - -.clock-widget::before { - content: ''; - position: absolute; - top: -50%; - left: -50%; - width: 200%; - height: 200%; - background: linear-gradient(135deg, rgba(255, 105, 180, 0.2), rgba(255, 228, 225, 0.2)); - animation: rotate 6s linear infinite; -} - -.clock-widget span { - position: relative; - z-index: 1; -} - -@keyframes rotate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} \ No newline at end of file diff --git a/pinapelz.moe/styles/projects.css b/pinapelz.moe/styles/projects.css deleted file mode 100644 index 5b00204..0000000 --- a/pinapelz.moe/styles/projects.css +++ /dev/null @@ -1,76 +0,0 @@ -.projects-section { - margin-top: 20px; - padding: 10px; - background: #ffebf0; - border: solid #ffb6c1 2px; -} -.projects-section h3 { - color: #ff69b4; - text-shadow: 1px 1px 2px #fff; -} -.projects-section ul { - list-style-type: disc; - padding-left: 20px; -} -.projects-section ul li { - margin-bottom: 10px; -} - -.projects-section .image-container { - display: flex; - flex-wrap: wrap; - gap: 10px; -} -.projects-section .image-container img { - max-width: 100%; - height: auto; - cursor: pointer; - transition: transform 0.2s; -} -.projects-section .image-container img:hover { - transform: scale(1.05); -} - -.fullscreen-img { - display: none; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.9); - justify-content: center; - align-items: center; - z-index: 1000; -} -.fullscreen-img img { - max-width: 90%; - max-height: 90%; -} - -@media (max-width: 768px) { - .projects-section { - padding: 5px; - } - - .projects-section h3 { - font-size: 1.5em; - } - - .projects-section ul { - padding-left: 10px; - } - - .projects-section ul li { - margin-bottom: 5px; - } - - .projects-section .image-container { - flex-direction: column; - align-items: center; - } - .projects-section .image-container img { - width: 100%; - height: auto; - } -} \ No newline at end of file diff --git a/pinapelz.moe/styles/styles.css b/pinapelz.moe/styles/styles.css deleted file mode 100644 index a8a4f48..0000000 --- a/pinapelz.moe/styles/styles.css +++ /dev/null @@ -1,475 +0,0 @@ -body { - background: url("bg.webp"); - background-size: - 100px 100px, - 100% 100%; - font-family: "Courier New", monospace; - color: #333; - background-color: pink; - cursor: url("cursor.gif"), auto; -} -.container { - border-width: 10px; - border-style: solid; - border-image: url("border.webp") 9 fill round; - z-index: -999; -} - -.sidebar { - padding: 10px; - margin-top: 30px; - border: solid #ffb6c1 2px; - background: #ffe4e1; - text-align: center; - overflow-wrap: break-word; -} - -.sidebar ul { - list-style-type: none; - padding: 0; - margin: 0; - text-align: center; -} - -.sidebar ul li { - margin-bottom: 2px; -} - -.sidebar ul li a { - color: #ff69b4; - text-decoration: none; -} - -.sidebar ul li a:hover { - text-decoration: underline; -} - -.content { - padding: 10px; - overflow-wrap: break-word; - word-wrap: break-word; -} -.footer { - text-align: center; - padding-top: 30px; - margin-top: 20px; - font-size: 0.8em; - overflow-wrap: break-word; - word-wrap: break-word; -} -a { - color: #ff69b4; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -.glitter { - color: #ff69b4; - font-weight: bold; - animation: glitter 3s infinite alternate; -} -@keyframes glitter { - 0% { - color: #ff69b4; - } - 25% { - color: #ff1493; - } - 50% { - color: #db7093; - } - 75% { - color: #ff69b4; - } - 100% { - color: #ffa07a; - } -} - -.border-img { - max-width: 100%; - border: solid #ff69b4 2px; -} - -marquee { - font-size: 1.2em; - color: #ff69b4; - margin-bottom: 10px; -} - -blink { - color: #ff1493; - animation: blinker 1.5s linear infinite; -} -@keyframes blinker { - 50% { - opacity: 0; - } -} - -.welcome-box { - border-style: dashed; - border: 2px dashed #ff69b4; - padding: 20px; -} - -.general-section { - margin-top: 20px; - padding: 10px; - background: #ffebf0; - border: solid #ffb6c1 2px; - overflow-wrap: break-word; - word-wrap: break-word; -} - -.general-section h3 { - color: #ff69b4; - text-shadow: 1px 1px 2px #fff; -} - -.general-section ul { - list-style-type: disc; - padding-left: 20px; -} - -.general-section ul li { - margin-bottom: 10px; -} - -.contacts-section { - margin-top: 20px; - padding: 10px; - background: #ffe4e1; - border: solid #ffb6c1 2px; -} -.contacts-section h3 { - color: #ff69b4; - text-shadow: 1px 1px 2px #fff; -} -.contacts-section ul { - list-style-type: none; - padding: 0; -} -.contacts-section ul li { - margin-bottom: 5px; -} - -.discord-status { - display: flex; - align-items: center; - padding: 15px; - border-radius: 10px; - color: white; - transition: background-color 0.3s ease-in-out; - margin-top: 20px; - margin-bottom: 10px; - background: #7289da; -} - -.discord-status img { - width: 50px; - height: 50px; - border-radius: 50%; - margin-right: 20px; -} - -.discord-status h2 { - font-size: 1.2rem; -} - -.discord-status p { - font-size: 1rem; - opacity: 0.8; -} - -@keyframes crazy-animation { - 0% { - transform: rotate(0deg) scale(1) translateX(0) skew(0deg) rotateY(0deg); - filter: hue-rotate(0deg) blur(0px); - opacity: 1; - } - 10% { - transform: rotate(30deg) scale(1.3) translateX(10px) skew(10deg) - rotateY(90deg); - filter: hue-rotate(50deg) blur(2px); - opacity: 0.8; - } - 25% { - transform: rotate(45deg) scale(1.5) translateX(20px) skew(-10deg) - rotateY(180deg); - filter: hue-rotate(120deg) blur(4px); - opacity: 0.6; - } - 50% { - transform: rotate(-45deg) scale(0.8) translateX(-30px) skew(15deg) - rotateY(270deg); - filter: hue-rotate(200deg) blur(6px); - opacity: 1; - } - 75% { - transform: rotate(90deg) scale(1.8) translateX(15px) skew(-15deg) - rotateY(360deg); - filter: hue-rotate(300deg) blur(3px); - opacity: 0.7; - } - 100% { - transform: rotate(0deg) scale(1) translateX(0) skew(0deg) rotateY(0deg); - filter: hue-rotate(360deg) blur(0px); - opacity: 1; - } -} - -.crazy-image:hover { - animation: crazy-animation 3s ease-in-out infinite; -} - -.fullscreen-text { - top: 0; - left: 0; - color: black; - display: flex; - justify-content: center; - align-items: center; - font-size: 2em; - opacity: 0; - visibility: hidden; - transition: - opacity 0.5s, - visibility 0.5s; - z-index: 10; -} - -.crazy-image:hover + .fullscreen-text { - opacity: 1; - visibility: visible; -} - -/* Mobile-specific overrides for custom elements */ -@media (max-width: 768px) { - .header-animation img { - width: 30px; - height: 30px; - } - - .discord-status { - flex-direction: column; - align-items: flex-start; - } - - .discord-status img { - margin-right: 0; - margin-bottom: 10px; - } - - .discord-status h2 { - font-size: 1rem; - } - - .discord-status p { - font-size: 0.9rem; - } - - .crazy-image { - max-width: 200px; - } - - /* Ensure no horizontal overflow */ - body { - overflow-x: hidden; - } - - .container { - max-width: 100%; - overflow-x: hidden; - } -} - -@media (max-width: 480px) { - .header-animation img { - width: 25px; - height: 25px; - } - - .crazy-image { - max-width: 150px; - } - - /* Further mobile optimizations */ - .general-section { - padding: 8px; - margin-top: 15px; - } - - .sidebar { - padding: 8px; - margin-top: 20px; - } - - .content { - padding: 8px; - } -} - -.center { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; -} - -.music-player { - margin-top: 20px; - padding: 10px; - background: #ffebf0; - border: dotted #ffb6c1 2px; -} - -.music-player h3 { - color: #ff69b4; - text-shadow: 1px 1px 2px #fff; - margin-bottom: 10px; - text-align: center; -} - -.music-player audio { - width: 100%; -} - -.now-playing { - margin-top: 10px; - padding: 10px; - text-align: center; -} - -.now-playing h4 { - margin: 0; - font-size: 1.2em; -} - -.now-playing p { - margin: 5px 0; -} - -.header { - position: relative; - text-align: center; - font-size: 2em; - color: #ff69b4; - text-shadow: - 1px 1px 2px #fff, - 2px 2px 4px #ffa07a; - animation: glitter 3s infinite alternate; - overflow: hidden; -} - -.header-content { - position: relative; - z-index: 1; -} - -.header-animation { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - z-index: -997; -} - -.header-animation img { - position: absolute; - width: 50px; - height: 50px; - opacity: 0.8; - animation: float 5s infinite ease-in-out; -} - -@keyframes float { - 0% { - transform: translateY(0); - } - 50% { - transform: translateY(-40px); - } - 100% { - transform: translateY(0); - } -} - -.random-image-container { - display: flex; - justify-content: center; - align-items: center; -} - -.random-image-container img { - max-width: 100%; - height: auto; - display: block; -} -.top-navbar { - background-color: rgba(0, 0, 0, 0.8); - padding: 10px 0; - position: sticky; - top: 0; - z-index: 100; - backdrop-filter: blur(5px); -} - -.top-navbar nav { - max-width: 1200px; - margin: 0 auto; - padding: 0 20px; -} - -.top-navbar ul { - display: flex; - justify-content: center; - align-items: center; - gap: 30px; - list-style: none; - margin: 0; - padding: 0; -} - -.top-navbar li { - margin: 0; -} - -.top-navbar a { - color: white; - text-decoration: none; - padding: 8px 16px; - border-radius: 20px; - transition: all 0.3s ease; - font-weight: 500; - display: block; -} - -.top-navbar a:hover, -.top-navbar a:focus { - background-color: #ff69b4; - outline: none; - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(255, 105, 180, 0.3); -} - -.top-navbar a[aria-current="page"] { - background-color: #ff69b4; - color: white; - font-weight: bold; -} - -@media (max-width: 768px) { - .top-navbar ul { - flex-direction: column; - gap: 10px; - } - - .top-navbar { - padding: 15px 0; - } -} diff --git a/sticker.pinapelz.com/esinstall.js b/sticker.pinapelz.com/esinstall.js new file mode 100644 index 0000000..8cb5682 --- /dev/null +++ b/sticker.pinapelz.com/esinstall.js @@ -0,0 +1,23 @@ +const { install, printStats } = require("esinstall") + +install( + [{ + specifier: "htm/preact", + all: false, + default: false, + namespace: false, + named: ["html", "render", "Component"], + }], + { + dest: "./lib", + sourceMap: false, + treeshake: true, + verbose: true, + } +).then(data => { + const oldPrefix = "web_modules/" + const newPrefix = "lib/" + const spaces = " ".repeat(oldPrefix.length - newPrefix.length) + console.log("Installation complete") + console.log(printStats(data.stats).replace(oldPrefix, newPrefix + spaces)) +}) diff --git a/sticker.pinapelz.com/index.html b/sticker.pinapelz.com/index.html new file mode 100644 index 0000000..527ea7b --- /dev/null +++ b/sticker.pinapelz.com/index.html @@ -0,0 +1,23 @@ + + + + + + Maunium sticker picker + + + + + + + + + + + + + + + + + diff --git a/sticker.pinapelz.com/lib/htm/preact.js b/sticker.pinapelz.com/lib/htm/preact.js new file mode 100644 index 0000000..ebf36ea --- /dev/null +++ b/sticker.pinapelz.com/lib/htm/preact.js @@ -0,0 +1,7 @@ +var n,l,u,i,o,r,f,e,c,s,h={},p=[],v=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function w(n){var l=n.parentNode;l&&l.removeChild(n);}function _(l,u,t){var i,o,r,f={};for(r in u)"key"==r?i=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return g(l,f,i,o,null)}function g(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function k(n){return n.children}function b(n,l){this.props=n,this.context=l;}function x(n,l){if(null==l)return n.__?x(n.__,n.__i+1):null;for(var u;lu&&i.sort(f));P.__r=0;}function S(n,l,u,t,i,o,r,f,e,c,s){var a,v,y,d,w,_=t&&t.__k||p,g=l.length;for(u.__d=e,$(u,l,_),e=u.__d,a=0;a0?g(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=L(i,u,r,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,"function"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f===r+1?a++:f>r?s>e-r?a+=f-r:a--:f(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--;}if(f=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e="";},a=0;a"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]} + +var m=e$1.bind(_); + +export { b as Component, m as html, B as render }; diff --git a/sticker.pinapelz.com/package.json b/sticker.pinapelz.com/package.json new file mode 100644 index 0000000..44fe1ea --- /dev/null +++ b/sticker.pinapelz.com/package.json @@ -0,0 +1,19 @@ +{ + "name": "maunium-stickerpicker", + "version": "0.1.0", + "description": "A fast and simple Matrix sticker picker widget", + "repository": "https://github.com/maunium/stickerpicker", + "author": "Tulir Asokan ", + "license": "AGPL-3.0-or-later", + "private": true, + "scripts": { + "esinstall": "node ./esinstall.js", + "sass": "sass --no-source-map --style=compressed style/" + }, + "dependencies": { + "esinstall": "^1.1.7", + "htm": "^3.1.0", + "preact": "^10.5.14", + "sass": "^1.42.1" + } +} diff --git a/sticker.pinapelz.com/packs/.gitkeep b/sticker.pinapelz.com/packs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/sticker.pinapelz.com/packs/dank.json b/sticker.pinapelz.com/packs/dank.json new file mode 100644 index 0000000..e5f2766 --- /dev/null +++ b/sticker.pinapelz.com/packs/dank.json @@ -0,0 +1 @@ +{"title": "dank", "id": "dank", "stickers": [{"body": "aware", "url": "mxc://chat.moekyun.me/QURUNgNThYmIdzyasFdcLJnr", "info": {"w": 112, "h": 112, "size": 17080, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/QURUNgNThYmIdzyasFdcLJnr", "thumbnail_info": {"w": 112, "h": 112, "size": 17080, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:3f0e3edace04fed69af1606f7c3c74591e4b1e3d1a296ad7340dd2b39214f099"}, {"body": "classic", "url": "mxc://chat.moekyun.me/ZBxiNUARoFZGoETjySzbKoAc", "info": {"w": 128, "h": 128, "size": 26042, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ZBxiNUARoFZGoETjySzbKoAc", "thumbnail_info": {"w": 128, "h": 128, "size": 26042, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:b9bec6f6748663456f72c7689db38e0f76e64a0e0496529d9515139fee067922"}, {"body": "smiley_good", "url": "mxc://chat.moekyun.me/PdyEJxgwOfBCxySfSFYlgPzP", "info": {"w": 256, "h": 256, "size": 90928, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/PdyEJxgwOfBCxySfSFYlgPzP", "thumbnail_info": {"w": 256, "h": 256, "size": 90928, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:57878fa8ccf13f58320c8cf07b266130984b4ed5ad35cfc87b67bc78fb2f7625"}, {"body": "smiley_grrr", "url": "mxc://chat.moekyun.me/xpwjfgHzxJFTiJWIXMEvBBck", "info": {"w": 256, "h": 256, "size": 89762, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/xpwjfgHzxJFTiJWIXMEvBBck", "thumbnail_info": {"w": 256, "h": 256, "size": 89762, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:76efdc3e86754261cfb6c93afe9ff5d25f2d4adbd45235a9670f5dbea6e1f74e"}, {"body": "smiley_no_no", "url": "mxc://chat.moekyun.me/yLAyUjCErrmXBfcAAUxYygsP", "info": {"w": 256, "h": 256, "size": 93010, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/yLAyUjCErrmXBfcAAUxYygsP", "thumbnail_info": {"w": 256, "h": 256, "size": 93010, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:1071abbf8e31ed12d226d5f078630d46b13ae377c9a3276e27f458076e42759a"}, {"body": "smiley_whatever", "url": "mxc://chat.moekyun.me/XmPidyRFUqsIUfMJXlyMqKTg", "info": {"w": 256, "h": 256, "size": 58621, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/XmPidyRFUqsIUfMJXlyMqKTg", "thumbnail_info": {"w": 256, "h": 256, "size": 58621, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:0f22af4ab47f63fcb9676537aa74aa3d0b6c8f606fe9e956f52b7ddfdc67ebf7"}, {"body": "xqc_ok", "url": "mxc://chat.moekyun.me/ZTckkllzHDrGCbrXBEqzDUYB", "info": {"w": 160, "h": 160, "size": 45997, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ZTckkllzHDrGCbrXBEqzDUYB", "thumbnail_info": {"w": 160, "h": 160, "size": 45997, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:bb49d28ed249cd3f01023ecfa99e2be2af901f737a0249aefbe53b31203197f5"}]} \ No newline at end of file diff --git a/sticker.pinapelz.com/packs/index.json b/sticker.pinapelz.com/packs/index.json new file mode 100644 index 0000000..cdb8d7d --- /dev/null +++ b/sticker.pinapelz.com/packs/index.json @@ -0,0 +1,7 @@ +{ + "packs": [ + "weeb.json", + "dank.json" + ], + "homeserver_url": "https://chat.moekyun.me" +} \ No newline at end of file diff --git a/sticker.pinapelz.com/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP b/sticker.pinapelz.com/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP new file mode 100644 index 0000000..931a057 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP differ diff --git a/sticker.pinapelz.com/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws b/sticker.pinapelz.com/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws new file mode 100644 index 0000000..cdf240a Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws differ diff --git a/sticker.pinapelz.com/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc b/sticker.pinapelz.com/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc new file mode 100644 index 0000000..20ab20f Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc differ diff --git a/sticker.pinapelz.com/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR b/sticker.pinapelz.com/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR new file mode 100644 index 0000000..e486283 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR differ diff --git a/sticker.pinapelz.com/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC b/sticker.pinapelz.com/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC new file mode 100644 index 0000000..a912611 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC differ diff --git a/sticker.pinapelz.com/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc b/sticker.pinapelz.com/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc new file mode 100644 index 0000000..5a12b37 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc differ diff --git a/sticker.pinapelz.com/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP b/sticker.pinapelz.com/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP new file mode 100644 index 0000000..4ce4ec4 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP differ diff --git a/sticker.pinapelz.com/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr b/sticker.pinapelz.com/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr new file mode 100644 index 0000000..f161e15 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr differ diff --git a/sticker.pinapelz.com/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb b/sticker.pinapelz.com/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb new file mode 100644 index 0000000..706c10d Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb differ diff --git a/sticker.pinapelz.com/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg b/sticker.pinapelz.com/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg new file mode 100644 index 0000000..2cdcf19 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg differ diff --git a/sticker.pinapelz.com/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc b/sticker.pinapelz.com/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc new file mode 100644 index 0000000..11f60e7 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc differ diff --git a/sticker.pinapelz.com/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB b/sticker.pinapelz.com/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB new file mode 100644 index 0000000..e6e259b Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB differ diff --git a/sticker.pinapelz.com/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx b/sticker.pinapelz.com/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx new file mode 100644 index 0000000..79a10b8 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx differ diff --git a/sticker.pinapelz.com/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck b/sticker.pinapelz.com/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck new file mode 100644 index 0000000..581048b Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck differ diff --git a/sticker.pinapelz.com/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP b/sticker.pinapelz.com/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP new file mode 100644 index 0000000..2b949b8 Binary files /dev/null and b/sticker.pinapelz.com/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP differ diff --git a/sticker.pinapelz.com/packs/weeb.json b/sticker.pinapelz.com/packs/weeb.json new file mode 100644 index 0000000..80550cf --- /dev/null +++ b/sticker.pinapelz.com/packs/weeb.json @@ -0,0 +1 @@ +{"title": "weeb", "id": "weeb", "stickers": [{"body": "erina_i_may_be_dumb", "url": "mxc://chat.moekyun.me/SzxfhuJJdFPYzoPvSDIBhWxb", "info": {"w": 146, "h": 160, "size": 37322, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/SzxfhuJJdFPYzoPvSDIBhWxb", "thumbnail_info": {"w": 146, "h": 160, "size": 37322, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:a8e636aef053b1b3214e7afeb8f2539a3fc5dee9a011fabe0c9e4300f73da242"}, {"body": "miku_honest_reaction", "url": "mxc://chat.moekyun.me/OddXtQLRutxvLZWWxNicguMc", "info": {"w": 160, "h": 112, "size": 28353, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/OddXtQLRutxvLZWWxNicguMc", "thumbnail_info": {"w": 160, "h": 112, "size": 28353, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:d4dde21efae2eab7be830a3d65bc78176d898052c8bfaf96d784083b58668ef2"}, {"body": "not_bad", "url": "mxc://chat.moekyun.me/CLkWhgAkDubZmahPWinNMaSc", "info": {"w": 160, "h": 160, "size": 31164, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/CLkWhgAkDubZmahPWinNMaSc", "thumbnail_info": {"w": 160, "h": 160, "size": 31164, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:575e12e9e5452bb44270f13c1942c1ec3c5598a1a59f35358fbf90cb4e1cc71d"}, {"body": "peko_interesting", "url": "mxc://chat.moekyun.me/DlLllEJSQYkOCBBzqVzdxuwR", "info": {"w": 160, "h": 156, "size": 35734, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/DlLllEJSQYkOCBBzqVzdxuwR", "thumbnail_info": {"w": 160, "h": 156, "size": 35734, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:752763fa8f4d19f77b131267ca2a35ed233d62335bafb27b165ca248d00e0b84"}, {"body": "peko_unbelievable", "url": "mxc://chat.moekyun.me/MjoQgqCbNmTRuQfDngBPPoOC", "info": {"w": 160, "h": 160, "size": 52103, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/MjoQgqCbNmTRuQfDngBPPoOC", "thumbnail_info": {"w": 160, "h": 160, "size": 52103, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:618e4ea2b509bdb2c761f8fcafdbe42f56690b028edaa68e510843bd8859d5f1"}, {"body": "senmei_caught_4k", "url": "mxc://chat.moekyun.me/aUBbgTfxxfWapJXDzOGsGWGx", "info": {"w": 160, "h": 160, "size": 39863, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/aUBbgTfxxfWapJXDzOGsGWGx", "thumbnail_info": {"w": 160, "h": 160, "size": 39863, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:04e25a3a8de7d9da6eac994c013c831ada8c674b6dc5d61628ec0a082a45dc4c"}, {"body": "tsukasa_lewd", "url": "mxc://chat.moekyun.me/ASWmCLdLLTVqLwXptdkBMtws", "info": {"w": 160, "h": 160, "size": 29637, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ASWmCLdLLTVqLwXptdkBMtws", "thumbnail_info": {"w": 160, "h": 160, "size": 29637, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:8dac5d9222770fe41ad4a120042416cb5db9e76501561942e0c0ffcbc78681dc"}, {"body": "weeb_fuck_everything", "url": "mxc://chat.moekyun.me/APyHPuZmyRfUwwsEHijRGdjP", "info": {"w": 140, "h": 160, "size": 47309, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/APyHPuZmyRfUwwsEHijRGdjP", "thumbnail_info": {"w": 140, "h": 160, "size": 47309, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:53246fc04cf8899b6311be5c8ca25673012d061b5f9245e13bc6e3271ef53892"}]} \ No newline at end of file diff --git a/sticker.pinapelz.com/res/favorite.svg b/sticker.pinapelz.com/res/favorite.svg new file mode 100644 index 0000000..4af2b49 --- /dev/null +++ b/sticker.pinapelz.com/res/favorite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sticker.pinapelz.com/res/giphy-dark.svg b/sticker.pinapelz.com/res/giphy-dark.svg new file mode 100644 index 0000000..9b47567 --- /dev/null +++ b/sticker.pinapelz.com/res/giphy-dark.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + diff --git a/sticker.pinapelz.com/res/giphy-light.svg b/sticker.pinapelz.com/res/giphy-light.svg new file mode 100644 index 0000000..8016e2c --- /dev/null +++ b/sticker.pinapelz.com/res/giphy-light.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + diff --git a/sticker.pinapelz.com/res/powered-by-giphy.png b/sticker.pinapelz.com/res/powered-by-giphy.png new file mode 100644 index 0000000..41861e6 Binary files /dev/null and b/sticker.pinapelz.com/res/powered-by-giphy.png differ diff --git a/sticker.pinapelz.com/res/recent.svg b/sticker.pinapelz.com/res/recent.svg new file mode 100644 index 0000000..59be87d --- /dev/null +++ b/sticker.pinapelz.com/res/recent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sticker.pinapelz.com/res/search.svg b/sticker.pinapelz.com/res/search.svg new file mode 100644 index 0000000..7be3396 --- /dev/null +++ b/sticker.pinapelz.com/res/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sticker.pinapelz.com/res/settings.svg b/sticker.pinapelz.com/res/settings.svg new file mode 100644 index 0000000..51f966f --- /dev/null +++ b/sticker.pinapelz.com/res/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sticker.pinapelz.com/src/frequently-used.js b/sticker.pinapelz.com/src/frequently-used.js new file mode 100644 index 0000000..a754e9a --- /dev/null +++ b/sticker.pinapelz.com/src/frequently-used.js @@ -0,0 +1,34 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +const FREQUENTLY_USED = JSON.parse(window.localStorage.mauFrequentlyUsedStickerIDs || "{}") +let FREQUENTLY_USED_SORTED = null + +export const add = id => { + const [count] = FREQUENTLY_USED[id] || [0] + FREQUENTLY_USED[id] = [count + 1, Date.now()] + window.localStorage.mauFrequentlyUsedStickerIDs = JSON.stringify(FREQUENTLY_USED) + FREQUENTLY_USED_SORTED = null +} + +export const get = (limit = 16) => { + if (FREQUENTLY_USED_SORTED === null) { + FREQUENTLY_USED_SORTED = Object.entries(FREQUENTLY_USED) + .sort(([, [count1, date1]], [, [count2, date2]]) => + count2 === count1 ? date2 - date1 : count2 - count1) + .map(([emoji]) => emoji) + } + return FREQUENTLY_USED_SORTED.slice(0, limit) +} diff --git a/sticker.pinapelz.com/src/giphy.js b/sticker.pinapelz.com/src/giphy.js new file mode 100644 index 0000000..35172bb --- /dev/null +++ b/sticker.pinapelz.com/src/giphy.js @@ -0,0 +1,107 @@ +import {Component, html} from "../lib/htm/preact.js"; +import * as widgetAPI from "./widget-api.js"; +import {SearchBox} from "./search-box.js"; + +const GIPHY_SEARCH_DEBOUNCE = 1000 +let GIPHY_API_KEY = "HQku8974Uq5MZn3MZns46kXn2R4GDm75" +let GIPHY_MXC_PREFIX = "mxc://giphy.mau.dev/" + +export function giphyIsEnabled() { + return GIPHY_API_KEY !== "" +} + +export function setGiphyAPIKey(apiKey, mxcPrefix) { + GIPHY_API_KEY = apiKey + if (mxcPrefix) { + GIPHY_MXC_PREFIX = mxcPrefix + } +} + +export class GiphySearchTab extends Component { + constructor(props) { + super(props) + this.state = { + searchTerm: "", + gifs: [], + loading: false, + error: null, + } + this.handleGifClick = this.handleGifClick.bind(this) + this.searchKeyUp = this.searchKeyUp.bind(this) + this.updateGifSearchQuery = this.updateGifSearchQuery.bind(this) + this.searchTimeout = null + } + + async makeGifSearchRequest() { + try { + const resp = await fetch(`https://api.giphy.com/v1/gifs/search?q=${this.state.searchTerm}&api_key=${GIPHY_API_KEY}`) + // TODO handle error responses properly? + const data = await resp.json() + if (data.data.length === 0) { + this.setState({gifs: [], error: "No results"}) + } else { + this.setState({gifs: data.data, error: null}) + } + } catch (error) { + this.setState({error}) + } + } + + componentWillUnmount() { + clearTimeout(this.searchTimeout) + } + + searchKeyUp(event) { + if (event.key === "Enter") { + clearTimeout(this.searchTimeout) + this.makeGifSearchRequest() + } + } + + updateGifSearchQuery(event) { + this.setState({searchTerm: event.target.value}) + clearTimeout(this.searchTimeout) + this.searchTimeout = setTimeout(() => this.makeGifSearchRequest(), GIPHY_SEARCH_DEBOUNCE) + } + + handleGifClick(gif) { + widgetAPI.sendSticker({ + "body": gif.title, + "info": { + "h": +gif.images.original.height, + "w": +gif.images.original.width, + "size": +gif.images.original.size, + "mimetype": "image/webp", + }, + "msgtype": "m.image", + "url": GIPHY_MXC_PREFIX + gif.id, + + "id": gif.id, + "filename": gif.id + ".webp", + }) + } + + render() { + // TODO display loading state? + return html` + <${SearchBox} onInput=${this.updateGifSearchQuery} onKeyUp=${this.searchKeyUp} value=${this.state.searchTerm} placeholder="Find GIFs"/> +
+
+
+ ${this.state.error} +
+
+ ${this.state.gifs.map((gif) => html` +
this.handleGifClick(gif)} data-gif-id=${gif.id}> + ${gif.title} +
+ `)} +
+ +
+
+ ` + } +} diff --git a/sticker.pinapelz.com/src/index.js b/sticker.pinapelz.com/src/index.js new file mode 100644 index 0000000..9f545b8 --- /dev/null +++ b/sticker.pinapelz.com/src/index.js @@ -0,0 +1,400 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +import {html, render, Component} from "../lib/htm/preact.js" +import {Spinner} from "./spinner.js" +import {SearchBox} from "./search-box.js" +import {giphyIsEnabled, GiphySearchTab, setGiphyAPIKey} from "./giphy.js" +import * as widgetAPI from "./widget-api.js" +import * as frequent from "./frequently-used.js" + +// The base URL for fetching packs. The app will first fetch ${PACK_BASE_URL}/index.json, +// then ${PACK_BASE_URL}/${packFile} for each packFile in the packs object of the index.json file. +const PACKS_BASE_URL = "packs" + +let INDEX = `${PACKS_BASE_URL}/index.json` +const params = new URLSearchParams(document.location.search) +if (params.has('config')) { + INDEX = params.get("config") +} + +const makeThumbnailURL = mxc => `${PACKS_BASE_URL}/thumbnails/${mxc.split("/").slice(-1)[0]}` + +// We need to detect iOS webkit because it has a bug related to scrolling non-fixed divs +// This is also used to fix scrolling to sections on Element iOS +const isMobileSafari = navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/) + +const supportedThemes = ["light", "dark", "black"] + +const defaultState = { + packs: [], + filtering: { + searchTerm: "", + packs: [], + }, +} + +class App extends Component { + constructor(props) { + super(props) + this.defaultTheme = params.get("theme") + this.state = { + viewingGifs: false, + packs: defaultState.packs, + loading: true, + error: null, + stickersPerRow: parseInt(localStorage.mauStickersPerRow || "4"), + theme: localStorage.mauStickerThemeOverride || this.defaultTheme, + frequentlyUsed: { + id: "frequently-used", + title: "Frequently used", + stickerIDs: frequent.get(), + stickers: [], + }, + filtering: defaultState.filtering, + } + if (!supportedThemes.includes(this.state.theme)) { + this.state.theme = "light" + } + if (!supportedThemes.includes(this.defaultTheme)) { + this.defaultTheme = "light" + } + this.stickersByID = new Map(JSON.parse(localStorage.mauFrequentlyUsedStickerCache || "[]")) + this.state.frequentlyUsed.stickers = this._getStickersByID(this.state.frequentlyUsed.stickerIDs) + this.imageObserver = null + this.packListRef = null + this.navRef = null + this.searchStickers = this.searchStickers.bind(this) + this.sendSticker = this.sendSticker.bind(this) + this.navScroll = this.navScroll.bind(this) + this.reloadPacks = this.reloadPacks.bind(this) + this.observeSectionIntersections = this.observeSectionIntersections.bind(this) + this.observeImageIntersections = this.observeImageIntersections.bind(this) + } + + _getStickersByID(ids) { + return ids.map(id => this.stickersByID.get(id)).filter(sticker => !!sticker) + } + + updateFrequentlyUsed() { + const stickerIDs = frequent.get() + const stickers = this._getStickersByID(stickerIDs) + this.setState({ + frequentlyUsed: { + ...this.state.frequentlyUsed, + stickerIDs, + stickers, + }, + }) + localStorage.mauFrequentlyUsedStickerCache = JSON.stringify(stickers.map(sticker => [sticker.id, sticker])) + } + + searchStickers(e) { + const sanitizeString = s => s.toLowerCase().trim() + const searchTerm = sanitizeString(e.target.value) + + const allPacks = [this.state.frequentlyUsed, ...this.state.packs] + const packsWithFilteredStickers = allPacks.map(pack => ({ + ...pack, + stickers: pack.stickers.filter(sticker => + sanitizeString(sticker.body).includes(searchTerm) || + sanitizeString(sticker.id).includes(searchTerm) + ), + })) + + this.setState({ + filtering: { + ...this.state.filtering, + searchTerm, + packs: packsWithFilteredStickers.filter(({stickers}) => !!stickers.length), + }, + }) + } + + setStickersPerRow(val) { + localStorage.mauStickersPerRow = val + document.documentElement.style.setProperty("--stickers-per-row", localStorage.mauStickersPerRow) + this.setState({ + stickersPerRow: val, + }) + this.packListRef.scrollTop = this.packListRef.scrollHeight + } + + setTheme(theme) { + if (theme === "default") { + delete localStorage.mauStickerThemeOverride + this.setState({theme: this.defaultTheme}) + } else { + localStorage.mauStickerThemeOverride = theme + this.setState({theme: theme}) + } + } + + reloadPacks() { + this.imageObserver.disconnect() + this.sectionObserver.disconnect() + this.setState({ + packs: defaultState.packs, + filtering: defaultState.filtering, + }) + this._loadPacks(true) + } + + _loadPacks(disableCache = false) { + const cache = disableCache ? "no-cache" : undefined + fetch(INDEX, {cache}).then(async indexRes => { + if (indexRes.status >= 400) { + this.setState({ + loading: false, + error: indexRes.status !== 404 ? indexRes.statusText : null, + }) + return + } + const indexData = await indexRes.json() + if (indexData.giphy_api_key !== undefined) { + setGiphyAPIKey(indexData.giphy_api_key, indexData.giphy_mxc_prefix) + } + // TODO only load pack metadata when scrolled into view? + for (const packFile of indexData.packs) { + let packRes + if (packFile.startsWith("https://") || packFile.startsWith("http://")) { + packRes = await fetch(packFile, {cache}) + } else { + packRes = await fetch(`${PACKS_BASE_URL}/${packFile}`, {cache}) + } + const packData = await packRes.json() + for (const sticker of packData.stickers) { + this.stickersByID.set(sticker.id, sticker) + } + this.setState({ + packs: [...this.state.packs, packData], + loading: false, + }) + } + this.updateFrequentlyUsed() + }, error => this.setState({loading: false, error})) + } + + componentDidMount() { + document.documentElement.style.setProperty("--stickers-per-row", this.state.stickersPerRow.toString()) + this._loadPacks() + this.imageObserver = new IntersectionObserver(this.observeImageIntersections, { + rootMargin: "100px", + }) + this.sectionObserver = new IntersectionObserver(this.observeSectionIntersections) + } + + observeImageIntersections(intersections) { + for (const entry of intersections) { + const img = entry.target.children.item(0) + if (entry.isIntersecting) { + img.setAttribute("src", img.getAttribute("data-src")) + img.classList.add("visible") + } else { + img.removeAttribute("src") + img.classList.remove("visible") + } + } + } + + observeSectionIntersections(intersections) { + const navWidth = this.navRef.getBoundingClientRect().width + let minX = 0, maxX = navWidth + let minXElem = null + let maxXElem = null + for (const entry of intersections) { + const packID = entry.target.getAttribute("data-pack-id") + if (!packID) { + continue + } + const navElement = document.getElementById(`nav-${packID}`) + if (entry.isIntersecting) { + navElement.classList.add("visible") + const bb = navElement.getBoundingClientRect() + if (bb.x < minX) { + minX = bb.x + minXElem = navElement + } else if (bb.right > maxX) { + maxX = bb.right + maxXElem = navElement + } + } else { + navElement.classList.remove("visible") + } + } + if (minXElem !== null) { + minXElem.scrollIntoView({inline: "start"}) + } else if (maxXElem !== null) { + maxXElem.scrollIntoView({inline: "end"}) + } + } + + componentDidUpdate() { + if (this.packListRef === null) { + return + } + for (const elem of this.packListRef.getElementsByClassName("sticker")) { + this.imageObserver.observe(elem) + } + for (const elem of this.packListRef.children) { + this.sectionObserver.observe(elem) + } + } + + componentWillUnmount() { + this.imageObserver.disconnect() + this.sectionObserver.disconnect() + } + + sendSticker(evt) { + const id = evt.currentTarget.getAttribute("data-sticker-id") + const sticker = this.stickersByID.get(id) + frequent.add(id) + this.updateFrequentlyUsed() + widgetAPI.sendSticker(sticker) + } + + navScroll(evt) { + this.navRef.scrollLeft += evt.deltaY + } + + render() { + const theme = `theme-${this.state.theme}` + const filterActive = !!this.state.filtering.searchTerm + const packs = filterActive + ? this.state.filtering.packs + : [this.state.frequentlyUsed, ...this.state.packs] + + if (this.state.loading) { + return html` +
+ <${Spinner} size=${80} green/> +
+ ` + } else if (this.state.error) { + return html` +
+

Failed to load packs

+

${this.state.error}

+
+ ` + } else if (this.state.packs.length === 0) { + return html` +

No packs found 😿

+ ` + } + + const onClickOverride = this.state.viewingGifs + ? (evt, packID) => { + evt.preventDefault() + this.setState({viewingGifs: false}, () => { + scrollToSection(null, packID) + }) + } : null + const switchToGiphy = () => this.setState({viewingGifs: true, filtering: defaultState.filtering}) + + return html` +
+ + + ${this.state.viewingGifs ? html` + <${GiphySearchTab}/> + ` : html` + <${SearchBox} onInput=${this.searchStickers} value=${this.state.filtering.searchTerm ?? ""}/> +
(this.packListRef = elem)}> + ${filterActive && packs.length === 0 + ? html`

No stickers match your search

` + : null} + ${packs.map((pack) => html`<${Pack} id=${pack.id} pack=${pack} send=${this.sendSticker}/>`)} + <${Settings} app=${this}/> +
+ `} +
` + } +} + +const Settings = ({app}) => html` +
+

Settings

+
+ +
+ + app.setStickersPerRow(evt.target.value)}/> +
+
+ + +
+
+
+` + +// By default we just let the browser handle scrolling to sections, but webviews on Element iOS +// open the link in the browser instead of just scrolling there, so we need to scroll manually: +const scrollToSection = (evt, id) => { + const pack = document.getElementById(`pack-${id}`) + if (pack) { + pack.scrollIntoView({block: "start", behavior: "instant"}) + } + evt?.preventDefault() +} + +const NavBarItem = ({pack, iconOverride = null, onClickOverride = null, extraClass = null}) => html` + onClickOverride(evt, pack.id)) : (isMobileSafari ? (evt => scrollToSection(evt, pack.id)) : undefined)}> +
+ ${iconOverride ? html` + + ` : html` + ${pack.stickers[0].body} + `} +
+
+` + +const Pack = ({pack, send}) => html` +
+

${pack.title}

+
+ ${pack.stickers.map(sticker => html` + <${Sticker} key=${sticker.id} content=${sticker} send=${send}/> + `)} +
+
+` + +const Sticker = ({content, send}) => html` +
+ ${content.body} +
+` + +render(html`<${App}/>`, document.body) diff --git a/sticker.pinapelz.com/src/search-box.js b/sticker.pinapelz.com/src/search-box.js new file mode 100644 index 0000000..b25769f --- /dev/null +++ b/sticker.pinapelz.com/src/search-box.js @@ -0,0 +1,26 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +import {html} from "../lib/htm/preact.js" + +export const SearchBox = ({onInput, onKeyUp, value, placeholder = 'Find stickers'}) => { + const component = html` + + ` + return component +} diff --git a/sticker.pinapelz.com/src/spinner.js b/sticker.pinapelz.com/src/spinner.js new file mode 100644 index 0000000..e89dd02 --- /dev/null +++ b/sticker.pinapelz.com/src/spinner.js @@ -0,0 +1,41 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +import { html } from "../lib/htm/preact.js" + +export const Spinner = ({ size = 40, noCenter = false, noMargin = false, green = false }) => { + let margin = 0 + if (!isNaN(+size)) { + size = +size + margin = noMargin ? 0 : `${Math.round(size / 6)}px` + size = `${size}px` + } + const noInnerMargin = !noCenter || !margin + const comp = html` +
+
+
+
+
+
+
+
+ ` + if (!noCenter) { + return html`
${comp}
` + } + return comp +} diff --git a/sticker.pinapelz.com/src/widget-api.js b/sticker.pinapelz.com/src/widget-api.js new file mode 100644 index 0000000..d9964a7 --- /dev/null +++ b/sticker.pinapelz.com/src/widget-api.js @@ -0,0 +1,77 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +let widgetId = null + +window.onmessage = event => { + if (!window.parent || !event.data) { + return + } + + const request = event.data + if (!request.requestId || !request.widgetId || !request.action || request.api !== "toWidget") { + return + } + + if (widgetId) { + if (widgetId !== request.widgetId) { + return + } + } else { + widgetId = request.widgetId + } + + let response + + if (request.action === "visibility") { + response = {} + } else if (request.action === "capabilities") { + response = { capabilities: ["m.sticker"] } + } else { + response = { error: { message: "Action not supported" } } + } + + window.parent.postMessage({ ...request, response }, event.origin) +} + +export function sendSticker(content) { + const data = { + content: { ...content }, + // `name` is for Element Web (and also the spec) + // Element Android uses content -> body as the name + name: content.body, + } + // Custom field that stores the ID even for non-telegram stickers + delete data.content.id + + // This is for Element iOS + const widgetData = { + ...data, + description: content.body, + file: content.filename ?? `${content.id}.png`, + } + delete widgetData.content.filename + // Element iOS explodes if there are extra fields present + delete widgetData.content["net.maunium.telegram.sticker"] + + window.parent.postMessage({ + api: "fromWidget", + action: "m.sticker", + requestId: `sticker-${Date.now()}`, + widgetId, + data, + widgetData, + }, "*") +} diff --git a/sticker.pinapelz.com/style/index.css b/sticker.pinapelz.com/style/index.css new file mode 100644 index 0000000..f73124e --- /dev/null +++ b/sticker.pinapelz.com/style/index.css @@ -0,0 +1 @@ +*{font-family:sans-serif}body{margin:0}h1{font-size:1rem}:root{--stickers-per-row: 4;--sticker-size: calc(100vw / var(--stickers-per-row))}main{color:var(--text-color)}main.spinner{margin-top:5rem}main.error,main.empty{margin:2rem}main.empty{text-align:center}main.has-content{position:fixed;top:0;left:0;right:0;bottom:0;display:grid;grid-template-rows:calc(12vw + 2px) min-content auto}main.theme-light{--highlight-color: #eee;--search-box-color: var(--highlight-color);--text-color: black;background-color:#fff}main.theme-dark{--highlight-color: #444;--search-box-color: #383e4b;--text-color: white;background-color:#22262e}main.theme-dark .icon.icon-giphy{background-image:url(../res/giphy-dark.svg)}main.theme-black{--highlight-color: #222;--search-box-color: var(--highlight-color);--text-color: white;background-color:#000}main.theme-black .icon.icon-giphy{background-image:url(../res/giphy-dark.svg)}div.powered-by-giphy{padding:1rem}div.powered-by-giphy>img{width:100%}.icon{width:100%;height:100%;background-color:var(--text-color);mask-size:contain;-webkit-mask-size:contain;mask-image:var(--icon-image);-webkit-mask-image:var(--icon-image)}.icon.icon-settings{--icon-image: url(../res/settings.svg)}.icon.icon-recent{--icon-image: url(../res/recent.svg)}.icon.icon.icon-search{--icon-image: url(../res/search.svg)}.icon.icon.icon-giphy{background:center/contain no-repeat url(../res/giphy-light.svg);mask:unset}nav{display:flex;overflow-x:auto}nav>a{border-bottom:2px solid rgba(0,0,0,0)}nav>a.visible{border-bottom-color:green}nav>a>div.sticker{width:12vw;height:12vw}div.pack-list,nav{scrollbar-width:none}div.pack-list::-webkit-scrollbar,nav::-webkit-scrollbar{display:none}div.pack-list{overflow-y:auto}div.pack-list.ios-safari-hack{position:fixed;top:calc(calc(12vw + 2px) + calc(2 * 0.7rem + 2 * 0.5rem + 1rem));bottom:0;left:0;right:0;-webkit-overflow-scrolling:touch}div.search-empty{margin:1.2rem;text-align:center}section.stickerpack{margin-top:.75rem}section.stickerpack>div.sticker-list{display:flex;flex-wrap:wrap}section.stickerpack>h1{margin:0 0 0 .75rem}section.stickerpack#pack-giphy{display:flex;justify-content:space-between;flex-direction:column;min-height:100%}div.sticker{display:flex;padding:4px;cursor:pointer;position:relative;width:var(--sticker-size);height:var(--sticker-size);box-sizing:border-box}div.sticker:hover{background-color:var(--highlight-color)}div.sticker>img{display:none;width:100%;object-fit:contain}div.sticker>img.visible{display:initial}div.sticker>.icon{width:70%;height:70%;margin:15%}div.search-box{position:relative;display:flex}div.search-box>input[type=text]{flex-grow:1;background-color:var(--search-box-color);outline:none;border:none;border-radius:.25rem;height:1rem;padding:.7rem;padding-right:calc(1rem + 0.7rem);margin:.5rem;font-size:1rem;color:var(--text-color)}div.search-box>span.icon{display:flex;position:absolute;top:calc(50% - 1rem/2);right:1rem;width:1rem;height:1rem;box-sizing:border-box}div.settings-list{display:flex;flex-direction:column}div.settings-list>*{margin:.5rem}div.settings-list button{padding:.5rem;border-radius:.25rem}div.settings-list input{width:100%} diff --git a/sticker.pinapelz.com/style/index.sass b/sticker.pinapelz.com/style/index.sass new file mode 100644 index 0000000..1269be5 --- /dev/null +++ b/sticker.pinapelz.com/style/index.sass @@ -0,0 +1,227 @@ +// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. +// Copyright (C) 2020 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +* + font-family: sans-serif + +body + margin: 0 + +h1 + font-size: 1rem + +\:root + --stickers-per-row: 4 + --sticker-size: calc(100vw / var(--stickers-per-row)) + +$nav-sticker-size: 12vw +$nav-bottom-highlight: 2px +$nav-height: calc(#{$nav-sticker-size} + #{$nav-bottom-highlight}) +$nav-height-inverse: calc(-#{$nav-sticker-size} - #{$nav-bottom-highlight}) + +$search-box-icon-size: 1rem +$search-box-input-height: 1rem +$search-box-input-padding: .7rem +$search-box-input-margin: .5rem +$search-box-height: calc(2 * #{$search-box-input-padding} + 2 * #{$search-box-input-margin} + #{$search-box-input-height}) + +main + color: var(--text-color) + + &.spinner + margin-top: 5rem + + &.error, &.empty + margin: 2rem + + &.empty + text-align: center + + &.has-content + position: fixed + top: 0 + left: 0 + right: 0 + bottom: 0 + display: grid + grid-template-rows: $nav-height min-content auto + +main.theme-light + --highlight-color: #eee + --search-box-color: var(--highlight-color) + --text-color: black + background-color: white + +main.theme-dark + --highlight-color: #444 + --search-box-color: #383e4b + --text-color: white + background-color: #22262e + + .icon.icon-giphy + background-image: url(../res/giphy-dark.svg) + +main.theme-black + --highlight-color: #222 + --search-box-color: var(--highlight-color) + --text-color: white + background-color: black + + .icon.icon-giphy + background-image: url(../res/giphy-dark.svg) + +div.powered-by-giphy + padding: 1rem + > img + width: 100% + +.icon + width: 100% + height: 100% + background-color: var(--text-color) + mask-size: contain + -webkit-mask-size: contain + mask-image: var(--icon-image) + -webkit-mask-image: var(--icon-image) + + &.icon-settings + --icon-image: url(../res/settings.svg) + + &.icon-recent + --icon-image: url(../res/recent.svg) + + &.icon.icon-search + --icon-image: url(../res/search.svg) + + &.icon.icon-giphy + background: center / contain no-repeat url(../res/giphy-light.svg) + mask: unset + +nav + display: flex + overflow-x: auto + + > a + border-bottom: $nav-bottom-highlight solid transparent + + &.visible + border-bottom-color: green + + > div.sticker + width: $nav-sticker-size + height: $nav-sticker-size + +div.pack-list, nav + scrollbar-width: none + + &::-webkit-scrollbar + display: none + +div.pack-list + overflow-y: auto + +div.pack-list.ios-safari-hack + position: fixed + top: calc(#{$nav-height} + #{$search-box-height}) + bottom: 0 + left: 0 + right: 0 + -webkit-overflow-scrolling: touch + +div.search-empty + margin: 1.2rem + text-align: center + +section.stickerpack + margin-top: .75rem + + > div.sticker-list + display: flex + flex-wrap: wrap + + > h1 + margin: 0 0 0 .75rem + +section.stickerpack#pack-giphy + display: flex + justify-content: space-between + flex-direction: column + min-height: 100% + +div.sticker + display: flex + padding: 4px + cursor: pointer + position: relative + width: var(--sticker-size) + height: var(--sticker-size) + box-sizing: border-box + + &:hover + background-color: var(--highlight-color) + + > img + display: none + width: 100% + object-fit: contain + + &.visible + display: initial + + > .icon + width: 70% + height: 70% + margin: 15% + +div.search-box + position: relative + display: flex + + >input[type="text"] + flex-grow: 1 + background-color: var(--search-box-color) + outline: none + border: none + border-radius: .25rem + height: $search-box-input-height + padding: $search-box-input-padding + padding-right: calc(#{$search-box-icon-size} + #{$search-box-input-padding}) + margin: $search-box-input-margin + font-size: 1rem + color: var(--text-color) + + >span.icon + display: flex + position: absolute + top: calc(50% - #{$search-box-icon-size} / 2) + right: $search-box-icon-size + width: $search-box-icon-size + height: $search-box-icon-size + box-sizing: border-box + +div.settings-list + display: flex + flex-direction: column + + > * + margin: .5rem + + button + padding: .5rem + border-radius: .25rem + + input + width: 100% diff --git a/sticker.pinapelz.com/style/spinner.css b/sticker.pinapelz.com/style/spinner.css new file mode 100644 index 0000000..de03d9c --- /dev/null +++ b/sticker.pinapelz.com/style/spinner.css @@ -0,0 +1 @@ +.sk-center-wrapper{width:100%;display:flex;justify-content:space-around}.sk-chase{position:relative;animation:sk-chase 2.5s infinite linear both}.sk-chase.green>.sk-chase-dot:before{background-color:#00c853}.sk-chase>.sk-chase-dot{width:100%;height:100%;position:absolute;left:0;top:0;animation:sk-chase-dot 2s infinite ease-in-out both}.sk-chase>.sk-chase-dot:before{content:"";display:block;width:25%;height:25%;border-radius:100%;animation:sk-chase-dot-before 2s infinite ease-in-out both;background-color:#fff}.sk-chase>.sk-chase-dot:nth-child(1){animation-delay:-1.1s}.sk-chase>.sk-chase-dot:nth-child(2){animation-delay:-1s}.sk-chase>.sk-chase-dot:nth-child(3){animation-delay:-0.9s}.sk-chase>.sk-chase-dot:nth-child(4){animation-delay:-0.8s}.sk-chase>.sk-chase-dot:nth-child(5){animation-delay:-0.7s}.sk-chase>.sk-chase-dot:nth-child(6){animation-delay:-0.6s}.sk-chase>.sk-chase-dot:nth-child(1):before{animation-delay:-1.1s}.sk-chase>.sk-chase-dot:nth-child(2):before{animation-delay:-1s}.sk-chase>.sk-chase-dot:nth-child(3):before{animation-delay:-0.9s}.sk-chase>.sk-chase-dot:nth-child(4):before{animation-delay:-0.8s}.sk-chase>.sk-chase-dot:nth-child(5):before{animation-delay:-0.7s}.sk-chase>.sk-chase-dot:nth-child(6):before{animation-delay:-0.6s}@keyframes sk-chase{100%{transform:rotate(360deg)}}@keyframes sk-chase-dot{80%,100%{transform:rotate(360deg)}}@keyframes sk-chase-dot-before{50%{transform:scale(0.4)}100%,0%{transform:scale(1)}} diff --git a/sticker.pinapelz.com/style/spinner.sass b/sticker.pinapelz.com/style/spinner.sass new file mode 100644 index 0000000..cbc9042 --- /dev/null +++ b/sticker.pinapelz.com/style/spinner.sass @@ -0,0 +1,68 @@ +// Chase spinner from https://tobiasahlin.com/spinkit/. MIT license +.sk-center-wrapper + width: 100% + display: flex + justify-content: space-around + +.sk-chase + position: relative + animation: sk-chase 2.5s infinite linear both + + &.green > .sk-chase-dot:before + background-color: #00C853 + + > .sk-chase-dot + width: 100% + height: 100% + position: absolute + left: 0 + top: 0 + animation: sk-chase-dot 2.0s infinite ease-in-out both + + &:before + content: '' + display: block + width: 25% + height: 25% + border-radius: 100% + animation: sk-chase-dot-before 2.0s infinite ease-in-out both + background-color: #FFF + + &:nth-child(1) + animation-delay: -1.1s + &:nth-child(2) + animation-delay: -1.0s + &:nth-child(3) + animation-delay: -0.9s + &:nth-child(4) + animation-delay: -0.8s + &:nth-child(5) + animation-delay: -0.7s + &:nth-child(6) + animation-delay: -0.6s + &:nth-child(1):before + animation-delay: -1.1s + &:nth-child(2):before + animation-delay: -1.0s + &:nth-child(3):before + animation-delay: -0.9s + &:nth-child(4):before + animation-delay: -0.8s + &:nth-child(5):before + animation-delay: -0.7s + &:nth-child(6):before + animation-delay: -0.6s + +@keyframes sk-chase + 100% + transform: rotate(360deg) + +@keyframes sk-chase-dot + 80%, 100% + transform: rotate(360deg) + +@keyframes sk-chase-dot-before + 50% + transform: scale(0.4) + 100%, 0% + transform: scale(1.0) diff --git a/sticker.pinapelz.com/yarn.lock b/sticker.pinapelz.com/yarn.lock new file mode 100644 index 0000000..de00773 --- /dev/null +++ b/sticker.pinapelz.com/yarn.lock @@ -0,0 +1,719 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@rollup/plugin-commonjs@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz#169004d56cd0f0a1d0f35915d31a036b0efe281f" + integrity sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== + dependencies: + "@rollup/pluginutils" "^3.1.0" + commondir "^1.0.1" + estree-walker "^2.0.1" + glob "^7.1.6" + is-reference "^1.2.1" + magic-string "^0.25.7" + resolve "^1.17.0" + +"@rollup/plugin-inject@^4.0.0", "@rollup/plugin-inject@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz#fbeee66e9a700782c4f65c8b0edbafe58678fbc2" + integrity sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + estree-walker "^2.0.1" + magic-string "^0.25.7" + +"@rollup/plugin-json@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-node-resolve@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz#44064a2b98df7530e66acf8941ff262fc9b4ead8" + integrity sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.17.0" + +"@rollup/plugin-replace@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@types/estree@*": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/node@*": + version "20.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" + integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== + dependencies: + undici-types "~5.26.4" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +acorn-walk@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.7.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +assert@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== + dependencies: + object.assign "^4.1.4" + util "^0.10.4" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +builtin-modules@^3.1.0, builtin-modules@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== + +call-bind@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +"chokidar@>=3.0.0 <4.0.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cjs-module-lexer@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" + integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA== + +esinstall@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/esinstall/-/esinstall-1.1.7.tgz#ceabeb4b8685bf48c805a503e292dfafe4e0cb22" + integrity sha512-irDsrIF7fZ5BCQEAV5gmH+4nsK6JhnkI9C9VloXdmzJLbM1EcshPw8Ap95UUGc4ZJdzGeOrjV+jgKjQ/Z7Q3pg== + dependencies: + "@rollup/plugin-commonjs" "^16.0.0" + "@rollup/plugin-inject" "^4.0.2" + "@rollup/plugin-json" "^4.0.0" + "@rollup/plugin-node-resolve" "^10.0.0" + "@rollup/plugin-replace" "^2.4.2" + builtin-modules "^3.2.0" + cjs-module-lexer "^1.2.1" + es-module-lexer "^0.6.0" + execa "^5.1.1" + is-valid-identifier "^2.0.2" + kleur "^4.1.1" + mkdirp "^1.0.3" + picomatch "^2.3.0" + resolve "^1.20.0" + rimraf "^3.0.0" + rollup "~2.37.1" + rollup-plugin-polyfill-node "^0.6.2" + slash "~3.0.0" + validate-npm-package-name "^3.0.0" + vm2 "^3.9.2" + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +htm@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" + integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +immutable@^4.0.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-reference@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-valid-identifier@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-valid-identifier/-/is-valid-identifier-2.0.2.tgz#146d9dbf29821b8118580b039d2203aa4bd1da4b" + integrity sha512-mpS5EGqXOwzXtKAg6I44jIAqeBfntFLxpAth1rrKbxtKyI6LPktyDYpHBI+tHlduhhX/SF26mFXmxQu995QVqg== + dependencies: + assert "^1.4.1" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +kleur@^4.1.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +preact@^10.5.14: + version "10.22.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.22.0.tgz#a50f38006ae438d255e2631cbdaf7488e6dd4e16" + integrity sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve@^1.17.0, resolve@^1.20.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-polyfill-node@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.6.2.tgz#dea62e00f5cc2c174e4b4654b5daab79b1a92fc3" + integrity sha512-gMCVuR0zsKq0jdBn8pSXN1Ejsc458k2QsFFvQdbHoM0Pot5hEnck+pBP/FDwFS6uAi77pD3rDTytsaUStsOMlA== + dependencies: + "@rollup/plugin-inject" "^4.0.0" + +rollup@~2.37.1: + version "2.37.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.37.1.tgz#aa7aadffd75c80393f9314f9857e851b0ffd34e7" + integrity sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ== + optionalDependencies: + fsevents "~2.1.2" + +sass@^1.42.1: + version "1.77.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" + integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +"source-map-js@>=0.6.2 <2.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +util@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== + dependencies: + builtins "^1.0.3" + +vm2@^3.9.2: + version "3.9.19" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" + integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== diff --git a/sticker.pinapelz.moe/esinstall.js b/sticker.pinapelz.moe/esinstall.js deleted file mode 100644 index 8cb5682..0000000 --- a/sticker.pinapelz.moe/esinstall.js +++ /dev/null @@ -1,23 +0,0 @@ -const { install, printStats } = require("esinstall") - -install( - [{ - specifier: "htm/preact", - all: false, - default: false, - namespace: false, - named: ["html", "render", "Component"], - }], - { - dest: "./lib", - sourceMap: false, - treeshake: true, - verbose: true, - } -).then(data => { - const oldPrefix = "web_modules/" - const newPrefix = "lib/" - const spaces = " ".repeat(oldPrefix.length - newPrefix.length) - console.log("Installation complete") - console.log(printStats(data.stats).replace(oldPrefix, newPrefix + spaces)) -}) diff --git a/sticker.pinapelz.moe/index.html b/sticker.pinapelz.moe/index.html deleted file mode 100644 index 527ea7b..0000000 --- a/sticker.pinapelz.moe/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Maunium sticker picker - - - - - - - - - - - - - - - - - diff --git a/sticker.pinapelz.moe/lib/htm/preact.js b/sticker.pinapelz.moe/lib/htm/preact.js deleted file mode 100644 index ebf36ea..0000000 --- a/sticker.pinapelz.moe/lib/htm/preact.js +++ /dev/null @@ -1,7 +0,0 @@ -var n,l,u,i,o,r,f,e,c,s,h={},p=[],v=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,y=Array.isArray;function d(n,l){for(var u in l)n[u]=l[u];return n}function w(n){var l=n.parentNode;l&&l.removeChild(n);}function _(l,u,t){var i,o,r,f={};for(r in u)"key"==r?i=u[r]:"ref"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),"function"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return g(l,f,i,o,null)}function g(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function k(n){return n.children}function b(n,l){this.props=n,this.context=l;}function x(n,l){if(null==l)return n.__?x(n.__,n.__i+1):null;for(var u;lu&&i.sort(f));P.__r=0;}function S(n,l,u,t,i,o,r,f,e,c,s){var a,v,y,d,w,_=t&&t.__k||p,g=l.length;for(u.__d=e,$(u,l,_),e=u.__d,a=0;a0?g(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=L(i,u,r,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,"function"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f===r+1?a++:f>r?s>e-r?a+=f-r:a--:f(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--;}if(f=5&&((e||!n&&5===r)&&(h.push(r,0,e,s),r=6),n&&(h.push(r,n,0,s),r=6)),e="";},a=0;a"===t?(r=1,e=""):e=t+e[0]:u?t===u?u="":e+=t:'"'===t||"'"===t?u=t:">"===t?(p(),r=1):r&&("="===t?(r=5,s=e,e=""):"/"===t&&(r<5||">"===n[a][l+1])?(p(),3===r&&(h=h[0]),r=h,(h=h[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(p(),r=2):e+=t),3===r&&"!--"===e&&(r=4,h=h[0]);}return p(),h}(s)),r),arguments,[])).length>1?r:r[0]} - -var m=e$1.bind(_); - -export { b as Component, m as html, B as render }; diff --git a/sticker.pinapelz.moe/package.json b/sticker.pinapelz.moe/package.json deleted file mode 100644 index 44fe1ea..0000000 --- a/sticker.pinapelz.moe/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "maunium-stickerpicker", - "version": "0.1.0", - "description": "A fast and simple Matrix sticker picker widget", - "repository": "https://github.com/maunium/stickerpicker", - "author": "Tulir Asokan ", - "license": "AGPL-3.0-or-later", - "private": true, - "scripts": { - "esinstall": "node ./esinstall.js", - "sass": "sass --no-source-map --style=compressed style/" - }, - "dependencies": { - "esinstall": "^1.1.7", - "htm": "^3.1.0", - "preact": "^10.5.14", - "sass": "^1.42.1" - } -} diff --git a/sticker.pinapelz.moe/packs/.gitkeep b/sticker.pinapelz.moe/packs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/sticker.pinapelz.moe/packs/dank.json b/sticker.pinapelz.moe/packs/dank.json deleted file mode 100644 index e5f2766..0000000 --- a/sticker.pinapelz.moe/packs/dank.json +++ /dev/null @@ -1 +0,0 @@ -{"title": "dank", "id": "dank", "stickers": [{"body": "aware", "url": "mxc://chat.moekyun.me/QURUNgNThYmIdzyasFdcLJnr", "info": {"w": 112, "h": 112, "size": 17080, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/QURUNgNThYmIdzyasFdcLJnr", "thumbnail_info": {"w": 112, "h": 112, "size": 17080, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:3f0e3edace04fed69af1606f7c3c74591e4b1e3d1a296ad7340dd2b39214f099"}, {"body": "classic", "url": "mxc://chat.moekyun.me/ZBxiNUARoFZGoETjySzbKoAc", "info": {"w": 128, "h": 128, "size": 26042, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ZBxiNUARoFZGoETjySzbKoAc", "thumbnail_info": {"w": 128, "h": 128, "size": 26042, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:b9bec6f6748663456f72c7689db38e0f76e64a0e0496529d9515139fee067922"}, {"body": "smiley_good", "url": "mxc://chat.moekyun.me/PdyEJxgwOfBCxySfSFYlgPzP", "info": {"w": 256, "h": 256, "size": 90928, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/PdyEJxgwOfBCxySfSFYlgPzP", "thumbnail_info": {"w": 256, "h": 256, "size": 90928, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:57878fa8ccf13f58320c8cf07b266130984b4ed5ad35cfc87b67bc78fb2f7625"}, {"body": "smiley_grrr", "url": "mxc://chat.moekyun.me/xpwjfgHzxJFTiJWIXMEvBBck", "info": {"w": 256, "h": 256, "size": 89762, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/xpwjfgHzxJFTiJWIXMEvBBck", "thumbnail_info": {"w": 256, "h": 256, "size": 89762, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:76efdc3e86754261cfb6c93afe9ff5d25f2d4adbd45235a9670f5dbea6e1f74e"}, {"body": "smiley_no_no", "url": "mxc://chat.moekyun.me/yLAyUjCErrmXBfcAAUxYygsP", "info": {"w": 256, "h": 256, "size": 93010, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/yLAyUjCErrmXBfcAAUxYygsP", "thumbnail_info": {"w": 256, "h": 256, "size": 93010, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:1071abbf8e31ed12d226d5f078630d46b13ae377c9a3276e27f458076e42759a"}, {"body": "smiley_whatever", "url": "mxc://chat.moekyun.me/XmPidyRFUqsIUfMJXlyMqKTg", "info": {"w": 256, "h": 256, "size": 58621, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/XmPidyRFUqsIUfMJXlyMqKTg", "thumbnail_info": {"w": 256, "h": 256, "size": 58621, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:0f22af4ab47f63fcb9676537aa74aa3d0b6c8f606fe9e956f52b7ddfdc67ebf7"}, {"body": "xqc_ok", "url": "mxc://chat.moekyun.me/ZTckkllzHDrGCbrXBEqzDUYB", "info": {"w": 160, "h": 160, "size": 45997, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ZTckkllzHDrGCbrXBEqzDUYB", "thumbnail_info": {"w": 160, "h": 160, "size": 45997, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:bb49d28ed249cd3f01023ecfa99e2be2af901f737a0249aefbe53b31203197f5"}]} \ No newline at end of file diff --git a/sticker.pinapelz.moe/packs/index.json b/sticker.pinapelz.moe/packs/index.json deleted file mode 100644 index cdb8d7d..0000000 --- a/sticker.pinapelz.moe/packs/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "packs": [ - "weeb.json", - "dank.json" - ], - "homeserver_url": "https://chat.moekyun.me" -} \ No newline at end of file diff --git a/sticker.pinapelz.moe/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP b/sticker.pinapelz.moe/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP deleted file mode 100644 index 931a057..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/APyHPuZmyRfUwwsEHijRGdjP and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws b/sticker.pinapelz.moe/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws deleted file mode 100644 index cdf240a..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/ASWmCLdLLTVqLwXptdkBMtws and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc b/sticker.pinapelz.moe/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc deleted file mode 100644 index 20ab20f..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/CLkWhgAkDubZmahPWinNMaSc and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR b/sticker.pinapelz.moe/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR deleted file mode 100644 index e486283..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/DlLllEJSQYkOCBBzqVzdxuwR and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC b/sticker.pinapelz.moe/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC deleted file mode 100644 index a912611..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/MjoQgqCbNmTRuQfDngBPPoOC and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc b/sticker.pinapelz.moe/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc deleted file mode 100644 index 5a12b37..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/OddXtQLRutxvLZWWxNicguMc and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP b/sticker.pinapelz.moe/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP deleted file mode 100644 index 4ce4ec4..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/PdyEJxgwOfBCxySfSFYlgPzP and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr b/sticker.pinapelz.moe/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr deleted file mode 100644 index f161e15..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/QURUNgNThYmIdzyasFdcLJnr and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb b/sticker.pinapelz.moe/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb deleted file mode 100644 index 706c10d..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/SzxfhuJJdFPYzoPvSDIBhWxb and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg b/sticker.pinapelz.moe/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg deleted file mode 100644 index 2cdcf19..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/XmPidyRFUqsIUfMJXlyMqKTg and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc b/sticker.pinapelz.moe/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc deleted file mode 100644 index 11f60e7..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/ZBxiNUARoFZGoETjySzbKoAc and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB b/sticker.pinapelz.moe/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB deleted file mode 100644 index e6e259b..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/ZTckkllzHDrGCbrXBEqzDUYB and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx b/sticker.pinapelz.moe/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx deleted file mode 100644 index 79a10b8..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/aUBbgTfxxfWapJXDzOGsGWGx and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck b/sticker.pinapelz.moe/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck deleted file mode 100644 index 581048b..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/xpwjfgHzxJFTiJWIXMEvBBck and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP b/sticker.pinapelz.moe/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP deleted file mode 100644 index 2b949b8..0000000 Binary files a/sticker.pinapelz.moe/packs/thumbnails/yLAyUjCErrmXBfcAAUxYygsP and /dev/null differ diff --git a/sticker.pinapelz.moe/packs/weeb.json b/sticker.pinapelz.moe/packs/weeb.json deleted file mode 100644 index 80550cf..0000000 --- a/sticker.pinapelz.moe/packs/weeb.json +++ /dev/null @@ -1 +0,0 @@ -{"title": "weeb", "id": "weeb", "stickers": [{"body": "erina_i_may_be_dumb", "url": "mxc://chat.moekyun.me/SzxfhuJJdFPYzoPvSDIBhWxb", "info": {"w": 146, "h": 160, "size": 37322, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/SzxfhuJJdFPYzoPvSDIBhWxb", "thumbnail_info": {"w": 146, "h": 160, "size": 37322, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:a8e636aef053b1b3214e7afeb8f2539a3fc5dee9a011fabe0c9e4300f73da242"}, {"body": "miku_honest_reaction", "url": "mxc://chat.moekyun.me/OddXtQLRutxvLZWWxNicguMc", "info": {"w": 160, "h": 112, "size": 28353, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/OddXtQLRutxvLZWWxNicguMc", "thumbnail_info": {"w": 160, "h": 112, "size": 28353, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:d4dde21efae2eab7be830a3d65bc78176d898052c8bfaf96d784083b58668ef2"}, {"body": "not_bad", "url": "mxc://chat.moekyun.me/CLkWhgAkDubZmahPWinNMaSc", "info": {"w": 160, "h": 160, "size": 31164, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/CLkWhgAkDubZmahPWinNMaSc", "thumbnail_info": {"w": 160, "h": 160, "size": 31164, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:575e12e9e5452bb44270f13c1942c1ec3c5598a1a59f35358fbf90cb4e1cc71d"}, {"body": "peko_interesting", "url": "mxc://chat.moekyun.me/DlLllEJSQYkOCBBzqVzdxuwR", "info": {"w": 160, "h": 156, "size": 35734, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/DlLllEJSQYkOCBBzqVzdxuwR", "thumbnail_info": {"w": 160, "h": 156, "size": 35734, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:752763fa8f4d19f77b131267ca2a35ed233d62335bafb27b165ca248d00e0b84"}, {"body": "peko_unbelievable", "url": "mxc://chat.moekyun.me/MjoQgqCbNmTRuQfDngBPPoOC", "info": {"w": 160, "h": 160, "size": 52103, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/MjoQgqCbNmTRuQfDngBPPoOC", "thumbnail_info": {"w": 160, "h": 160, "size": 52103, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:618e4ea2b509bdb2c761f8fcafdbe42f56690b028edaa68e510843bd8859d5f1"}, {"body": "senmei_caught_4k", "url": "mxc://chat.moekyun.me/aUBbgTfxxfWapJXDzOGsGWGx", "info": {"w": 160, "h": 160, "size": 39863, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/aUBbgTfxxfWapJXDzOGsGWGx", "thumbnail_info": {"w": 160, "h": 160, "size": 39863, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:04e25a3a8de7d9da6eac994c013c831ada8c674b6dc5d61628ec0a082a45dc4c"}, {"body": "tsukasa_lewd", "url": "mxc://chat.moekyun.me/ASWmCLdLLTVqLwXptdkBMtws", "info": {"w": 160, "h": 160, "size": 29637, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/ASWmCLdLLTVqLwXptdkBMtws", "thumbnail_info": {"w": 160, "h": 160, "size": 29637, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:8dac5d9222770fe41ad4a120042416cb5db9e76501561942e0c0ffcbc78681dc"}, {"body": "weeb_fuck_everything", "url": "mxc://chat.moekyun.me/APyHPuZmyRfUwwsEHijRGdjP", "info": {"w": 140, "h": 160, "size": 47309, "mimetype": "image/png", "thumbnail_url": "mxc://chat.moekyun.me/APyHPuZmyRfUwwsEHijRGdjP", "thumbnail_info": {"w": 140, "h": 160, "size": 47309, "mimetype": "image/png"}}, "msgtype": "m.sticker", "id": "sha256:53246fc04cf8899b6311be5c8ca25673012d061b5f9245e13bc6e3271ef53892"}]} \ No newline at end of file diff --git a/sticker.pinapelz.moe/res/favorite.svg b/sticker.pinapelz.moe/res/favorite.svg deleted file mode 100644 index 4af2b49..0000000 --- a/sticker.pinapelz.moe/res/favorite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sticker.pinapelz.moe/res/giphy-dark.svg b/sticker.pinapelz.moe/res/giphy-dark.svg deleted file mode 100644 index 9b47567..0000000 --- a/sticker.pinapelz.moe/res/giphy-dark.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/sticker.pinapelz.moe/res/giphy-light.svg b/sticker.pinapelz.moe/res/giphy-light.svg deleted file mode 100644 index 8016e2c..0000000 --- a/sticker.pinapelz.moe/res/giphy-light.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/sticker.pinapelz.moe/res/powered-by-giphy.png b/sticker.pinapelz.moe/res/powered-by-giphy.png deleted file mode 100644 index 41861e6..0000000 Binary files a/sticker.pinapelz.moe/res/powered-by-giphy.png and /dev/null differ diff --git a/sticker.pinapelz.moe/res/recent.svg b/sticker.pinapelz.moe/res/recent.svg deleted file mode 100644 index 59be87d..0000000 --- a/sticker.pinapelz.moe/res/recent.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sticker.pinapelz.moe/res/search.svg b/sticker.pinapelz.moe/res/search.svg deleted file mode 100644 index 7be3396..0000000 --- a/sticker.pinapelz.moe/res/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sticker.pinapelz.moe/res/settings.svg b/sticker.pinapelz.moe/res/settings.svg deleted file mode 100644 index 51f966f..0000000 --- a/sticker.pinapelz.moe/res/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sticker.pinapelz.moe/src/frequently-used.js b/sticker.pinapelz.moe/src/frequently-used.js deleted file mode 100644 index a754e9a..0000000 --- a/sticker.pinapelz.moe/src/frequently-used.js +++ /dev/null @@ -1,34 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -const FREQUENTLY_USED = JSON.parse(window.localStorage.mauFrequentlyUsedStickerIDs || "{}") -let FREQUENTLY_USED_SORTED = null - -export const add = id => { - const [count] = FREQUENTLY_USED[id] || [0] - FREQUENTLY_USED[id] = [count + 1, Date.now()] - window.localStorage.mauFrequentlyUsedStickerIDs = JSON.stringify(FREQUENTLY_USED) - FREQUENTLY_USED_SORTED = null -} - -export const get = (limit = 16) => { - if (FREQUENTLY_USED_SORTED === null) { - FREQUENTLY_USED_SORTED = Object.entries(FREQUENTLY_USED) - .sort(([, [count1, date1]], [, [count2, date2]]) => - count2 === count1 ? date2 - date1 : count2 - count1) - .map(([emoji]) => emoji) - } - return FREQUENTLY_USED_SORTED.slice(0, limit) -} diff --git a/sticker.pinapelz.moe/src/giphy.js b/sticker.pinapelz.moe/src/giphy.js deleted file mode 100644 index 35172bb..0000000 --- a/sticker.pinapelz.moe/src/giphy.js +++ /dev/null @@ -1,107 +0,0 @@ -import {Component, html} from "../lib/htm/preact.js"; -import * as widgetAPI from "./widget-api.js"; -import {SearchBox} from "./search-box.js"; - -const GIPHY_SEARCH_DEBOUNCE = 1000 -let GIPHY_API_KEY = "HQku8974Uq5MZn3MZns46kXn2R4GDm75" -let GIPHY_MXC_PREFIX = "mxc://giphy.mau.dev/" - -export function giphyIsEnabled() { - return GIPHY_API_KEY !== "" -} - -export function setGiphyAPIKey(apiKey, mxcPrefix) { - GIPHY_API_KEY = apiKey - if (mxcPrefix) { - GIPHY_MXC_PREFIX = mxcPrefix - } -} - -export class GiphySearchTab extends Component { - constructor(props) { - super(props) - this.state = { - searchTerm: "", - gifs: [], - loading: false, - error: null, - } - this.handleGifClick = this.handleGifClick.bind(this) - this.searchKeyUp = this.searchKeyUp.bind(this) - this.updateGifSearchQuery = this.updateGifSearchQuery.bind(this) - this.searchTimeout = null - } - - async makeGifSearchRequest() { - try { - const resp = await fetch(`https://api.giphy.com/v1/gifs/search?q=${this.state.searchTerm}&api_key=${GIPHY_API_KEY}`) - // TODO handle error responses properly? - const data = await resp.json() - if (data.data.length === 0) { - this.setState({gifs: [], error: "No results"}) - } else { - this.setState({gifs: data.data, error: null}) - } - } catch (error) { - this.setState({error}) - } - } - - componentWillUnmount() { - clearTimeout(this.searchTimeout) - } - - searchKeyUp(event) { - if (event.key === "Enter") { - clearTimeout(this.searchTimeout) - this.makeGifSearchRequest() - } - } - - updateGifSearchQuery(event) { - this.setState({searchTerm: event.target.value}) - clearTimeout(this.searchTimeout) - this.searchTimeout = setTimeout(() => this.makeGifSearchRequest(), GIPHY_SEARCH_DEBOUNCE) - } - - handleGifClick(gif) { - widgetAPI.sendSticker({ - "body": gif.title, - "info": { - "h": +gif.images.original.height, - "w": +gif.images.original.width, - "size": +gif.images.original.size, - "mimetype": "image/webp", - }, - "msgtype": "m.image", - "url": GIPHY_MXC_PREFIX + gif.id, - - "id": gif.id, - "filename": gif.id + ".webp", - }) - } - - render() { - // TODO display loading state? - return html` - <${SearchBox} onInput=${this.updateGifSearchQuery} onKeyUp=${this.searchKeyUp} value=${this.state.searchTerm} placeholder="Find GIFs"/> -
-
-
- ${this.state.error} -
-
- ${this.state.gifs.map((gif) => html` -
this.handleGifClick(gif)} data-gif-id=${gif.id}> - ${gif.title} -
- `)} -
- -
-
- ` - } -} diff --git a/sticker.pinapelz.moe/src/index.js b/sticker.pinapelz.moe/src/index.js deleted file mode 100644 index 9f545b8..0000000 --- a/sticker.pinapelz.moe/src/index.js +++ /dev/null @@ -1,400 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -import {html, render, Component} from "../lib/htm/preact.js" -import {Spinner} from "./spinner.js" -import {SearchBox} from "./search-box.js" -import {giphyIsEnabled, GiphySearchTab, setGiphyAPIKey} from "./giphy.js" -import * as widgetAPI from "./widget-api.js" -import * as frequent from "./frequently-used.js" - -// The base URL for fetching packs. The app will first fetch ${PACK_BASE_URL}/index.json, -// then ${PACK_BASE_URL}/${packFile} for each packFile in the packs object of the index.json file. -const PACKS_BASE_URL = "packs" - -let INDEX = `${PACKS_BASE_URL}/index.json` -const params = new URLSearchParams(document.location.search) -if (params.has('config')) { - INDEX = params.get("config") -} - -const makeThumbnailURL = mxc => `${PACKS_BASE_URL}/thumbnails/${mxc.split("/").slice(-1)[0]}` - -// We need to detect iOS webkit because it has a bug related to scrolling non-fixed divs -// This is also used to fix scrolling to sections on Element iOS -const isMobileSafari = navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/) - -const supportedThemes = ["light", "dark", "black"] - -const defaultState = { - packs: [], - filtering: { - searchTerm: "", - packs: [], - }, -} - -class App extends Component { - constructor(props) { - super(props) - this.defaultTheme = params.get("theme") - this.state = { - viewingGifs: false, - packs: defaultState.packs, - loading: true, - error: null, - stickersPerRow: parseInt(localStorage.mauStickersPerRow || "4"), - theme: localStorage.mauStickerThemeOverride || this.defaultTheme, - frequentlyUsed: { - id: "frequently-used", - title: "Frequently used", - stickerIDs: frequent.get(), - stickers: [], - }, - filtering: defaultState.filtering, - } - if (!supportedThemes.includes(this.state.theme)) { - this.state.theme = "light" - } - if (!supportedThemes.includes(this.defaultTheme)) { - this.defaultTheme = "light" - } - this.stickersByID = new Map(JSON.parse(localStorage.mauFrequentlyUsedStickerCache || "[]")) - this.state.frequentlyUsed.stickers = this._getStickersByID(this.state.frequentlyUsed.stickerIDs) - this.imageObserver = null - this.packListRef = null - this.navRef = null - this.searchStickers = this.searchStickers.bind(this) - this.sendSticker = this.sendSticker.bind(this) - this.navScroll = this.navScroll.bind(this) - this.reloadPacks = this.reloadPacks.bind(this) - this.observeSectionIntersections = this.observeSectionIntersections.bind(this) - this.observeImageIntersections = this.observeImageIntersections.bind(this) - } - - _getStickersByID(ids) { - return ids.map(id => this.stickersByID.get(id)).filter(sticker => !!sticker) - } - - updateFrequentlyUsed() { - const stickerIDs = frequent.get() - const stickers = this._getStickersByID(stickerIDs) - this.setState({ - frequentlyUsed: { - ...this.state.frequentlyUsed, - stickerIDs, - stickers, - }, - }) - localStorage.mauFrequentlyUsedStickerCache = JSON.stringify(stickers.map(sticker => [sticker.id, sticker])) - } - - searchStickers(e) { - const sanitizeString = s => s.toLowerCase().trim() - const searchTerm = sanitizeString(e.target.value) - - const allPacks = [this.state.frequentlyUsed, ...this.state.packs] - const packsWithFilteredStickers = allPacks.map(pack => ({ - ...pack, - stickers: pack.stickers.filter(sticker => - sanitizeString(sticker.body).includes(searchTerm) || - sanitizeString(sticker.id).includes(searchTerm) - ), - })) - - this.setState({ - filtering: { - ...this.state.filtering, - searchTerm, - packs: packsWithFilteredStickers.filter(({stickers}) => !!stickers.length), - }, - }) - } - - setStickersPerRow(val) { - localStorage.mauStickersPerRow = val - document.documentElement.style.setProperty("--stickers-per-row", localStorage.mauStickersPerRow) - this.setState({ - stickersPerRow: val, - }) - this.packListRef.scrollTop = this.packListRef.scrollHeight - } - - setTheme(theme) { - if (theme === "default") { - delete localStorage.mauStickerThemeOverride - this.setState({theme: this.defaultTheme}) - } else { - localStorage.mauStickerThemeOverride = theme - this.setState({theme: theme}) - } - } - - reloadPacks() { - this.imageObserver.disconnect() - this.sectionObserver.disconnect() - this.setState({ - packs: defaultState.packs, - filtering: defaultState.filtering, - }) - this._loadPacks(true) - } - - _loadPacks(disableCache = false) { - const cache = disableCache ? "no-cache" : undefined - fetch(INDEX, {cache}).then(async indexRes => { - if (indexRes.status >= 400) { - this.setState({ - loading: false, - error: indexRes.status !== 404 ? indexRes.statusText : null, - }) - return - } - const indexData = await indexRes.json() - if (indexData.giphy_api_key !== undefined) { - setGiphyAPIKey(indexData.giphy_api_key, indexData.giphy_mxc_prefix) - } - // TODO only load pack metadata when scrolled into view? - for (const packFile of indexData.packs) { - let packRes - if (packFile.startsWith("https://") || packFile.startsWith("http://")) { - packRes = await fetch(packFile, {cache}) - } else { - packRes = await fetch(`${PACKS_BASE_URL}/${packFile}`, {cache}) - } - const packData = await packRes.json() - for (const sticker of packData.stickers) { - this.stickersByID.set(sticker.id, sticker) - } - this.setState({ - packs: [...this.state.packs, packData], - loading: false, - }) - } - this.updateFrequentlyUsed() - }, error => this.setState({loading: false, error})) - } - - componentDidMount() { - document.documentElement.style.setProperty("--stickers-per-row", this.state.stickersPerRow.toString()) - this._loadPacks() - this.imageObserver = new IntersectionObserver(this.observeImageIntersections, { - rootMargin: "100px", - }) - this.sectionObserver = new IntersectionObserver(this.observeSectionIntersections) - } - - observeImageIntersections(intersections) { - for (const entry of intersections) { - const img = entry.target.children.item(0) - if (entry.isIntersecting) { - img.setAttribute("src", img.getAttribute("data-src")) - img.classList.add("visible") - } else { - img.removeAttribute("src") - img.classList.remove("visible") - } - } - } - - observeSectionIntersections(intersections) { - const navWidth = this.navRef.getBoundingClientRect().width - let minX = 0, maxX = navWidth - let minXElem = null - let maxXElem = null - for (const entry of intersections) { - const packID = entry.target.getAttribute("data-pack-id") - if (!packID) { - continue - } - const navElement = document.getElementById(`nav-${packID}`) - if (entry.isIntersecting) { - navElement.classList.add("visible") - const bb = navElement.getBoundingClientRect() - if (bb.x < minX) { - minX = bb.x - minXElem = navElement - } else if (bb.right > maxX) { - maxX = bb.right - maxXElem = navElement - } - } else { - navElement.classList.remove("visible") - } - } - if (minXElem !== null) { - minXElem.scrollIntoView({inline: "start"}) - } else if (maxXElem !== null) { - maxXElem.scrollIntoView({inline: "end"}) - } - } - - componentDidUpdate() { - if (this.packListRef === null) { - return - } - for (const elem of this.packListRef.getElementsByClassName("sticker")) { - this.imageObserver.observe(elem) - } - for (const elem of this.packListRef.children) { - this.sectionObserver.observe(elem) - } - } - - componentWillUnmount() { - this.imageObserver.disconnect() - this.sectionObserver.disconnect() - } - - sendSticker(evt) { - const id = evt.currentTarget.getAttribute("data-sticker-id") - const sticker = this.stickersByID.get(id) - frequent.add(id) - this.updateFrequentlyUsed() - widgetAPI.sendSticker(sticker) - } - - navScroll(evt) { - this.navRef.scrollLeft += evt.deltaY - } - - render() { - const theme = `theme-${this.state.theme}` - const filterActive = !!this.state.filtering.searchTerm - const packs = filterActive - ? this.state.filtering.packs - : [this.state.frequentlyUsed, ...this.state.packs] - - if (this.state.loading) { - return html` -
- <${Spinner} size=${80} green/> -
- ` - } else if (this.state.error) { - return html` -
-

Failed to load packs

-

${this.state.error}

-
- ` - } else if (this.state.packs.length === 0) { - return html` -

No packs found 😿

- ` - } - - const onClickOverride = this.state.viewingGifs - ? (evt, packID) => { - evt.preventDefault() - this.setState({viewingGifs: false}, () => { - scrollToSection(null, packID) - }) - } : null - const switchToGiphy = () => this.setState({viewingGifs: true, filtering: defaultState.filtering}) - - return html` -
- - - ${this.state.viewingGifs ? html` - <${GiphySearchTab}/> - ` : html` - <${SearchBox} onInput=${this.searchStickers} value=${this.state.filtering.searchTerm ?? ""}/> -
(this.packListRef = elem)}> - ${filterActive && packs.length === 0 - ? html`

No stickers match your search

` - : null} - ${packs.map((pack) => html`<${Pack} id=${pack.id} pack=${pack} send=${this.sendSticker}/>`)} - <${Settings} app=${this}/> -
- `} -
` - } -} - -const Settings = ({app}) => html` -
-

Settings

-
- -
- - app.setStickersPerRow(evt.target.value)}/> -
-
- - -
-
-
-` - -// By default we just let the browser handle scrolling to sections, but webviews on Element iOS -// open the link in the browser instead of just scrolling there, so we need to scroll manually: -const scrollToSection = (evt, id) => { - const pack = document.getElementById(`pack-${id}`) - if (pack) { - pack.scrollIntoView({block: "start", behavior: "instant"}) - } - evt?.preventDefault() -} - -const NavBarItem = ({pack, iconOverride = null, onClickOverride = null, extraClass = null}) => html` - onClickOverride(evt, pack.id)) : (isMobileSafari ? (evt => scrollToSection(evt, pack.id)) : undefined)}> -
- ${iconOverride ? html` - - ` : html` - ${pack.stickers[0].body} - `} -
-
-` - -const Pack = ({pack, send}) => html` -
-

${pack.title}

-
- ${pack.stickers.map(sticker => html` - <${Sticker} key=${sticker.id} content=${sticker} send=${send}/> - `)} -
-
-` - -const Sticker = ({content, send}) => html` -
- ${content.body} -
-` - -render(html`<${App}/>`, document.body) diff --git a/sticker.pinapelz.moe/src/search-box.js b/sticker.pinapelz.moe/src/search-box.js deleted file mode 100644 index b25769f..0000000 --- a/sticker.pinapelz.moe/src/search-box.js +++ /dev/null @@ -1,26 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -import {html} from "../lib/htm/preact.js" - -export const SearchBox = ({onInput, onKeyUp, value, placeholder = 'Find stickers'}) => { - const component = html` - - ` - return component -} diff --git a/sticker.pinapelz.moe/src/spinner.js b/sticker.pinapelz.moe/src/spinner.js deleted file mode 100644 index e89dd02..0000000 --- a/sticker.pinapelz.moe/src/spinner.js +++ /dev/null @@ -1,41 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -import { html } from "../lib/htm/preact.js" - -export const Spinner = ({ size = 40, noCenter = false, noMargin = false, green = false }) => { - let margin = 0 - if (!isNaN(+size)) { - size = +size - margin = noMargin ? 0 : `${Math.round(size / 6)}px` - size = `${size}px` - } - const noInnerMargin = !noCenter || !margin - const comp = html` -
-
-
-
-
-
-
-
- ` - if (!noCenter) { - return html`
${comp}
` - } - return comp -} diff --git a/sticker.pinapelz.moe/src/widget-api.js b/sticker.pinapelz.moe/src/widget-api.js deleted file mode 100644 index d9964a7..0000000 --- a/sticker.pinapelz.moe/src/widget-api.js +++ /dev/null @@ -1,77 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -let widgetId = null - -window.onmessage = event => { - if (!window.parent || !event.data) { - return - } - - const request = event.data - if (!request.requestId || !request.widgetId || !request.action || request.api !== "toWidget") { - return - } - - if (widgetId) { - if (widgetId !== request.widgetId) { - return - } - } else { - widgetId = request.widgetId - } - - let response - - if (request.action === "visibility") { - response = {} - } else if (request.action === "capabilities") { - response = { capabilities: ["m.sticker"] } - } else { - response = { error: { message: "Action not supported" } } - } - - window.parent.postMessage({ ...request, response }, event.origin) -} - -export function sendSticker(content) { - const data = { - content: { ...content }, - // `name` is for Element Web (and also the spec) - // Element Android uses content -> body as the name - name: content.body, - } - // Custom field that stores the ID even for non-telegram stickers - delete data.content.id - - // This is for Element iOS - const widgetData = { - ...data, - description: content.body, - file: content.filename ?? `${content.id}.png`, - } - delete widgetData.content.filename - // Element iOS explodes if there are extra fields present - delete widgetData.content["net.maunium.telegram.sticker"] - - window.parent.postMessage({ - api: "fromWidget", - action: "m.sticker", - requestId: `sticker-${Date.now()}`, - widgetId, - data, - widgetData, - }, "*") -} diff --git a/sticker.pinapelz.moe/style/index.css b/sticker.pinapelz.moe/style/index.css deleted file mode 100644 index f73124e..0000000 --- a/sticker.pinapelz.moe/style/index.css +++ /dev/null @@ -1 +0,0 @@ -*{font-family:sans-serif}body{margin:0}h1{font-size:1rem}:root{--stickers-per-row: 4;--sticker-size: calc(100vw / var(--stickers-per-row))}main{color:var(--text-color)}main.spinner{margin-top:5rem}main.error,main.empty{margin:2rem}main.empty{text-align:center}main.has-content{position:fixed;top:0;left:0;right:0;bottom:0;display:grid;grid-template-rows:calc(12vw + 2px) min-content auto}main.theme-light{--highlight-color: #eee;--search-box-color: var(--highlight-color);--text-color: black;background-color:#fff}main.theme-dark{--highlight-color: #444;--search-box-color: #383e4b;--text-color: white;background-color:#22262e}main.theme-dark .icon.icon-giphy{background-image:url(../res/giphy-dark.svg)}main.theme-black{--highlight-color: #222;--search-box-color: var(--highlight-color);--text-color: white;background-color:#000}main.theme-black .icon.icon-giphy{background-image:url(../res/giphy-dark.svg)}div.powered-by-giphy{padding:1rem}div.powered-by-giphy>img{width:100%}.icon{width:100%;height:100%;background-color:var(--text-color);mask-size:contain;-webkit-mask-size:contain;mask-image:var(--icon-image);-webkit-mask-image:var(--icon-image)}.icon.icon-settings{--icon-image: url(../res/settings.svg)}.icon.icon-recent{--icon-image: url(../res/recent.svg)}.icon.icon.icon-search{--icon-image: url(../res/search.svg)}.icon.icon.icon-giphy{background:center/contain no-repeat url(../res/giphy-light.svg);mask:unset}nav{display:flex;overflow-x:auto}nav>a{border-bottom:2px solid rgba(0,0,0,0)}nav>a.visible{border-bottom-color:green}nav>a>div.sticker{width:12vw;height:12vw}div.pack-list,nav{scrollbar-width:none}div.pack-list::-webkit-scrollbar,nav::-webkit-scrollbar{display:none}div.pack-list{overflow-y:auto}div.pack-list.ios-safari-hack{position:fixed;top:calc(calc(12vw + 2px) + calc(2 * 0.7rem + 2 * 0.5rem + 1rem));bottom:0;left:0;right:0;-webkit-overflow-scrolling:touch}div.search-empty{margin:1.2rem;text-align:center}section.stickerpack{margin-top:.75rem}section.stickerpack>div.sticker-list{display:flex;flex-wrap:wrap}section.stickerpack>h1{margin:0 0 0 .75rem}section.stickerpack#pack-giphy{display:flex;justify-content:space-between;flex-direction:column;min-height:100%}div.sticker{display:flex;padding:4px;cursor:pointer;position:relative;width:var(--sticker-size);height:var(--sticker-size);box-sizing:border-box}div.sticker:hover{background-color:var(--highlight-color)}div.sticker>img{display:none;width:100%;object-fit:contain}div.sticker>img.visible{display:initial}div.sticker>.icon{width:70%;height:70%;margin:15%}div.search-box{position:relative;display:flex}div.search-box>input[type=text]{flex-grow:1;background-color:var(--search-box-color);outline:none;border:none;border-radius:.25rem;height:1rem;padding:.7rem;padding-right:calc(1rem + 0.7rem);margin:.5rem;font-size:1rem;color:var(--text-color)}div.search-box>span.icon{display:flex;position:absolute;top:calc(50% - 1rem/2);right:1rem;width:1rem;height:1rem;box-sizing:border-box}div.settings-list{display:flex;flex-direction:column}div.settings-list>*{margin:.5rem}div.settings-list button{padding:.5rem;border-radius:.25rem}div.settings-list input{width:100%} diff --git a/sticker.pinapelz.moe/style/index.sass b/sticker.pinapelz.moe/style/index.sass deleted file mode 100644 index 1269be5..0000000 --- a/sticker.pinapelz.moe/style/index.sass +++ /dev/null @@ -1,227 +0,0 @@ -// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. -// Copyright (C) 2020 Tulir Asokan -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -* - font-family: sans-serif - -body - margin: 0 - -h1 - font-size: 1rem - -\:root - --stickers-per-row: 4 - --sticker-size: calc(100vw / var(--stickers-per-row)) - -$nav-sticker-size: 12vw -$nav-bottom-highlight: 2px -$nav-height: calc(#{$nav-sticker-size} + #{$nav-bottom-highlight}) -$nav-height-inverse: calc(-#{$nav-sticker-size} - #{$nav-bottom-highlight}) - -$search-box-icon-size: 1rem -$search-box-input-height: 1rem -$search-box-input-padding: .7rem -$search-box-input-margin: .5rem -$search-box-height: calc(2 * #{$search-box-input-padding} + 2 * #{$search-box-input-margin} + #{$search-box-input-height}) - -main - color: var(--text-color) - - &.spinner - margin-top: 5rem - - &.error, &.empty - margin: 2rem - - &.empty - text-align: center - - &.has-content - position: fixed - top: 0 - left: 0 - right: 0 - bottom: 0 - display: grid - grid-template-rows: $nav-height min-content auto - -main.theme-light - --highlight-color: #eee - --search-box-color: var(--highlight-color) - --text-color: black - background-color: white - -main.theme-dark - --highlight-color: #444 - --search-box-color: #383e4b - --text-color: white - background-color: #22262e - - .icon.icon-giphy - background-image: url(../res/giphy-dark.svg) - -main.theme-black - --highlight-color: #222 - --search-box-color: var(--highlight-color) - --text-color: white - background-color: black - - .icon.icon-giphy - background-image: url(../res/giphy-dark.svg) - -div.powered-by-giphy - padding: 1rem - > img - width: 100% - -.icon - width: 100% - height: 100% - background-color: var(--text-color) - mask-size: contain - -webkit-mask-size: contain - mask-image: var(--icon-image) - -webkit-mask-image: var(--icon-image) - - &.icon-settings - --icon-image: url(../res/settings.svg) - - &.icon-recent - --icon-image: url(../res/recent.svg) - - &.icon.icon-search - --icon-image: url(../res/search.svg) - - &.icon.icon-giphy - background: center / contain no-repeat url(../res/giphy-light.svg) - mask: unset - -nav - display: flex - overflow-x: auto - - > a - border-bottom: $nav-bottom-highlight solid transparent - - &.visible - border-bottom-color: green - - > div.sticker - width: $nav-sticker-size - height: $nav-sticker-size - -div.pack-list, nav - scrollbar-width: none - - &::-webkit-scrollbar - display: none - -div.pack-list - overflow-y: auto - -div.pack-list.ios-safari-hack - position: fixed - top: calc(#{$nav-height} + #{$search-box-height}) - bottom: 0 - left: 0 - right: 0 - -webkit-overflow-scrolling: touch - -div.search-empty - margin: 1.2rem - text-align: center - -section.stickerpack - margin-top: .75rem - - > div.sticker-list - display: flex - flex-wrap: wrap - - > h1 - margin: 0 0 0 .75rem - -section.stickerpack#pack-giphy - display: flex - justify-content: space-between - flex-direction: column - min-height: 100% - -div.sticker - display: flex - padding: 4px - cursor: pointer - position: relative - width: var(--sticker-size) - height: var(--sticker-size) - box-sizing: border-box - - &:hover - background-color: var(--highlight-color) - - > img - display: none - width: 100% - object-fit: contain - - &.visible - display: initial - - > .icon - width: 70% - height: 70% - margin: 15% - -div.search-box - position: relative - display: flex - - >input[type="text"] - flex-grow: 1 - background-color: var(--search-box-color) - outline: none - border: none - border-radius: .25rem - height: $search-box-input-height - padding: $search-box-input-padding - padding-right: calc(#{$search-box-icon-size} + #{$search-box-input-padding}) - margin: $search-box-input-margin - font-size: 1rem - color: var(--text-color) - - >span.icon - display: flex - position: absolute - top: calc(50% - #{$search-box-icon-size} / 2) - right: $search-box-icon-size - width: $search-box-icon-size - height: $search-box-icon-size - box-sizing: border-box - -div.settings-list - display: flex - flex-direction: column - - > * - margin: .5rem - - button - padding: .5rem - border-radius: .25rem - - input - width: 100% diff --git a/sticker.pinapelz.moe/style/spinner.css b/sticker.pinapelz.moe/style/spinner.css deleted file mode 100644 index de03d9c..0000000 --- a/sticker.pinapelz.moe/style/spinner.css +++ /dev/null @@ -1 +0,0 @@ -.sk-center-wrapper{width:100%;display:flex;justify-content:space-around}.sk-chase{position:relative;animation:sk-chase 2.5s infinite linear both}.sk-chase.green>.sk-chase-dot:before{background-color:#00c853}.sk-chase>.sk-chase-dot{width:100%;height:100%;position:absolute;left:0;top:0;animation:sk-chase-dot 2s infinite ease-in-out both}.sk-chase>.sk-chase-dot:before{content:"";display:block;width:25%;height:25%;border-radius:100%;animation:sk-chase-dot-before 2s infinite ease-in-out both;background-color:#fff}.sk-chase>.sk-chase-dot:nth-child(1){animation-delay:-1.1s}.sk-chase>.sk-chase-dot:nth-child(2){animation-delay:-1s}.sk-chase>.sk-chase-dot:nth-child(3){animation-delay:-0.9s}.sk-chase>.sk-chase-dot:nth-child(4){animation-delay:-0.8s}.sk-chase>.sk-chase-dot:nth-child(5){animation-delay:-0.7s}.sk-chase>.sk-chase-dot:nth-child(6){animation-delay:-0.6s}.sk-chase>.sk-chase-dot:nth-child(1):before{animation-delay:-1.1s}.sk-chase>.sk-chase-dot:nth-child(2):before{animation-delay:-1s}.sk-chase>.sk-chase-dot:nth-child(3):before{animation-delay:-0.9s}.sk-chase>.sk-chase-dot:nth-child(4):before{animation-delay:-0.8s}.sk-chase>.sk-chase-dot:nth-child(5):before{animation-delay:-0.7s}.sk-chase>.sk-chase-dot:nth-child(6):before{animation-delay:-0.6s}@keyframes sk-chase{100%{transform:rotate(360deg)}}@keyframes sk-chase-dot{80%,100%{transform:rotate(360deg)}}@keyframes sk-chase-dot-before{50%{transform:scale(0.4)}100%,0%{transform:scale(1)}} diff --git a/sticker.pinapelz.moe/style/spinner.sass b/sticker.pinapelz.moe/style/spinner.sass deleted file mode 100644 index cbc9042..0000000 --- a/sticker.pinapelz.moe/style/spinner.sass +++ /dev/null @@ -1,68 +0,0 @@ -// Chase spinner from https://tobiasahlin.com/spinkit/. MIT license -.sk-center-wrapper - width: 100% - display: flex - justify-content: space-around - -.sk-chase - position: relative - animation: sk-chase 2.5s infinite linear both - - &.green > .sk-chase-dot:before - background-color: #00C853 - - > .sk-chase-dot - width: 100% - height: 100% - position: absolute - left: 0 - top: 0 - animation: sk-chase-dot 2.0s infinite ease-in-out both - - &:before - content: '' - display: block - width: 25% - height: 25% - border-radius: 100% - animation: sk-chase-dot-before 2.0s infinite ease-in-out both - background-color: #FFF - - &:nth-child(1) - animation-delay: -1.1s - &:nth-child(2) - animation-delay: -1.0s - &:nth-child(3) - animation-delay: -0.9s - &:nth-child(4) - animation-delay: -0.8s - &:nth-child(5) - animation-delay: -0.7s - &:nth-child(6) - animation-delay: -0.6s - &:nth-child(1):before - animation-delay: -1.1s - &:nth-child(2):before - animation-delay: -1.0s - &:nth-child(3):before - animation-delay: -0.9s - &:nth-child(4):before - animation-delay: -0.8s - &:nth-child(5):before - animation-delay: -0.7s - &:nth-child(6):before - animation-delay: -0.6s - -@keyframes sk-chase - 100% - transform: rotate(360deg) - -@keyframes sk-chase-dot - 80%, 100% - transform: rotate(360deg) - -@keyframes sk-chase-dot-before - 50% - transform: scale(0.4) - 100%, 0% - transform: scale(1.0) diff --git a/sticker.pinapelz.moe/yarn.lock b/sticker.pinapelz.moe/yarn.lock deleted file mode 100644 index de00773..0000000 --- a/sticker.pinapelz.moe/yarn.lock +++ /dev/null @@ -1,719 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@rollup/plugin-commonjs@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz#169004d56cd0f0a1d0f35915d31a036b0efe281f" - integrity sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-inject@^4.0.0", "@rollup/plugin-inject@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz#fbeee66e9a700782c4f65c8b0edbafe58678fbc2" - integrity sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ== - dependencies: - "@rollup/pluginutils" "^3.1.0" - estree-walker "^2.0.1" - magic-string "^0.25.7" - -"@rollup/plugin-json@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" - integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== - dependencies: - "@rollup/pluginutils" "^3.0.8" - -"@rollup/plugin-node-resolve@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz#44064a2b98df7530e66acf8941ff262fc9b4ead8" - integrity sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - builtin-modules "^3.1.0" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.17.0" - -"@rollup/plugin-replace@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" - integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@types/estree@*": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/node@*": - version "20.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" - integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== - dependencies: - undici-types "~5.26.4" - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -acorn-walk@^8.2.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.7.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -assert@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" - integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== - dependencies: - object.assign "^4.1.4" - util "^0.10.4" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -builtin-modules@^3.1.0, builtin-modules@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== - -call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -"chokidar@>=3.0.0 <4.0.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cjs-module-lexer@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.6.0.tgz#e72ab05b7412e62b9be37c37a09bdb6000d706f0" - integrity sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA== - -esinstall@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/esinstall/-/esinstall-1.1.7.tgz#ceabeb4b8685bf48c805a503e292dfafe4e0cb22" - integrity sha512-irDsrIF7fZ5BCQEAV5gmH+4nsK6JhnkI9C9VloXdmzJLbM1EcshPw8Ap95UUGc4ZJdzGeOrjV+jgKjQ/Z7Q3pg== - dependencies: - "@rollup/plugin-commonjs" "^16.0.0" - "@rollup/plugin-inject" "^4.0.2" - "@rollup/plugin-json" "^4.0.0" - "@rollup/plugin-node-resolve" "^10.0.0" - "@rollup/plugin-replace" "^2.4.2" - builtin-modules "^3.2.0" - cjs-module-lexer "^1.2.1" - es-module-lexer "^0.6.0" - execa "^5.1.1" - is-valid-identifier "^2.0.2" - kleur "^4.1.1" - mkdirp "^1.0.3" - picomatch "^2.3.0" - resolve "^1.20.0" - rimraf "^3.0.0" - rollup "~2.37.1" - rollup-plugin-polyfill-node "^0.6.2" - slash "~3.0.0" - validate-npm-package-name "^3.0.0" - vm2 "^3.9.2" - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -htm@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" - integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -immutable@^4.0.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" - integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-reference@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-valid-identifier@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-valid-identifier/-/is-valid-identifier-2.0.2.tgz#146d9dbf29821b8118580b039d2203aa4bd1da4b" - integrity sha512-mpS5EGqXOwzXtKAg6I44jIAqeBfntFLxpAth1rrKbxtKyI6LPktyDYpHBI+tHlduhhX/SF26mFXmxQu995QVqg== - dependencies: - assert "^1.4.1" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -kleur@^4.1.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -mkdirp@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -preact@^10.5.14: - version "10.22.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.22.0.tgz#a50f38006ae438d255e2631cbdaf7488e6dd4e16" - integrity sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -resolve@^1.17.0, resolve@^1.20.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-polyfill-node@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.6.2.tgz#dea62e00f5cc2c174e4b4654b5daab79b1a92fc3" - integrity sha512-gMCVuR0zsKq0jdBn8pSXN1Ejsc458k2QsFFvQdbHoM0Pot5hEnck+pBP/FDwFS6uAi77pD3rDTytsaUStsOMlA== - dependencies: - "@rollup/plugin-inject" "^4.0.0" - -rollup@~2.37.1: - version "2.37.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.37.1.tgz#aa7aadffd75c80393f9314f9857e851b0ffd34e7" - integrity sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ== - optionalDependencies: - fsevents "~2.1.2" - -sass@^1.42.1: - version "1.77.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" - integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slash@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -"source-map-js@>=0.6.2 <2.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -util@^0.10.4: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== - dependencies: - builtins "^1.0.3" - -vm2@^3.9.2: - version "3.9.19" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" - integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -- cgit v1.2.3