<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://neomeirer.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://neomeirer.github.io/" rel="alternate" type="text/html" /><updated>2026-04-28T07:51:20+00:00</updated><id>https://neomeirer.github.io/feed.xml</id><title type="html">neolabs</title><subtitle>Personal website</subtitle><author><name>Neo Meirer</name><email>blabla@gmail.com</email></author><entry><title type="html">Kicker-Ticker</title><link href="https://neomeirer.github.io/2026-04-13/Ticker" rel="alternate" type="text/html" title="Kicker-Ticker" /><published>2026-04-13T00:00:00+00:00</published><updated>2026-04-13T00:00:00+00:00</updated><id>https://neomeirer.github.io/2026-04-13/Ticker</id><content type="html" xml:base="https://neomeirer.github.io/2026-04-13/Ticker"><![CDATA[<p>Willkommen bei unserer Kicker-Liga! Hier können wir unsere Spiele dokumentieren und Statistiken einsehen.</p>]]></content><author><name>Neo</name></author><category term="kicker" /><summary type="html"><![CDATA[Willkommen bei unserer Kicker-Liga! Hier können wir unsere Spiele dokumentieren und Statistiken einsehen.]]></summary></entry><entry><title type="html">Agora</title><link href="https://neomeirer.github.io/2026-02-28/Agora" rel="alternate" type="text/html" title="Agora" /><published>2026-02-28T23:00:00+00:00</published><updated>2026-02-28T23:00:00+00:00</updated><id>https://neomeirer.github.io/2026-02-28/Agora</id><content type="html" xml:base="https://neomeirer.github.io/2026-02-28/Agora"><![CDATA[<section class="chat-widget" id="chat-2026-02-28-agora">
  <h2>Chat</h2>
  <p class="chat-hint">
    Wähle ein Thema oder gib ein neues ein. Kommentieren geht über GitHub-Login.
  </p>

  

  <div class="chat-controls">
    <select id="chat-2026-02-28-agora-topic-select" class="chat-topic-select">
      
        <option value="Allgemein">Allgemein</option>
      
        <option value="Werkstatt">Werkstatt</option>
      
        <option value="Garten">Garten</option>
      
        <option value="Sokrates-Ecke">Sokrates-Ecke</option>
      
    </select>

    <input id="chat-2026-02-28-agora-topic-input" class="chat-topic-input" type="text" inputmode="text" placeholder="Neues Thema…" />
  </div>

  <div class="chat-thread-container" aria-live="polite"></div>
</section>

