diff --git a/astro.config.mjs b/astro.config.mjs index a77103e..1815c5a 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,8 +1,10 @@ // @ts-check import { defineConfig } from "astro/config"; +import preact from '@astrojs/preact'; // https://astro.build/config export default defineConfig({ site: "https://regional.rubykaigi.org", base: "/tokyo12", + integrations: [preact()], }); diff --git a/package-lock.json b/package-lock.json index 7d28d6e..85e6090 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,16 @@ "version": "0.0.1", "dependencies": { "@astrojs/check": "^0.9.4", + "@astrojs/preact": "^3.5.4", + "@nanostores/preact": "^0.5.2", "astro": "^4.15.12", - "typescript": "^5.6.3" + "nanostores": "^0.11.3", + "preact": "^10.25.0" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "typescript": "^5.7.2" } }, "node_modules/@ampproject/remapping": { @@ -123,6 +131,27 @@ "vfile": "^6.0.3" } }, + "node_modules/@astrojs/preact": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/@astrojs/preact/-/preact-3.5.4.tgz", + "integrity": "sha512-NCS88C3JV/ZaFlBLLzYGvAvSrHsO2kaBgxMNDf9c0/OSywyY9D2NOBHWmwmiMP8tBtDbW5f8sfyL0XrjhguKgw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@preact/preset-vite": "2.8.2", + "@preact/signals": "^1.3.0", + "babel-plugin-transform-hook-names": "^1.0.2", + "preact-render-to-string": "^6.5.11", + "vite": "^5.4.10" + }, + "engines": { + "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + }, + "peerDependencies": { + "preact": "^10.6.5" + } + }, "node_modules/@astrojs/prism": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", @@ -163,12 +192,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -224,12 +254,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -239,12 +270,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", - "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -276,13 +307,13 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -307,9 +338,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -329,18 +360,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -368,28 +399,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -399,12 +415,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -414,16 +430,31 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz", - "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-jsx": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -433,30 +464,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -465,14 +496,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1320,6 +1350,25 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nanostores/preact": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@nanostores/preact/-/preact-0.5.2.tgz", + "integrity": "sha512-DZ5G0UuHTJ8NNS8I3Jd6f4RCcWIl4siYD+vaV6jQf0T6xJ3QqTSkJkYNQTZK7O+7NC/mzaLkomyLQqD+w1E0Tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0", + "preact": ">=10.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1361,6 +1410,144 @@ "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@preact/preset-vite": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.8.2.tgz", + "integrity": "sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "0.30.5", + "node-html-parser": "^6.1.10", + "resolve": "^1.22.8", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x" + } + }, + "node_modules/@preact/preset-vite/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@preact/preset-vite/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@preact/preset-vite/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@preact/signals": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@preact/signals/-/signals-1.3.1.tgz", + "integrity": "sha512-nNvSF2O7RDzxp1Rm7SkA5QhN1a2kN8pGE8J5o6UjgDof0F0Vlg6d6HUUVxxqZ1uJrN9xnH2DpL6rpII3Es0SsQ==", + "license": "MIT", + "dependencies": { + "@preact/signals-core": "^1.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + }, + "peerDependencies": { + "preact": "10.x" + } + }, + "node_modules/@preact/signals-core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.8.0.tgz", + "integrity": "sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", + "license": "MIT" + }, + "node_modules/@prefresh/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.3.tgz", + "integrity": "sha512-nDzxj0tA1/M6APNAWqaxkZ+3sTdPHESa+gol4+Bw7rMc2btWdkLoNH7j9rGhUb8SThC0Vz0VoXtq+U+9azGLHg==", + "license": "MIT", + "peerDependencies": { + "preact": "^10.0.0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", + "license": "MIT" + }, + "node_modules/@prefresh/vite": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.1", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0", + "vite": ">=2.0.0" + } + }, + "node_modules/@prefresh/vite/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@prefresh/vite/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, "node_modules/@rollup/pluginutils": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", @@ -1743,6 +1930,34 @@ "@types/unist": "*" } }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -1941,18 +2156,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2068,6 +2271,15 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-transform-hook-names": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.12.10" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -2084,6 +2296,12 @@ "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", "license": "MIT" }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/boxen": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", @@ -2204,20 +2422,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -2445,20 +2649,12 @@ "node": ">=12.5.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/color-string": { "version": "1.9.1", @@ -2522,6 +2718,34 @@ "node": ">= 0.6" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2534,6 +2758,13 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -2629,6 +2860,61 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dset": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", @@ -2731,15 +3017,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2893,6 +3170,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2993,13 +3279,16 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, "node_modules/hast-util-from-html": { @@ -3179,6 +3468,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/html-escaper": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", @@ -3218,6 +3516,21 @@ "license": "MIT", "optional": true }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -3422,6 +3735,12 @@ "node": ">=6" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, "node_modules/load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -4438,6 +4757,21 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/nanostores": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-0.11.3.tgz", + "integrity": "sha512-TUes3xKIX33re4QzdxwZ6tdbodjmn3tWXCEc1uokiEmo14sI1EaGYNs2k3bU2pyyGNmBqFGAVl6jAGWd06AVIg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, "node_modules/neotraverse": { "version": "0.6.18", "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", @@ -4460,12 +4794,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/onetime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", @@ -4652,6 +5008,12 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -4719,6 +5081,25 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.25.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.0.tgz", + "integrity": "sha512-6bYnzlLxXV3OSpUxLdaxBmE7PMOu0aR3pG6lryK/0jmvcDFPlcXGQAt5DpK3RITWiDrfYZRI0druyaK/S9kYLg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", + "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==", + "license": "MIT", + "peerDependencies": { + "preact": ">=10" + } + }, "node_modules/preferred-pm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", @@ -4996,6 +5377,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -5248,6 +5646,15 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5273,6 +5680,15 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -5349,16 +5765,16 @@ "node": ">=0.10.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tinyexec": { @@ -5367,15 +5783,6 @@ "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", "license": "MIT" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5454,9 +5861,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -5690,9 +6097,9 @@ } }, "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "license": "MIT", "dependencies": { "esbuild": "^0.21.3", diff --git a/package.json b/package.json index 789ee7c..28536f8 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,16 @@ "astro": "astro" }, "dependencies": { - "astro": "^4.15.12", "@astrojs/check": "^0.9.4", - "typescript": "^5.6.3" + "@astrojs/preact": "^3.5.4", + "@nanostores/preact": "^0.5.2", + "astro": "^4.15.12", + "nanostores": "^0.11.3", + "preact": "^10.25.0" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "typescript": "^5.7.2" } } diff --git a/src/components/Layouts/Footer.astro b/src/components/Layouts/Footer.astro index 420f719..52e2581 100644 --- a/src/components/Layouts/Footer.astro +++ b/src/components/Layouts/Footer.astro @@ -1,6 +1,4 @@ --- -import XLogoWhiteImage from "../../imgs/x-logo-white.png"; -import ArrowUpRightFromSquareIcon from "../icons/arrow-up-right-from-square-white.svg"; --- diff --git a/src/components/Layouts/Panel.astro b/src/components/Layouts/Panel.astro index 03a31a3..a00e5bb 100644 --- a/src/components/Layouts/Panel.astro +++ b/src/components/Layouts/Panel.astro @@ -1,34 +1,33 @@ --- import PanelHeader from "./PanelHeader.astro"; -const { title, subtitle } = Astro.props; +const { title } = Astro.props; ---
- - +
+ + +
diff --git a/src/components/Layouts/PanelHeader.astro b/src/components/Layouts/PanelHeader.astro index b49c36b..b131c7c 100644 --- a/src/components/Layouts/PanelHeader.astro +++ b/src/components/Layouts/PanelHeader.astro @@ -1,33 +1,23 @@ --- -const { title, subtitle } = Astro.props; +const { title } = Astro.props; ---

