From e3c70632e2e33d4ea182debcb17c5c56a2e6a0e2 Mon Sep 17 00:00:00 2001 From: "Paul W." Date: Tue, 13 Feb 2024 18:01:07 -0500 Subject: [PATCH] Add programming-resources; swi->generic Nintendo; Remove custom html from markdown, clean-up UI (again) Signed-off-by: Paul W. --- bun.lockb | Bin 272019 -> 264838 bytes components/container.tsx | 13 +++++ components/layout.tsx | 17 ++---- components/lists.tsx | 103 --------------------------------- components/quick-links.tsx | 9 ++- components/recent-notes.tsx | 29 ++++++---- components/recent-posts.tsx | 42 +++++++++----- components/title.tsx | 16 +++-- lib/date.ts | 77 +++++++++++++++--------- next.config.js | 16 +++-- notes/nintendo-switch.md | 17 ------ notes/nintendo.md | 28 +++++++++ notes/programming-resources.md | 48 +++++++++++++++ notes/steam-deck.md | 79 +++++++++++++++---------- notes/steam.md | 53 +++++++++-------- package.json | 1 + pages/about.tsx | 2 +- pages/index.tsx | 7 ++- pages/notes/index.tsx | 48 ++++++++++----- pages/posts/[post].tsx | 40 ++++++++++++- pages/posts/index.tsx | 2 +- pages/sitemap.tsx | 12 ++-- public/notes.json | 2 +- public/sitemap.json | 2 +- scripts/generate-metadata.js | 4 +- styles/global.css | 4 +- styles/post.module.css | 4 +- styles/recent-posts.module.css | 21 +------ 28 files changed, 392 insertions(+), 304 deletions(-) create mode 100644 components/container.tsx delete mode 100644 components/lists.tsx delete mode 100644 notes/nintendo-switch.md create mode 100644 notes/nintendo.md create mode 100644 notes/programming-resources.md diff --git a/bun.lockb b/bun.lockb index b8f31758ed5329915a71a722efba5bee21b100e8..238df2d50d70e3e13dc8947c46bd2d8ddd4081ed 100644 GIT binary patch delta 66763 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

