This commit is contained in:
2026-04-14 07:16:16 +09:00
parent 4f15147be3
commit 5ecea0ee42
15 changed files with 627 additions and 521 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
{% block extra_title %}About{% endblock %}
{% block description %}Nerconeについて{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p>思いついたものを適当に作っているただの学生です。</p>
<p>作ろうと思ったものをとりあえず作ってみていったらいつの間にかこうなってました。</p>
<p>低レイヤに興味を持ちつつ結局いつもPythonを使ってしまう残念な人です。</p>
+3 -3
View File
@@ -18,11 +18,11 @@
</style>
{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-highlight big-text"><span class="text-lowlight unselectable">#</span>{{ get_access_count() }}</p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-white big-text"><span class="text-tx-alt unselectable">#</span>{{ get_access_count() }}</p>
<div class="block">
<p>ただのアクセスカウンターです。</p>
<p>誰かがこのサイトのページへのアクセスに成功した場合に自動的に1増えます。(pngなどのファイルへのアクセスは加算されません)</p>
<p>詳しくは<a href="https://gitea.nercone.dev/nercone-dev/website/">このサーバーのソースコード</a><span class="text-lowlight">※キリ番報告は不要です</span></p>
<p>詳しくは<a href="https://gitea.nercone.dev/nercone-dev/website/">このサーバーのソースコード</a><span class="text-tx-alt">※キリ番報告は不要です</span></p>
</div>
{% endblock %}
+402
View File
@@ -0,0 +1,402 @@
html {
color: #E0E0E0;
background-color: #1A1A1A;
margin: 0;
padding: 0;
padding-top: 0;
padding-bottom: 0;
font-family: "Inter", "Noto Sans JP", "Noto Sans TC", "Noto Sans SC", sans-serif;
font-size: 12pt;
font-optical-sizing: auto;
font-weight: 200;
font-style: normal;
}
body {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
position: fixed;
top: 0;
left: 0;
right: 0;
padding: 24px;
display: flex;
align-items: center;
gap: 16px;
z-index: 10;
overflow: hidden;
}
header::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
backdrop-filter: blur(12px);
background: linear-gradient(to bottom, #1A1A1A 0%, transparent 50%), #1A1A1A80;
mask-image: linear-gradient(to bottom,
black 0%,
black 40%,
transparent 100%
);
}
main {
view-transition-name: main-content;
padding: 24px;
padding-top: 60px;
padding-bottom: 0px;
flex: 1;
}
footer {
view-transition-name: footer-content;
padding: 24px;
padding-top: 0px;
display: flex;
align-items: center;
gap: 16px;
z-index: 10;
}
h1, h2, h3, h4, h5, h6 {
color: #FFFFFF;
}
/* Layout */
section {
padding-top: 4px;
padding-bottom: 4px;
}
.block {
background-color: #272727;
border-radius: 6px;
padding-top: 4px;
padding-left: 24px;
padding-right: 24px;
padding-bottom: 4px;
margin-bottom: 16px;
}
.flex {
display: flex;
align-items: center;
gap: 16px;
}
.flex > * {
margin: 0;
}
.flex-1 {
flex: 1;
}
.flex-vertical {
flex-direction: column;
}
/* Code */
pre {
background-color: #272727;
border-radius: 4px;
padding: 8px;
padding-left: 16px;
overflow-x: auto;
white-space: pre;
line-height: 24px;
font-size: small;
font-family: "MesloLGS Nerd Font", monospace, sans-serif;
font-optical-sizing: auto;
font-style: normal;
}
.block pre {
margin-bottom: 20px;
}
.code {
padding: 4px;
font-family: "MesloLGS Nerd Font", monospace, sans-serif;
font-optical-sizing: auto;
font-style: normal;
}
/* Fonts */
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Noto+Sans+JP:wght@100..900&family=Noto+Sans+SC:wght@100..900&family=Noto+Sans+TC:wght@100..900&family=Noto+Sans+KR:wght@100..900&display=swap');
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: normal;
font-weight: 400;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Regular.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: normal;
font-weight: 700;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Bold.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: italic;
font-weight: 400;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Italic.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: italic;
font-weight: 700;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-BoldItalic.woff2") format("woff2")
}
a {
text-decoration: underline;
color: inherit;
}
h1 {
font-weight: 400;
line-height: 8pt;
}
h2 {
font-weight: 300;
}
section h2, section h3 {
line-height: 8pt;
}
.font-inter {
font-family: "Inter";
}
.font-nsajp {
font-family: "Noto Sans JP";
}
.font-nsatc {
font-family: "Noto Sans TC";
}
.font-nsasc {
font-family: "Noto Sans SC";
}
.font-nsakr {
font-family: "Noto Sans KR";
}
.font-meslo {
font-family: "MesloLGS Nerd Font";
}
.font-small {
font-size: small;
}
.font-bold {
font-weight: 400;
}
.text-no-decoration {
text-decoration: none;
}
.text-underline {
text-decoration: underline;
}
/* Colors */
.text-white {
color: #FFFFFF;
}
.text-bg {
color: #1A1A1A;
}
.text-bg-alt {
color: #272727;
}
.text-tx {
color: #E0E0E0;
}
.text-tx-alt {
color: #939393;
}
.text-red {
color: #A03333;
}
.text-yellow {
color: #CCA000;
}
.text-green {
color: #00A050;
}
.text-teal {
color: #00A0A0;
}
.text-blue {
color: #0080C0;
}
.text-orange {
color: #C86000;
}
.text-brown {
color: #A07033;
}
.text-purple {
color: #7844A0;
}
.text-magenta {
color: #A043A0;
}
.text-indigo {
color: #334DA0;
}
.text-bright-red {
color: #C84040;
}
.text-bright-yellow {
color: #FFC800;
}
.text-bright-green {
color: #00C878;
}
.text-bright-teal {
color: #00C8C8;
}
.text-bright-blue {
color: #00C0FF;
}
.text-bright-orange {
color: #FA7800;
}
.text-bright-brown {
color: #C88C40;
}
.text-bright-purple {
color: #C84040;
}
.text-bright-magenta {
color: #C854C8;
}
.text-bright-indigo {
color: #4060C8;
}
/* Responsive Design */
.hide {
display: none;
}
@media (max-width: 1000px) {
.bold-on-small {
font-weight: 400;
}
.hide.show-on-small {
display: block;
}
}
@media (min-width: 1000px) and (max-width: 1200px) {
.hide.show-on-medium {
display: block;
}
}
@media (min-width: 1200px) {
.hide.show-on-large {
display: block;
}
}
/* View Transition */
@keyframes vt-fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
@keyframes vt-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes vt-blur-out {
from { filter: blur(0px); }
to { filter: blur(6px); }
}
@keyframes vt-blur-in {
from { filter: blur(6px); }
to { filter: blur(0px); }
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(header-content),
::view-transition-new(header-content) {
z-index: 1;
pointer-events: none;
}
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(main-content),
::view-transition-new(main-content) {
z-index: 1;
pointer-events: none;
}
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(footer-content),
::view-transition-new(footer-content) {
z-index: 1;
pointer-events: none;
}
}
/* Cursor */
* { cursor: none; }
#cursor {
view-transition-name: none;
position: fixed;
z-index: 99999;
width: 25px;
height: 25px;
border-radius: 50%;
background: #FFFFFFC0;
pointer-events: none;
transform: translate(-50%, -50%);
opacity: 0;
transition:
left 0.08s ease-out,
top 0.08s ease-out,
width 0.15s cubic-bezier(0.22, 1, 0.36, 1),
height 0.15s cubic-bezier(0.22, 1, 0.36, 1),
border-radius 0.15s cubic-bezier(0.22, 1, 0.36, 1),
background 0.15s ease,
transform 0.08s ease-out,
opacity 0.3s ease;
}
#cursor.visible {
opacity: 1;
}
#cursor.on-text {
width: 3px;
border-radius: 1.5px;
background: #FFFFFFC0;
}
#cursor.on-link {
border-radius: 6px;
background: #FFFFFF40;
transform: translate(0, 0);
}
/* Miscellaneous */
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.banner {
height: 50px;
width: auto;
border-radius: 6px;
}
.social-icons {
width: 12pt;
height: 12pt;
display: block;
}
+179
View File
@@ -0,0 +1,179 @@
(() => {
const textSelectors = 'p, h1, h2, h3, h4, h5, h6, span, li, label, td, th, pre, .code';
const linkSelectors = 'a, button, [role="button"], input[type="submit"], input[type="button"]';
const padding = 6;
let mouseX = 0, mouseY = 0;
let currentLinkEl = null;
let rafId = null;
let cursor = null;
let cursorVisible = false;
let lastTouchTime = 0;
let isMouseDown = false;
const TOUCH_MOUSE_GUARD_MS = 800;
function showCursor() {
if (!cursorVisible && cursor) {
cursorVisible = true;
cursor.classList.add('visible');
}
}
function hideCursor() {
if (cursor) {
cursorVisible = false;
cursor.classList.remove('visible');
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
cursor.classList.remove('on-link', 'on-text');
}
}
function isSyntheticMouse() {
return Date.now() - lastTouchTime < TOUCH_MOUSE_GUARD_MS;
}
function updateCursorForLink(el) {
const rect = el.getBoundingClientRect();
cursor.classList.remove('on-text');
cursor.classList.add('on-link');
cursor.style.transform = 'none';
cursor.style.left = (rect.left - padding) + 'px';
cursor.style.top = (rect.top - padding) + 'px';
cursor.style.width = (rect.width + padding * 2) + 'px';
cursor.style.height = (rect.height + padding * 2) + 'px';
}
function trackLink() {
if (currentLinkEl) {
updateCursorForLink(currentLinkEl);
rafId = requestAnimationFrame(trackLink);
}
}
document.addEventListener('DOMContentLoaded', () => {
cursor = document.getElementById('cursor');
if (!cursor) return;
document.addEventListener('touchstart', () => { lastTouchTime = Date.now(); hideCursor(); }, { passive: true });
document.addEventListener('touchmove', () => { lastTouchTime = Date.now(); hideCursor(); }, { passive: true });
document.addEventListener('touchend', () => { lastTouchTime = Date.now(); }, { passive: true });
document.addEventListener('mousemove', (e) => {
if (isSyntheticMouse()) return;
if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
mouseX = e.clientX;
mouseY = e.clientY;
showCursor();
const el = document.elementFromPoint(mouseX, mouseY);
const linkEl = el ? el.closest(linkSelectors) : null;
if (linkEl) {
if (currentLinkEl !== linkEl) {
currentLinkEl = linkEl;
if (rafId) cancelAnimationFrame(rafId);
rafId = requestAnimationFrame(trackLink);
}
} else {
if (currentLinkEl) {
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
}
cursor.classList.remove('on-link');
cursor.style.transform = isMouseDown ? 'translate(-50%, -50%) scale(0.9)' : 'translate(-50%, -50%)';
cursor.style.left = mouseX + 'px';
cursor.style.top = mouseY + 'px';
cursor.style.width = '';
cursor.style.height = '';
if (el && el.closest(textSelectors)) {
cursor.classList.add('on-text');
} else {
cursor.classList.remove('on-text');
}
}
});
document.addEventListener('mousedown', () => {
isMouseDown = true;
cursor.style.transform = currentLinkEl ? 'none' : 'translate(-50%, -50%) scale(0.9)';
});
document.addEventListener('mouseup', () => {
isMouseDown = false;
cursor.style.transform = currentLinkEl ? 'none' : 'translate(-50%, -50%) scale(1)';
});
window.addEventListener('scroll', () => {
if (currentLinkEl) updateCursorForLink(currentLinkEl);
}, { passive: true });
});
if (document.startViewTransition) {
document.addEventListener("click", (event) => {
const link = event.target.closest("a");
if (!link || link.hasAttribute('download')) return;
const url = new URL(link.href, location.href);
if (url.origin !== location.origin) return;
if (link.target || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
if (url.hash && url.pathname === location.pathname) {
event.preventDefault();
const target = document.querySelector(url.hash);
if (target) {
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
history.pushState(null, '', url.hash);
}
return;
}
event.preventDefault();
document.startViewTransition(async () => {
const response = await fetch(url.href, {
headers: { "X-Requested-With": "view-transition" }
});
const html = await response.text();
const doc = new DOMParser().parseFromString(html, "text/html");
for (const tag of ['head', 'header', 'main', 'footer']) {
const newEl = doc.querySelector(tag);
const curEl = document.querySelector(tag);
if (!newEl || !curEl) { location.href = url.href; return; }
curEl.innerHTML = newEl.innerHTML;
curEl.querySelectorAll('script').forEach(old => {
const s = document.createElement('script');
[...old.attributes].forEach(a => s.setAttribute(a.name, a.value));
s.textContent = old.textContent;
old.replaceWith(s);
});
}
history.pushState(null, "", url.href);
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
cursor.classList.remove('on-link', 'on-text');
cursor.style.transform = 'translate(-50%, -50%)';
cursor.style.left = mouseX + 'px';
cursor.style.top = mouseY + 'px';
cursor.style.width = '';
cursor.style.height = '';
const el = document.elementFromPoint(mouseX, mouseY);
const newLinkEl = el ? el.closest(linkSelectors) : null;
if (newLinkEl) {
currentLinkEl = newLinkEl;
rafId = requestAnimationFrame(trackLink);
} else if (el && el.closest(textSelectors)) {
cursor.classList.add('on-text');
}
});
});
window.addEventListener("popstate", () => location.reload());
}
})();
+17 -492
View File
@@ -36,513 +36,38 @@
<meta name="twitter:title" content="{{ self.title() }}">
<meta name="twitter:description" content="{{ self.description() }}">
<meta name="twitter:image" content="https://nercone.dev/assets/images/nercone.png">
<!-- Scripts / Stylesheets etc. -->
<!-- PWA (Progressive Web App) -->
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" href="/assets/images/favicon_cat.png" sizes="1200x1200">
<link rel="icon" type="image/png" href="/assets/images/favicon_cat.png" sizes="1200x1200">
<link rel="icon" type="image/svg+xml" href="/assets/images/favicon_cat.svg" sizes="1200x1200">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Noto+Sans+JP:wght@100..900&family=Noto+Sans+SC:wght@100..900&family=Noto+Sans+TC:wght@100..900&family=Noto+Sans+KR:wght@100..900&display=swap');
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: normal;
font-weight: 400;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Regular.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: normal;
font-weight: 700;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Bold.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: italic;
font-weight: 400;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-Italic.woff2") format("woff2")
}
@font-face {
font-family: "MesloLGS Nerd Font";
font-style: italic;
font-weight: 700;
src:
local("MesloLGS Nerd Font"),
url("https://nercone.dev/assets/fonts/MesloLGSNerdFont-BoldItalic.woff2") format("woff2")
}
html {
color: #E0E0E0;
background-color: #1A1A1A;
margin: 0;
padding: 0;
padding-top: 0;
padding-bottom: 0;
font-family: "Inter", "Noto Sans JP", "Noto Sans TC", "Noto Sans SC", sans-serif, monospace;
font-size: 12pt;
font-optical-sizing: auto;
font-weight: 200;
font-style: normal;
}
body {
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
}
header {
position: fixed;
top: 0;
left: 0;
right: 0;
padding: 24px;
display: flex;
align-items: center;
gap: 16px;
z-index: 10;
overflow: hidden;
}
header::before {
content: '';
position: absolute;
inset: 0;
z-index: -1;
backdrop-filter: blur(12px);
background: linear-gradient(to bottom, #1A1A1A 0%, transparent 50%), #1A1A1A80;
mask-image: linear-gradient(to bottom,
black 0%,
black 40%,
transparent 100%
);
}
main {
view-transition-name: main-content;
padding: 24px;
padding-top: 60px;
padding-bottom: 0px;
flex: 1;
}
footer {
view-transition-name: footer-content;
padding: 24px;
padding-top: 0px;
display: flex;
align-items: center;
gap: 16px;
z-index: 10;
}
section {
padding-top: 4px;
padding-bottom: 4px;
}
a {
text-decoration: underline;
color: inherit;
}
h1 {
font-weight: 400;
line-height: 8pt;
}
h2 {
font-weight: 300;
}
h3, h4, h5, h6 {
font-weight: 200;
}
section h2, section h3 {
line-height: 8pt;
}
h1, h2, h3, h4, h5, h6 {
color: #FFFFFF;
}
.block {
background-color: #272727;
border-radius: 6px;
padding-top: 4px;
padding-left: 24px;
padding-right: 24px;
padding-bottom: 4px;
margin-bottom: 16px;
}
.block pre {
margin-bottom: 20px;
}
pre {
background-color: #272727;
border-radius: 4px;
padding: 8px;
padding-left: 16px;
overflow-x: auto;
white-space: pre;
line-height: 24px;
font-size: small;
font-family: "MesloLGS Nerd Font", "Noto Sans JP", "Noto Sans TC", "Noto Sans SC", monospace, sans-serif;
font-optical-sizing: auto;
font-style: normal;
}
.code {
padding: 4px;
font-family: "MesloLGS Nerd Font", "Noto Sans JP", "Noto Sans TC", "Noto Sans SC", monospace, sans-serif;
font-optical-sizing: auto;
font-style: normal;
}
.banner {
height: 50px;
width: auto;
border-radius: 6px;
}
.flex {
display: flex;
align-items: center;
gap: 16px;
}
.flex > * {
margin: 0;
}
.flex-1 {
flex: 1;
}
.flex-vertical {
flex-direction: column;
}
.text-small {
font-size: small;
}
.text-bold {
font-weight: 400;
}
.text-no-decoration {
text-decoration: none;
}
.text-underline {
text-decoration: underline;
}
.text-highlight {
color: #FCFCFC;
}
.text-lowlight {
color: #939393;
}
.text-tc {
font-family: "Noto Sans TC";
}
.text-sc {
font-family: "Noto Sans SC";
}
.text-kr {
font-family: "Noto Sans KR";
}
.narrow-height {
line-height: 0;
}
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.social-icons {
width: 12pt;
height: 12pt;
display: block;
}
.hide {
display: none;
}
@media (min-width: 998px) {
.hide.show-on-medium {
display: block;
}
}
@media (min-width: 1200px) {
.hide.show-on-large {
display: block;
}
}
@keyframes vt-fade-out {
from { opacity: 1; }
to { opacity: 0; }
}
@keyframes vt-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes vt-blur-out {
from { filter: blur(0px); }
to { filter: blur(6px); }
}
@keyframes vt-blur-in {
from { filter: blur(6px); }
to { filter: blur(0px); }
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(header-content),
::view-transition-new(header-content) {
z-index: 1;
pointer-events: none;
}
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(main-content),
::view-transition-new(main-content) {
z-index: 1;
pointer-events: none;
}
}
@media (prefers-reduced-motion: reduce) {
::view-transition-old(footer-content),
::view-transition-new(footer-content) {
z-index: 1;
pointer-events: none;
}
}
* { cursor: none; }
#cursor {
view-transition-name: none;
position: fixed;
z-index: 99999;
width: 25px;
height: 25px;
border-radius: 50%;
background: #FFFFFFC0;
pointer-events: none;
transform: translate(-50%, -50%);
opacity: 0;
transition:
left 0.08s ease-out,
top 0.08s ease-out,
width 0.15s cubic-bezier(0.22, 1, 0.36, 1),
height 0.15s cubic-bezier(0.22, 1, 0.36, 1),
border-radius 0.15s cubic-bezier(0.22, 1, 0.36, 1),
background 0.15s ease,
transform 0.08s ease-out,
opacity 0.3s ease;
}
#cursor.visible {
opacity: 1;
}
#cursor.on-text {
width: 3px;
border-radius: 1.5px;
background: #FFFFFFC0;
}
#cursor.on-link {
border-radius: 6px;
background: #FFFFFF40;
transform: translate(0, 0);
}
</style>
<script>
(() => {
const textSelectors = 'p, h1, h2, h3, h4, h5, h6, span, li, label, td, th, pre, .code';
const linkSelectors = 'a, button, [role="button"], input[type="submit"], input[type="button"]';
const padding = 6;
let mouseX = 0, mouseY = 0;
let currentLinkEl = null;
let rafId = null;
let cursor = null;
let cursorVisible = false;
let lastTouchTime = 0;
let isMouseDown = false;
const TOUCH_MOUSE_GUARD_MS = 800;
function showCursor() {
if (!cursorVisible && cursor) {
cursorVisible = true;
cursor.classList.add('visible');
}
}
function hideCursor() {
if (cursor) {
cursorVisible = false;
cursor.classList.remove('visible');
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
cursor.classList.remove('on-link', 'on-text');
}
}
function isSyntheticMouse() {
return Date.now() - lastTouchTime < TOUCH_MOUSE_GUARD_MS;
}
function updateCursorForLink(el) {
const rect = el.getBoundingClientRect();
cursor.classList.remove('on-text');
cursor.classList.add('on-link');
cursor.style.transform = 'none';
cursor.style.left = (rect.left - padding) + 'px';
cursor.style.top = (rect.top - padding) + 'px';
cursor.style.width = (rect.width + padding * 2) + 'px';
cursor.style.height = (rect.height + padding * 2) + 'px';
}
function trackLink() {
if (currentLinkEl) {
updateCursorForLink(currentLinkEl);
rafId = requestAnimationFrame(trackLink);
}
}
document.addEventListener('DOMContentLoaded', () => {
cursor = document.getElementById('cursor');
if (!cursor) return;
document.addEventListener('touchstart', () => { lastTouchTime = Date.now(); hideCursor(); }, { passive: true });
document.addEventListener('touchmove', () => { lastTouchTime = Date.now(); hideCursor(); }, { passive: true });
document.addEventListener('touchend', () => { lastTouchTime = Date.now(); }, { passive: true });
document.addEventListener('mousemove', (e) => {
if (isSyntheticMouse()) return;
if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
mouseX = e.clientX;
mouseY = e.clientY;
showCursor();
const el = document.elementFromPoint(mouseX, mouseY);
const linkEl = el ? el.closest(linkSelectors) : null;
if (linkEl) {
if (currentLinkEl !== linkEl) {
currentLinkEl = linkEl;
if (rafId) cancelAnimationFrame(rafId);
rafId = requestAnimationFrame(trackLink);
}
} else {
if (currentLinkEl) {
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
}
cursor.classList.remove('on-link');
cursor.style.transform = isMouseDown ? 'translate(-50%, -50%) scale(0.9)' : 'translate(-50%, -50%)';
cursor.style.left = mouseX + 'px';
cursor.style.top = mouseY + 'px';
cursor.style.width = '';
cursor.style.height = '';
if (el && el.closest(textSelectors)) {
cursor.classList.add('on-text');
} else {
cursor.classList.remove('on-text');
}
}
});
document.addEventListener('mousedown', () => {
isMouseDown = true;
cursor.style.transform = currentLinkEl ? 'none' : 'translate(-50%, -50%) scale(0.9)';
});
document.addEventListener('mouseup', () => {
isMouseDown = false;
cursor.style.transform = currentLinkEl ? 'none' : 'translate(-50%, -50%) scale(1)';
});
window.addEventListener('scroll', () => {
if (currentLinkEl) updateCursorForLink(currentLinkEl);
}, { passive: true });
});
if (document.startViewTransition) {
document.addEventListener("click", (event) => {
const link = event.target.closest("a");
if (!link || link.hasAttribute('download')) return;
const url = new URL(link.href, location.href);
if (url.origin !== location.origin) return;
if (link.target || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
if (url.hash && url.pathname === location.pathname) {
event.preventDefault();
const target = document.querySelector(url.hash);
if (target) {
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
history.pushState(null, '', url.hash);
}
return;
}
event.preventDefault();
document.startViewTransition(async () => {
const response = await fetch(url.href, {
headers: { "X-Requested-With": "view-transition" }
});
const html = await response.text();
const doc = new DOMParser().parseFromString(html, "text/html");
for (const tag of ['head', 'header', 'main', 'footer']) {
const newEl = doc.querySelector(tag);
const curEl = document.querySelector(tag);
if (!newEl || !curEl) { location.href = url.href; return; }
curEl.innerHTML = newEl.innerHTML;
curEl.querySelectorAll('script').forEach(old => {
const s = document.createElement('script');
[...old.attributes].forEach(a => s.setAttribute(a.name, a.value));
s.textContent = old.textContent;
old.replaceWith(s);
});
}
history.pushState(null, "", url.href);
currentLinkEl = null;
if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
cursor.classList.remove('on-link', 'on-text');
cursor.style.transform = 'translate(-50%, -50%)';
cursor.style.left = mouseX + 'px';
cursor.style.top = mouseY + 'px';
cursor.style.width = '';
cursor.style.height = '';
const el = document.elementFromPoint(mouseX, mouseY);
const newLinkEl = el ? el.closest(linkSelectors) : null;
if (newLinkEl) {
currentLinkEl = newLinkEl;
rafId = requestAnimationFrame(trackLink);
} else if (el && el.closest(textSelectors)) {
cursor.classList.add('on-text');
}
});
});
window.addEventListener("popstate", () => location.reload());
}
})();
</script>
<!-- Stylesheets / Scripts -->
<link rel="stylesheet" href="/assets/css/style.css">
<script src="/assets/js/script.js" defer></script>
{% block extra_head %}{% endblock %}
</head>
<body>
<div id="cursor"></div>
<header class="flex">
<div class="flex-1 flex">
<a href="/" class="text-no-decoration text-highlight" style="gap: 8px;"><span class="text-bold">Nercone</span> {% block extra_title %}{% endblock %}</a>
<p class="hide show-on-medium">{% block header_desc %}<a href="/daily-quote/" class="text-no-decoration">{{ get_daily_quote() }}</a>{% endblock %}</p>
<a href="/" class="text-no-decoration text-white" style="gap: 8px;"><span class="font-bold">Nercone</span> {% block extra_title %}{% endblock %}</a>
<p class="hide show-on-medium show-on-large">{% block header_desc %}<a href="/daily-quote/" class="text-no-decoration">{{ get_daily_quote() }}</a>{% endblock %}</p>
</div>
<div class="flex">
<a href="/access-counter/" class="text-no-decoration hide show-on-medium">あなたは{{ get_access_count() }}番目の訪問者です。</a>
<a href="/access-counter/" class="text-no-decoration hide show-on-medium show-on-large">あなたは{{ get_access_count() }}番目の訪問者です。</a>
</div>
</header>
<main>{% block content %}{% endblock %}</main>
<footer class="flex text-lowlight">
<footer class="flex text-tx-alt">
<div class="flex-1 flex">
<a href="/" class="text-no-decoration hide show-on-medium"><span class="text-bold">nercone</span>.dev</a>
<a href="/about/" class="text-no-decoration" style="@media(max-width: 998px){font-weight: 400;}">about</a>
<a href="/links/" class="text-no-decoration" style="@media(max-width: 998px){font-weight: 400;}">links</a>
<a href="/projects/" class="text-no-decoration" style="@media(max-width: 998px){font-weight: 400;}">projects</a>
<a href="{{ onion_site_url }}" class="text-no-decoration hide show-on-medium">onion</a>
<a href="mailto:nercone@nercone.dev" class="text-no-decoration hide show-on-medium">email</a>
<a href="/public-key/" class="text-no-decoration hide show-on-medium">public-key</a>
<a href="/vulnerability-reporters/" class="text-no-decoration hide show-on-medium">vulnerability-reporters</a>
<a href="/" class="text-no-decoration hide show-on-medium show-on-large"><span class="font-bold">nercone</span>.dev</a>
<a href="/about/" class="text-no-decoration">about</a>
<a href="/links/" class="text-no-decoration">links</a>
<a href="/projects/" class="text-no-decoration">projects</a>
<a href="{{ onion_site_url }}" class="text-no-decoration hide show-on-medium show-on-large">onion</a>
<a href="mailto:nercone@nercone.dev" class="text-no-decoration hide show-on-medium show-on-large">email</a>
<a href="/public-key/" class="text-no-decoration hide show-on-medium show-on-large">public-key</a>
<a href="/vulnerability-reporters/" class="text-no-decoration hide show-on-medium show-on-large">vulnerability-reporters</a>
</div>
<div class="flex">
<a href="https://github.com/nercone-dev/"><img alt="github" src="/assets/images/icons/github.svg" class="social-icons"></a>
@@ -551,7 +76,7 @@
<a href="https://qiita.com/DiamondGotCat/"><img alt="qiita" src="/assets/images/icons/qiita.svg" class="social-icons">
<a href="https://zenn.dev/techcat56/"><img alt="zenn" src="/assets/images/icons/zenn.svg" class="social-icons">
<!-- qiita kotonai -->
<a href="/server-version/" class="text-bold text-no-decoration hide show-on-medium" id="footer-version-text">{{ server_version }}</a>
<a href="/server-version/" class="font-bold text-no-decoration hide show-on-medium show-on-large" id="footer-version-text">{{ server_version }}</a>
</div>
</footer>
</body>
+2 -2
View File
@@ -18,8 +18,8 @@
</style>
{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-highlight big-text"><span class="text-lowlight unselectable">"</span>{{ get_daily_quote() }}<span class="text-lowlight unselectable">"</span></p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-white big-text"><span class="text-tx-alt unselectable">"</span>{{ get_daily_quote() }}<span class="text-tx-alt unselectable">"</span></p>
<div class="block">
<p>日替わり迷言集です。毎日0:00 UTCに更新されます。</p>
</div>
+2 -2
View File
@@ -4,10 +4,10 @@
{% block header_desc %}バナー画像は<a href="https://creativecommons.org/licenses/by/4.0/deed.ja">CC BY 4.0</a>の元で自由に使用できます。{% endblock %}
{% block description %}Nerconeのバナー画像をダウンロード{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/links/" class="text-no-decoration">← Links</a></p>
<p class="font-small font-bold"><a href="/links/" class="text-no-decoration">← Links</a></p>
<p><a href="/assets/images/banners/banner.ai" class="text-no-decoration" download>adobe-illustrator</a> / <a href="/assets/images/banners/banner.svg" class="text-no-decoration" download>svg</a> / <a href="/assets/images/banners/banner.png" class="text-no-decoration" download>png</a> / <a href="/assets/images/banners/banner.webp" class="text-no-decoration" download>webp</a></p>
<pre>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner.svg&quot;&gt;&lt;/a&gt; &lt;!-- SVG --&gt;<br>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner.png&quot;&gt;&lt;/a&gt; &lt;!-- PNG --&gt;<br>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner.webp&quot;&gt;&lt;/a&gt; &lt;!-- WEBP --&gt;</pre>
<h3 class="text-bold" style="margin-bottom: 0px;">Cat Version</h3>
<h3 class="font-bold" style="margin-bottom: 0px;">Cat Version</h3>
<p style="margin-top: 0px;">猫バージョンです。dotpictを使って描いたやつをIllustratorで加工してます。個人的にはこっちのほうが好き。</p>
<p><a href="/assets/images/banners/banner_cat.ai" class="text-no-decoration" download>adobe-illustrator</a> / <a href="/assets/images/banners/banner_cat.svg" class="text-no-decoration" download>svg</a> / <a href="/assets/images/banners/banner_cat.png" class="text-no-decoration" download>png</a> / <a href="/assets/images/banners/banner_cat.webp" class="text-no-decoration" download>webp</a></p>
<pre>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner_cat.svg&quot;&gt;&lt;/a&gt; &lt;!-- SVG --&gt;<br>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner_cat.png&quot;&gt;&lt;/a&gt; &lt;!-- PNG --&gt;<br>&lt;a href=&quot;https://nercone.dev/&quot;&gt;&lt;img src=&quot;https://assets.nercone.dev/images/banners/banner_cat.webp&quot;&gt;&lt;/a&gt; &lt;!-- WEBP --&gt;</pre>
+2 -2
View File
@@ -1,8 +1,8 @@
{% extends "/base.html" %}
{% block title %}{{ status_code }} {{ status_code_name }} - Nercone{% endblock %}
{% block extra_title %}{{ status_code }}{% endblock %}
{% block header_desc %}<span class="text-lowlight">{{ joke_message }}</span>{% endblock %}
{% block header_desc %}<span class="text-tx-alt">{{ joke_message }}</span>{% endblock %}
{% block content %}
<h1 class="text-bold">{{ status_code }} {{ status_code_name }}</h1>
<h1 class="font-bold">{{ status_code }} {{ status_code_name }}</h1>
<p>{{ message }}</p>
{% endblock %}
+2 -2
View File
@@ -31,8 +31,8 @@
{% block content %}
<div class="inner">
<div class="flex-vertical">
<p id="big-text" class="text-highlight big-text" style="padding-bottom: 0px; margin-bottom: 0px; text-box: trim-both cap alphabetic;">NERCONE</p>
<p class="text-bold" style="padding-top: 0px; margin-top: 0px; text-box: trim-both cap alphabetic;">ようこそ・Welcome・<span class="text-sc">欢迎</span><span class="text-tc">歡迎</span><span class="text-kr">환영해요</span></p>
<p id="big-text" class="text-white big-text" style="padding-bottom: 0px; margin-bottom: 0px; text-box: trim-both cap alphabetic;">NERCONE</p>
<p class="font-bold" style="padding-top: 0px; margin-top: 0px; text-box: trim-both cap alphabetic;">ようこそ・Welcome・<span class="font-nsasc">欢迎</span><span class="font-nsatc">歡迎</span><span class="font-nsakr">환영해요</span></p>
</div>
</div>
<script>
+2 -2
View File
@@ -4,7 +4,7 @@
{% block header_desc %}相互リンク大歓迎{% endblock %}
{% block description %}Nerconeのリンク集{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<div id="nercone" class="block">
<h3>nercone</h3>
<img src="/assets/images/banners/banner_cat.png" alt="banner-nercone" class="banner">
@@ -34,5 +34,5 @@
<!-- tip of tip of tip of tip of tip of tip of tip of tip: そういえば最近てとらさんがウェブサイトのコード書き直してFastAPI + Jinja2にしてた。まさか... -->
<!-- tip of tip of tip of tip of tip of tip of tip of tip of tip: いや待て落ち着けまだそうと決まったわけじゃ...でもそうだったらいいな -->
</div>
<p class="text-lowlight">追加は<a href="#nercone">SNSまたはメール</a>でご連絡ください。</p>
<p class="text-tx-alt">追加は<a href="#nercone">SNSまたはメール</a>でご連絡ください。</p>
{% endblock %}
+7 -7
View File
@@ -4,35 +4,35 @@
{% block header_desc %}主なプロジェクトたち{% endblock %}
{% block description %}Nerconeの主なプロジェクトたち{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<div id="os" class="block">
<h3>NerconeOS</h3>
<p>自作OS (とりあえず計画段階)</p>
<p><a href="https://github.com/nercone-dev/nerconeos/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a></p>
<p><a href="https://github.com/nercone-dev/nerconeos/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a></p>
</div>
<div id="fastget" class="block">
<h3>FastGet</h3>
<p>高速ファイルダウンロードツール</p>
<p><a href="https://github.com/nercone-dev/nercone-fastget/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a> <a href="https://pypi.org/project/nercone-fastget/" class="text-highlight">PyPI</a></p>
<p><a href="https://github.com/nercone-dev/nercone-fastget/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a> <a href="https://pypi.org/project/nercone-fastget/" class="text-white">PyPI</a></p>
</div>
<div id="nersh" class="block">
<h3>SpeedClone</h3>
<p>ちょっと速い気がしなくもないgitのクローンツール</p>
<p><a href="https://github.com/nercone-dev/SpeedClone/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a></p>
<p><a href="https://github.com/nercone-dev/SpeedClone/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a></p>
</div>
<div id="gatepass" class="block">
<h3>GatePass</h3>
<p>macOS向け実行ファイル隔離解除ツール</p>
<p><a href="https://github.com/nercone-dev/GatePass/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a></p>
<p><a href="https://github.com/nercone-dev/GatePass/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a></p>
</div>
<div id="ypsh" class="block">
<h3>YPSH Language</h3>
<p>自作プログラミング言語</p>
<p><a href="https://github.com/nercone-dev/ypsh/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a></p>
<p><a href="https://github.com/nercone-dev/ypsh/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a></p>
</div>
<div id="zetallm" class="block">
<h3>Zeta LLM</h3>
<p>自作LLM</p>
<p><a href="https://github.com/nercone-dev/zeta-llm/" target="_blank" rel="noopener noreferrer" class="text-highlight">GitHub</a></p>
<p><a href="https://github.com/nercone-dev/zeta-llm/" target="_blank" rel="noopener noreferrer" class="text-white">GitHub</a></p>
</div>
{% endblock %}
+1 -1
View File
@@ -4,7 +4,7 @@
{% block header_desc %}PGP公開鍵{% endblock %}
{% block description %}NerconeのPGP公開鍵とそのフィンガープリント{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<h3 style="margin-bottom: 0px;"><a href="mailto:nercone@nercone.dev" class="text-no-decoration">Nercone &lt;nercone&#64;nercone.dev&gt;</a></h3>
<a href="/public-key/nercone.asc" class="text-no-decoration">Download</a>
<pre>-----BEGIN PGP PUBLIC KEY BLOCK-----<br><br>mDMEaZNZjBYJKwYBBAHaRw8BAQdAUSCDOhESmGQBqA9BXpmmB6tYAvzwPt+5pEjJ<br>UDl9rEO0Nk5lcmNvbmUgKGZvcm1lcmx5IERpYW1vbmRHb3RDYXQpIDxuZXJjb25l<br>QG5lcmNvbmUuZGV2PoiTBBMWCgA7FiEEc5Q3UzpWjrjbmTU3UFzPN/mj6OkFAmmT<br>WYwCGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQUFzPN/mj6OkjVgD/<br>ZSTmQCQ0R4JShXU74Onftlm0wYqj6+8E9C13OVC/Rx8A/iQIvmXZe9zfEslmFS7V<br>oWFegRuDoqLACL7BZUx/2r0MuDgEaZNZjBIKKwYBBAGXVQEFAQEHQPAgLyhydOum<br>8vtTBa/46VH5B29v0DnNEUCmHYnHn3EMAwEIB4h4BBgWCgAgFiEEc5Q3UzpWjrjb<br>mTU3UFzPN/mj6OkFAmmTWYwCGwwACgkQUFzPN/mj6OmgXQD/Umyya1slJclVhI/+<br>IHmvak+E6LMRcnr6r6ybY57iEK4BAOA/CMuOE718KYm0yqVSV8lK5ym1G/1BDwml<br>ZjQEF4sK<br>=qeqQ<br>-----END PGP PUBLIC KEY BLOCK-----</pre>
+2 -2
View File
@@ -18,8 +18,8 @@
</style>
{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-highlight big-text"><span class="text-lowlight unselectable">#</span>{{ server_version }}</p>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<p class="text-white big-text"><span class="text-tx-alt unselectable">#</span>{{ server_version }}</p>
<div class="block">
<p>このサーバーで現在使用されているソースコードのコミットID(ハッシュ)の先頭7文字です。</p>
<p>サーバーが起動されるたびに<span class="code">git rev-parse --short HEAD</span>を使用して取得しています。</p>
+2 -2
View File
@@ -4,7 +4,7 @@
{% block header_desc %}404 Not Found{% endblock %}
{% block description %}見つからないよ{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<h1 class="text-bold">404 Not Found</h1>
<p class="font-small font-bold"><a href="/" class="text-no-decoration">← ホーム</a></p>
<h1 class="font-bold">404 Not Found</h1>
<p>見つからないよ</p>
{% endblock %}
+3 -3
View File
@@ -4,7 +4,7 @@
{% block header_desc %}These people found and pointed out security vulnerabilities in my system/service.{% endblock %}
{% block description %}People who found and pointed out security vulnerabilities in my system/service{% endblock %}
{% block content %}
<p class="text-small text-bold"><a href="/.well-known/security.txt" class="text-no-decoration">← security.txt</a></p>
<p class="font-small font-bold"><a href="/.well-known/security.txt" class="text-no-decoration">← security.txt</a></p>
<h3>Thank you for Helping!</h3>
<p>These people found and pointed out security vulnerabilities in my system/service.</p>
<p>As I'm just a student, I occasionally overlook vulnerabilities while writing code.</p>
@@ -14,9 +14,9 @@
<h3>Arbitrary Code Execution (UNRESOLVED)</h3>
<p>If Nercone is asked by a specific individual to carry out an arbitrary command in exchange for a reward, and Nercone is in a state where it can execute that command, it will comply with the request.</p>
<p>This vulnerability is unfixable and therefore remains unpatched.</p>
<p class="text-bold">Scope of impact</p>
<p class="font-bold">Scope of impact</p>
<p>Nercone's Life</p>
<p class="text-small text-bold">Reported by <a href="https://t3tra.dev/" class="text-no-decoration">t3tra</a>. Thank you very much! (but I cannot fix this issue... Sorry.)</p>
<p class="font-small font-bold">Reported by <a href="https://t3tra.dev/" class="text-no-decoration">t3tra</a>. Thank you very much! (but I cannot fix this issue... Sorry.)</p>
</div>
-->
{% endblock %}