{title}

-

{subtitle}

diff --git a/src/components/talks/Main.astro b/src/components/talks/Main.astro new file mode 100644 index 0000000..19f1e82 --- /dev/null +++ b/src/components/talks/Main.astro @@ -0,0 +1,13 @@ +--- +import Panel from '../Layouts/Panel.astro'; + +import TabToggle from './TabToggle'; +import Talks from './Talks'; +import ZenyasaiTalks from './ZenyasaiTalks'; +--- + + + + + + diff --git a/src/components/talks/TabToggle.css b/src/components/talks/TabToggle.css new file mode 100644 index 0000000..7f2b741 --- /dev/null +++ b/src/components/talks/TabToggle.css @@ -0,0 +1,36 @@ +.tabs { + width: 100%; + display: flex; + justify-content: center; + gap: 24px; + + button { + text-align: center; + + font-family: "Futura", "Jost", sans-serif; + font-weight: 500; + font-size: 20px; + line-height: 27px; + + border-radius: 4px; + border: none; + padding: 16px 32px; + } + + .default { + background-color: #aeaeb2; + color: #fff; + } + + .selected { + background-color: #000; + color: #fff; + } +} +@media screen and (width <= 720px) { + .tabs { + button { + font-size: 15px; + } + } +} diff --git a/src/components/talks/TabToggle.tsx b/src/components/talks/TabToggle.tsx new file mode 100644 index 0000000..26abbb0 --- /dev/null +++ b/src/components/talks/TabToggle.tsx @@ -0,0 +1,36 @@ +import {useStore} from '@nanostores/preact'; +import {selectedTabStore, type Tab} from './tabStore'; +import './TabToggle.css'; + +export default function Tabs() { + const $tab = useStore(selectedTabStore); + + const isSelected = (tabName: Tab) => { + return $tab === tabName; + } + + const handleClick = (tabName: Tab) => { + selectedTabStore.set(tabName); + } + + return ( + <> +
+ + +
+ + ); +} diff --git a/src/components/talks/Talk.css b/src/components/talks/Talk.css new file mode 100644 index 0000000..5b953ee --- /dev/null +++ b/src/components/talks/Talk.css @@ -0,0 +1,113 @@ +.talk { + display: flex; + flex-direction: row; + gap: 32px; + + padding: 24px; + border-radius: 24px; + background-color: #F5F5F5; + + .speaker-icon { + img { + border-radius: 12px; + height: auto; + width: 240px; + } + } + @media screen and (width <= 720px) { + .speaker-icon { + img { + width: 160px; + } + } + } + + .description { + .session-title { + font-size: 20px; + line-height: 30px; + font-weight: 600; + margin-bottom: 8px; + } + + .session-introduction { + text-wrap: wrap; + margin-bottom: 16px; + + li { + margin-left: 24px; + } + } + + .line { + border: 1px solid #AEAEB2; + margin-bottom: 16px; + } + + .speaker-name { + font-family: "Futura", "Jost", sans-serif; + font-size: 16px; + font-weight: 500; + + margin-bottom: 16px; + } + + .speaker-socials { + display: flex; + flex-wrap: wrap; + gap: 8px 24px; + + a { + font-size: 16px; + font-weight: 500; + line-height: 21px; + text-decoration: none; + vertical-align: top; + } + @media screen and (width <= 480px) { + a { + font-size: 16px; + } + } + + .social-x, .social-github { + display: flex; + align-items: center; + } + + .social-x { + img { + width: 24px; + height: 24px; + margin: 0 8px 0 0; + } + @media screen and (width <= 480px) { + img { + width: 16px; + height: 16px; + } + } + } + + .social-github { + img { + width: 30px; + height: 30px; + margin: 0 8px 0 0; + } + @media screen and (width <= 480px) { + img { + width: 18px; + height: 18px; + } + } + } + } + } +} +@media screen and (width <= 960px) { + .talk { + flex-direction: column; + align-items: center; + } +} diff --git a/src/components/talks/Talk.tsx b/src/components/talks/Talk.tsx new file mode 100644 index 0000000..25e0de9 --- /dev/null +++ b/src/components/talks/Talk.tsx @@ -0,0 +1,65 @@ +import type { ComponentChildren } from 'preact'; + +import './Talk.css'; + +import GitHubMarkImage from "../../imgs/github-mark.png"; +import XLogoBlackImage from '../../imgs/x-logo-black.png'; + +type Speaker = { + name: string; + ImageSrc: string; + XId?: string; + GitHubId?: string; +} + +type Session = { + id: number; + title: string; + introduction: ComponentChildren; +} + +type Props = { + speaker: Speaker; + session: Session +} + +export default function Talk({speaker, session}: Props) { + return ( + <> +
+
+ Speaker +
+
+

+ {/* */} + {session.title} +

+
+ {session.introduction} +
+
+

{speaker.name}

+
+ {speaker.GitHubId && ( + + )} + {speaker.XId && ( + + )} +
+
+
+ + ) +} diff --git a/src/components/talks/Talks.css b/src/components/talks/Talks.css new file mode 100644 index 0000000..c2f369a --- /dev/null +++ b/src/components/talks/Talks.css @@ -0,0 +1,6 @@ +.talks { + margin-top: 24px; + display: flex; + flex-direction: column; + gap: 24px; +} diff --git a/src/components/talks/Talks.tsx b/src/components/talks/Talks.tsx new file mode 100644 index 0000000..7f1079b --- /dev/null +++ b/src/components/talks/Talks.tsx @@ -0,0 +1,155 @@ +import { useStore } from '@nanostores/preact'; +import { selectedTabStore } from './tabStore'; + +import Talk from "./Talk" +import './Talks.css' + +export default function Talks() { + const $tab = useStore(selectedTabStore); + return $tab === 'sat' ? (
+ +

私は2016年から自作のテキストエディタでコードを書いたり、メールやその他の文章を書いたりしています。近年Rubyに静的型の導入を求められることが多くなっていますが、静的型のメリットや関数/メソッドの型から先に考えるプログラミングの気持ちよさも理解しているものの、Rubyの魅力の一つは思いついたコードをすぐに動かして試せることにあると考えています。この発表では、Ruby製テキストエディタ上での生活を通じて、動いているオブジェクトの振る舞いを動的に変えていく楽しさについてお話したいと思います。

+ ) + }} /> + +