X4QvO$=)U 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 + +function Container(props: { children?: ChildrenType, ignore?: boolean }) { + if (props.ignore) + return <>{props.children}; + return ( +

+ ); +} + +export default Container; \ No newline at end of file diff --git a/components/layout.tsx b/components/layout.tsx index 7323bca..5fff3f3 100644 --- a/components/layout.tsx +++ b/components/layout.tsx @@ -1,25 +1,18 @@ import Title from './title'; - -type ChildrenType = JSX.Element | Array; +import Container, { ChildrenType } from './container'; type LayoutProps = { children?: ChildrenType, removeContainer?: boolean, }; -function Container(props: {children?: ChildrenType, ignore?: boolean}) { - if (props.ignore) - return <>{props.children}; - return
- {props.children} -
; -} - -function Layout(props : LayoutProps) { +function Layout(props: LayoutProps) { return ( <> - <Container ignore={props.removeContainer}>{props.children}</Container> + <Container ignore={props.removeContainer}> + {props.children} + </Container> </> ); } diff --git a/components/lists.tsx b/components/lists.tsx deleted file mode 100644 index 8d336b9..0000000 --- a/components/lists.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import style from '../styles/lists.module.css'; -import React, { ReactElement } from 'react'; - -export interface listItem { - [x: string]: any; - children?: listItem[] | string[]; - url?: string; - type?: string; - title: string; - description?: string; -}; - -export function toListItem(record: Record<string, any>): listItem | null { - if (!record.title) - return null; - - let children: listItem[] | string[] = []; - if (Array.isArray(record.children) && record.children.length) { - - let lchildren: listItem[] = []; - let schildren: string[] = []; - for (const child of record.children) { - if (typeof child === 'string') { - schildren.push(child); - continue; - } - const lChild = toListItem(child); - if (lChild) - lchildren.push(lChild); - } - - if (!lchildren.length) { - children = schildren; - } - else { - children = [...lchildren, ...schildren.map((s: string): listItem => { - return { title: s }; - })]; - } - } - - return Object.assign(record, { - title: record.title, - url: record.url, - children: children.length ? children : undefined, - type: record.type?.length ? record.type : undefined, - description: record.description, - }); -} - -export function mapChild( - obj: listItem | string, - level: number, - typeMap? : Record<string, (o: listItem) => JSX.Element> - ) { - if (typeof obj === 'string') { - if (obj === '') - return <></> - return <span className={style.listItem}>{obj}</span> - } - - if (obj.title === '') - return <></> - - const desc = obj.description - ? <span className={style.listItemDesc}>{obj.description}</span> - : <></>; - - if (obj.url) - return ( - <> - <span className={style.listItem}><a href={obj.url}>{obj.title}</a></span> - {desc} - </>); - - if (!obj.children) { - let cb; - if (obj.type && typeMap) { - cb = typeMap[obj.type] - } - - return cb - ? cb(obj) - : (<><span className={style.listItem}>{obj.title}</span>{desc}</>); - } - - let title: ReactElement; - - if (level >= 0 && level <= 4) - title = React.createElement(`h${level + 2}`, {}, obj.title); - else - title = React.createElement('strong', {}, obj.title); - - return ( - <section className={level < 4 && `block ${style.block}` || ''}> - {title} - {obj.description ? <p className={style.desc}>{obj.description}</p> : <></>} - <div> - {obj.children.map(l => mapChild(l, level + 1, typeMap))} - </div> - </section> - ); -} diff --git a/components/quick-links.tsx b/components/quick-links.tsx index 6b38994..4743a56 100644 --- a/components/quick-links.tsx +++ b/components/quick-links.tsx @@ -4,12 +4,17 @@ import Pages from '../public/external.json'; function QuickLinks() { return ( <div className='block'> - <div className='h2'>Quick Links</div> + <h2>Quick Links</h2> { Object.entries(Pages).map(([title, link], i) => { const extern = link.match(/^http/) && `blue extern` || ''; return ( - <Link key={i} href={link} className={`${extern} link button`}>{title}</Link> + <Link + key={i} + href={link} + className={`${extern} link button`}> + {title} + </Link> ); }) } diff --git a/components/recent-notes.tsx b/components/recent-notes.tsx index bd6857d..b3be0df 100644 --- a/components/recent-notes.tsx +++ b/components/recent-notes.tsx @@ -2,22 +2,29 @@ import Link from "next/link"; import NotesInfo from '../public/notes.json'; function RecentNotes() { - const notes = Object.entries(NotesInfo); + const notes = Object.entries(NotesInfo).reverse(); return ( - <div className='block'> - <div className='h2'>Recent Notes</div> - {notes?.slice(0, 10) - .map(([slug, note]: any) => { - return <Link key={slug} href={`/notes/${slug}`} className={`button link`}>{note.title}</Link> + <ul className='block'> + <h2>Recent Notes</h2> + {notes?.slice(0, 5) + .map(([slug, note]: any, i: number) => { + return ( + <li + key={i} + > + <Link + href={`/notes/${slug}`}> + {note.title} + </Link> + </li> + ); }) } { - notes.length > 10 && - <div> - <Link href='/notes' className='h5'>More...</Link> - </div> + notes.length > 5 && + <Link href='/notes'>More...</Link> } - </div> + </ul> ); } diff --git a/components/recent-posts.tsx b/components/recent-posts.tsx index ee24815..9f8a9b3 100644 --- a/components/recent-posts.tsx +++ b/components/recent-posts.tsx @@ -1,34 +1,46 @@ import Link from "next/link"; -import date from "../lib/date"; +import { toRelativeDate } from "../lib/date"; import style from '../styles/recent-posts.module.css'; import PostsInfo from '../public/posts.json'; +function PostBlock({ slug, otime, title }: { slug: string, otime: string, title: string }) { + return ( + <div className={style.block}> + <span className={style.postDate}> + {toRelativeDate(new Date(otime))} + </span> + <div className={style.postTitle}> + <Link href={`/posts/${slug}`}> + {title} + </Link> + </div> + </div> + ); +} + function RecentPosts() { - const posts = Object.entries(PostsInfo); + const posts = Object.entries(PostsInfo).reverse(); if (!posts.length) return <></>; return ( <div className='block'> - <div className='h2'>Recent Posts</div> + <h2>Recent Posts</h2> <div className={style.container}> {posts?.slice(0, 10) - .map(([slug, post]: any) => { - return <div className={style.block} key={post.slug}> - <span className={style.postDate}> - {date.toRelativeDate(new Date(post.otime))} - </span> - <div className={style.postTitle}> - <Link href={`/posts/${slug}`}> - {post.title} - </Link> - </div> - </div> + .map(([slug, post]: any, i: number) => { + return ( + <PostBlock + key={i} + slug={slug} + title={post.title} + otime={post.otime} /> + ); })} </div> { posts.length > 10 && <div className={style.more}> - <Link href='/posts' className='h5'>More...</Link> + <Link href='/posts' >More...</Link> </div> } </div> diff --git a/components/title.tsx b/components/title.tsx index bbcb677..6629473 100644 --- a/components/title.tsx +++ b/components/title.tsx @@ -17,7 +17,7 @@ function createPathElements(ancestors: Array<{ name: string, path: string }>) { </> ); }); -}; +} function Title() { @@ -31,10 +31,12 @@ function Title() { const subPaths = pagePath.split('/'); for (const p of subPaths.slice(1, subPaths.length)) { splitPath.push({ name: currRoot[p].title, path: p }); + if (currRoot === undefined || currRoot[p] === undefined - || currRoot[p].subpages !== undefined) - currRoot = currRoot[p].subpages!; + || currRoot[p].subpages === undefined) + break; + currRoot = currRoot[p].subpages!; } if (splitPath !== undefined && splitPath.length > 0) title = splitPath.pop()!.name; @@ -53,9 +55,11 @@ function Title() { </h1> </div> <div className={`${style.nav} h1`}> - {title - ? <><Link href='/'>PaulW.XYZ</Link> / {pathElements}{title}</> - : <>PaulW.XYZ /</>} + { + title + ? <><Link href='/'>PaulW.XYZ</Link> / {pathElements}{title}</> + : <>PaulW.XYZ /</> + } </div> </> ); diff --git a/lib/date.ts b/lib/date.ts index 48e54e9..2f1fdb7 100644 --- a/lib/date.ts +++ b/lib/date.ts @@ -1,3 +1,4 @@ +// getMonth() method ranges from 0-11 so no reason to account for it const months = [ 'January', 'February', @@ -13,36 +14,51 @@ const months = [ 'December' ]; -const ordSfx = ['','st','nd','rd','th']; - -function toHumanReadableDate(date: Date | string, disable?: {year?: boolean, month?: boolean, day?: boolean}) { - const oDate = (typeof date === 'string')? new Date(date): date; +function toHumanReadableDate(date: Date | string, disable?: { year?: boolean, month?: boolean, day?: boolean }) { + const oDate = (typeof date === 'string') ? new Date(date) : date; const year = oDate.getFullYear(); const month = months[oDate.getMonth()]; const day = oDate.getDate(); - - let sfx; - if (day >= 1 && day <= 3) - sfx = ordSfx[day]; - else - sfx = ordSfx[4]; - - let out = !disable?.day ? `${day}${sfx}` : ''; + + let out = !disable?.day ? `${day}${getOrdinalDaySuffix(day)}` : ''; out = !disable?.month ? `${out} ${month}` : out; out = !disable?.year ? `${out} ${year}` : out; return out; } -function toRelativeDate(date: Date | string): string { - const oDate = (typeof date === 'string')? new Date(date): date; + +export function getOrdinalDaySuffix(day: number) { + switch (day) { + case 1: + case 21: + case 31: + return 'st'; + case 2: + case 22: + return 'nd'; + case 3: + case 23: + return 'rd'; + default: + return 'th'; + } +} + +export function toRelativeDate(date: Date | string): string { + const oDate = (typeof date === 'string') ? new Date(date) : date; + + + if (!isValid(oDate)) { + return 'Invalid Date'; + } const now = new Date(); const diff = now.getTime() - oDate.getTime(); - let tdiff = Math.floor(diff/1000); - + let tdiff = Math.floor(diff / 1000); + if (tdiff < 0) { return toHumanReadableDate(oDate); } @@ -50,15 +66,15 @@ function toRelativeDate(date: Date | string): string { if (tdiff < 60) { return `${tdiff} seconds ago`; } - - tdiff = Math.floor(tdiff/60); + + tdiff = Math.floor(tdiff / 60); if (tdiff < 60) { - return `${tdiff} minute${tdiff === 1? '' : 's'} ago`; + return `${tdiff} minute${tdiff === 1 ? '' : 's'} ago`; } - tdiff = Math.floor(tdiff/60); + tdiff = Math.floor(tdiff / 60); if (tdiff < 24) { - return `${tdiff} hour${tdiff === 1? '' : 's'} ago`; + return `${tdiff} hour${tdiff === 1 ? '' : 's'} ago`; } if (tdiff < 48) { return `Yesterday`; @@ -66,15 +82,24 @@ function toRelativeDate(date: Date | string): string { if (oDate.getFullYear() != now.getFullYear()) return toHumanReadableDate(oDate); - return toHumanReadableDate(oDate, {year: true}); + return toHumanReadableDate(oDate, { year: true }); } -function isValid(date: any) { - return (new Date(date)).toString() === 'Invalid Date'; +export function getFullMonth(month: number) { + if (month >= 1 && month <= 12) + return months[month]; + return 'Invalid Month'; } + +export function isValid(date: any) { + return (new Date(date)).toString() !== 'Invalid Date'; +} + const DateTool = { - toRelativeDate, - isValid + toRelativeDate, + getFullMonth, + isValid, + getOrdinalDaySuffix, }; export default DateTool; diff --git a/next.config.js b/next.config.js index bc20bb1..d7e6ce7 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,4 @@ -module.exports = { +const config = { i18n: { locales: ['en-US'], defaultLocale: 'en-US' @@ -32,9 +32,15 @@ module.exports = { }, ); - return config - }, - images: { - domains: ['avatars.githubusercontent.com'] + return config; }, +}; + +if (process.env.ANALYZE) { + const bundleAnalyzer = require('@next/bundle-analyzer')({ + enabled: true + }); + module.exports = bundleAnalyzer(config); +} else { + module.exports = config; } diff --git a/notes/nintendo-switch.md b/notes/nintendo-switch.md deleted file mode 100644 index 32d7dd6..0000000 --- a/notes/nintendo-switch.md +++ /dev/null @@ -1,17 +0,0 @@ -# Nintendo Switch - -<a href='https://www.nintendo.com/switch' class='link button extern blue'>Official Website</a> -<a href='https://developer.nintendo.com/' class='link button extern blue'>Developer Portal</a> - -## Third-party Software -- [Atmosphère](https://github.com/Atmosphere-NX/Atmosphere) - - custom firmware - -## Third-party Resources -- [DekuDeals](https://www.dekudeals.com/) - - price tracker for games with support for all major US retailers - - -## High-level Emulators -- [yuzu](https://yuzu-emu.org/) -- [Ryujinx](https://ryujinx.org/) diff --git a/notes/nintendo.md b/notes/nintendo.md new file mode 100644 index 0000000..85eab4d --- /dev/null +++ b/notes/nintendo.md @@ -0,0 +1,28 @@ +# Nintendo Consoles + +## Nintendo Switch + +- [Official Website](https://www.nintendo.com/switch) +- [Developer Portal](https://developer.nintendo.com/) + +### Third-party Software +- [Atmosphère (Custom Firmware)](https://github.com/Atmosphere-NX/Atmosphere) + +### Third-party Resources +- [DekuDeals](https://www.dekudeals.com/) + - price tracker for games with support for all major US retailers + + +### High-level Emulators +- [yuzu](https://yuzu-emu.org/) +- [Ryujinx](https://ryujinx.org/) + +## Wii U + +- [Wii U Brew Wiki](https://wiiubrew.org/wiki/Main_Page) +- [Cemu emulator](https://cemu.info/) + - GitHub: [cemu-project / Cemu](https://github.com/cemu-project/Cemu) + +## Nintendo 3DS +- [Citra emulator](https://citra-emu.org/) +- [Custom Firmware Guide (3ds.hacks.guide)](https://3ds.hacks.guide/) diff --git a/notes/programming-resources.md b/notes/programming-resources.md new file mode 100644 index 0000000..666f298 --- /dev/null +++ b/notes/programming-resources.md @@ -0,0 +1,48 @@ +# Programming Resources + +A handy list of blog posts, articles, videos, and books that I would probably +refer to someone or within something. + +- Untangling Lifetimes: The Arena Allocator + + Making performant dynamic manual memory management in C feel almost like + garbage collection. + + https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator + +- Ryan Fleury's UI Series + + Semi-paywalled + + https://www.rfleury.com/p/ui-series-table-of-contents + +- Immediate-Mode Graphical User Interfaces (2005) + + https://caseymuratori.com/blog_0001 + + https://www.youtube.com/watch?v=Z1qyvQsjK5Y + +- What Color is Your Function? + + https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ + +- Real-time audio programming 101: time waits for nothing + + http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing + +- Triangulation + + https://www.humus.name/index.php?ID=228 + +- Quantifying the Performance of Garbage Collection vs. Explicit Memory + Management + + https://people.cs.umass.edu/~emery/pubs/gcvsmalloc.pdf + +- Typing is Hard + + https://3fx.ch/typing-is-hard.html + +- The Aggregate Magic Algorithms + + http://aggregate.org/MAGIC/ diff --git a/notes/steam-deck.md b/notes/steam-deck.md index 16586d2..ada97f8 100644 --- a/notes/steam-deck.md +++ b/notes/steam-deck.md @@ -1,15 +1,21 @@ # Steam Deck -<a href='https://www.steamdeck.com/' class='link button extern blue'>Official Website</a> +- [Official Website](https://www.steamdeck.com/) ## Third-party Software -* [Decky Plugin Loader](https://decky.xyz/) - * Installer: [decky\_installer.desktop](https://github.com/SteamDeckHomebrew/decky-installer/releases/latest/download/decky_installer.desktop) +- [Decky Plugin Loader](https://decky.xyz/) + - Source: [GitHub / SteamDeckHomebrew](https://github.com/SteamDeckHomebrew) + - Installer: + [decky_installer.desktop](https://github.com/SteamDeckHomebrew/decky-installer/releases/latest/download/decky_installer.desktop) -## Access Console-like Youtube in Gaming Mode +## Console-like Youtube in Gaming Mode -* Using Chromium's undocumented command-line options, the user agent can be changed to PlayStation's, Xbox's or Tizen's (Samsung's TV OS) and the application can be launched in full screen by using the `--kiosk` flag. The following XDG Desktop Configuration, for example, can be used and added as a non-Steam game while in Desktop mode for access in gaming mode +- Using Chromium's undocumented command-line options, the user agent can be + changed to PlayStation's, Xbox's or Tizen's (Samsung's TV OS) and the + application can be launched in full screen by using the `--kiosk` flag. The + following XDG Desktop Configuration, for example, can be used and added as a + non-Steam game while in Desktop mode for access in gaming mode ```cfg #!/usr/bin/env xdg-open @@ -21,34 +27,45 @@ GenericName=Online Video Platform Comment=An online video-sharing, social media platform Exec=/usr/bin/flatpak run --branch=master --arch=x86_64 --file-forwarding org.chromium.Chrome @@ %F @@ --user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox Series X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36 Edge/20.02' --kiosk 'https://www.youtube.com/tv' Terminal=false -MimeType=text/plain; -# $XDG_PATH contains the paths used to fetch icons, extensions for supported formats are optional -Icon=com.youtube.tv +MimeType=text/plain; # $XDG_PATH contains the paths used to fetch icons, extensions for supported formats are optional Icon=com.youtube.tv ``` -* Firefox can also be used however the supported command-line options are limited -* The URL is https://www.youtube.com/tv -* Without the user agent change, the above URL is inaccessible -* Adblockers like uBlock Origin, AdBlock Plus (both tested) do not remove ads unlike on the desktop site -* Choosing the Xbox user agent is recommended as button prompts match the Steam Deck's `ABXY` button layout -* The Electron framework can be used to build a wrapper for the URL. This is the preferable method as it supports exiting from within the application, while browsers only support manual termination from the Steam menu. E.g. (assuming you can build native linux binaries on a device) - -```javascript -const { app, BrowserWindow } = require('electron'); -app.whenReady() - .then(() => { - const win = new BrowserWindow({ - backgroundColor: '#2e2c29', - kiosk: true - }); - win.maximize(); - win.loadURL('https://youtube.com/tv'); - const wc = win.webContents; - wc.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox Series X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36 Edge/20.02' - }) - .catch(()=>{}); // swallow errs -``` +- Firefox can also be used however the supported command-line options are + limited +- The URL for the TV user interface is https://www.youtube.com/tv +- Without the user agent change, the above URL is inaccessible and will redirect + you to the desktop version of the website +- Adblockers like uBlock Origin, AdBlock Plus (both tested) do not remove ads + even if they work with the desktop version +- Choosing an Xbox user agent is recommended as button prompts match the Steam + Deck's `ABXY` button layout +- The Electron framework can be used to build a wrapper for the URL + - This is the preferable method as it supports exiting from within the + application, while browsers only support manual termination from the Steam + menu. + - Sample code for the electron app (assuming you can build linux binaries + for the target platform): + ```javascript + // sample code to get started + const { app, BrowserWindow } = require('electron'); + app + .whenReady() + .then(() => { + const win = new BrowserWindow({ + backgroundColor: '#2e2c29', + kiosk: true, + }); + win.maximize(); + win.loadURL('https://youtube.com/tv'); + win.webContents.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox Series X) ' + + 'AppleWebKit/537.36 (KHTML, like Gecko) ' + + 'Chrome/48.0.2564.82 Safari/537.36 Edge/20.02'; + }) + .catch(() => { }); + ``` ## Miscellaneous -* When using a dock or a hub to connect to an external display, ensure the display supports the refresh rate set on the device as some TVs and other displays only support refresh rates that are multiples of 30Hz +- When using a dock or a hub to connect to an external display, ensure the + display supports the refresh rate set on the device; some TVs and some + monitors only support refresh rates that are multiples of 30Hz diff --git a/notes/steam.md b/notes/steam.md index eeb70c7..41a6d95 100644 --- a/notes/steam.md +++ b/notes/steam.md @@ -1,27 +1,33 @@ # Steam Client -<a href='https://store.steampowered.com' class='link button extern blue'>Steam Store</a> -<a href='https://developer.valvesoftware.com/wiki/SteamCMD' class='link button extern blue'>SteamCMD</a> +- [Steam Store](https://store.steampowered.com) +- [SteamCMD](https://developer.valvesoftware.com/wiki/SteamCMD) ## Accessing the Console -- Use the following URIs on a browser or a file manager to open GUI client with the console: - - `steam://nav/console` - - `steam://open/console` - - will not work if the Steam client is running in the background + +- Use the following URIs on a browser or a file manager to open GUI client with + the console: + - `steam://nav/console` + - `steam://open/console` + - will not work if the Steam client is running in the background - The `-console` flag can be used with the client executable -- Alternatively, SteamCMD, a command-line only version of the Steam client, can be used - - [Windows Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip) - - [Linux Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz) - - [macOS Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd_osx.tar.gz) +- Alternatively, SteamCMD, a command-line only version of the Steam client, can + be used + - [Windows + Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip) + - [Linux + Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz) + - [macOS + Binary](https://steamcdn-a.akamaihd.net/client/installer/steamcmd_osx.tar.gz) ## Downloading Older Depots Download a single depot (used to download older versions of applications/games): -``` -download_depot <appid> <depotid> [<target manifestid>] [<delta manifestid>] [<depot flags filter>] -``` -[SteamDB](https://steamdb.info/) can be used to find the required argument values. +`download_depot <appid> <depotid> [<target manifestid>] [<delta manifestid>][<depot flags filter>]` + +[SteamDB](https://steamdb.info/) can be used to find the required argument +values. ## Resources @@ -32,18 +38,19 @@ download_depot <appid> <depotid> [<target manifestid>] [<delta manifestid>] [<de ## Third-party Resources - [SteamDB](https://steamdb.info/) - - tracks depot changes, price history, everything steam + - tracks depot changes, price history, everything steam - [SteamGifts](https://steamgifts.com/) - - giveaway Steam keys or take part in giveaways + - giveaway Steam keys or take part in giveaways - [SteamTradeMatcher](https://steamtradematcher.com/) - - one-to-one trading of items on Steam + - one-to-one trading of items on Steam - [ArchiSteamFarm](https://asf.justarchi.net) - - useful bot written in C# to farm trading cards for owned games that can be sold + - useful bot written in C# to farm trading cards for owned games that can be + sold - [IsThereAnyDeal](https://isthereanydeal.com) - - tracks game deals for steam, steam key stores and other platforms - - somewhat broken although it is being migrated and modernized, see [New ITAD](https://new.isthereanydeal.com) + - tracks game deals for steam, steam key stores and other platforms + - somewhat broken although it is being migrated and modernized, see [New + ITAD](https://new.isthereanydeal.com) - [gg.deals](https://gg.deals) - - newer than and similar to IsThereAnyDeal with modern UI + - newer than and similar to IsThereAnyDeal with modern UI - [SteamGridDB](https://steamgriddb.com/) - - custom video game assets for games available and not available on steam - + - custom video game assets for games available and not available on steam diff --git a/package.json b/package.json index d7d2375..672afed 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "uri-js": "^4.4.1" }, "devDependencies": { + "@next/bundle-analyzer": "^14.0.1", "@svgr/webpack": "^6.5.1", "@types/node": "^18.17.17", "@types/react": "^18.2.22", diff --git a/pages/about.tsx b/pages/about.tsx index cebac99..1794896 100644 --- a/pages/about.tsx +++ b/pages/about.tsx @@ -17,7 +17,7 @@ function AboutPage() { </section> <hr /> <section className='block'> - <p>Source for this site is available at <a className='button link extern blue' href='https://github.com/LambdaPaul/www'>GitHub / LambdaPaul / www</a></p> + <p>Source for this site is available at <a className='link' href='https://github.com/LambdaPaul/www'>GitHub / LambdaPaul / www</a></p> <p>Relevant information regarding the source is available on the repo and is also provided below.</p> </section> <section className='block'> diff --git a/pages/index.tsx b/pages/index.tsx index 9e458b5..92c556e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -9,7 +9,8 @@ import RootInfo from '../public/home.json'; function Nav() { const nav = RootInfo; return ( - <div className='block' style={{ textAlign: 'center' }}> + <div className='block'> + <h2>Navigation</h2> { Object.entries(nav).map(([slug, info], i) => { return <Link key={i} href={slug} className='button green'>{info.title}</Link> @@ -22,10 +23,10 @@ function Nav() { function HomePage() { return ( <Layout> - <Nav /> <QuickLinks /> - <RecentNotes /> <RecentPosts /> + <RecentNotes /> + <Nav /> </Layout> ) } diff --git a/pages/notes/index.tsx b/pages/notes/index.tsx index 94891e9..e8609bf 100644 --- a/pages/notes/index.tsx +++ b/pages/notes/index.tsx @@ -1,37 +1,55 @@ import Link from 'next/link'; -import Layout from '../../components/layout'; -import date from '../../lib/date'; +import Layout from '../../components/layout'; +import { toRelativeDate } from '../../lib/date'; + import NotesInfo from '../../public/notes.json'; -function NoteEntry(props: { path: string, note: { title: string, mtime: string } }) { +function NoteEntry({ note }: { note: { title: string, mtime: string, slug: string } }) { return ( <tr> <td style={{ flex: '1 0 50%' }}> - <Link href={props.path}> - {props.note.title} + <Link href={`/notes/${note.slug}`}> + {note.title} </Link> </td> <td style={{ fontStyle: 'italic' }}> - {props.note.mtime && date.toRelativeDate(new Date(props.note.mtime))} + {note.mtime && toRelativeDate(note.mtime)} </td> </tr> - ); } function NotesPage() { - const notes = Object.entries(NotesInfo); + const notes = Object.entries(NotesInfo) + .map(([slug, note]) => { + return { + slug, + title: note.title, + mtime: new Date(note.mtime) + } + }) + .sort( + (a, b) => { + return b.mtime.getTime() - a.mtime.getTime(); + } + ); return ( <Layout> - {!notes || notes.length === 0 && <>No notes found</> || <table> - <tbody> - {notes.map(([slug, note]: any, i: number) => { - return <NoteEntry path={`/notes/${slug}`} note={note} key={i} /> - })} - </tbody> - </table>} + { + !notes || notes.length === 0 + && <>No notes found</> + || <table> + <tbody> + {notes.map( + (note: any, i: number) => { + return (<NoteEntry note={note} key={i} />); + } + )} + </tbody> + </table> + } </Layout> ) } diff --git a/pages/posts/[post].tsx b/pages/posts/[post].tsx index 4136a54..73df8c1 100644 --- a/pages/posts/[post].tsx +++ b/pages/posts/[post].tsx @@ -3,6 +3,7 @@ import ReactMarkdown from 'react-markdown'; import style from '../../styles/post.module.css'; import PostsInfo from '../../public/posts.json'; import readMarkdown from '../../lib/read-markdown'; +import DateTool from '../../lib/date'; interface Post { title: string; @@ -14,7 +15,43 @@ interface Posts { [slug: string]: Post } -function Post({ post }: { post: Post & { content: string, cover?: string } }) { + +function TimeBlock({ mtime, otime }: { mtime: string, otime: string }) { + const ampm = (h: number) => { if (h >= 12) return 'p.m.'; return 'a.m.'; }; + + const mdate = new Date(mtime); + const odate = new Date(otime); + + const format = (date: Date) => { + const day = date.getDay(); + const ord = <sup>{DateTool.getOrdinalDaySuffix(date.getDay())}</sup>; + const month = DateTool.getFullMonth(date.getMonth()); + const year = date.getFullYear(); + const hours = date.getHours() > 12 ? date.getHours() - 12 : date.getHours(); + const minPrefix = date.getMinutes() < 10 ? '0' : ''; + const minutes = date.getMinutes(); + const twelveSfx = ampm(date.getHours()); + return <>{day}{ord} {month} {year} at {hours}:{minPrefix}{minutes} {twelveSfx}</> + }; + + return ( + <div style={{ textAlign: 'right', fontSize: '16px', fontFamily: 'Cantarell', fontStyle: 'italic' }}> + { + mtime ? + <div className='mtime' data-text={mdate.toISOString()}> + Last updated: {format(mdate)} + </div> + : + <></> + } + <div className='otime'> + {format(odate)} + </div> + </div> + ); +} + +function Post({ post }: { post: Post & { content: string, cover?: string, otime: string, mtime?: string } }) { return (<> <Layout removeContainer={true} > {<div className={style.imageBlock} @@ -27,6 +64,7 @@ function Post({ post }: { post: Post & { content: string, cover?: string } }) { <div className={`${style.spacer} ${post.cover ? style.background : ''}`}></div> <section className={`${style.block} block`}> <div className='container'> + <TimeBlock mtime={post.mtime} otime={post.otime} /> <ReactMarkdown>{post.content}</ReactMarkdown> </div> </section> diff --git a/pages/posts/index.tsx b/pages/posts/index.tsx index 058afa0..fbae0cc 100644 --- a/pages/posts/index.tsx +++ b/pages/posts/index.tsx @@ -30,7 +30,7 @@ function Posts() { return <tr key={i} style={{ alignItems: 'center' }}> <td style={{ display: 'inline-block', textAlign: 'right', fontSize: '0.9rem' }}> <div style={{ fontStyle: 'italics', fontSize: '.8rem' }}>{ - post.mtime && `Updated ${date.toRelativeDate(new Date(post.mtime))}` + post.mtime && (post.mtime != post.otime) && `Updated ${date.toRelativeDate(new Date(post.mtime))}` }</div> <div>{date.toRelativeDate(new Date(post.otime))}</div> </td> diff --git a/pages/sitemap.tsx b/pages/sitemap.tsx index 6f73c29..a723cd1 100644 --- a/pages/sitemap.tsx +++ b/pages/sitemap.tsx @@ -9,11 +9,13 @@ function traverseMap(head: Site, cwd = '', depth = 0) { let elements = []; for (const [slug, info] of Object.entries(head.subpages)) { const path = `${cwd}/${slug}`; - const children = (<><ul> {traverseMap(info, path, depth + 1)}</ul></>); + const children = (<><dl style={{marginLeft: '3rem'}}> {traverseMap(info, path, depth + 1)}</dl></>); elements.push(<> - <li> - <Link className='button' href={path}>{info.title}</Link> {children} - </li> + <> + <dt>{info.title}</dt> + <dd><Link href={path}>{path}</Link></dd> + {children} + </> </>); } return elements; @@ -23,7 +25,7 @@ function SiteMapPage() { return <Layout> - <ul>{traverseMap(SiteMap)}</ul> + <dl>{traverseMap(SiteMap)}</dl> </Layout>; } diff --git a/public/notes.json b/public/notes.json index 60a5501..fbb306b 100644 --- a/public/notes.json +++ b/public/notes.json @@ -1 +1 @@ -{"mos-6502":{"title":"MOS 6502 Microprocessor","mtime":"2023-10-29T18:05:52.440Z"},"nintendo-switch":{"title":"Nintendo Switch","mtime":"2023-10-29T18:06:23.793Z"},"steam-deck":{"title":"Steam Deck","mtime":"2023-11-01T22:27:06.480Z"},"steam":{"title":"Steam Client","mtime":"2023-10-29T18:06:53.897Z"},"zilog-z80":{"title":"Zilog Z80 Microprocessor","mtime":"2023-10-29T18:07:08.580Z"}} \ No newline at end of file +{"mos-6502":{"title":"MOS 6502 Microprocessor","mtime":"2023-10-29T18:05:52.439Z"},"zilog-z80":{"title":"Zilog Z80 Microprocessor","mtime":"2023-10-29T18:07:08.579Z"},"programming-resources":{"title":"Programming Resources","mtime":"2024-02-13T21:59:46.795Z"},"steam":{"title":"Steam Client","mtime":"2024-02-13T22:34:17.609Z"},"nintendo":{"title":"Nintendo Consoles","mtime":"2024-02-13T22:45:34.306Z"},"steam-deck":{"title":"Steam Deck","mtime":"2024-02-13T22:53:51.919Z"}} \ No newline at end of file diff --git a/public/sitemap.json b/public/sitemap.json index 09c5674..cb3dfef 100644 --- a/public/sitemap.json +++ b/public/sitemap.json @@ -1 +1 @@ -{"title":"PaulW.XYZ","subpages":{"posts":{"title":"Posts","subpages":{}},"notes":{"title":"Notes","subpages":{"mos-6502":{"title":"MOS 6502 Microprocessor","mtime":"2023-10-29T18:05:52.440Z"},"nintendo-switch":{"title":"Nintendo Switch","mtime":"2023-10-29T18:06:23.793Z"},"steam-deck":{"title":"Steam Deck","mtime":"2023-10-29T18:06:45.197Z"},"steam":{"title":"Steam Client","mtime":"2023-10-29T18:06:53.897Z"},"zilog-z80":{"title":"Zilog Z80 Microprocessor","mtime":"2023-10-29T18:07:08.580Z"}}},"about":{"title":"About"},"sitemap":{"title":"Site Map"}}} \ No newline at end of file +{"title":"PaulW.XYZ","subpages":{"posts":{"title":"Posts","subpages":{}},"notes":{"title":"Notes","subpages":{"mos-6502":{"title":"MOS 6502 Microprocessor","mtime":"2023-10-29T18:05:52.439Z"},"zilog-z80":{"title":"Zilog Z80 Microprocessor","mtime":"2023-10-29T18:07:08.579Z"},"programming-resources":{"title":"Programming Resources","mtime":"2024-02-13T21:59:46.795Z"},"steam":{"title":"Steam Client","mtime":"2024-02-13T22:34:17.609Z"},"nintendo":{"title":"Nintendo Consoles","mtime":"2024-02-13T22:45:34.306Z"},"steam-deck":{"title":"Steam Deck","mtime":"2024-02-13T22:53:51.919Z"}}},"about":{"title":"About"},"sitemap":{"title":"Site Map"}}} \ No newline at end of file diff --git a/scripts/generate-metadata.js b/scripts/generate-metadata.js index 56e72f4..7c5f286 100644 --- a/scripts/generate-metadata.js +++ b/scripts/generate-metadata.js @@ -2,12 +2,12 @@ const fs = require('fs/promises'); const { createReadStream } = require('fs'); const path = require('path'); const readline = require('readline/promises'); -const { info } = require('console'); +// const { info } = require('console'); async function readFirstLines(filePath, lineCount = 1) { return new Promise((resolve, reject) => { try { - const stream = createReadStream(filePath, 'utf-8'); + const stream = createReadStream(filePath, { encoding: 'utf-8' }); const rl = readline.createInterface({ input: stream }); let counter = 0; const lines = []; diff --git a/styles/global.css b/styles/global.css index a454e17..71cd4aa 100644 --- a/styles/global.css +++ b/styles/global.css @@ -296,9 +296,9 @@ li { position: relative; } -@media screen and (min-width: 1018px) { +@media screen and (min-width: 818px) { .container { - max-width: 1018px; + max-width: 818px; margin: 0 auto; position: relative; } diff --git a/styles/post.module.css b/styles/post.module.css index e75570b..d335030 100644 --- a/styles/post.module.css +++ b/styles/post.module.css @@ -19,8 +19,8 @@ background-color: rgba(13, 17, 23, 0.97); margin: 0 auto; border-radius: 0; - font-size: 1.25rem; - line-height: 2rem; + font-size: 1.4rem; + line-height: 2.5rem; padding: 2rem 1rem; } diff --git a/styles/recent-posts.module.css b/styles/recent-posts.module.css index d58212f..78dbe4b 100644 --- a/styles/recent-posts.module.css +++ b/styles/recent-posts.module.css @@ -30,33 +30,16 @@ } .postTitle { - font-family: 'EB Garamond', 'Garamond', 'Times New Roman', Times, serif; flex: 1 1 60%; padding: .25rem 0.75rem; } -.postTitle a { - text-decoration: none; - border: 1px dotted transparent; - transition: border-width 100ms ease-in-out; -} - -.postTitle a:hover { - text-decoration: none; - border-bottom: 1px dotted var(--link-color); -} - -.postTitle a:focus { - text-decoration: none; - border: 1px dotted var(--link-color); -} - .postDate { flex: 1 1; display: inline-block; text-align: right; font-style: italic; - font-size: 0.9rem; + font-size: 1rem; padding: .25rem 0.50rem; } @@ -66,4 +49,4 @@ .more a { text-decoration: none; -} \ No newline at end of file +}