diff --git a/.github/workflows/pipeline.yaml b/.github/workflows/pipeline.yaml index df56c0f..8cc9e5f 100644 --- a/.github/workflows/pipeline.yaml +++ b/.github/workflows/pipeline.yaml @@ -66,14 +66,14 @@ jobs: - name: Cache pytest uses: actions/cache@v4.0.2 with: - path: .pytest_cache key: pytest-${{ github.head_ref || github.ref_name }}-${{ hashFiles('requirements-dev.txt') }} + path: .pytest_cache - name: Cache Ruff uses: actions/cache@v4.0.2 with: - path: .ruff_cache key: ruff-${{ github.head_ref || github.ref_name }}-${{ hashFiles('requirements-dev.txt') }} + path: .ruff_cache - name: Set up dependencies run: make install-deps @@ -86,6 +86,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v4.3.6 + if: always() with: compression-level: 9 name: test-results diff --git a/Makefile b/Makefile index 7117639..99fe8cc 100644 --- a/Makefile +++ b/Makefile @@ -85,10 +85,10 @@ test-static-server: test-unit-run: @echo "➡️ Unit tests (Pytest)..." - pytest \ + python3 -m pytest \ --junit-xml=test-reports/$(version_full).xml \ --maxprocesses=4 \ - -n logical \ + -n=logical \ tests/*.py dev: diff --git a/app/helpers/resources.py b/app/helpers/resources.py index bf3bb6e..0288625 100644 --- a/app/helpers/resources.py +++ b/app/helpers/resources.py @@ -1,9 +1,14 @@ +import asyncio import hashlib -from os.path import join +from collections.abc import AsyncGenerator +from contextlib import asynccontextmanager +from datetime import UTC, datetime, timedelta +from os.path import dirname, join from pathlib import Path import click -from aiofiles.os import makedirs, path +from aiofiles import open +from aiofiles.os import makedirs, path, remove def dir_tests(sub: str) -> str: @@ -64,12 +69,15 @@ async def cache_dir() -> str: """ Get the path to the cache directory. + If the directory does not exist, it will be created. + See: https://click.palletsprojects.com/en/8.1.x/api/#click.get_app_dir """ + # Resolve res = await path.abspath(click.get_app_dir("scrape-it-now")) # Create if not exists - if not await path.exists(res): - await makedirs(res) + await makedirs(res, exist_ok=True) + # Return return res @@ -94,3 +102,53 @@ async def local_disk_cache_path() -> str: Get the path to the local disk persistence. """ return join(await cache_dir(), "local_disk") + + +@asynccontextmanager +async def file_lock(file_path: str, timeout: int = 60) -> AsyncGenerator[None, None]: # noqa: ASYNC109 + """ + Lock a file for exclusive access. + + File path is built with `.lock` appended to the file path. Timeout is in seconds. If the folder does not exist, it will be created. + """ + full_path = await path.abspath(file_path) + lock_file = f"{full_path}.lock" + + # Create the directory if it doesn't exist + await makedirs(dirname(full_path), exist_ok=True) + + # Wait until the lock file is removed + while await path.exists(lock_file): + # Wait a bit to now overwhelm the CPU + await asyncio.sleep(0.1) + + try: + # Check if the lock file has been there for too long + if ( + datetime.now(UTC) + - datetime.fromtimestamp(await path.getmtime(lock_file), UTC) + ) > timedelta(seconds=timeout): + # Run anyway, the initial worker may have crashed, and the other workers are waiting but *would* have to wait again because of the lock file timestamp update + break + except FileNotFoundError: + # The lock file was removed, continue + break + + # Create the empty lock file + async with open( + encoding="utf-8", + file=lock_file, + mode="a", + ) as f: + await f.write("a") + + try: + # Return to the caller + yield + + finally: + try: + # Remove the lock file + await remove(lock_file) + except FileNotFoundError: + pass diff --git a/app/persistence/local_disk.py b/app/persistence/local_disk.py index 0c91fc7..20cc750 100644 --- a/app/persistence/local_disk.py +++ b/app/persistence/local_disk.py @@ -16,7 +16,7 @@ from pydantic import BaseModel, Field from app.helpers.logging import logger -from app.helpers.resources import local_disk_cache_path +from app.helpers.resources import file_lock, local_disk_cache_path from app.models.message import Message from app.persistence.iblob import ( BlobAlreadyExistsError, @@ -69,8 +69,8 @@ async def lease_blob( lease_file = await self._lease_path(blob) - # Ensure only this worker accesses the lease - async with self._file_lock(lease_file): + # Ensure only one worker is updating the lease + async with file_lock(lease_file): # Skip if the lease file already exists and is not expired if await path.exists(lease_file): try: @@ -231,36 +231,6 @@ async def delete_container( await rmdir(join(root_name, dir_name)) logger.info('Deleted Local Disk Blob "%s"', self._config.name) - @asynccontextmanager - async def _file_lock(self, file_path: str) -> AsyncGenerator[None, None]: - full_path = await path.abspath(file_path) - lock_file = f"{full_path}.lock" - - # Create the directory if it doesn't exist - await makedirs(dirname(full_path), exist_ok=True) - - # Wait until the lock file is removed - while await path.exists(lock_file): # noqa: ASYNC110 - await asyncio.sleep(0.1) - - # Create the empty lock file - async with open( - file=lock_file, - mode="wb", - ) as _: - pass - - try: - # Return to the caller - yield - - finally: - try: - # Remove the lock file - await remove(lock_file) - except FileNotFoundError: - pass - async def _lease_path(self, blob: str) -> str: working_path = await self._config.working_path() return await path.abspath(join(working_path, f"{blob}.lease")) diff --git a/app/scrape.py b/app/scrape.py index ff11212..9f75c7a 100644 --- a/app/scrape.py +++ b/app/scrape.py @@ -34,6 +34,7 @@ from app.helpers.resources import ( browsers_install_path, dir_resources, + file_lock, hash_url, index_queue_name, pandoc_install_path, @@ -811,7 +812,7 @@ def _network_used_callback(size_bytes: int) -> None: res = await page.goto( url_clean.geturl(), referer=referrer, - timeout=30000, # 30 seconds + timeout=60000, # 1 min ) except TimeoutError: # TODO: Retry maybe a few times for timeout errors? return _generic_error( @@ -925,11 +926,20 @@ def _network_used_callback(size_bytes: int) -> None: # Extract text content # TODO: Make it async with a wrapper try: + # Remove "src" attributes to avoid downloading external resources + full_html_minus_resources = full_html + for attribute in ("src", "srcset"): + full_html_minus_resources = re.sub( + rf"{attribute}=\"[^\"].*?\"", # Match attribute + f'{attribute}=""', # Replace with empty string + full_html_minus_resources, + ) + # Convert HTML to Markdown full_markdown = convert_text( format="html", # Input is HTML sandbox=True, # Enable sandbox mode, we don't know what we are scraping - source=full_html, + source=full_html_minus_resources, to="markdown-fenced_divs-native_divs-raw_html-bracketed_spans-native_spans-link_attributes-header_attributes-inline_code_attributes", extra_args=[ "--embed-resources=false", @@ -953,9 +963,18 @@ def _network_used_callback(size_bytes: int) -> None: full_markdown, ) + # Remove empty images + full_markdown = full_markdown.replace("![]()", "") + + # Remove empty links + full_markdown = full_markdown.replace("[]()", "") + # Clean up by removing double newlines full_markdown = re.sub(r"\n\n+", "\n\n", full_markdown) + # Strip + full_markdown = full_markdown.strip() + except ( RuntimeError ) as e: # pypandoc raises a RuntimeError if Pandoc returns one @@ -1012,14 +1031,18 @@ async def _extract_meta( """ Extract a meta tag from an element. - Name and content are returned. Other attributes are ignored. + Name and content are returned. Other attributes are ignored. If the browser fails to extract the attributes, None is returned. See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attributes """ - name, content = await asyncio.gather( - element.get_attribute("name"), - element.get_attribute("content"), - ) + try: + name, content = await asyncio.gather( + element.get_attribute("name"), + element.get_attribute("content"), + ) + except TimeoutError: + logger.debug("Timeout for selecting meta tag attributes", exc_info=True) + return if not name: return return (name, content or None) @@ -1041,7 +1064,7 @@ async def _extract_meta( full_page=True, # Store the full page quality=70, # Quality is not a concern, let's keep it cheap to store scale="css", # Keep the same zoom level for all screenshots across random viewports - timeout=30000, # 30 seconds + timeout=60000, # 1 min type="jpeg", # JPEG is good enough for screenshots ) # Callback to save the screenshot @@ -1108,10 +1131,13 @@ async def run( # noqa: PLR0913 browser_name = "chromium" async with async_playwright() as p: browser_type = getattr(p, browser_name) - await _install_browser(browser_type) - # Install Pandoc - await _install_pandoc() + await asyncio.gather( + # Install Playwright + _install_browser(browser_type), + # Install Pandoc + _install_pandoc(), + ) # Parse cache_refresh cache_refresh_parsed = timedelta(hours=cache_refresh) @@ -1222,17 +1248,19 @@ async def _install_browser( # Get location of Playwright driver driver_executable, driver_cli = compute_driver_executable() - # Build the command arguments - args = [driver_executable, driver_cli, "install", browser_type.name] - if with_deps: - args.append("--with-deps") - - # Run - proc = await asyncio.create_subprocess_shell( - cmd=" ".join(args), - env=get_driver_env(), - ) - await proc.wait() + # Ensure only one worker is installing the browser + async with file_lock(driver_executable): + # Build the command arguments + args = [driver_executable, driver_cli, "install", browser_type.name] + if with_deps: + args.append("--with-deps") + + # Run + proc = await asyncio.create_subprocess_shell( + cmd=" ".join(args), + env=get_driver_env(), + ) + await proc.wait() # Display error logs if any err = proc.stderr @@ -1254,12 +1282,8 @@ async def _get_broswer( """ Launch a browser instance. """ - # Using the application path not the default one from the SDK - playwright_path = await browsers_install_path() - # Launch the browser browser = await browser_type.launch( - downloads_path=playwright_path, chromium_sandbox=True, # Enable the sandbox for security, we don't know what we are scraping # See: https://github.com/microsoft/playwright/blob/99a36310570617222290c09b96a2026beb8b00f9/packages/playwright-core/src/server/chromium/chromium.ts args=[ @@ -1282,12 +1306,14 @@ async def _install_pandoc() -> None: # Get location of Pandoc driver install_path = await pandoc_install_path(version) - # Download Pandoc if not installed - ensure_pandoc_installed( - delete_installer=True, - targetfolder=install_path, - version=version, - ) + # Ensure only one worker is installing Pandoc + async with file_lock(install_path): + # Download Pandoc if not installed + ensure_pandoc_installed( + delete_installer=True, + targetfolder=install_path, + version=version, + ) # Add installation path to the environment # See: https://github.com/JessicaTegner/pypandoc?tab=readme-ov-file#specifying-the-location-of-pandoc-binaries diff --git a/cicd/test-unit-ci.sh b/cicd/test-unit-ci.sh index 0818712..1f3deaf 100644 --- a/cicd/test-unit-ci.sh +++ b/cicd/test-unit-ci.sh @@ -1,7 +1,7 @@ #!/bin/bash # Start the first command in the background -make test-static-server & +make test-static-server 1>/dev/null 2>&1 & # Capture the PID of the background process UNIT_RUN_PID=$! diff --git a/pyproject.toml b/pyproject.toml index 4e5ba1a..5038a52 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,12 @@ py-modules = [ generate-hashes = true strip-extras = true +[tool.pytest.ini_options] +asyncio_mode = "auto" +junit_suite_name = "scrape-it-now" +log_file = "test-reports/last-logs.txt" +log_file_level = "INFO" + [tool.deptry] ignore_notebooks = true pep621_dev_dependency_groups = ["dev"] diff --git a/requirements-dev.txt b/requirements-dev.txt index 0768046..9aa0ce0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -543,9 +543,9 @@ httpx==0.27.0 \ --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 # via openai -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via # anyio # httpx diff --git a/requirements.txt b/requirements.txt index bcf39da..2f731e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -527,9 +527,9 @@ httpx==0.27.0 \ --hash=sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5 \ --hash=sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5 # via openai -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via # anyio # httpx diff --git a/tests/blob.py b/tests/blob.py index 656fc3d..af8519f 100644 --- a/tests/blob.py +++ b/tests/blob.py @@ -25,7 +25,6 @@ ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") @pytest.mark.repeat(10) # Catch multi-threading and concurrency issues async def test_acid(provider: BlobProvider) -> None: # Init values @@ -105,7 +104,6 @@ async def test_acid(provider: BlobProvider) -> None: ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") @pytest.mark.repeat(10) # Catch multi-threading and concurrency issues async def test_lease(provider: BlobProvider) -> None: # Init values @@ -245,7 +243,6 @@ async def test_lease(provider: BlobProvider) -> None: ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") @pytest.mark.repeat(5) # Catch multi-threading and concurrency issues async def test_upload_many(provider: BlobProvider) -> None: # Init values diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..c26328a --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,27 @@ +import asyncio +from collections.abc import AsyncGenerator + +import pytest +from playwright.async_api import Browser, async_playwright + +from app.scrape import _get_broswer, _install_browser, _install_pandoc + + +@pytest.fixture +async def browser() -> AsyncGenerator[Browser, None]: + """ + Fixture to provide a Playwright browser for each test. + """ + async with async_playwright() as p: + browser_type = p.chromium + + # Make sure the browser and pandoc are installed + await asyncio.gather( + # Install Playwright + _install_browser(browser_type), + # Install Pandoc + _install_pandoc(), + ) + + async with await _get_broswer(browser_type) as browser: + yield browser diff --git a/tests/queue.py b/tests/queue.py index 7fb19b1..4bdad43 100644 --- a/tests/queue.py +++ b/tests/queue.py @@ -18,7 +18,6 @@ ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") @pytest.mark.repeat(10) # Catch multi-threading and concurrency issues async def test_acid(provider: QueueProvider) -> None: # Init values @@ -56,6 +55,8 @@ async def test_acid(provider: QueueProvider) -> None: max_messages=10, visibility_timeout=5, ): + if i == 0: # Save first message + received_message = message # Check message content assert message.content == contents[i], "Message content mismatch" i += 1 @@ -113,7 +114,6 @@ async def test_acid(provider: QueueProvider) -> None: ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") @pytest.mark.repeat(10) # Catch multi-threading and concurrency issues async def test_send_many(provider: QueueProvider) -> None: # Init values diff --git a/tests/resources.py b/tests/resources.py new file mode 100644 index 0000000..5379162 --- /dev/null +++ b/tests/resources.py @@ -0,0 +1,72 @@ +import asyncio +from os.path import join +from pathlib import Path + +from aiofiles.os import path + +from app.helpers.resources import file_lock + + +async def test_lock_file_exists(tmp_path: Path) -> None: + """ + Test that the lock file is created. + """ + tmp_file = join(tmp_path, "dummy") + async with file_lock(str(tmp_file)): + assert await path.exists(f"{await path.abspath(tmp_file)}.lock") + + +async def test_lock_file_removed(tmp_path: Path) -> None: + """ + Test that the lock file is removed after the context manager exits. + """ + tmp_file = join(tmp_path, "dummy") + async with file_lock(str(tmp_file)): + pass + + assert not await path.exists(f"{await path.abspath(tmp_file)}.lock") + + +async def test_lock_path_released(tmp_path: Path) -> None: + """ + Test tat the lock can be acquired again after the context manager exits. + """ + async with asyncio.timeout(5): + async with file_lock(str(tmp_path)): + pass + + async with asyncio.timeout(5): + async with file_lock(str(tmp_path)): + pass + + +async def test_lock_path_concurrent_simple(tmp_path: Path) -> None: + """ + Test that the lock cannot be acquired concurrently before the configured timeout. + """ + async with file_lock(str(tmp_path)): + try: + async with asyncio.timeout(5): + async with file_lock( + str(tmp_path), + timeout=10, + ): + raise AssertionError("Should not be able to acquire lock") + except TimeoutError: + pass + + +async def test_lock_path_concurrent_timeout(tmp_path: Path) -> None: + """ + Test that the lock can be acquired concurrently after the configured timeout. + """ + async with file_lock(str(tmp_path)): + try: + async with asyncio.timeout(10): + async with file_lock( + str(tmp_path), + timeout=5, + ): + pass + except TimeoutError: + raise AssertionError("Should be able to acquire lock") diff --git a/tests/scrape.py b/tests/scrape.py index d516290..2af930e 100644 --- a/tests/scrape.py +++ b/tests/scrape.py @@ -8,7 +8,7 @@ import pytest from aiofiles import open from isodate import UTC -from playwright.async_api import ViewportSize, async_playwright +from playwright.async_api import Browser, ViewportSize from app.helpers.persistence import blob_client, queue_client from app.helpers.resources import dir_tests @@ -17,13 +17,7 @@ Provider as BlobProvider, ) from app.persistence.iqueue import Provider as QueueProvider -from app.scrape import ( - _get_broswer, - _install_browser, - _install_pandoc, - _queue, - _scrape_page, -) +from app.scrape import _queue, _scrape_page DEFAULT_TIMEZONE = "Europe/Moscow" DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" @@ -45,9 +39,9 @@ ], ids=lambda x: x, ) -@pytest.mark.asyncio(scope="session") async def test_scrape_page_website( website: str, + browser: Browser, ) -> None: """ Test a real website page against the expected Markdown content. @@ -61,47 +55,35 @@ async def test_scrape_page_website( url=f"{LOCALHOST_URL}/{website}", ) - # Init Playwright context - async with async_playwright() as p: - browser_type = p.chromium - - # Make sure the browser and pandoc are installed - await _install_browser(browser_type) - await _install_pandoc() - - # Launch the browser - browser = await _get_broswer(browser_type) - - # Process the item - page = await _scrape_page( - browser=browser, - image_callback=_dummy_callback, - previous_etag=None, - referrer=item.referrer, - save_images=False, - save_screenshot=False, - screenshot_callback=_dummy_callback, - timezones=[DEFAULT_TIMEZONE], - url=item.url, - user_agents=[DEFAULT_USER_AGENT], - viewports=[DEFAULT_VIEWPORT], - ) + # Process the item + page = await _scrape_page( + browser=browser, + image_callback=_dummy_callback, + previous_etag=None, + referrer=item.referrer, + save_images=False, + save_screenshot=False, + screenshot_callback=_dummy_callback, + timezones=[DEFAULT_TIMEZONE], + url=item.url, + user_agents=[DEFAULT_USER_AGENT], + viewports=[DEFAULT_VIEWPORT], + ) - # Check page is not None - assert page is not None, "Page should not be None" + # Check page is not None + assert page is not None, "Page should not be None" - # Check Markdown content - async with open( - encoding="utf-8", - file=join(dir_tests("websites"), f"{website}.md"), - mode="r", - ) as f: - expected = await f.read() - assert page.content == expected.rstrip(), "Markdown content should match" + # Check Markdown content + async with open( + encoding="utf-8", + file=join(dir_tests("websites"), f"{website}.md"), + mode="r", + ) as f: + expected = await f.read() + assert page.content == expected.strip(), "Markdown content should match" -@pytest.mark.asyncio(scope="session") -async def test_scrape_page_links() -> None: +async def test_scrape_page_links(browser: Browser) -> None: """ Test a page with links against the expected links and title. """ @@ -112,55 +94,43 @@ async def test_scrape_page_links() -> None: url=f"{LOCALHOST_URL}/links.html", ) - # Init Playwright context - async with async_playwright() as p: - browser_type = p.chromium - - # Make sure the browser and pandoc are installed - await _install_browser(browser_type) - await _install_pandoc() - - # Launch the browser - browser = await _get_broswer(browser_type) - - # Process the item - page = await _scrape_page( - browser=browser, - image_callback=_dummy_callback, - previous_etag=None, - referrer=item.referrer, - save_images=False, - save_screenshot=False, - screenshot_callback=_dummy_callback, - timezones=[DEFAULT_TIMEZONE], - url=item.url, - user_agents=[DEFAULT_USER_AGENT], - viewports=[DEFAULT_VIEWPORT], - ) + # Process the item + page = await _scrape_page( + browser=browser, + image_callback=_dummy_callback, + previous_etag=None, + referrer=item.referrer, + save_images=False, + save_screenshot=False, + screenshot_callback=_dummy_callback, + timezones=[DEFAULT_TIMEZONE], + url=item.url, + user_agents=[DEFAULT_USER_AGENT], + viewports=[DEFAULT_VIEWPORT], + ) + + # Check page is not None + assert page is not None, "Page should not be None" + + # Check links + assert set(page.links) == { + # Link 1 + f"{LOCALHOST_URL}/link_1", + # Link 2 + LOCALHOST_URL, + # Link 3 + f"{LOCALHOST_URL}/abc", + # Link 4 + "http://link_4/../abc", + # Link 5 + f"{item.url}/link_5", + }, "Links should match" - # Check page is not None - assert page is not None, "Page should not be None" - - # Check links - assert set(page.links) == { - # Link 1 - f"{LOCALHOST_URL}/link_1", - # Link 2 - LOCALHOST_URL, - # Link 3 - f"{LOCALHOST_URL}/abc", - # Link 4 - "http://link_4/../abc", - # Link 5 - f"{item.url}/link_5", - }, "Links should match" - - # Check title - assert page.title == "Test links", "Title should match" - - -@pytest.mark.asyncio(scope="session") -async def test_scrape_page_paragraphs() -> None: + # Check title + assert page.title == "Test links", "Title should match" + + +async def test_scrape_page_paragraphs(browser: Browser) -> None: """ Test a page with paragraphs against the expected paragraphs and title. """ @@ -171,50 +141,38 @@ async def test_scrape_page_paragraphs() -> None: url=f"{LOCALHOST_URL}/paragraphs.html", ) - # Init Playwright context - async with async_playwright() as p: - browser_type = p.chromium - - # Make sure the browser and pandoc are installed - await _install_browser(browser_type) - await _install_pandoc() - - # Launch the browser - browser = await _get_broswer(browser_type) - - # Process the item - page = await _scrape_page( - browser=browser, - image_callback=_dummy_callback, - previous_etag=None, - referrer=item.referrer, - save_images=False, - save_screenshot=False, - screenshot_callback=_dummy_callback, - timezones=[DEFAULT_TIMEZONE], - url=item.url, - user_agents=[DEFAULT_USER_AGENT], - viewports=[DEFAULT_VIEWPORT], - ) + # Process the item + page = await _scrape_page( + browser=browser, + image_callback=_dummy_callback, + previous_etag=None, + referrer=item.referrer, + save_images=False, + save_screenshot=False, + screenshot_callback=_dummy_callback, + timezones=[DEFAULT_TIMEZONE], + url=item.url, + user_agents=[DEFAULT_USER_AGENT], + viewports=[DEFAULT_VIEWPORT], + ) - # Check page is not None - assert page is not None, "Page should not be None" + # Check page is not None + assert page is not None, "Page should not be None" - # Check content - async with open( - encoding="utf-8", - file=join(dir_tests("websites"), "paragraphs.html.md"), - mode="r", - ) as f: - expected = await f.read() - assert page.content == expected.rstrip(), "Content should match" + # Check content + async with open( + encoding="utf-8", + file=join(dir_tests("websites"), "paragraphs.html.md"), + mode="r", + ) as f: + expected = await f.read() + assert page.content == expected.strip(), "Content should match" - # Check title - assert page.title == "Complex paragraph example", "Title should match" + # Check title + assert page.title == "Complex paragraph example", "Title should match" -@pytest.mark.asyncio(scope="session") -async def test_scrape_page_images() -> None: +async def test_scrape_page_images(browser: Browser) -> None: """ Test a page with images against the expected images and title. """ @@ -225,56 +183,44 @@ async def test_scrape_page_images() -> None: url=f"{LOCALHOST_URL}/images.html", ) - # Init Playwright context - async with async_playwright() as p: - browser_type = p.chromium - - # Make sure the browser and pandoc are installed - await _install_browser(browser_type) - await _install_pandoc() - - # Launch the browser - browser = await _get_broswer(browser_type) - - async def _image_callback( - body: bytes, - content_type: str | None, - image: ScrapedImageModel, - ) -> None: - assert content_type == "image/jpeg", "Content type should match" - assert image.url == f"{LOCALHOST_URL}/images/banana.jpg", "URL should match" - - async with open( - file=join(dir_tests("websites"), "images", "banana.jpg"), - mode="r", - ) as f: - expected = await f.read() - assert body == expected, "Content should match" - - # Process the item - page = await _scrape_page( - browser=browser, - image_callback=_image_callback, - previous_etag=None, - referrer=item.referrer, - save_images=False, - save_screenshot=False, - screenshot_callback=_dummy_callback, - timezones=[DEFAULT_TIMEZONE], - url=item.url, - user_agents=[DEFAULT_USER_AGENT], - viewports=[DEFAULT_VIEWPORT], - ) + async def _image_callback( + body: bytes, + content_type: str | None, + image: ScrapedImageModel, + ) -> None: + assert content_type == "image/jpeg", "Content type should match" + assert image.url == f"{LOCALHOST_URL}/images/banana.jpg", "URL should match" + + async with open( + file=join(dir_tests("websites"), "images", "banana.jpg"), + mode="r", + ) as f: + expected = await f.read() + assert body == expected, "Content should match" + + # Process the item + page = await _scrape_page( + browser=browser, + image_callback=_image_callback, + previous_etag=None, + referrer=item.referrer, + save_images=False, + save_screenshot=False, + screenshot_callback=_dummy_callback, + timezones=[DEFAULT_TIMEZONE], + url=item.url, + user_agents=[DEFAULT_USER_AGENT], + viewports=[DEFAULT_VIEWPORT], + ) - # Check page is not None - assert page is not None, "Page should not be None" + # Check page is not None + assert page is not None, "Page should not be None" - # Check title - assert page.title == "Test images", "Title should match" + # Check title + assert page.title == "Test images", "Title should match" -@pytest.mark.asyncio(scope="session") -async def test_scrape_page_timeout() -> None: +async def test_scrape_page_timeout(browser: Browser) -> None: """ Test a page with a timeout against the expected timeout. """ @@ -283,54 +229,43 @@ async def test_scrape_page_timeout() -> None: depth=0, referrer="https://google.com", url="http://localhost:1234" ) - # Init Playwright context - async with async_playwright() as p: - browser_type = p.chromium - - # Make sure the browser and pandoc are installed - await _install_browser(browser_type) - await _install_pandoc() - - # Launch the browser - browser = await _get_broswer(browser_type) - - # Process the item - start_time = datetime.now(UTC) - page = await _scrape_page( - browser=browser, - image_callback=_dummy_callback, - previous_etag=None, - referrer=item.referrer, - save_images=False, - save_screenshot=False, - screenshot_callback=_dummy_callback, - timezones=[DEFAULT_TIMEZONE], - url=item.url, - user_agents=[DEFAULT_USER_AGENT], - viewports=[DEFAULT_VIEWPORT], - ) - end_time = datetime.now(UTC) - took_time = end_time - start_time + # Process the item + start_time = datetime.now(UTC) + page = await _scrape_page( + browser=browser, + image_callback=_dummy_callback, + previous_etag=None, + referrer=item.referrer, + save_images=False, + save_screenshot=False, + screenshot_callback=_dummy_callback, + timezones=[DEFAULT_TIMEZONE], + url=item.url, + user_agents=[DEFAULT_USER_AGENT], + viewports=[DEFAULT_VIEWPORT], + ) + end_time = datetime.now(UTC) + took_time = end_time - start_time - # Check timeout duration - assert took_time > timedelta(seconds=29) and took_time < timedelta( - seconds=35 - ), "Timeout should be around 30 secs" + # Check timeout duration + assert took_time > timedelta(seconds=59) and took_time < timedelta( + seconds=65 + ), "Timeout should be around 1 min" - # Check page is not None - assert page is not None, "Page should not be None" + # Check page is not None + assert page is not None, "Page should not be None" - # Check status - assert page.status == -1, "Status should be -1" + # Check status + assert page.status == -1, "Status should be -1" - # Check HTML - assert not page.raw, "HTML should be empty" + # Check HTML + assert not page.raw, "HTML should be empty" - # Check content - assert not page.content, "Content should be empty" + # Check content + assert not page.content, "Content should be empty" - # Check title - assert not page.title, "Title should be empty" + # Check title + assert not page.title, "Title should be empty" @pytest.mark.parametrize( @@ -349,7 +284,6 @@ async def test_scrape_page_timeout() -> None: ], ids=lambda x: x.value, ) -@pytest.mark.asyncio(scope="session") async def test_queue_simple( blob_provider: BlobProvider, queue_provider: QueueProvider, @@ -388,7 +322,7 @@ async def test_queue_simple( deph=test_depth, item_id=test_id, in_queue=in_queue, - max_depth=0, + max_depth=1, referrer=test_referrer, urls={test_url}, whitelist={}, @@ -404,7 +338,7 @@ async def test_queue_simple( ): model = ScrapedQueuedModel.model_validate_json(message.content) # Check depth - assert model.depth == test_depth, "Depth should be the same" + assert model.depth == test_depth + 1, "Depth should be the same" # Check referrer assert model.referrer == test_referrer, "Referer should be the same" # Check URL diff --git a/tests/websites/google.html.md b/tests/websites/google.html.md index c7a4d35..c4d576c 100644 --- a/tests/websites/google.html.md +++ b/tests/websites/google.html.md @@ -6,7 +6,7 @@ Skip to main content[Accessibility help](https://support.google.com/websearch/an Accessibility feedback -[![Google](./google/googlelogo_light_color_92x30dp.png)](https://www.google.com/webhp?hl=en&sa=X&ved=0ahUKEwjqwcCgg4mIAxVqcKQEHWSHCUYQPAgI "Go to Google Home") +[![Google]()](https://www.google.com/webhp?hl=en&sa=X&ved=0ahUKEwjqwcCgg4mIAxVqcKQEHWSHCUYQPAgI "Go to Google Home") Press / to jump to the search box @@ -98,7 +98,7 @@ About 140,000,000 results (0.21 seconds)  Ctrl+Shift+X to select -![Google](https://fonts.gstatic.com/s/i/productlogos/googleg/v6/24px.svg) +![Google]() # Search settings @@ -168,8 +168,6 @@ What color are bananas naturally? 4:28 -![](https://fonts.gstatic.com/s/i/productlogos/youtube/v9/192px.svg) - Mashed YouTube· @@ -180,7 +178,7 @@ Aug 28, 2021 # The Real Difference Between Red And Yellow Bananas -![](https://www.gstatic.com/images/branding/product/1x/youtube_32dp.png)YouTube·Mashed·Aug 28, 2021 +YouTube·Mashed·Aug 28, 2021 In this video @@ -245,8 +243,6 @@ https://www.healthline.com › nutrition › green-bananas-\... Search for: [Is it better to eat bananas green or yellow?](/search?sca_esv=d3224e15adc24c7c&q=Is+it+better+to+eat+bananas+green+or+yellow%3F&sa=X&ved=2ahUKEwjqwcCgg4mIAxVqcKQEHWSHCUYQzmd6BAgkEAY) -![](//www.gstatic.com/ui/v1/activityindicator/loading_24.gif) - Feedback [\ @@ -408,22 +404,23 @@ YouTube · Scientific American 1. [](https://www.youtube.com/watch?v=0WCErY3OYng&t=40) + From 00:40 Why do bananas turn brown? 2. [](https://www.youtube.com/watch?v=0WCErY3OYng&t=57) + From 00:57 Melanin is part of a banana\'s defense system 3. [](https://www.youtube.com/watch?v=0WCErY3OYng&t=73) + From 01:13 Triggers of Ripening -![](https://fonts.gstatic.com/s/i/productlogos/youtube/v9/192px.svg) - Scientific American YouTube· @@ -434,7 +431,7 @@ Apr 13, 2018 # Why Do Bananas Change Color? -![](https://www.gstatic.com/images/branding/product/1x/youtube_32dp.png)YouTube·Scientific American·Apr 13, 2018 +YouTube·Scientific American·Apr 13, 2018 In this video @@ -451,8 +448,6 @@ In this video Triggers of Ripening -![](https://i.ytimg.com/vi/0WCErY3OYng/mqdefault.jpg?sqp=-oaymwEFCJQBEFM&rs=AMzJL3npWGNkEMCAQ2mRSduxEreZPZH0Fw) - [\ ](https://specialtyproduce.com/produce/Yellow_Bananas_919.php) @@ -485,8 +480,6 @@ Mar 15, 2023 --- Banana chips are yellow in color because *they are made from ba People also ask -![](//www.gstatic.com/ui/v1/activityindicator/loading_24.gif) - Feedback People also search for @@ -550,4 +543,3 @@ Updating location... [Consumer information](https://support.google.com/websearch?p=fr_consumer_info&hl=en-FR&fg=1)[Report inappropriate content](https://support.google.com/legal/answer/3110420?hl=en-FR&fg=1) Google apps - diff --git a/tests/websites/hackernews.html.md b/tests/websites/hackernews.html.md index c717394..736417d 100644 --- a/tests/websites/hackernews.html.md +++ b/tests/websites/hackernews.html.md @@ -1,209 +1,209 @@ -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| ------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------- | -| [![](./hackernews/y18.svg)](https://news.ycombinator.com/) **[Hacker News](https://news.ycombinator.com/news)** [new](https://news.ycombinator.com/newest) \| [past](https://news.ycombinator.com/front) \| [comments](https://news.ycombinator.com/newcomments) \| [ask](https://news.ycombinator.com/ask) \| [show](https://news.ycombinator.com/show) \| [jobs](https://news.ycombinator.com/jobs) \| [submit](https://news.ycombinator.com/submit) [login](https://news.ycombinator.com/login?goto=news) | -| ------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------- | -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| | -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| +----------------------:+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 1. | [](https://news.ycombinator.com/vote?id=41321063&how=up&goto=news) | [Continuous reinvention: A brief history of block storage at AWS](https://www.allthingsdistributed.com/2024/08/continuous-reinvention-a-brief-history-of-block-storage-at-aws.html) ([allthingsdistributed.com](https://news.ycombinator.com/from?site=allthingsdistributed.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 104 points by [riv991](https://news.ycombinator.com/user?id=riv991) [2 hours ago](https://news.ycombinator.com/item?id=41321063) \| [hide](https://news.ycombinator.com/hide?id=41321063&goto=news) \| [9 comments](https://news.ycombinator.com/item?id=41321063) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 2. | [](https://news.ycombinator.com/vote?id=41321981&how=up&goto=news) | [Aerc: A Well-Crafted TUI for Email](https://blog.sergeantbiggs.net/posts/aerc-a-well-crafted-tui-for-email/) ([sergeantbiggs.net](https://news.ycombinator.com/from?site=sergeantbiggs.net)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 17 points by [edward](https://news.ycombinator.com/user?id=edward) [49 minutes ago](https://news.ycombinator.com/item?id=41321981) \| [hide](https://news.ycombinator.com/hide?id=41321981&goto=news) \| [11 comments](https://news.ycombinator.com/item?id=41321981) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 3. | [](https://news.ycombinator.com/vote?id=41321936&how=up&goto=news) | [Launch HN: Arva AI (YC S24) -- AI agents for instant global KYB onboarding](https://news.ycombinator.com/item?id=41321936) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 17 points by [rhimshah](https://news.ycombinator.com/user?id=rhimshah) [55 minutes ago](https://news.ycombinator.com/item?id=41321936) \| [hide](https://news.ycombinator.com/hide?id=41321936&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41321936) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 4. | [](https://news.ycombinator.com/vote?id=41318133&how=up&goto=news) | [Show HN: A Ghidra extension for exporting parts of a program as object files](https://github.com/boricj/ghidra-delinker-extension) ([github.com/boricj](https://news.ycombinator.com/from?site=github.com/boricj)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 143 points by [boricj](https://news.ycombinator.com/user?id=boricj) [4 hours ago](https://news.ycombinator.com/item?id=41318133) \| [hide](https://news.ycombinator.com/hide?id=41318133&goto=news) \| [17 comments](https://news.ycombinator.com/item?id=41318133) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 5. | [](https://news.ycombinator.com/vote?id=41318222&how=up&goto=news) | [What is an SBAT and why does everyone suddenly care](https://mjg59.dreamwidth.org/70348.html) ([mjg59.dreamwidth.org](https://news.ycombinator.com/from?site=mjg59.dreamwidth.org)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 248 points by [todsacerdoti](https://news.ycombinator.com/user?id=todsacerdoti) [8 hours ago](https://news.ycombinator.com/item?id=41318222) \| [hide](https://news.ycombinator.com/hide?id=41318222&goto=news) \| [136 comments](https://news.ycombinator.com/item?id=41318222) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 6. | [](https://news.ycombinator.com/vote?id=41311135&how=up&goto=news) | [We don\'t know how bad most things are nor precisely how they\'re bad](https://www.lesswrong.com/posts/PJu2HhKsyTEJMxS9a/you-don-t-know-how-bad-most-things-are-nor-precisely-how) ([lesswrong.com](https://news.ycombinator.com/from?site=lesswrong.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 62 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [4 hours ago](https://news.ycombinator.com/item?id=41311135) \| [hide](https://news.ycombinator.com/hide?id=41311135&goto=news) \| [23 comments](https://news.ycombinator.com/item?id=41311135) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 7. | ![](./hackernews/s.gif) | [Vooma (YC W23) Is Hiring a Growth Lead](https://www.ycombinator.com/companies/vooma/jobs/ATEQ9kQ-growth-lead) ([ycombinator.com](https://news.ycombinator.com/from?site=ycombinator.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | [22 minutes ago](https://news.ycombinator.com/item?id=41322207) \| [hide](https://news.ycombinator.com/hide?id=41322207&goto=news) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 8. | [](https://news.ycombinator.com/vote?id=41318013&how=up&goto=news) | [Ethernet History Deepdive -- Why Do We Have Different Frame Types?](https://lostintransit.se/2024/08/21/ethernet-history-deepdive-why-do-we-have-different-frame-types/) ([lostintransit.se](https://news.ycombinator.com/from?site=lostintransit.se)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 62 points by [un_ess](https://news.ycombinator.com/user?id=un_ess) [4 hours ago](https://news.ycombinator.com/item?id=41318013) \| [hide](https://news.ycombinator.com/hide?id=41318013&goto=news) \| [19 comments](https://news.ycombinator.com/item?id=41318013) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 9. | [](https://news.ycombinator.com/vote?id=41321998&how=up&goto=news) | [Making PyPy\'s GC and JIT produce a sound \[video\]](https://www.youtube.com/watch?v=drwJBzDM1jI) ([youtube.com](https://news.ycombinator.com/from?site=youtube.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 9 points by [luu](https://news.ycombinator.com/user?id=luu) [47 minutes ago](https://news.ycombinator.com/item?id=41321998) \| [hide](https://news.ycombinator.com/hide?id=41321998&goto=news) \| [4 comments](https://news.ycombinator.com/item?id=41321998) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 10. | [](https://news.ycombinator.com/vote?id=41292757&how=up&goto=news) | [DRAKON](https://en.wikipedia.org/wiki/DRAKON) ([wikipedia.org](https://news.ycombinator.com/from?site=wikipedia.org)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 15 points by [instagraham](https://news.ycombinator.com/user?id=instagraham) [3 hours ago](https://news.ycombinator.com/item?id=41292757) \| [hide](https://news.ycombinator.com/hide?id=41292757&goto=news) \| [4 comments](https://news.ycombinator.com/item?id=41292757) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 11. | [](https://news.ycombinator.com/vote?id=41290189&how=up&goto=news) | [What If Data Is a Bad Idea?](https://schmud.de/posts/2024-08-18-data-is-a-bad-idea.html) ([schmud.de](https://news.ycombinator.com/from?site=schmud.de)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 20 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [3 hours ago](https://news.ycombinator.com/item?id=41290189) \| [hide](https://news.ycombinator.com/hide?id=41290189&goto=news) \| [2 comments](https://news.ycombinator.com/item?id=41290189) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 12. | [](https://news.ycombinator.com/vote?id=41317988&how=up&goto=news) | [Show HN: Isaiah -- open-source and self-hosted app to manage everything Docker](https://github.com/will-moss/isaiah) ([github.com/will-moss](https://news.ycombinator.com/from?site=github.com/will-moss)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 119 points by [willmoss](https://news.ycombinator.com/user?id=willmoss) [8 hours ago](https://news.ycombinator.com/item?id=41317988) \| [hide](https://news.ycombinator.com/hide?id=41317988&goto=news) \| [35 comments](https://news.ycombinator.com/item?id=41317988) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 13. | [](https://news.ycombinator.com/vote?id=41318033&how=up&goto=news) | [Hardware Virtualization](https://www.haiku-os.org/blog/dalme/2024-08-19_gsoc_2024_hardware_virtualization_final_report/) ([haiku-os.org](https://news.ycombinator.com/from?site=haiku-os.org)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 104 points by [rcarmo](https://news.ycombinator.com/user?id=rcarmo) [8 hours ago](https://news.ycombinator.com/item?id=41318033) \| [hide](https://news.ycombinator.com/hide?id=41318033&goto=news) \| [12 comments](https://news.ycombinator.com/item?id=41318033) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 14. | [](https://news.ycombinator.com/vote?id=41322297&how=up&goto=news) | [Apple splits App Store team in two, introduces new leadership](https://arstechnica.com/gadgets/2024/08/apple-says-farewell-to-its-app-store-chief-as-it-splits-his-team-in-two/) ([arstechnica.com](https://news.ycombinator.com/from?site=arstechnica.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 8 points by [LorenDB](https://news.ycombinator.com/user?id=LorenDB) [13 minutes ago](https://news.ycombinator.com/item?id=41322297) \| [hide](https://news.ycombinator.com/hide?id=41322297&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41322297) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 15. | [](https://news.ycombinator.com/vote?id=41322266&how=up&goto=news) | [Peloton to charge \$95 activation fee for used bikes](https://www.cnbc.com/2024/08/22/peloton-to-charge-95-activation-fee-for-used-bikes-.html) ([cnbc.com](https://news.ycombinator.com/from?site=cnbc.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 9 points by [speckx](https://news.ycombinator.com/user?id=speckx) [17 minutes ago](https://news.ycombinator.com/item?id=41322266) \| [hide](https://news.ycombinator.com/hide?id=41322266&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41322266) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 16. | [](https://news.ycombinator.com/vote?id=41292049&how=up&goto=news) | [How Deep Can Humans Go?](https://www.mcgill.ca/oss/article/student-contributors-did-you-know/how-deep-can-humans-really-go) ([mcgill.ca](https://news.ycombinator.com/from?site=mcgill.ca)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 16 points by [bookofjoe](https://news.ycombinator.com/user?id=bookofjoe) [3 hours ago](https://news.ycombinator.com/item?id=41292049) \| [hide](https://news.ycombinator.com/hide?id=41292049&goto=news) \| [8 comments](https://news.ycombinator.com/item?id=41292049) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 17. | [](https://news.ycombinator.com/vote?id=41292481&how=up&goto=news) | [Constraining writers in distributed systems](https://shachaf.net/w/constraining-writers-in-distributed-systems) ([shachaf.net](https://news.ycombinator.com/from?site=shachaf.net)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 7 points by [shachaf](https://news.ycombinator.com/user?id=shachaf) [2 hours ago](https://news.ycombinator.com/item?id=41292481) \| [hide](https://news.ycombinator.com/hide?id=41292481&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41292481) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 18. | [](https://news.ycombinator.com/vote?id=41285275&how=up&goto=news) | [\'Virtually intact\' wreck believed to be Royal Navy warship torpedoed in WWI](https://www.theguardian.com/uk-news/article/2024/aug/17/virtually-intact-wreck-off-scotland-believed-to-be-royal-navy-warship-torpedoed-in-wwi) ([theguardian.com](https://news.ycombinator.com/from?site=theguardian.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 7 points by [SonOfKyuss](https://news.ycombinator.com/user?id=SonOfKyuss) [3 hours ago](https://news.ycombinator.com/item?id=41285275) \| [hide](https://news.ycombinator.com/hide?id=41285275&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41285275) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 19. | [](https://news.ycombinator.com/vote?id=41312335&how=up&goto=news) | [GPU utilization can be a misleading metric](https://trainy.ai/blog/gpu-utilization-misleading) ([trainy.ai](https://news.ycombinator.com/from?site=trainy.ai)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 16 points by [roanakb](https://news.ycombinator.com/user?id=roanakb) [3 hours ago](https://news.ycombinator.com/item?id=41312335) \| [hide](https://news.ycombinator.com/hide?id=41312335&goto=news) \| [1 comment](https://news.ycombinator.com/item?id=41312335) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 20. | [](https://news.ycombinator.com/vote?id=41279166&how=up&goto=news) | [Trailer Faces HQ Dataset](https://www.justinpinkney.com/blog/2024/trailer-faces/) ([justinpinkney.com](https://news.ycombinator.com/from?site=justinpinkney.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 19 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [4 hours ago](https://news.ycombinator.com/item?id=41279166) \| [hide](https://news.ycombinator.com/hide?id=41279166&goto=news) \| [5 comments](https://news.ycombinator.com/item?id=41279166) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 21. | [](https://news.ycombinator.com/vote?id=41315359&how=up&goto=news) | [SIMD Matters: Graph Coloring](https://box2d.org/posts/2024/08/simd-matters/) ([box2d.org](https://news.ycombinator.com/from?site=box2d.org)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 154 points by [matt_d](https://news.ycombinator.com/user?id=matt_d) [17 hours ago](https://news.ycombinator.com/item?id=41315359) \| [hide](https://news.ycombinator.com/hide?id=41315359&goto=news) \| [57 comments](https://news.ycombinator.com/item?id=41315359) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 22. | [](https://news.ycombinator.com/vote?id=41321467&how=up&goto=news) | [Japan\'s Public Didn\'t Buy Fumio Kishida\'s New Capitalism](https://foreignpolicy.com/2024/08/15/japan-fumio-kishida-departure-capitalism-liberal-democratic-party/) ([foreignpolicy.com](https://news.ycombinator.com/from?site=foreignpolicy.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 16 points by [segasaturn](https://news.ycombinator.com/user?id=segasaturn) [1 hour ago](https://news.ycombinator.com/item?id=41321467) \| [hide](https://news.ycombinator.com/hide?id=41321467&goto=news) \| [5 comments](https://news.ycombinator.com/item?id=41321467) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 23. | [](https://news.ycombinator.com/vote?id=41316342&how=up&goto=news) | [A deep dive into how linkers work (2008)](https://lwn.net/Articles/276782/) ([lwn.net](https://news.ycombinator.com/from?site=lwn.net)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 182 points by [thunderbong](https://news.ycombinator.com/user?id=thunderbong) [14 hours ago](https://news.ycombinator.com/item?id=41316342) \| [hide](https://news.ycombinator.com/hide?id=41316342&goto=news) \| [15 comments](https://news.ycombinator.com/item?id=41316342) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 24. | [](https://news.ycombinator.com/vote?id=41321881&how=up&goto=news) | [NASA says data will guide whether astronauts return on troubled Starliner](https://www.washingtonpost.com/technology/2024/08/22/boeing-starliner-nasa-astronauts-dragon-spacex/) ([washingtonpost.com](https://news.ycombinator.com/from?site=washingtonpost.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 13 points by [howard941](https://news.ycombinator.com/user?id=howard941) [1 hour ago](https://news.ycombinator.com/item?id=41321881) \| [hide](https://news.ycombinator.com/hide?id=41321881&goto=news) \| [12 comments](https://news.ycombinator.com/item?id=41321881) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 25. | [](https://news.ycombinator.com/vote?id=41317280&how=up&goto=news) | [Mourning and moving on: rituals for leaving a career (2014)](https://franceshocutt.com/2014/09/10/on-mourning-and-moving-on-rituals-for-leaving-a-career/) ([franceshocutt.com](https://news.ycombinator.com/from?site=franceshocutt.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 165 points by [luu](https://news.ycombinator.com/user?id=luu) [11 hours ago](https://news.ycombinator.com/item?id=41317280) \| [hide](https://news.ycombinator.com/hide?id=41317280&goto=news) \| [101 comments](https://news.ycombinator.com/item?id=41317280) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 26. | [](https://news.ycombinator.com/vote?id=41310384&how=up&goto=news) | [How to build a 50k ton forging press](https://www.construction-physics.com/p/how-to-build-a-50000-ton-forging) ([construction-physics.com](https://news.ycombinator.com/from?site=construction-physics.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 389 points by [chmaynard](https://news.ycombinator.com/user?id=chmaynard) [1 day ago](https://news.ycombinator.com/item?id=41310384) \| [hide](https://news.ycombinator.com/hide?id=41310384&goto=news) \| [161 comments](https://news.ycombinator.com/item?id=41310384) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 27. | [](https://news.ycombinator.com/vote?id=41319003&how=up&goto=news) | [Electric Clojure v3: Differential Dataflow for UI \[video\]](https://hyperfiddle-docs.notion.site/Talk-Electric-Clojure-v3-Differential-Dataflow-for-UI-Getz-2024-2e611cebd73f45dc8cc97c499b3aa8b8) ([hyperfiddle-docs.notion.site](https://news.ycombinator.com/from?site=hyperfiddle-docs.notion.site)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 85 points by [refset](https://news.ycombinator.com/user?id=refset) [5 hours ago](https://news.ycombinator.com/item?id=41319003) \| [hide](https://news.ycombinator.com/hide?id=41319003&goto=news) \| [34 comments](https://news.ycombinator.com/item?id=41319003) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 28. | [](https://news.ycombinator.com/vote?id=41312480&how=up&goto=news) | [Show HN: VirtualStorageLibrary -- .NET Tree solutions for items, dirs, symlinks](https://shimodateakira.github.io/VirtualStorageLibrary/) ([shimodateakira.github.io](https://news.ycombinator.com/from?site=shimodateakira.github.io)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 7 points by [shimodateakira](https://news.ycombinator.com/user?id=shimodateakira) [3 hours ago](https://news.ycombinator.com/item?id=41312480) \| [hide](https://news.ycombinator.com/hide?id=41312480&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41312480) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 29. | [](https://news.ycombinator.com/vote?id=41290664&how=up&goto=news) | [Meteorites give the Moon its thin atmosphere](https://arstechnica.com/science/2024/08/meteorites-give-the-moon-its-extremely-thin-atmosphere/) ([arstechnica.com](https://news.ycombinator.com/from?site=arstechnica.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 8 points by [Brajeshwar](https://news.ycombinator.com/user?id=Brajeshwar) [4 hours ago](https://news.ycombinator.com/item?id=41290664) \| [hide](https://news.ycombinator.com/hide?id=41290664&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41290664) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | 30. | [](https://news.ycombinator.com/vote?id=41281097&how=up&goto=news) | [Discovery of Roman water wells in England proves trial and error](https://www.theguardian.com/uk-news/article/2024/aug/17/failure-of-roman-engineering-on-industrial-scale-discovery-of-water-wells-in-england-proves-trial-and-error) ([theguardian.com](https://news.ycombinator.com/from?site=theguardian.com)) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | 5 points by [zeristor](https://news.ycombinator.com/user?id=zeristor) [3 hours ago](https://news.ycombinator.com/item?id=41281097) \| [hide](https://news.ycombinator.com/hide?id=41281097&goto=news) \| [2 comments](https://news.ycombinator.com/item?id=41281097) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -| | | | [More](https://news.ycombinator.com/?p=2) | | -| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| ![](./hackernews/s.gif) | -| | -| -- | -| -- | -| | -| \ | -| | -| [Consider applying for YC\'s first-ever Fall batch! Applications are open till Aug 27.](https://www.ycombinator.com/apply/) | -| | -| \ | -| | -| [Guidelines](https://news.ycombinator.com/newsguidelines.html) \| [FAQ](https://news.ycombinator.com/newsfaq.html) \| [Lists](https://news.ycombinator.com/lists) \| [API](https://github.com/HackerNews/API) \| [Security](https://news.ycombinator.com/security.html) \| [Legal](https://www.ycombinator.com/legal/) \| [Apply to YC](https://www.ycombinator.com/apply/) \| [Contact](mailto:hn@ycombinator.com)\ | -| \ | -| | -| Search: | -+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ---------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------- | +| [](https://news.ycombinator.com/) **[Hacker News](https://news.ycombinator.com/news)** [new](https://news.ycombinator.com/newest) \| [past](https://news.ycombinator.com/front) \| [comments](https://news.ycombinator.com/newcomments) \| [ask](https://news.ycombinator.com/ask) \| [show](https://news.ycombinator.com/show) \| [jobs](https://news.ycombinator.com/jobs) \| [submit](https://news.ycombinator.com/submit) [login](https://news.ycombinator.com/login?goto=news) | +| ---------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------- | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| +----------------------:+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 1. | [](https://news.ycombinator.com/vote?id=41321063&how=up&goto=news) | [Continuous reinvention: A brief history of block storage at AWS](https://www.allthingsdistributed.com/2024/08/continuous-reinvention-a-brief-history-of-block-storage-at-aws.html) ([allthingsdistributed.com](https://news.ycombinator.com/from?site=allthingsdistributed.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 104 points by [riv991](https://news.ycombinator.com/user?id=riv991) [2 hours ago](https://news.ycombinator.com/item?id=41321063) \| [hide](https://news.ycombinator.com/hide?id=41321063&goto=news) \| [9 comments](https://news.ycombinator.com/item?id=41321063) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 2. | [](https://news.ycombinator.com/vote?id=41321981&how=up&goto=news) | [Aerc: A Well-Crafted TUI for Email](https://blog.sergeantbiggs.net/posts/aerc-a-well-crafted-tui-for-email/) ([sergeantbiggs.net](https://news.ycombinator.com/from?site=sergeantbiggs.net)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 17 points by [edward](https://news.ycombinator.com/user?id=edward) [49 minutes ago](https://news.ycombinator.com/item?id=41321981) \| [hide](https://news.ycombinator.com/hide?id=41321981&goto=news) \| [11 comments](https://news.ycombinator.com/item?id=41321981) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 3. | [](https://news.ycombinator.com/vote?id=41321936&how=up&goto=news) | [Launch HN: Arva AI (YC S24) -- AI agents for instant global KYB onboarding](https://news.ycombinator.com/item?id=41321936) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 17 points by [rhimshah](https://news.ycombinator.com/user?id=rhimshah) [55 minutes ago](https://news.ycombinator.com/item?id=41321936) \| [hide](https://news.ycombinator.com/hide?id=41321936&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41321936) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 4. | [](https://news.ycombinator.com/vote?id=41318133&how=up&goto=news) | [Show HN: A Ghidra extension for exporting parts of a program as object files](https://github.com/boricj/ghidra-delinker-extension) ([github.com/boricj](https://news.ycombinator.com/from?site=github.com/boricj)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 143 points by [boricj](https://news.ycombinator.com/user?id=boricj) [4 hours ago](https://news.ycombinator.com/item?id=41318133) \| [hide](https://news.ycombinator.com/hide?id=41318133&goto=news) \| [17 comments](https://news.ycombinator.com/item?id=41318133) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 5. | [](https://news.ycombinator.com/vote?id=41318222&how=up&goto=news) | [What is an SBAT and why does everyone suddenly care](https://mjg59.dreamwidth.org/70348.html) ([mjg59.dreamwidth.org](https://news.ycombinator.com/from?site=mjg59.dreamwidth.org)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 248 points by [todsacerdoti](https://news.ycombinator.com/user?id=todsacerdoti) [8 hours ago](https://news.ycombinator.com/item?id=41318222) \| [hide](https://news.ycombinator.com/hide?id=41318222&goto=news) \| [136 comments](https://news.ycombinator.com/item?id=41318222) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 6. | [](https://news.ycombinator.com/vote?id=41311135&how=up&goto=news) | [We don\'t know how bad most things are nor precisely how they\'re bad](https://www.lesswrong.com/posts/PJu2HhKsyTEJMxS9a/you-don-t-know-how-bad-most-things-are-nor-precisely-how) ([lesswrong.com](https://news.ycombinator.com/from?site=lesswrong.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 62 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [4 hours ago](https://news.ycombinator.com/item?id=41311135) \| [hide](https://news.ycombinator.com/hide?id=41311135&goto=news) \| [23 comments](https://news.ycombinator.com/item?id=41311135) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 7. | | [Vooma (YC W23) Is Hiring a Growth Lead](https://www.ycombinator.com/companies/vooma/jobs/ATEQ9kQ-growth-lead) ([ycombinator.com](https://news.ycombinator.com/from?site=ycombinator.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | [22 minutes ago](https://news.ycombinator.com/item?id=41322207) \| [hide](https://news.ycombinator.com/hide?id=41322207&goto=news) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 8. | [](https://news.ycombinator.com/vote?id=41318013&how=up&goto=news) | [Ethernet History Deepdive -- Why Do We Have Different Frame Types?](https://lostintransit.se/2024/08/21/ethernet-history-deepdive-why-do-we-have-different-frame-types/) ([lostintransit.se](https://news.ycombinator.com/from?site=lostintransit.se)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 62 points by [un_ess](https://news.ycombinator.com/user?id=un_ess) [4 hours ago](https://news.ycombinator.com/item?id=41318013) \| [hide](https://news.ycombinator.com/hide?id=41318013&goto=news) \| [19 comments](https://news.ycombinator.com/item?id=41318013) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 9. | [](https://news.ycombinator.com/vote?id=41321998&how=up&goto=news) | [Making PyPy\'s GC and JIT produce a sound \[video\]](https://www.youtube.com/watch?v=drwJBzDM1jI) ([youtube.com](https://news.ycombinator.com/from?site=youtube.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 9 points by [luu](https://news.ycombinator.com/user?id=luu) [47 minutes ago](https://news.ycombinator.com/item?id=41321998) \| [hide](https://news.ycombinator.com/hide?id=41321998&goto=news) \| [4 comments](https://news.ycombinator.com/item?id=41321998) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 10. | [](https://news.ycombinator.com/vote?id=41292757&how=up&goto=news) | [DRAKON](https://en.wikipedia.org/wiki/DRAKON) ([wikipedia.org](https://news.ycombinator.com/from?site=wikipedia.org)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 15 points by [instagraham](https://news.ycombinator.com/user?id=instagraham) [3 hours ago](https://news.ycombinator.com/item?id=41292757) \| [hide](https://news.ycombinator.com/hide?id=41292757&goto=news) \| [4 comments](https://news.ycombinator.com/item?id=41292757) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 11. | [](https://news.ycombinator.com/vote?id=41290189&how=up&goto=news) | [What If Data Is a Bad Idea?](https://schmud.de/posts/2024-08-18-data-is-a-bad-idea.html) ([schmud.de](https://news.ycombinator.com/from?site=schmud.de)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 20 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [3 hours ago](https://news.ycombinator.com/item?id=41290189) \| [hide](https://news.ycombinator.com/hide?id=41290189&goto=news) \| [2 comments](https://news.ycombinator.com/item?id=41290189) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 12. | [](https://news.ycombinator.com/vote?id=41317988&how=up&goto=news) | [Show HN: Isaiah -- open-source and self-hosted app to manage everything Docker](https://github.com/will-moss/isaiah) ([github.com/will-moss](https://news.ycombinator.com/from?site=github.com/will-moss)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 119 points by [willmoss](https://news.ycombinator.com/user?id=willmoss) [8 hours ago](https://news.ycombinator.com/item?id=41317988) \| [hide](https://news.ycombinator.com/hide?id=41317988&goto=news) \| [35 comments](https://news.ycombinator.com/item?id=41317988) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 13. | [](https://news.ycombinator.com/vote?id=41318033&how=up&goto=news) | [Hardware Virtualization](https://www.haiku-os.org/blog/dalme/2024-08-19_gsoc_2024_hardware_virtualization_final_report/) ([haiku-os.org](https://news.ycombinator.com/from?site=haiku-os.org)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 104 points by [rcarmo](https://news.ycombinator.com/user?id=rcarmo) [8 hours ago](https://news.ycombinator.com/item?id=41318033) \| [hide](https://news.ycombinator.com/hide?id=41318033&goto=news) \| [12 comments](https://news.ycombinator.com/item?id=41318033) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 14. | [](https://news.ycombinator.com/vote?id=41322297&how=up&goto=news) | [Apple splits App Store team in two, introduces new leadership](https://arstechnica.com/gadgets/2024/08/apple-says-farewell-to-its-app-store-chief-as-it-splits-his-team-in-two/) ([arstechnica.com](https://news.ycombinator.com/from?site=arstechnica.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 8 points by [LorenDB](https://news.ycombinator.com/user?id=LorenDB) [13 minutes ago](https://news.ycombinator.com/item?id=41322297) \| [hide](https://news.ycombinator.com/hide?id=41322297&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41322297) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 15. | [](https://news.ycombinator.com/vote?id=41322266&how=up&goto=news) | [Peloton to charge \$95 activation fee for used bikes](https://www.cnbc.com/2024/08/22/peloton-to-charge-95-activation-fee-for-used-bikes-.html) ([cnbc.com](https://news.ycombinator.com/from?site=cnbc.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 9 points by [speckx](https://news.ycombinator.com/user?id=speckx) [17 minutes ago](https://news.ycombinator.com/item?id=41322266) \| [hide](https://news.ycombinator.com/hide?id=41322266&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41322266) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 16. | [](https://news.ycombinator.com/vote?id=41292049&how=up&goto=news) | [How Deep Can Humans Go?](https://www.mcgill.ca/oss/article/student-contributors-did-you-know/how-deep-can-humans-really-go) ([mcgill.ca](https://news.ycombinator.com/from?site=mcgill.ca)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 16 points by [bookofjoe](https://news.ycombinator.com/user?id=bookofjoe) [3 hours ago](https://news.ycombinator.com/item?id=41292049) \| [hide](https://news.ycombinator.com/hide?id=41292049&goto=news) \| [8 comments](https://news.ycombinator.com/item?id=41292049) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 17. | [](https://news.ycombinator.com/vote?id=41292481&how=up&goto=news) | [Constraining writers in distributed systems](https://shachaf.net/w/constraining-writers-in-distributed-systems) ([shachaf.net](https://news.ycombinator.com/from?site=shachaf.net)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 7 points by [shachaf](https://news.ycombinator.com/user?id=shachaf) [2 hours ago](https://news.ycombinator.com/item?id=41292481) \| [hide](https://news.ycombinator.com/hide?id=41292481&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41292481) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 18. | [](https://news.ycombinator.com/vote?id=41285275&how=up&goto=news) | [\'Virtually intact\' wreck believed to be Royal Navy warship torpedoed in WWI](https://www.theguardian.com/uk-news/article/2024/aug/17/virtually-intact-wreck-off-scotland-believed-to-be-royal-navy-warship-torpedoed-in-wwi) ([theguardian.com](https://news.ycombinator.com/from?site=theguardian.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 7 points by [SonOfKyuss](https://news.ycombinator.com/user?id=SonOfKyuss) [3 hours ago](https://news.ycombinator.com/item?id=41285275) \| [hide](https://news.ycombinator.com/hide?id=41285275&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41285275) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 19. | [](https://news.ycombinator.com/vote?id=41312335&how=up&goto=news) | [GPU utilization can be a misleading metric](https://trainy.ai/blog/gpu-utilization-misleading) ([trainy.ai](https://news.ycombinator.com/from?site=trainy.ai)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 16 points by [roanakb](https://news.ycombinator.com/user?id=roanakb) [3 hours ago](https://news.ycombinator.com/item?id=41312335) \| [hide](https://news.ycombinator.com/hide?id=41312335&goto=news) \| [1 comment](https://news.ycombinator.com/item?id=41312335) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 20. | [](https://news.ycombinator.com/vote?id=41279166&how=up&goto=news) | [Trailer Faces HQ Dataset](https://www.justinpinkney.com/blog/2024/trailer-faces/) ([justinpinkney.com](https://news.ycombinator.com/from?site=justinpinkney.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 19 points by [surprisetalk](https://news.ycombinator.com/user?id=surprisetalk) [4 hours ago](https://news.ycombinator.com/item?id=41279166) \| [hide](https://news.ycombinator.com/hide?id=41279166&goto=news) \| [5 comments](https://news.ycombinator.com/item?id=41279166) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 21. | [](https://news.ycombinator.com/vote?id=41315359&how=up&goto=news) | [SIMD Matters: Graph Coloring](https://box2d.org/posts/2024/08/simd-matters/) ([box2d.org](https://news.ycombinator.com/from?site=box2d.org)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 154 points by [matt_d](https://news.ycombinator.com/user?id=matt_d) [17 hours ago](https://news.ycombinator.com/item?id=41315359) \| [hide](https://news.ycombinator.com/hide?id=41315359&goto=news) \| [57 comments](https://news.ycombinator.com/item?id=41315359) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 22. | [](https://news.ycombinator.com/vote?id=41321467&how=up&goto=news) | [Japan\'s Public Didn\'t Buy Fumio Kishida\'s New Capitalism](https://foreignpolicy.com/2024/08/15/japan-fumio-kishida-departure-capitalism-liberal-democratic-party/) ([foreignpolicy.com](https://news.ycombinator.com/from?site=foreignpolicy.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 16 points by [segasaturn](https://news.ycombinator.com/user?id=segasaturn) [1 hour ago](https://news.ycombinator.com/item?id=41321467) \| [hide](https://news.ycombinator.com/hide?id=41321467&goto=news) \| [5 comments](https://news.ycombinator.com/item?id=41321467) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 23. | [](https://news.ycombinator.com/vote?id=41316342&how=up&goto=news) | [A deep dive into how linkers work (2008)](https://lwn.net/Articles/276782/) ([lwn.net](https://news.ycombinator.com/from?site=lwn.net)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 182 points by [thunderbong](https://news.ycombinator.com/user?id=thunderbong) [14 hours ago](https://news.ycombinator.com/item?id=41316342) \| [hide](https://news.ycombinator.com/hide?id=41316342&goto=news) \| [15 comments](https://news.ycombinator.com/item?id=41316342) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 24. | [](https://news.ycombinator.com/vote?id=41321881&how=up&goto=news) | [NASA says data will guide whether astronauts return on troubled Starliner](https://www.washingtonpost.com/technology/2024/08/22/boeing-starliner-nasa-astronauts-dragon-spacex/) ([washingtonpost.com](https://news.ycombinator.com/from?site=washingtonpost.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 13 points by [howard941](https://news.ycombinator.com/user?id=howard941) [1 hour ago](https://news.ycombinator.com/item?id=41321881) \| [hide](https://news.ycombinator.com/hide?id=41321881&goto=news) \| [12 comments](https://news.ycombinator.com/item?id=41321881) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 25. | [](https://news.ycombinator.com/vote?id=41317280&how=up&goto=news) | [Mourning and moving on: rituals for leaving a career (2014)](https://franceshocutt.com/2014/09/10/on-mourning-and-moving-on-rituals-for-leaving-a-career/) ([franceshocutt.com](https://news.ycombinator.com/from?site=franceshocutt.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 165 points by [luu](https://news.ycombinator.com/user?id=luu) [11 hours ago](https://news.ycombinator.com/item?id=41317280) \| [hide](https://news.ycombinator.com/hide?id=41317280&goto=news) \| [101 comments](https://news.ycombinator.com/item?id=41317280) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 26. | [](https://news.ycombinator.com/vote?id=41310384&how=up&goto=news) | [How to build a 50k ton forging press](https://www.construction-physics.com/p/how-to-build-a-50000-ton-forging) ([construction-physics.com](https://news.ycombinator.com/from?site=construction-physics.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 389 points by [chmaynard](https://news.ycombinator.com/user?id=chmaynard) [1 day ago](https://news.ycombinator.com/item?id=41310384) \| [hide](https://news.ycombinator.com/hide?id=41310384&goto=news) \| [161 comments](https://news.ycombinator.com/item?id=41310384) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 27. | [](https://news.ycombinator.com/vote?id=41319003&how=up&goto=news) | [Electric Clojure v3: Differential Dataflow for UI \[video\]](https://hyperfiddle-docs.notion.site/Talk-Electric-Clojure-v3-Differential-Dataflow-for-UI-Getz-2024-2e611cebd73f45dc8cc97c499b3aa8b8) ([hyperfiddle-docs.notion.site](https://news.ycombinator.com/from?site=hyperfiddle-docs.notion.site)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 85 points by [refset](https://news.ycombinator.com/user?id=refset) [5 hours ago](https://news.ycombinator.com/item?id=41319003) \| [hide](https://news.ycombinator.com/hide?id=41319003&goto=news) \| [34 comments](https://news.ycombinator.com/item?id=41319003) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 28. | [](https://news.ycombinator.com/vote?id=41312480&how=up&goto=news) | [Show HN: VirtualStorageLibrary -- .NET Tree solutions for items, dirs, symlinks](https://shimodateakira.github.io/VirtualStorageLibrary/) ([shimodateakira.github.io](https://news.ycombinator.com/from?site=shimodateakira.github.io)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 7 points by [shimodateakira](https://news.ycombinator.com/user?id=shimodateakira) [3 hours ago](https://news.ycombinator.com/item?id=41312480) \| [hide](https://news.ycombinator.com/hide?id=41312480&goto=news) \| [discuss](https://news.ycombinator.com/item?id=41312480) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 29. | [](https://news.ycombinator.com/vote?id=41290664&how=up&goto=news) | [Meteorites give the Moon its thin atmosphere](https://arstechnica.com/science/2024/08/meteorites-give-the-moon-its-extremely-thin-atmosphere/) ([arstechnica.com](https://news.ycombinator.com/from?site=arstechnica.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 8 points by [Brajeshwar](https://news.ycombinator.com/user?id=Brajeshwar) [4 hours ago](https://news.ycombinator.com/item?id=41290664) \| [hide](https://news.ycombinator.com/hide?id=41290664&goto=news) \| [3 comments](https://news.ycombinator.com/item?id=41290664) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | 30. | [](https://news.ycombinator.com/vote?id=41281097&how=up&goto=news) | [Discovery of Roman water wells in England proves trial and error](https://www.theguardian.com/uk-news/article/2024/aug/17/failure-of-roman-engineering-on-industrial-scale-discovery-of-water-wells-in-england-proves-trial-and-error) ([theguardian.com](https://news.ycombinator.com/from?site=theguardian.com)) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | 5 points by [zeristor](https://news.ycombinator.com/user?id=zeristor) [3 hours ago](https://news.ycombinator.com/item?id=41281097) \| [hide](https://news.ycombinator.com/hide?id=41281097&goto=news) \| [2 comments](https://news.ycombinator.com/item?id=41281097) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | +| | | | [More](https://news.ycombinator.com/?p=2) | | +| +-----------------------+--------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| | +| | +| -- | +| -- | +| | +| \ | +| | +| [Consider applying for YC\'s first-ever Fall batch! Applications are open till Aug 27.](https://www.ycombinator.com/apply/) | +| | +| \ | +| | +| [Guidelines](https://news.ycombinator.com/newsguidelines.html) \| [FAQ](https://news.ycombinator.com/newsfaq.html) \| [Lists](https://news.ycombinator.com/lists) \| [API](https://github.com/HackerNews/API) \| [Security](https://news.ycombinator.com/security.html) \| [Legal](https://www.ycombinator.com/legal/) \| [Apply to YC](https://www.ycombinator.com/apply/) \| [Contact](mailto:hn@ycombinator.com)\ | +| \ | +| | +| Search: | ++-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/tests/websites/reflex.html.md b/tests/websites/reflex.html.md index 04f48ca..5251758 100644 --- a/tests/websites/reflex.html.md +++ b/tests/websites/reflex.html.md @@ -1,4 +1,4 @@ -- [![Reflex Logo](/logos/light/reflex.svg)](/) +- [![Reflex Logo]()](/) - [Docs](/docs/getting-started/introduction/)