チャットなどのように画面に変更をリアルタイムに反映させたい時、どのように作りますか?

+

チャット以外のコラボレーションツールを作る場合はどうでしょう。もっと多くのカラムやモデルでも変更をリアルタイムに反映させたいとしたらどのように設計しますか? 今後さらにカラムやモデルが増えた時、その設計は複雑さが爆発して破綻しませんか?

+

実は、このような一見複雑に見えるWebアプリケーションでは、設計を破綻させずにRailsとReactをかなりシンプルに連携できます。このトークでは、どのような設計をすれば良いか複数の方法について解説します。

+ ) + }} /> + +

Rubyには動的な処理に必要な機能がたくさん盛り込まれており、しかもそれが他言語にはない魅力であり強力な武器でもあります。しかしデメリットとして可読性の低下や処理の見通しを低下させることになることがあります。Rubyでは強い力には責任が伴うという言葉の元、使う側にも必要な能力を求めている実情もあると思います。

+

しかし場合によりRubyで実装する機能に関数型プログラミングのアプローチを取り入れることにより、前述したデメリットを減らせるのではないかと考え実際に機能開発に盛り込んだ経験についてお話しします。

+

更にこのセッションでは実例も交えて、動的なアプローチの場合との対比を行い、どのような場面で有効かを考えるきっかけにしたいと思っています。

