aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/public/slides
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-08 10:38:18 +0900
committernsfisis <nsfisis@gmail.com>2026-08-08 10:38:18 +0900
commit4681e861efcdf9b0b73e3803e70712bc55162863 (patch)
treed910ef14d9549df19896d85a42e12a32db787fb6 /services/nuldoc/public/slides
parenteca423774047122f7dfc4be9ac78626e32d733d3 (diff)
downloadnsfisis.dev-4681e861efcdf9b0b73e3803e70712bc55162863.tar.gz
nsfisis.dev-4681e861efcdf9b0b73e3803e70712bc55162863.tar.zst
nsfisis.dev-4681e861efcdf9b0b73e3803e70712bc55162863.zip
feat(slides): improve slide controllerHEADmain
Diffstat (limited to 'services/nuldoc/public/slides')
-rw-r--r--services/nuldoc/public/slides/404.html2
-rw-r--r--services/nuldoc/public/slides/slide.js381
-rw-r--r--services/nuldoc/public/slides/slides.css145
-rw-r--r--services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2026-03-21/phperkaigi-2026-book-revue/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2026-03-22/phperkaigi-2026/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2026-04-11/phpcon-odawara-2026/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2026-05-25/phperkaigi-mini-1/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/2026-07-27/phperkaigi-mini-3/index.html32
-rw-r--r--services/nuldoc/public/slides/slides/index.html2
-rw-r--r--services/nuldoc/public/slides/style.css12
-rw-r--r--services/nuldoc/public/slides/tags/c/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/cohackpp/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/composer/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/conference/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/php/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phpcon-nagoya/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phpcon-odawara/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phpconfuk/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phpconkagawa/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phperkaigi/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/ruby/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/rust/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/techramen/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/wasm/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/xdebug/index.html2
-rw-r--r--services/nuldoc/public/slides/tags/ya8/index.html2
53 files changed, 1281 insertions, 257 deletions
diff --git a/services/nuldoc/public/slides/404.html b/services/nuldoc/public/slides/404.html
index 48bd5013..e262ba8d 100644
--- a/services/nuldoc/public/slides/404.html
+++ b/services/nuldoc/public/slides/404.html
@@ -14,7 +14,7 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>Page Not Found|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
<header class="header">
diff --git a/services/nuldoc/public/slides/slide.js b/services/nuldoc/public/slides/slide.js
index a90fda7a..72f14bba 100644
--- a/services/nuldoc/public/slides/slide.js
+++ b/services/nuldoc/public/slides/slide.js
@@ -1,98 +1,367 @@
-import { getDocument, GlobalWorkerOptions } from "./pdf.min.mjs";
+import {
+ AnnotationLayer,
+ getDocument,
+ GlobalWorkerOptions,
+ TextLayer,
+} from "./pdf.min.mjs";
+
+const PAGE_HASH_PATTERN = /^#p(\d+)$/;
+// How long to wait before re-rendering, so a drag-resize does not redraw on every frame.
+const RESIZE_DEBOUNCE_MS = 150;
+// How long to wait before showing the indicator, so quick renders do not flash it.
+const RENDER_INDICATOR_DELAY_MS = 200;
+// How many pages around the current one to render ahead of time.
+const PREFETCH_RADIUS = 1;
+
+function pageFromHash(hash) {
+ const matched = PAGE_HASH_PATTERN.exec(hash);
+ if (matched === null) return null;
+ const num = Number(matched[1]);
+ return num >= 1 ? num : null;
+}
async function init() {
GlobalWorkerOptions.workerSrc = "/pdf.worker.min.mjs";
+ const container = document.getElementById("slide-container");
+ const stage = document.getElementById("slide-stage");
const canvas = document.getElementById("slide");
const ctx = canvas.getContext("2d");
- const url = canvas.dataset.slideLink;
+ const textLayerDiv = document.getElementById("text-layer");
+ const annotationLayerDiv = document.getElementById("annotation-layer");
+ const status = document.getElementById("slide-status");
+ const prev = document.getElementById("prev");
+ const next = document.getElementById("next");
+ const pageInput = document.getElementById("page-input");
+ const pageCount = document.getElementById("page-count");
+ const url = container.dataset.slideLink;
- let pageNum = 1;
let doc = null;
- let renderTask = null;
+ let pageNum = 1;
let renderToken = 0;
+ let textLayer = null;
+ let stageWidth = 0;
+ // `${pageNumber}@${width}` -> { image, layers }. Both are promises.
+ const cache = new Map();
- const backCanvas = document.createElement("canvas");
- const backCtx = backCanvas.getContext("2d");
+ const hideStatus = () => {
+ status.hidden = true;
+ status.replaceChildren();
+ delete status.dataset.state;
+ };
- const renderPage = async (num) => {
- const token = ++renderToken;
- if (renderTask !== null) {
- renderTask.cancel();
- renderTask = null;
- }
+ const showStatus = (state, message) => {
+ status.dataset.state = state;
+ status.replaceChildren(message);
+ status.hidden = false;
+ };
- const page = await doc.getPage(num);
- if (token !== renderToken) return;
+ const showFailure = (message) => {
+ const description = document.createElement("p");
+ description.textContent = message;
+ const fallback = document.createElement("a");
+ fallback.href = url;
+ fallback.textContent = "PDF を直接開く";
+ status.dataset.state = "error";
+ status.replaceChildren(description, fallback);
+ status.hidden = false;
+ };
- const baseViewport = page.getViewport({ scale: 1.0 });
- const containerWidth = canvas.parentElement.clientWidth;
- const scale = containerWidth / baseViewport.width;
+ const renderToOffscreenCanvas = async (page, width) => {
+ const scale = width / page.getViewport({ scale: 1 }).width;
const viewport = page.getViewport({ scale });
-
const outputScale = globalThis.devicePixelRatio || 1;
- const cssWidth = Math.floor(viewport.width);
- const cssHeight = Math.floor(viewport.height);
- backCanvas.width = Math.floor(viewport.width * outputScale);
- backCanvas.height = Math.floor(viewport.height * outputScale);
+ const target = document.createElement("canvas");
+ target.width = Math.floor(viewport.width * outputScale);
+ target.height = Math.floor(viewport.height * outputScale);
const transform = outputScale !== 1
? [outputScale, 0, 0, outputScale, 0, 0]
: null;
- // TODO: error handling
- const task = page.render({
- canvasContext: backCtx,
+ await page.render({
+ canvasContext: target.getContext("2d"),
viewport,
transform,
+ }).promise;
+
+ return {
+ canvas: target,
+ viewport,
+ cssWidth: Math.floor(viewport.width),
+ cssHeight: Math.floor(viewport.height),
+ // Factor the text/annotation layers use to convert PDF units into CSS px.
+ totalScaleFactor: viewport.width / viewport.rawDims.pageWidth,
+ };
+ };
+
+ // Cache the rendered result itself; same page at the same width returns instantly.
+ const entryFor = (num, width) => {
+ const key = `${num}@${width}`;
+ const cached = cache.get(key);
+ if (cached !== undefined) return cached;
+
+ const page = doc.getPage(num);
+ const entry = {
+ image: page.then((p) => renderToOffscreenCanvas(p, width)),
+ layers: page.then(async (p) => ({
+ page: p,
+ textContent: await p.getTextContent(),
+ annotations: await p.getAnnotations({ intent: "display" }),
+ })),
+ };
+ // Drop rejected promises, otherwise a failure would never be retried.
+ const forget = () => {
+ if (cache.get(key) === entry) cache.delete(key);
+ };
+ entry.image.catch(forget);
+ entry.layers.catch(forget);
+
+ cache.set(key, entry);
+ return entry;
+ };
+
+ const sweepCache = () => {
+ for (const key of cache.keys()) {
+ const [num, width] = key.split("@").map(Number);
+ if (width !== stageWidth || Math.abs(num - pageNum) > PREFETCH_RADIUS) {
+ cache.delete(key);
+ }
+ }
+ };
+
+ const prefetchNeighbors = () => {
+ for (let d = 1; d <= PREFETCH_RADIUS; d++) {
+ for (const num of [pageNum + d, pageNum - d]) {
+ if (num < 1 || num > doc.numPages) continue;
+ entryFor(num, stageWidth);
+ }
+ }
+ };
+
+ const drawImage = ({ canvas: source, cssWidth, cssHeight }) => {
+ if (canvas.width !== source.width || canvas.height !== source.height) {
+ canvas.width = source.width;
+ canvas.height = source.height;
+ }
+ canvas.style.width = `${cssWidth}px`;
+ canvas.style.height = `${cssHeight}px`;
+ ctx.drawImage(source, 0, 0);
+ };
+
+ const renderOverlays = async (entry, viewport, token) => {
+ if (textLayer !== null) {
+ textLayer.cancel();
+ textLayer = null;
+ }
+ textLayerDiv.replaceChildren();
+ annotationLayerDiv.replaceChildren();
+
+ const { page, textContent, annotations } = await entry.layers;
+ if (token !== renderToken) return;
+
+ const layer = new TextLayer({
+ textContentSource: textContent,
+ container: textLayerDiv,
+ viewport,
});
- renderTask = task;
+ textLayer = layer;
try {
- await task.promise;
+ await layer.render();
+ } catch {
+ // Cancelled by a move to another page; leave it to the newer render.
+ return;
+ }
+ if (token !== renderToken) return;
+
+ if (annotations.length === 0) return;
+ await new AnnotationLayer({
+ div: annotationLayerDiv,
+ page,
+ viewport: viewport.clone({ dontFlip: true }),
+ linkService,
+ }).render({ annotations, renderForms: false });
+ };
+
+ const renderPage = async (num) => {
+ // No measurable width (e.g. hidden); leave it to the ResizeObserver re-render.
+ if (stageWidth === 0) return;
+
+ const token = ++renderToken;
+ const entry = entryFor(num, stageWidth);
+
+ const indicator = globalThis.setTimeout(() => {
+ if (token === renderToken) showStatus("loading", "描画中…");
+ }, RENDER_INDICATOR_DELAY_MS);
+
+ try {
+ const image = await entry.image;
+ if (token !== renderToken) return;
+
+ globalThis.clearTimeout(indicator);
+ hideStatus();
+ stage.style.setProperty("--total-scale-factor", image.totalScaleFactor);
+ drawImage(image);
+ await renderOverlays(entry, image.viewport, token);
} catch (e) {
- if (e?.name === "RenderingCancelledException") return;
- throw e;
+ if (token !== renderToken) return;
+ console.error(e);
+ showFailure("スライドの描画に失敗しました。");
} finally {
- if (renderTask === task) renderTask = null;
+ globalThis.clearTimeout(indicator);
+ if (token === renderToken) {
+ sweepCache();
+ prefetchNeighbors();
+ }
}
- if (token !== renderToken) return;
+ };
- if (canvas.width !== backCanvas.width || canvas.height !== backCanvas.height) {
- canvas.width = backCanvas.width;
- canvas.height = backCanvas.height;
- canvas.style.width = cssWidth + "px";
- canvas.style.height = cssHeight + "px";
+ const syncControls = () => {
+ prev.disabled = pageNum <= 1;
+ next.disabled = doc === null || pageNum >= doc.numPages;
+ if (document.activeElement !== pageInput) {
+ pageInput.value = String(pageNum);
}
- ctx.drawImage(backCanvas, 0, 0);
};
- const prev = document.getElementById("prev");
- prev.addEventListener("click", () => {
- if (pageNum <= 1) return;
- pageNum--;
- renderPage(pageNum);
- });
- const next = document.getElementById("next");
- next.addEventListener("click", () => {
- if (pageNum >= doc.numPages) return;
- pageNum++;
+ const writeHash = (num) => {
+ const hash = `#p${num}`;
+ if (globalThis.location.hash === hash) return;
+ // Pushing an entry per page would make the back button useless.
+ globalThis.history.replaceState(null, "", hash);
+ };
+
+ const goToPage = (num, { updateHash = true } = {}) => {
+ if (doc === null || !Number.isFinite(num)) return;
+ pageNum = Math.min(Math.max(Math.trunc(num), 1), doc.numPages);
+ syncControls();
+ if (updateHash) writeHash(pageNum);
renderPage(pageNum);
- });
+ };
+
+ const linkService = {
+ addLinkAttributes(link, href, newWindow) {
+ link.href = href;
+ link.rel = "noopener noreferrer";
+ if (newWindow) link.target = "_blank";
+ },
+ getDestinationHash() {
+ return "#";
+ },
+ getAnchorUrl(hash) {
+ return hash;
+ },
+ async goToDestination(dest) {
+ if (doc === null) return;
+ const explicit = typeof dest === "string"
+ ? await doc.getDestination(dest)
+ : dest;
+ if (!Array.isArray(explicit) || explicit.length === 0) return;
+ const ref = explicit[0];
+ const index = typeof ref === "object" && ref !== null
+ ? await doc.getPageIndex(ref)
+ : Number(ref);
+ goToPage(index + 1);
+ },
+ executeNamedAction(action) {
+ switch (action) {
+ case "GoBack":
+ case "PrevPage":
+ goToPage(pageNum - 1);
+ break;
+ case "GoForward":
+ case "NextPage":
+ goToPage(pageNum + 1);
+ break;
+ case "FirstPage":
+ goToPage(1);
+ break;
+ case "LastPage":
+ goToPage(doc.numPages);
+ break;
+ default:
+ break;
+ }
+ },
+ executeSetOCGState() {},
+ };
+
+ prev.addEventListener("click", () => goToPage(pageNum - 1));
+ next.addEventListener("click", () => goToPage(pageNum + 1));
document.addEventListener("keydown", (e) => {
+ if (e.target === pageInput) return;
+ if (e.altKey || e.ctrlKey || e.metaKey) return;
if (e.key === "ArrowLeft" || e.key === "h") {
- if (pageNum <= 1) return;
- pageNum--;
- renderPage(pageNum);
+ goToPage(pageNum - 1);
} else if (e.key === "ArrowRight" || e.key === "l") {
- if (pageNum >= doc.numPages) return;
- pageNum++;
- renderPage(pageNum);
+ goToPage(pageNum + 1);
+ } else {
+ return;
+ }
+ e.preventDefault();
+ });
+
+ const commitPageInput = () => {
+ const value = Number(pageInput.value);
+ if (Number.isFinite(value) && pageInput.value !== "") {
+ goToPage(value);
}
+ pageInput.value = String(pageNum);
+ };
+ pageInput.addEventListener("change", commitPageInput);
+ pageInput.addEventListener("keydown", (e) => {
+ if (e.key !== "Enter") return;
+ e.preventDefault();
+ commitPageInput();
+ });
+
+ globalThis.addEventListener("hashchange", () => {
+ const num = pageFromHash(globalThis.location.hash);
+ if (num !== null && num !== pageNum) goToPage(num, { updateHash: false });
});
- // TODO: error handling
- doc = await getDocument(url).promise;
+ let resizeTimer = 0;
+ const measure = () => Math.floor(container.clientWidth);
+ new ResizeObserver(() => {
+ globalThis.clearTimeout(resizeTimer);
+ resizeTimer = globalThis.setTimeout(() => {
+ const width = measure();
+ if (width === 0 || width === stageWidth) return;
+ stageWidth = width;
+ cache.clear();
+ if (doc !== null) renderPage(pageNum);
+ }, RESIZE_DEBOUNCE_MS);
+ }).observe(container);
+
+ stageWidth = measure();
+ syncControls();
+ showStatus("loading", "読み込み中……");
+
+ const loadingTask = getDocument(url);
+ loadingTask.onProgress = ({ loaded, total }) => {
+ if (doc !== null) return;
+ const percent = total > 0
+ ? Math.min(100, Math.round((loaded / total) * 100))
+ : null;
+ showStatus(
+ "loading",
+ percent === null ? "読み込み中……" : `読み込み中…… ${percent}%`,
+ );
+ };
+
+ try {
+ doc = await loadingTask.promise;
+ } catch (e) {
+ console.error(e);
+ showFailure("スライドの読み込みに失敗しました。");
+ return;
+ }
+
+ pageCount.textContent = String(doc.numPages);
+ pageInput.max = String(doc.numPages);
+ pageNum = Math.min(pageFromHash(globalThis.location.hash) ?? 1, doc.numPages);
+ syncControls();
renderPage(pageNum);
}
diff --git a/services/nuldoc/public/slides/slides.css b/services/nuldoc/public/slides/slides.css
index 17a9e183..703d66e1 100644
--- a/services/nuldoc/public/slides/slides.css
+++ b/services/nuldoc/public/slides/slides.css
@@ -4,12 +4,125 @@ main {
}
.slide-container {
+ position: relative;
margin: 0 1rem;
}
-.controllers {
+.slide-stage {
+ /* Variables read by pdf.js setLayerDimensions(). --total-scale-factor is
+ overwritten from JavaScript on every page render. */
+ --total-scale-factor: 1;
+ --scale-round-x: 1px;
+ --scale-round-y: 1px;
+ position: relative;
+ min-height: 6rem;
+}
+
+.slide-stage canvas {
+ display: block;
+}
+
+/* Text layer: selection, copy, in-page search and screen readers */
+
+.textLayer {
+ position: absolute;
+ inset: 0;
+ z-index: 1;
+ overflow: clip;
+ line-height: 1;
+ text-align: initial;
+ text-size-adjust: none;
+ forced-color-adjust: none;
+ transform-origin: 0 0;
+ caret-color: CanvasText;
+}
+
+.textLayer span,
+.textLayer br {
+ position: absolute;
+ margin: 0;
+ color: transparent;
+ white-space: pre;
+ cursor: text;
+ transform-origin: 0 0;
+}
+
+.textLayer ::selection {
+ background: rgb(0 0 255 / 25%);
+}
+
+.textLayer br::selection {
+ background: transparent;
+}
+
+/* Annotation layer: makes links inside the slides clickable */
+
+.annotationLayer {
+ position: absolute;
+ inset: 0;
+ z-index: 2;
+ pointer-events: none;
+ transform-origin: 0 0;
+}
+
+.annotationLayer section {
+ position: absolute;
+ margin: 0;
+ text-align: initial;
+ pointer-events: auto;
+ transform-origin: 0 0;
+}
+
+.annotationLayer .linkAnnotation > a {
+ position: absolute;
+ inset: 0;
+ font-size: 1em;
+ border: none;
+}
+
+.annotationLayer .linkAnnotation > a:hover {
+ background: rgb(255 255 0 / 20%);
+ box-shadow: 0 0 0 2px rgb(255 200 0 / 60%);
+}
+
+/* Loading and error overlay */
+
+.slide-status {
+ position: absolute;
+ inset: 0;
+ z-index: 3;
display: flex;
+ flex-direction: column;
+ align-items: center;
justify-content: center;
+ gap: 0.5rem;
+ background: rgb(255 255 255 / 90%);
+}
+
+.slide-status[hidden] {
+ display: none;
+}
+
+.slide-status p {
+ margin: 0;
+}
+
+.slide-status[data-state="error"] {
+ color: #a00;
+}
+
+.slide-noscript {
+ margin: 1rem;
+ text-align: center;
+}
+
+/* Controls */
+
+.controllers {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.5rem;
margin: 1rem 0;
}
@@ -35,3 +148,33 @@ main {
.controllers button:hover {
background: #555;
}
+
+.controllers button:disabled {
+ background: #ccc;
+ cursor: default;
+}
+
+.page-indicator {
+ display: flex;
+ align-items: center;
+ gap: 0.3rem;
+ font-variant-numeric: tabular-nums;
+}
+
+.page-input {
+ width: 4rem;
+ height: 2rem;
+ padding: 0 0.3rem;
+ border: 1px solid #999;
+ border-radius: 0.3rem;
+ font: inherit;
+ text-align: right;
+}
+
+.page-count {
+ min-width: 2rem;
+}
+
+.slide-download {
+ font-size: 0.9rem;
+}
diff --git a/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html b/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html
index c4a4fe24..3019fbab 100644
--- a/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html
+++ b/services/nuldoc/public/slides/slides/2023-01-18/phpstudy-tokyo-148/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>明日のあなたの役に立たない PHP コーディング技法~polyglot~ (PHP 勉強会@東京 第148 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-01-18/phpstudy-tokyo-148/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-01-18/phpstudy-tokyo-148/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-01-18/phpstudy-tokyo-148/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-01-18/phpstudy-tokyo-148/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html b/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html
index ec3139e9..da735978 100644
--- a/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html
+++ b/services/nuldoc/public/slides/slides/2023-02-15/phpstudy-tokyo-149/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPerKaigi 2023 のトークン問題でボツにした問題を供養する (PHP 勉強会@東京 第149 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-02-15/phpstudy-tokyo-149/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-02-15/phpstudy-tokyo-149/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-02-15/phpstudy-tokyo-149/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-02-15/phpstudy-tokyo-149/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html b/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html
index 270822e3..02d2ede3 100644
--- a/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html
+++ b/services/nuldoc/public/slides/slides/2023-03-15/phpstudy-tokyo-150/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>明日のあなたの役に立たない PHP コーディング技法~細長い FizzBuzz を書く~ (PHP 勉強会@東京 第150 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-03-15/phpstudy-tokyo-150/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-03-15/phpstudy-tokyo-150/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-03-15/phpstudy-tokyo-150/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-03-15/phpstudy-tokyo-150/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html b/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html
index bccf3555..3cec569e 100644
--- a/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html
+++ b/services/nuldoc/public/slides/slides/2023-03-24/phperkaigi-2023/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>詳説「参照」PHP の参照を完全に理解する (PHPerKaigi 2023)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-03-24/phperkaigi-2023/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-03-24/phperkaigi-2023/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-03-24/phperkaigi-2023/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-03-24/phperkaigi-2023/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html b/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html
index 8d4d4bfa..b94b6bdf 100644
--- a/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html
+++ b/services/nuldoc/public/slides/slides/2023-03-25/phperkaigi-2023-tokens/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPer チャレンジ解説 (デジタルサーカス株式会社) (PHPerKaigi 2023)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-03-25/phperkaigi-2023-tokens/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-03-25/phperkaigi-2023-tokens/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-03-25/phperkaigi-2023-tokens/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-03-25/phperkaigi-2023-tokens/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html b/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html
index 8a74c9b7..56e84d73 100644
--- a/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html
+++ b/services/nuldoc/public/slides/slides/2023-04-12/phpstudy-tokyo-151/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>list でない array の末尾を探す (PHP 勉強会@東京 第151 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-04-12/phpstudy-tokyo-151/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-04-12/phpstudy-tokyo-151/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-04-12/phpstudy-tokyo-151/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-04-12/phpstudy-tokyo-151/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html b/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html
index eaa5f350..f6482842 100644
--- a/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html
+++ b/services/nuldoc/public/slides/slides/2023-06-21/phpstudy-tokyo-153/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>テキストファイルの末尾には改行コードを入れよう (PHP 勉強会@東京 第153 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-06-21/phpstudy-tokyo-153/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-06-21/phpstudy-tokyo-153/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-06-21/phpstudy-tokyo-153/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-06-21/phpstudy-tokyo-153/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html b/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html
index e0734b16..b9dc2f64 100644
--- a/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html
+++ b/services/nuldoc/public/slides/slides/2023-06-23/phpconfuk-2023-eve/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>巨大なコードベースへ突撃するために (PHP カンファレンス福岡 2023 前夜祭 (非公式))|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-06-23/phpconfuk-2023-eve/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-06-23/phpconfuk-2023-eve/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-06-23/phpconfuk-2023-eve/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-06-23/phpconfuk-2023-eve/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html b/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html
index e1b2707c..2516ae37 100644
--- a/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html
+++ b/services/nuldoc/public/slides/slides/2023-07-26/phpstudy-tokyo-154/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>言語間で比較するエラーの通知と処理 (PHP 勉強会@東京 第154 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-07-26/phpstudy-tokyo-154/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-07-26/phpstudy-tokyo-154/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-07-26/phpstudy-tokyo-154/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-07-26/phpstudy-tokyo-154/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html b/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html
index 5a0af08b..355e9e3a 100644
--- a/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html
+++ b/services/nuldoc/public/slides/slides/2023-08-24/phpstudy-tokyo-155/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP 3.0 の処理系のソースを読んでみる (PHP 勉強会@東京 第155 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-08-24/phpstudy-tokyo-155/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-08-24/phpstudy-tokyo-155/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-08-24/phpstudy-tokyo-155/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-08-24/phpstudy-tokyo-155/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html b/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html
index 8461d7eb..498007c7 100644
--- a/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html
+++ b/services/nuldoc/public/slides/slides/2023-10-25/phpstudy-tokyo-157/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP コードを隔離された環境で安全に動かす (on WebAssembly) (PHP 勉強会@東京 第157 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2023-10-25/phpstudy-tokyo-157/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2023-10-25/phpstudy-tokyo-157/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2023-10-25/phpstudy-tokyo-157/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2023-10-25/phpstudy-tokyo-157/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html b/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html
index 9c174c05..1ace2961 100644
--- a/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html
+++ b/services/nuldoc/public/slides/slides/2024-01-24/phpstudy-tokyo-160/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPStan の力で Algebraic Data Types を実現する (PHP 勉強会@東京 第160 回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-01-24/phpstudy-tokyo-160/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-01-24/phpstudy-tokyo-160/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-01-24/phpstudy-tokyo-160/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-01-24/phpstudy-tokyo-160/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html b/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html
index f8261c3f..31d13b08 100644
--- a/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html
+++ b/services/nuldoc/public/slides/slides/2024-03-08/phperkaigi-2024/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>WebAssembly を理解する 〜VM の作成を通して〜 (PHPerKaigi 2024)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -65,10 +65,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-03-08/phperkaigi-2024/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-03-08/phperkaigi-2024/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-03-08/phperkaigi-2024/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -77,6 +93,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -84,8 +103,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-03-08/phperkaigi-2024/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html b/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html
index 779dca54..cde7a867 100644
--- a/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html
+++ b/services/nuldoc/public/slides/slides/2024-03-15/ya8-2024/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>CLI の PHP プログラムを限界まで高速化してみる (Ya8 2024)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-03-15/ya8-2024/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-03-15/ya8-2024/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-03-15/ya8-2024/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-03-15/ya8-2024/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html b/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html
index 919e39a0..4e65330f 100644
--- a/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html
+++ b/services/nuldoc/public/slides/slides/2024-04-13/phpcon-odawara-2024/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>来る新 JIT エンジンについて知った気になる (PHP カンファレンス小田原 2024)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-04-13/phpcon-odawara-2024/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-04-13/phpcon-odawara-2024/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-04-13/phpcon-odawara-2024/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-04-13/phpcon-odawara-2024/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html b/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html
index 90a568bf..796ae200 100644
--- a/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html
+++ b/services/nuldoc/public/slides/slides/2024-04-25/phpstudy-tokyo-163/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>Tracing JIT の発動条件 (PHP 勉強会@東京 第163回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-04-25/phpstudy-tokyo-163/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-04-25/phpstudy-tokyo-163/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-04-25/phpstudy-tokyo-163/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-04-25/phpstudy-tokyo-163/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html b/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html
index f55f5259..cb9c851d 100644
--- a/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html
+++ b/services/nuldoc/public/slides/slides/2024-07-18/phpstudy-tokyo-166/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPerKaigi 2024 で発表した WebAssembly ランタイムのその後 (PHP 勉強会@東京 第166回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-07-18/phpstudy-tokyo-166/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-07-18/phpstudy-tokyo-166/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-07-18/phpstudy-tokyo-166/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-07-18/phpstudy-tokyo-166/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html b/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html
index 8034f473..2388077c 100644
--- a/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html
+++ b/services/nuldoc/public/slides/slides/2024-10-30/phpstudy-tokyo-169/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP で PHP を作る (縮小版) (PHP 勉強会@東京 第169回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-10-30/phpstudy-tokyo-169/slide.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-10-30/phpstudy-tokyo-169/slide.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-10-30/phpstudy-tokyo-169/slide.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-10-30/phpstudy-tokyo-169/slide.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html b/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html
index 4852055c..cca47dba 100644
--- a/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html
+++ b/services/nuldoc/public/slides/slides/2024-11-30/cohackpp/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>プログラミングマナー講座 (紅白ぺぱ合戦)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2024-11-30/cohackpp/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2024-11-30/cohackpp/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2024-11-30/cohackpp/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2024-11-30/cohackpp/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html b/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html
index 8596053c..831ab046 100644
--- a/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html
+++ b/services/nuldoc/public/slides/slides/2025-02-22/phpcon-nagoya-2025/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP 処理系の garbage collection を理解する~メモリはいつ解放されるのか~ (PHP カンファレンス名古屋 2025)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-02-22/phpcon-nagoya-2025/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-02-22/phpcon-nagoya-2025/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-02-22/phpcon-nagoya-2025/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-02-22/phpcon-nagoya-2025/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html b/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html
index 1aeb2f0f..dea19f96 100644
--- a/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html
+++ b/services/nuldoc/public/slides/slides/2025-03-23/phperkaigi-2025/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHPで作るPHP~セルフホストできる言語処理系を作ろう~ (PHPerKaigi 2025)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-03-23/phperkaigi-2025/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-03-23/phperkaigi-2025/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-03-23/phperkaigi-2025/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-03-23/phperkaigi-2025/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html b/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html
index 860f2451..7c5118b0 100644
--- a/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html
+++ b/services/nuldoc/public/slides/slides/2025-04-12/phpcon-odawara-2025/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP 8.x 時代のクラス設計(property promotion から property hooks まで) (PHP カンファレンス小田原 2025)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-04-12/phpcon-odawara-2025/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-04-12/phpcon-odawara-2025/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-04-12/phpcon-odawara-2025/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-04-12/phpcon-odawara-2025/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html b/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html
index b3bbbcb3..89878996 100644
--- a/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html
+++ b/services/nuldoc/public/slides/slides/2025-07-26/techramen-25-conf/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>セルフホスト可能なCコンパイラを2000行弱で書く (TechRAMEN 2025 Conference)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-07-26/techramen-25-conf/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-07-26/techramen-25-conf/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-07-26/techramen-25-conf/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-07-26/techramen-25-conf/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html b/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html
index 4d30109d..76ee160e 100644
--- a/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html
+++ b/services/nuldoc/public/slides/slides/2025-10-29/phpstudy-tokyo-180/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>浮動小数点数の半開区間で単一値を指定する (PHP 勉強会@東京 第180回)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -59,10 +59,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-10-29/phpstudy-tokyo-180/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-10-29/phpstudy-tokyo-180/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-10-29/phpstudy-tokyo-180/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -71,6 +87,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -78,8 +97,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-10-29/phpstudy-tokyo-180/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html b/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html
index 1e2996fd..12b749c5 100644
--- a/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html
+++ b/services/nuldoc/public/slides/slides/2025-11-24/phpconkagawa-2025/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>Pure PHP で作る簡易 HTTP サーバ (PHP カンファレンス香川 2025)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2025-11-24/phpconkagawa-2025/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2025-11-24/phpconkagawa-2025/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2025-11-24/phpconkagawa-2025/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2025-11-24/phpconkagawa-2025/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2026-03-21/phperkaigi-2026-book-revue/index.html b/services/nuldoc/public/slides/slides/2026-03-21/phperkaigi-2026-book-revue/index.html
index 90334d1c..72ba9983 100644
--- a/services/nuldoc/public/slides/slides/2026-03-21/phperkaigi-2026-book-revue/index.html
+++ b/services/nuldoc/public/slides/slides/2026-03-21/phperkaigi-2026-book-revue/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>Ruby ソースコード完全解説 (PHPerKaigi 2026)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -65,10 +65,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2026-03-21/phperkaigi-2026-book-revue/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2026-03-21/phperkaigi-2026-book-revue/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2026-03-21/phperkaigi-2026-book-revue/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -77,6 +93,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -84,8 +103,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2026-03-21/phperkaigi-2026-book-revue/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2026-03-22/phperkaigi-2026/index.html b/services/nuldoc/public/slides/slides/2026-03-22/phperkaigi-2026/index.html
index d0bdbb21..fc84c80b 100644
--- a/services/nuldoc/public/slides/slides/2026-03-22/phperkaigi-2026/index.html
+++ b/services/nuldoc/public/slides/slides/2026-03-22/phperkaigi-2026/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>PHP を魔改造して学ぶ言語処理系 (PHPerKaigi 2026)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -62,10 +62,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2026-03-22/phperkaigi-2026/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2026-03-22/phperkaigi-2026/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2026-03-22/phperkaigi-2026/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -74,6 +90,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -81,8 +100,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2026-03-22/phperkaigi-2026/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2026-04-11/phpcon-odawara-2026/index.html b/services/nuldoc/public/slides/slides/2026-04-11/phpcon-odawara-2026/index.html
index ccb95bd7..38f8facd 100644
--- a/services/nuldoc/public/slides/slides/2026-04-11/phpcon-odawara-2026/index.html
+++ b/services/nuldoc/public/slides/slides/2026-04-11/phpcon-odawara-2026/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>Deep Dive into Xdebug (PHP カンファレンス小田原 2026)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -65,10 +65,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2026-04-11/phpcon-odawara-2026/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2026-04-11/phpcon-odawara-2026/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2026-04-11/phpcon-odawara-2026/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -77,6 +93,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -84,8 +103,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2026-04-11/phpcon-odawara-2026/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2026-05-25/phperkaigi-mini-1/index.html b/services/nuldoc/public/slides/slides/2026-05-25/phperkaigi-mini-1/index.html
index 01b4d377..21c16b5b 100644
--- a/services/nuldoc/public/slides/slides/2026-05-25/phperkaigi-mini-1/index.html
+++ b/services/nuldoc/public/slides/slides/2026-05-25/phperkaigi-mini-1/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>最近作っている Rust 製 Composer の進捗 (PHPerKaigi mini #1)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -68,10 +68,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2026-05-25/phperkaigi-mini-1/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2026-05-25/phperkaigi-mini-1/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2026-05-25/phperkaigi-mini-1/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -80,6 +96,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -87,8 +106,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2026-05-25/phperkaigi-mini-1/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/2026-07-27/phperkaigi-mini-3/index.html b/services/nuldoc/public/slides/slides/2026-07-27/phperkaigi-mini-3/index.html
index ecabd1a1..cd898701 100644
--- a/services/nuldoc/public/slides/slides/2026-07-27/phperkaigi-mini-3/index.html
+++ b/services/nuldoc/public/slides/slides/2026-07-27/phperkaigi-mini-3/index.html
@@ -15,10 +15,10 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>最近作っている Rust 製 Composer の進捗 (2026年7月) (PHPerKaigi mini #3)|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="single">
- <link rel="stylesheet" href="/slides.css?h=48ccba536579d1291e7c04ae27851b57">
+ <link rel="stylesheet" href="/slides.css?h=d1639dd95e0e0082996901b5bfcf5fd6">
<header class="header">
<div class="site-logo">
<a href="https://nsfisis.dev/">nsfisis.dev</a>
@@ -68,10 +68,26 @@
</li>
</ol>
</section>
- <div class="slide-container">
- <canvas data-slide-link="/slides/2026-07-27/phperkaigi-mini-3/slides.pdf" id="slide">
- </canvas>
+ <div class="slide-container" data-slide-link="/slides/2026-07-27/phperkaigi-mini-3/slides.pdf" id="slide-container">
+ <div class="slide-stage" id="slide-stage">
+ <canvas id="slide">
+ </canvas>
+ <div class="textLayer" id="text-layer">
+ </div>
+ <div class="annotationLayer" id="annotation-layer">
+ </div>
+ </div>
+ <div aria-live="polite" class="slide-status" hidden="hidden" id="slide-status" role="status">
+ </div>
</div>
+ <noscript>
+ <style>
+ .slide-container,.controllers-buttons{display:none}
+ </style>
+ <p class="slide-noscript">
+ <a href="/slides/2026-07-27/phperkaigi-mini-3/slides.pdf">PDF をダウンロード</a>
+ </p>
+ </noscript>
<div class="controllers">
<div class="controllers-buttons">
<button aria-label="前のページ (←/h)" id="prev" title="前のページ (←/h)" type="button">
@@ -80,6 +96,9 @@
</path>
</svg>
</button>
+ <div class="page-indicator">
+ <input aria-label="ページ番号" class="page-input" id="page-input" inputmode="numeric" min="1" step="1" type="number" value="1"><span class="page-separator">/</span><span class="page-count" id="page-count">–</span>
+ </div>
<button aria-label="次のページ (→/l)" id="next" title="次のページ (→/l)" type="button">
<svg fill="none" height="20" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" width="20">
<path d="M9 18l6-6-6-6">
@@ -87,8 +106,9 @@
</svg>
</button>
</div>
+ <a class="slide-download" download="" href="/slides/2026-07-27/phperkaigi-mini-3/slides.pdf">PDF をダウンロード</a>
</div>
- <script src="/slide.js?h=dcdc1524058e7cb08242f930fa849473" type="module">
+ <script src="/slide.js?h=4c869c1409da703e66a0d73294863232" type="module">
</script>
</div>
</article>
diff --git a/services/nuldoc/public/slides/slides/index.html b/services/nuldoc/public/slides/slides/index.html
index 1942e66a..6d4c49b0 100644
--- a/services/nuldoc/public/slides/slides/index.html
+++ b/services/nuldoc/public/slides/slides/index.html
@@ -15,7 +15,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/slides/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>スライド一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/style.css b/services/nuldoc/public/slides/style.css
index f886658b..1c854d5c 100644
--- a/services/nuldoc/public/slides/style.css
+++ b/services/nuldoc/public/slides/style.css
@@ -206,6 +206,18 @@ li.revision {
list-style: inside;
}
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
h1 {
font-size: 1.75rem;
}
diff --git a/services/nuldoc/public/slides/tags/c/index.html b/services/nuldoc/public/slides/tags/c/index.html
index 5e5f43d9..32f95bb4 100644
--- a/services/nuldoc/public/slides/tags/c/index.html
+++ b/services/nuldoc/public/slides/tags/c/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/c/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「C」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/cohackpp/index.html b/services/nuldoc/public/slides/tags/cohackpp/index.html
index 4e9c8638..5a071b40 100644
--- a/services/nuldoc/public/slides/tags/cohackpp/index.html
+++ b/services/nuldoc/public/slides/tags/cohackpp/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/cohackpp/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「紅白ぺぱ合戦」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/composer/index.html b/services/nuldoc/public/slides/tags/composer/index.html
index 8f81299a..9531c9a3 100644
--- a/services/nuldoc/public/slides/tags/composer/index.html
+++ b/services/nuldoc/public/slides/tags/composer/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/composer/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「Composer」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/conference/index.html b/services/nuldoc/public/slides/tags/conference/index.html
index bb0d8d01..ba47e6a1 100644
--- a/services/nuldoc/public/slides/tags/conference/index.html
+++ b/services/nuldoc/public/slides/tags/conference/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/conference/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「カンファレンス」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/index.html b/services/nuldoc/public/slides/tags/index.html
index e37e91ec..d9bdd352 100644
--- a/services/nuldoc/public/slides/tags/index.html
+++ b/services/nuldoc/public/slides/tags/index.html
@@ -14,7 +14,7 @@
<meta name="Hatena::Bookmark" content="nocomment">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/php/index.html b/services/nuldoc/public/slides/tags/php/index.html
index 5b26deca..bf1342b6 100644
--- a/services/nuldoc/public/slides/tags/php/index.html
+++ b/services/nuldoc/public/slides/tags/php/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/php/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html b/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html
index db7c85c5..db146e72 100644
--- a/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html
+++ b/services/nuldoc/public/slides/tags/phpcon-nagoya/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpcon-nagoya/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP カンファレンス名古屋」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phpcon-odawara/index.html b/services/nuldoc/public/slides/tags/phpcon-odawara/index.html
index f89dd75e..a2fb62d0 100644
--- a/services/nuldoc/public/slides/tags/phpcon-odawara/index.html
+++ b/services/nuldoc/public/slides/tags/phpcon-odawara/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpcon-odawara/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP カンファレンス小田原」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phpconfuk/index.html b/services/nuldoc/public/slides/tags/phpconfuk/index.html
index 02f5226a..f665e3e2 100644
--- a/services/nuldoc/public/slides/tags/phpconfuk/index.html
+++ b/services/nuldoc/public/slides/tags/phpconfuk/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpconfuk/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP カンファレンス福岡」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phpconkagawa/index.html b/services/nuldoc/public/slides/tags/phpconkagawa/index.html
index 7a626c0e..16050e6c 100644
--- a/services/nuldoc/public/slides/tags/phpconkagawa/index.html
+++ b/services/nuldoc/public/slides/tags/phpconkagawa/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpconkagawa/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP カンファレンス香川」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phperkaigi/index.html b/services/nuldoc/public/slides/tags/phperkaigi/index.html
index b23f8aa8..eafd859d 100644
--- a/services/nuldoc/public/slides/tags/phperkaigi/index.html
+++ b/services/nuldoc/public/slides/tags/phperkaigi/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phperkaigi/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHPerKaigi」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html b/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html
index 37463953..d6e555ac 100644
--- a/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html
+++ b/services/nuldoc/public/slides/tags/phpstudy-tokyo/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/phpstudy-tokyo/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「PHP 勉強会@東京」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/ruby/index.html b/services/nuldoc/public/slides/tags/ruby/index.html
index 3f700df1..771ecbb4 100644
--- a/services/nuldoc/public/slides/tags/ruby/index.html
+++ b/services/nuldoc/public/slides/tags/ruby/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/ruby/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「Ruby」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/rust/index.html b/services/nuldoc/public/slides/tags/rust/index.html
index 6b4f3d97..9e8833c4 100644
--- a/services/nuldoc/public/slides/tags/rust/index.html
+++ b/services/nuldoc/public/slides/tags/rust/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/rust/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「Rust」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/techramen/index.html b/services/nuldoc/public/slides/tags/techramen/index.html
index 02b3d12d..8dcf1564 100644
--- a/services/nuldoc/public/slides/tags/techramen/index.html
+++ b/services/nuldoc/public/slides/tags/techramen/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/techramen/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「TechRAMEN」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/wasm/index.html b/services/nuldoc/public/slides/tags/wasm/index.html
index 6ecf937b..6204d395 100644
--- a/services/nuldoc/public/slides/tags/wasm/index.html
+++ b/services/nuldoc/public/slides/tags/wasm/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/wasm/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「WebAssembly」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/xdebug/index.html b/services/nuldoc/public/slides/tags/xdebug/index.html
index b3934589..79acd76f 100644
--- a/services/nuldoc/public/slides/tags/xdebug/index.html
+++ b/services/nuldoc/public/slides/tags/xdebug/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/xdebug/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「Xdebug」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">
diff --git a/services/nuldoc/public/slides/tags/ya8/index.html b/services/nuldoc/public/slides/tags/ya8/index.html
index 08c10bf5..7d28d499 100644
--- a/services/nuldoc/public/slides/tags/ya8/index.html
+++ b/services/nuldoc/public/slides/tags/ya8/index.html
@@ -16,7 +16,7 @@
<link rel="alternate" type="application/atom+xml" href="https://slides.nsfisis.dev/tags/ya8/atom.xml">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<title>タグ「Ya8」一覧|nsfisis’s slides</title>
- <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368">
+ <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7">
</head>
<body class="list">
<header class="header">