<script>
    (() => {
      const root = document.getElementById("chat-2026-02-28-agora");
      if (!root) return;

      const giscusConfig = {
        repo: "neomeirer/neomeirer.github.io",
        repoId: "R_kgDOK-iy8Q",
        category: "General",
        categoryId: "DIC_kwDOK-iy8c4C3dRd",
        theme: "https://neomeirer.github.io/assets/giscus-custom.css",
        lang: "de",
      };

      const termPrefix = "neolabs-chat";
      const select = root.querySelector(".chat-topic-select");
      const input = root.querySelector(".chat-topic-input");
      const container = root.querySelector(".chat-thread-container");
      const storageKey = "chat:" + root.id + ":topic";

      let currentTopic = "";

      const normalize = (v) =>
        String(v || "").trim().replace(/\s+/g, " ").slice(0, 250);

      const toTerm = (topic) => {
        const t = normalize(topic);
        const p = normalize(termPrefix);
        if (!p) return t;
        if (!t) return p;
        return p + " :: " + t;
      };

      const ensureOption = (topic) => {
        if (!select || !topic) return;
        if (Array.from(select.options).some((o) => o.value === topic)) return;
        const opt = document.createElement("option");
        opt.value = topic;
        opt.textContent = topic;
        select.appendChild(opt);
      };

      /* Session (GitHub OAuth) */
      const getSession = () => {
        const url = new URL(location.href);
        const token = url.searchParams.get("giscus") || "";
        if (token) {
          url.searchParams.delete("giscus");
          history.replaceState(null, "", url.toString());
          try { localStorage.setItem("giscus-session", JSON.stringify(token)); } catch (e) {}
        }
        if (token) return token;
        try {
          const raw = localStorage.getItem("giscus-session");
          return raw ? JSON.parse(raw) : "";
        } catch (e) { return ""; }
      };
      const giscusSession = getSession();

      const cleanOrigin = (() => {
        const u = new URL(location.href);
        u.searchParams.delete("giscus");
        return u.toString();
      })();

      /* Iframe erstellen */
      const createFrame = (term) => {
        const params = new URLSearchParams({
          origin: cleanOrigin,
          session: giscusSession,
          theme: giscusConfig.theme,
          reactionsEnabled: "0",
          emitMetadata: "0",
          inputPosition: "bottom",
          repo: giscusConfig.repo,
          repoId: giscusConfig.repoId,
          category: giscusConfig.category || "",
          categoryId: giscusConfig.categoryId,
          mapping: "specific",
          term: term,
          strict: "1",
          number: "0",
          description: "",
          backLink: cleanOrigin,
        });

        const iframe = document.createElement("iframe");
        iframe.className = "giscus-frame";
        iframe.src =
          "https://giscus.app/" +
          encodeURIComponent(giscusConfig.lang) +
          "/widget?" +
          params.toString();
        iframe.scrolling = "no";
        iframe.loading = "lazy";
        iframe.setAttribute("allow", "clipboard-write");
        return iframe;
      };

      /* postMessage-Listener */
      window.addEventListener("message", function(event) {
        if (event.origin !== "https://giscus.app") return;
        if (!event.data || typeof event.data !== "object" || !event.data.giscus) return;

        var msg = event.data.giscus;
        if (msg.signOut) {
          try { localStorage.removeItem("giscus-session"); } catch (e) {}
        }
        if (typeof msg.resizeHeight === "number") {
          var frames = root.querySelectorAll("iframe.giscus-frame");
          for (var i = 0; i < frames.length; i++) {
            if (frames[i].contentWindow === event.source) {
              frames[i].style.height = msg.resizeHeight + "px";
              break;
            }
          }
        }
      });

      /* Thema oeffnen */
      const openTopic = (topic) => {
        if (!topic || topic === currentTopic) return;
        currentTopic = topic;
        ensureOption(topic);
        if (select) select.value = topic;

        container.innerHTML = "";
        const frame = createFrame(toTerm(topic));
        container.appendChild(frame);

        try { localStorage.setItem(storageKey, topic); } catch (e) {}
      };

      /* Events */
      if (select) {
        select.addEventListener("change", function() {
          if (input) input.value = "";
          openTopic(normalize(select.value));
        });
      }

      if (input) {
        input.addEventListener("keydown", function(e) {
          if (e.key !== "Enter") return;
          var topic = normalize(input.value);
          if (!topic) return;
          e.preventDefault();
          input.value = "";
          openTopic(topic);
        });
      }

      /* Initialisierung */
      var saved = "";
      try { saved = localStorage.getItem(storageKey) || ""; } catch (e) {}
      var initial = normalize(saved) || normalize(select ? select.value : "");
      if (initial) openTopic(initial);
    })();
  </script>]]></content><author><name>Neo</name></author><category term="community" /><summary type="html"><![CDATA[Chat Wähle ein Thema oder gib ein neues ein. Kommentieren geht über GitHub-Login. Allgemein Werkstatt Garten Sokrates-Ecke]]></summary></entry><entry><title type="html">Pentomino</title><link href="https://neomeirer.github.io/2025-02-12/Pentomino" rel="alternate" type="text/html" title="Pentomino" /><published>2025-02-12T00:00:00+00:00</published><updated>2025-02-12T00:00:00+00:00</updated><id>https://neomeirer.github.io/2025-02-12/Pentomino</id><content type="html" xml:base="https://neomeirer.github.io/2025-02-12/Pentomino"><![CDATA[<style>
  #pentomino-game {
    width: 50vw;
    height: 30vw;
    max-width: 800px;
    max-height: 480px;
    display: block;
    margin: 0 auto;
    border: none;
  }
</style>

<iframe id="pentomino-game" src="/Pentomino_Python/build/web/index.html" allowfullscreen="" webkitallowfullscreen="" mozallowfullscreen=""></iframe>

<p><button onclick="toggleFullscreen()">Vollbildmodus</button></p>

<script>
function toggleFullscreen() {
  const iframe = document.getElementById('pentomino-game');
  if (iframe.requestFullscreen) {
    iframe.requestFullscreen();
  } else if (iframe.mozRequestFullScreen) { // Firefox
    iframe.mozRequestFullScreen();
  } else if (iframe.webkitRequestFullscreen) { // Chrome, Safari and Opera
    iframe.webkitRequestFullscreen();
  } else if (iframe.msRequestFullscreen) { // IE/Edge
    iframe.msRequestFullscreen();
  }
}
</script>

<h1 id="spielregeln">Spielregeln</h1>

<h2 id="1-ziehphase">1. Ziehphase</h2>
<p>Zu Beginn werden die Spielsteine abwechselnd gezogen. Hier fängt Spieler 1 an. Spieler 2 zieht den zweiten Spielstein. Dies geht so weiter, bis alle Spielsteine verteilt sind.</p>

<h2 id="2-platzierphase">2. Platzierphase</h2>
<p>Die Spieler legen abwechselnd einen ihrer Spielsteine auf das Spielfeld. Dabei ist es egal, wo die Steine auf dem Spielfeld platziert werden, man darf nur keinen anderen Spielstein bedecken. Es beginnt derjenige Spieler mit dem Legen, der nicht begonnen hat zu ziehen. (Hier Spieler 2)</p>

<h2 id="3-spielende">3. Spielende</h2>
<p>Die Spielrunde ist zu Ende, wenn der Spieler, der an der Reihe ist, keinen Spielstein mehr auf das Spielfeld legen kann.</p>

<h3 id="gewinner">Gewinner:</h3>
<p>Der Spieler, der als letzter einen Spielstein platzieren konnte, gewinnt das Spiel.</p>]]></content><author><name>Neo</name></author><category term="games" /><summary type="html"><![CDATA[]]></summary></entry></feed>