+ ) + }} /> + +

現在 Processing をベースとした CRuby 用の 2Dレトロゲームエンジンを作っています。

+

本発表では、OpenGL を抽象化した自作描画エンジンと、各 OS のネイティブ API を使って作られた自作 GUI ツールキットを使って、どのようにゲームエンジンを作っているかを紹介いたします。

+ ) + }} /> + +

動画変換システムというと、既存のSaaSを使うか、低レイヤーな実装に踏み込むかの二択と思われがちです。しかし、RubyのエコシステムとAWSの各種サービスを活用することで、より手軽に独自の動画変換システムを構築できます。

+

本セッションでは、ハンドメイドECサービス「minne」における動画変換システムの実装方法をご紹介します。

+

動画変換の核となるFFmpegをRubyから扱う方法、変換処理を担うShoryuken workerの実装、そして実運用に耐えうる設計の作り方まで、具体的なコードを交えながら解説します。開発環境はDockerで簡単に構築でき、ローカルでの開発から本番展開まで、スムーズに進められる構成をお見せします。

+ ) + }} /> + +

Ruby on Railsといえばご存知フルスタックフレームワークであり、昨今ではThe One Person Frameworkでおなじみとなっています。

+

発表者が本格的にRailsアプリを触りはじめたのは去年からです。それまではPerlやGoなどの上でミニマルなフレームワークを用いてwebアプリケーションを開発、あるいは各プロジェクトごとにシンプルなコンポーネントを組み合わせることで専用のフレームワークを作ってその上でアプリケーションを開発していました。

+

一方Railsはなんでも持っているフルスタックフレームワークであり、いわゆる "easy" 寄りのフレームワークとされている認識です。

+

つまりこれは巷でよく対比として用いられる "Simple vs Easy" の構図であると捉えられると思います。もちろんsimpleにもeasyにも双方にpros/consがあり一概にどちらが良いと断じることができるものではありませんが、easy寄りのRailsに触れ親しむことでなんとなくその利点について実感を持てるようになってきました。

+

一方、Webアプリ開発はそういったSimpleとEasyのみで二分し判断できるものではないと考えています。本発表では様々な対比観点からフルスタック/ミニマルの双方を検討し、Webアプリケーション開発に及ぼす影響について考察したいと考えています。

+ ) + }} /> + +

Portable Document Format (PDF) は、広く使われているドキュメント交換のためのファイル形式です。PDF を日常的に利用している人でも、自分で1から PDF を作成したことがある人は少ないのではないでしょうか?

+

この発表では、そんな身近でありながら謎めいた PDF を出力する簡単なプログラムを実装する流れを紹介します。レギュレーションは次の通り:

+
    +
  • 出力した PDF が Adobe Acrobat Reader で開ける
  • +
  • 消費メモリが書くドキュメントの大きさに依存しない(ストリーミング)
  • +
  • Ruby DSL を使う
  • +
+

PDF の構造について簡単に解説しながら、まずは PDF の内部構造を反映した低レベルな DSL を構築します。DSL による適度な抽象化は PDF の構造の理解を助けるでしょう。そして、もちろん Ruby は DSL の構築にぴったりですが、今回のようにデータ形式のストリーミング生成を行う場合は特に相性が良いのです。その後、低レベル DSL の上に抽象度を高めた DSL を構築し、よりわかりやすく使いやすい API を模索します。

+

発表を通して、Ruby DSL によるデータ構造を介さない抽象化のたのしみを共有します。きっとあなたも日常の抽象化に Ruby DSL を取り入れたくなるでしょう。

+ ) + }} /> + +

mrubyを用いたワンバイナリーアプリケーションの実装手法に焦点を当て、テキスト処理ツールの開発を例に、シンプルなアプリケーションの作成方法について解説します。一般的なRubyアプリケーションはスクリプト言語としての性質からRubyの実行環境が必要ですが、mrubyを活用することで単体で実行できるバイナリ形式のツールを実現できます。

+

この発表では、実際に私がOSSとして公開しているテキストフィルタツールを題材に、mrubyによるビルドプロセス、ワンバイナリー化における設計上の工夫や実装手法、クロスプラットフォーム対応や配布手順の最適化について紹介します。

+ ) + }} /> + +

アプリケーション開発において例外処理は重要です。一方で複数人でアプリケーション開発を行う際に、例外処理のコンセンサスが意外と取れておらず、結果としてアプリケーションの監視において苦労することがこれまでの経験上でありました。

+

eいつの間にか全て握りつぶされた例外処理、誰も監視していないログに密かに送り続けられていたエラーログ、長年そのアプリケーション開発に携わる人のみぞ知る「このエラーは無視して良いエラーです」という伝承された知識。

+

誰もが一度はこのような経験をしたことがあるのではないでしょうか?

+

この発表では例外処理について整理し、アプリケーション開発において持続的なエラー監視をするための考え方や、混沌としてしまったエラー監視にある程度の秩序をもたらし、楽しくRubyと暮らすべく私が工夫した点についてお話しします。

+ ) + }} /> + +

DNSは1980年代に発明された名前解決システムながら,その通信プロトコルは開発当初とほぼ変わらない形で,今日までインターネットを支えつづけています.一方で,かつて平和だったインターネットには多くのならず者が出没するようになりました.通信の改竄・盗聴,そしてDDoS――DNSはいま脅威に曝されているのです.

+

これらの当初は想定されていなかった脅威に対抗すべく,DNSにはさまざまなセキュリティ拡張が提案されてきました.この数年では,伝統的な平文のプロトコルから暗号化に対応した新しいプロトコルへアップグレードをする枠組みもIETFで文書化され,DNSは漸進的に安全なプロトコルへ移行してゆくと期待されています.

+

本発表では,DNSのプライバシーを改善する近年のプロトコル拡張について解説します.また,これらの新たなプロトコルをRubyから使えるようにするには,DNSライブラリにどのような拡張が必要であるかを議論します.また,暗号化DNSプロトコルが依拠しているQUICやHTTP/3を扱うRubyライブラリの開発について,発表者の取り組みを紹介します.

+ ) + }} /> +
) : <> +} diff --git a/src/components/talks/ZenyasaiTalks.tsx b/src/components/talks/ZenyasaiTalks.tsx new file mode 100644 index 0000000..9c821e8 --- /dev/null +++ b/src/components/talks/ZenyasaiTalks.tsx @@ -0,0 +1,165 @@ +import { useStore } from '@nanostores/preact'; +import { selectedTabStore } from './tabStore'; + +import Talk from "./Talk" +import './Talks.css' + +import OkuramasafumiImage from "../staff/pics/okuramasafumi.jpg"; + +export default function ZenyasaiTalks() { + const $tab = useStore(selectedTabStore); + return $tab === 'fri' ? ( + <> +
+ + AlbaというJSONシリアライザのgemを作成・保守しています。Rubyで開発をしているとユーザーの使い勝手について考えることが多くなりますね。ここでの使い勝手というのは例えばブロックを使うことで柔軟になるAPIなどを含みますが、全体的な「良さ」、使っていて何か気持ちが良い、という感覚も含んだものです。 + AlbaはRubyプログラマにとってなるべく使いやすく直感的であるように設計されており、そのための工夫を多数含んでいます。この発表ではAlbaが生まれた経緯を振り返りつつ、Rubyistにとって興味深いであろう実装上のおもしろポイントをご紹介します。また、自作のライブラリを広く使ってもらうために行ったことなどもご紹介できればと思います。

) + }} /> + +

2017年からRubyとMasotodonとともに暮らしている一人の鯖缶(Mastodonのサーバー管理者)の暮らしぶりをお話しします。

+

Railsを触りはじめたばかりの頃に登場したMasotodonを軽率にはじめ、運用していく中でRubyやRailsを学び、やらかしに対応し、Rubyの開発版(masterブランチ)とMastodonの開発版(mainブランチ)でMasotodonを運用するに至ったり、いかにしてRubyやMastodon にパッチを投げるようになったのかの歴史をお話ししたいと思います。

+

またゆるゆると鯖缶業を続けていくなかでどうスキルアップしていったのかや、エンジニアとして新しい技術を素振りできる砂場を持つことの楽しさについてもお話しします。

+ ) + }} /> + +

WebAssemblyはブラウザを飛び越えた大きな可能性を持つ技術で、Rubyをはじめ様々な言語でWebAssemblyバイナリを出力可能にする対応が進んでいます。その一方、WebAssemblyを動かすランタイム自体も様々なものがあり、Goのwazero、SwiftのWasmKitといった純粋に特定の言語で実装されたものも増えてきました。

+

ところで、筆者は"Wardite"という名前の、Rubyに組み込み可能なWebAssemblyのランタイムを作っています。Warditeは以下のコンセプトで絶賛開発中です。

+
    +
  • Pure Rubyで、外部GemやC拡張の依存なしで実装
  • +
  • Fully RBS Annotated
  • +
  • WASI preview 1 対応
  • +
  • 利用上十分なパフォーマンス
  • +
+

このトークでは、Warditeの内部のRubyのコードを通して、WebAssembly Coreにはどのような仕様があるのか、WASI(WebAssembly System Interface)とは何であるのかについて理解が深まる話をします。そして言語ランタイム、具体的にはWebAssemblyのVMを作るためにどのような実装を行ってきたかを解説します。

+

また、Warditeの現在の開発状況や課題、将来のゴールなどを、デモも交えながらお話しします。

+ ) + }} /> + +

2010年代前半はChatOps全盛期でした。いまでもチャットボットは開発されていますか?

+

10年前に比べて私たちが働く環境は大きく変わりました。チャットツールでのやり取りがメインになり、リモートワークで働く人が増え、エンジニア以外も複数のSaaSを利用するようになりました。この変化を組織の成長に変えるため、2024年に新たにチャットボットのフレームワークを開発しました。

+

本セッションでは discordrb というgemをベースにしたチャットボットフレームワークの作成時に考慮したこととその設計を紹介します。そして使っているうちに生まれた設計の歪みと新しい設計への移行、そして使われなくなっていった機能を紹介します。

+ ) + }} /> + +

Webサイトから得られる情報はアクセス時点のスナップショットに過ぎませんが、時間とともに変化する情報を継続的に追跡したり、新たな情報を検知して認知したいシーンがあります。

+

時間とともに変化するそのようなデータを追跡するための効果的なアプローチとしてSimon Willison氏が2020年に提案したのがGit scrapingと呼ばれるスクレイピング手法です。定期的なWebスクレイピングにより収集した情報をGitによるバージョン管理することで、時系列に沿ってデータを簡易に記録できるようになります。また、GitHub ActionsなどのCI/CDシステムを組み合わせることで定期実行も行えるうえ、ATOMでのRSS配信を行うこともできます。

+

本セッションではこのシンプルな手法を通じて、Rubyで生活を便利にする第一歩を提案します。

+ ) + }} /> + 2024年8月にWiFi対応を果たしたPicoRubyを活用し、シェアハウスの生活を便利にするIoTデバイスを開発しました。スマートロック、洗濯機・乾燥機の稼働チェッカー、トイレットペーパー購入ボタンなど、日常の小さな不便を解消するアイデアとその実装方法を紹介します。PicoRubyと共に、シェアハウス生活をより快適にするハックをお届けします。

) + }} /> + 東京Ruby会議11で発表されたRubyのベンチマークプログラムOptCarrotを振り返ります。OptCarrotは、Rubyを高速化する開発者を駆り立てるためのエサとして作られ、狙い通りに多くのプログラム最適化マニアに愛され、Rubyの最適化を牽引しました。OptCarrotに釣られてできた成果を駆け足で紹介し、OptCarrotの評価・功罪を議論します。

+ ) + }} /> + +

皆さんは、日々のシステム開発の中で「ソケットを扱う」ということを意識したことがあるでしょうか?

+

ネットワークプログラミングやソケットプログラミングは、ネットワークの基礎を理解する上で重要な要素です。

+

このセッションでは、Rubyを使ってネットワークパケットキャプチャツールを自作する過程をご紹介します。

+

libpcapなどの既存ライブラリには頼らず、純粋にRubyのみでパケットキャプチャツールを実装することで、ネットワークデータの流れを低レベルから体感できるようなお話をしたいと思います。

+

「Working with TCP Sockets」の翻訳版である「なるほどTCPソケット Rubyで学ぶソケットプログラミングの基礎」が今年9月に公開され、ソケットプログラミングやネットワークプログラミングに興味を持たれた方も多いのではないでしょうか。

+

このセッションを通じて、ソケットプログラミングやネットワークプログラミングの基礎を学び、Web技術を支える要素技術への理解を深める一助になれば幸いです。

+ ) + }} /> + +

Rails アプリケーションではモデルで概念を表します。この概念はいくつくらいあるのでしょうか。

+

話者が勤務する会社の rails stats ではモデルは 1,345 クラスあります(2024 年 11 月現在)。人間が全てを理解するにはつらい数ですが、全てのモデルを理解してから開発を始めるという人は多くないでしょう。

+

わたしたちはまずアプリケーションの中心となる重要な概念を理解し、そうでない概念は後追いで理解していくからです。

+

ところで、日本には多くの市があります。政府統計によると 2024 年時点で 792 の市があります1

+

ここで Google マップを開いてみましょう。数度ズームアウトすると日本の全体像が現れます。「東京」「大阪」「札幌」という都市が表示され、これらが重要な都市として扱われていることがわかります。ズームインすると次に重要な都市と幹線道路が現れます。

+

Google マップのようにズームイン・ズームアウトで重要なモデルとリレーション(つまり ER 図ですね)を見られるとそれは Rails アプリケーションの「地図」になるのではないでしょうか。そんな Gem を作っている話をします。

+

[1]: https://www.e-stat.go.jp/municipalities/number-of-municipalities

+ ) + }} /> + +

あなたの所属するエンジニア組織では、日々のOSS活動が賞賛され、外部登壇やプロポーザル提出に対して先輩登壇者やプロの編集者からサポートを受けられるような環境は整っていますか?

+

SmartHRでは、Rubyの会社として長年Rubyコミュニティへのスポンサー活動やOSSへの貢献を行ってきましたが、これまでは会社全体で活動をサポートする環境は十分に整備されておらず、各エンジニアの自主的な努力に委ねられていました。

+

そこで、約半年前に有志のプロジェクト「OSSやっていきの集い」が立ち上がり、社内のエンジニアがOSS貢献をより積極的に行い、社外への発信をサポートする仕組みが生まれました。

+

このトークでは、「OSSやっていきの集い」の立ち上げから半年間で得られた成果や学びについてお話しします。

+ + ) + }} /> +
+ + ) : <> +} diff --git a/src/components/talks/tabStore.ts b/src/components/talks/tabStore.ts new file mode 100644 index 0000000..30bbd5c --- /dev/null +++ b/src/components/talks/tabStore.ts @@ -0,0 +1,4 @@ +import { atom } from 'nanostores'; + +export type Tab = 'fri' | 'sat' +export const selectedTabStore = atom('sat'); diff --git a/src/pages/talks.astro b/src/pages/talks.astro index 719c956..e03b57d 100644 --- a/src/pages/talks.astro +++ b/src/pages/talks.astro @@ -2,14 +2,14 @@ import Layout from "../components/Layouts/Layout.astro"; import Main from "../components/Layouts/Main.astro"; -import Preparing from "../components/Preparing.astro"; +import TalksComponent from "../components/talks/Main.astro"; -const title = "スケジュール | 東京Ruby会議12"; +const title = "発表一覧 | 東京Ruby会議12"; const twitter_card = "summary_large_image"; ---
- +
diff --git a/tsconfig.json b/tsconfig.json index bcbf8b5..76786e6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,14 @@ { - "extends": "astro/tsconfigs/strict" + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "target": "ES6", + "module": "es2015", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "jsxImportSource": "preact" + }, + "include": ["src"] }