<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>dilshod</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Личный сайт системного администратора: об опыте, стеке и проектах.">
<link rel="icon" href="favicon.ico" sizes="any">
<link rel="icon" type="image/png" sizes="32x32" href="favicon32.png">
<link rel="icon" type="image/png" sizes="192x192" href="favicon192.png">
<link rel="apple-touch-icon" sizes="180x180" href="favicon180.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
  :root {
    --bg: #0a0d12;
    --bg-soft: #0d1117;
    --surface: #12161d;
    --surface-2: #171c24;
    --border: #232a35;
    --border-soft: #1a2029;
    --text: #e7ebf1;
    --text-dim: #8c96a8;
    --text-dimmer: #57616f;
    --amber: #ffb454;
    --amber-soft: rgba(255, 180, 84, 0.12);
    --amber-line: rgba(255, 180, 84, 0.35);
    --green: #5fd68a;
    --red: #ff6b6b;
    --font-sans: "IBM Plex Sans", -apple-system, "Segoe UI", sans-serif;
    --font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
    --container: 1080px;
  }

  * { box-sizing: border-box; }
  html { scroll-behavior: smooth; }

  body {
    margin: 0;
    background: var(--bg);
    color: var(--text);
    font-family: var(--font-sans);
    font-size: 16px;
    line-height: 1.55;
    -webkit-font-smoothing: antialiased;
  }

  body::before {
    content: "";
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    background:
      radial-gradient(ellipse 900px 500px at 15% -10%, rgba(255, 180, 84, 0.07), transparent 60%),
      radial-gradient(ellipse 700px 500px at 100% 10%, rgba(95, 214, 138, 0.04), transparent 55%);
  }

  a { color: inherit; }

  ::selection { background: var(--amber-soft); color: var(--amber); }

  :focus-visible {
    outline: 2px solid var(--amber);
    outline-offset: 3px;
    border-radius: 2px;
  }

  .wrap {
    max-width: var(--container);
    margin: 0 auto;
    padding: 0 28px;
    position: relative;
    z-index: 1;
  }

  .mono { font-family: var(--font-mono); }

  .eyebrow {
    font-family: var(--font-mono);
    font-size: 0.75rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-dimmer);
  }

  .eyebrow .dash { color: var(--amber-line); margin-right: 0.6em; }

  h1, h2, h3 { font-family: var(--font-sans); font-weight: 700; margin: 0; text-wrap: balance; }

  p { text-wrap: pretty; }

  /* ---------- nav ---------- */
  header.nav {
    position: sticky;
    top: 0;
    z-index: 50;
    backdrop-filter: blur(10px);
    background: rgba(10, 13, 18, 0.78);
    border-bottom: 1px solid var(--border-soft);
  }

  .nav-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 60px;
    gap: 20px;
  }

  .brand {
    font-family: var(--font-mono);
    font-size: 0.95rem;
    font-weight: 500;
    color: var(--text);
    text-decoration: none;
    display: flex;
    align-items: center;
    gap: 8px;
    white-space: nowrap;
  }
  .brand .caret { color: var(--amber); }

  .nav-links {
    display: flex;
    gap: 28px;
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: 0.9rem;
  }
  .nav-links a {
    text-decoration: none;
    color: var(--text-dim);
    transition: color 0.15s ease;
  }
  .nav-links a:hover { color: var(--text); }

  .nav-status {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--font-mono);
    font-size: 0.78rem;
    color: var(--text-dimmer);
    white-space: nowrap;
  }
  .dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--green);
    box-shadow: 0 0 8px rgba(95, 214, 138, 0.7);
    flex: none;
  }
  .dot { animation: pulse 2.4s ease-in-out infinite; }
  @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }

  .nav-toggle {
    display: none;
    background: none;
    border: 1px solid var(--border);
    border-radius: 6px;
    color: var(--text);
    width: 38px; height: 38px;
    font-family: var(--font-mono);
    cursor: pointer;
  }

  @media (max-width: 760px) {
    .nav-links, .nav-status { display: none; }
    .nav-toggle { display: block; }
  }

  .mobile-nav {
    display: none;
    list-style: none;
    margin: 0;
    padding: 14px 28px 18px;
    border-top: 1px solid var(--border-soft);
    flex-direction: column;
    gap: 14px;
  }
  .mobile-nav.open { display: flex; }
  .mobile-nav a {
    color: var(--text-dim);
    text-decoration: none;
    font-size: 0.95rem;
  }
  .mobile-nav a:hover { color: var(--text); }
  @media (min-width: 761px) {
    .mobile-nav { display: none !important; }
  }

  /* ---------- hero ---------- */
  .hero {
    padding: 88px 0 72px;
  }

  .hero-grid {
    display: grid;
    grid-template-columns: 1.05fr 0.95fr;
    gap: 56px;
    align-items: center;
  }

  @media (max-width: 900px) {
    .hero-grid { grid-template-columns: 1fr; gap: 44px; }
    .hero { padding: 56px 0 48px; }
  }

  .hero-name {
    font-size: clamp(2.6rem, 5.5vw, 4rem);
    line-height: 1.02;
    letter-spacing: -0.02em;
    margin-top: 14px;
  }
  .hero-name .accent { color: var(--amber); }

  .hero-role {
    font-family: var(--font-mono);
    font-size: 1.05rem;
    color: var(--text-dim);
    margin-top: 14px;
  }

  .hero-bio {
    margin-top: 20px;
    max-width: 46ch;
    color: var(--text-dim);
    font-size: 1.02rem;
  }

  .tag-row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 22px;
  }
  .tag {
    font-family: var(--font-mono);
    font-size: 0.76rem;
    padding: 5px 10px;
    border: 1px solid var(--border);
    border-radius: 5px;
    color: var(--text-dim);
    background: var(--surface);
  }

  .cta-row {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 30px;
  }

  .btn {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 18px;
    border-radius: 7px;
    text-decoration: none;
    font-size: 0.9rem;
    font-weight: 500;
    border: 1px solid var(--border);
    color: var(--text);
    background: var(--surface);
    transition: border-color 0.15s ease, transform 0.15s ease, background 0.15s ease;
  }
  .btn:hover { border-color: var(--amber-line); transform: translateY(-1px); background: var(--surface-2); }
  .btn.primary {
    background: var(--amber);
    color: #1a1204;
    border-color: var(--amber);
  }
  .btn.primary:hover { background: #ffc471; }
  .btn svg { width: 15px; height: 15px; flex: none; }

  /* ---------- terminal card ---------- */
  .term {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 10px;
    overflow: hidden;
    box-shadow: 0 30px 60px -30px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.02);
  }
  .term-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 11px 14px;
    background: var(--surface-2);
    border-bottom: 1px solid var(--border);
  }
  .term-dot { width: 10px; height: 10px; border-radius: 50%; background: var(--border); }
  .term-title {
    margin-left: 8px;
    font-family: var(--font-mono);
    font-size: 0.76rem;
    color: var(--text-dimmer);
  }
  .term-body {
    padding: 22px 20px 26px;
    font-family: var(--font-mono);
    font-size: 0.88rem;
    min-height: 230px;
  }
  .term-line { margin: 0 0 6px; color: var(--text-dim); }
  .term-line .prompt { color: var(--green); }
  .term-line .path { color: var(--text-dimmer); }
  .term-out { color: var(--text); margin: 0 0 16px; }
  .term-out .amber { color: var(--amber); }
  .cursor {
    display: inline-block;
    width: 7px; height: 15px;
    background: var(--amber);
    margin-left: 2px;
    vertical-align: text-bottom;
  }
  .cursor { animation: blink 1s step-end infinite; }
  @keyframes blink { 50% { opacity: 0; } }

  /* ---------- stats strip ---------- */
  .stats-strip {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 1px;
    background: var(--border-soft);
    border: 1px solid var(--border-soft);
    border-radius: 12px;
    overflow: hidden;
    margin-top: 56px;
  }
  .stat {
    background: var(--bg-soft);
    padding: 22px 20px;
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .stat-num {
    font-family: var(--font-mono);
    font-size: 1.9rem;
    font-weight: 500;
    color: var(--text);
    font-variant-numeric: tabular-nums;
  }
  .stat-num .accent { color: var(--amber); }
  .stat-unit { font-size: 1.1rem; color: var(--text-dim); }
  .stat-label {
    font-size: 0.82rem;
    color: var(--text-dim);
    line-height: 1.4;
  }
  @media (max-width: 760px) {
    .stats-strip { grid-template-columns: repeat(2, 1fr); }
  }
  @media (max-width: 420px) {
    .stats-strip { grid-template-columns: 1fr; }
  }

  /* ---------- sections ---------- */
  section { padding: 84px 0; border-top: 1px solid var(--border-soft); }
  @media (max-width: 700px) { section { padding: 56px 0; } }

  .section-head { margin-bottom: 40px; }
  .section-head h2 { font-size: clamp(1.5rem, 3vw, 1.9rem); margin-top: 10px; }

  .reveal {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 0.6s ease, transform 0.6s ease;
  }
  .reveal.in { opacity: 1; transform: none; }

  /* ---------- stack ---------- */
  .stack-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1px;
    background: var(--border-soft);
    border: 1px solid var(--border-soft);
    border-radius: 12px;
    overflow: hidden;
  }
  @media (min-width: 640px) {
    .stack-grid { grid-template-columns: repeat(3, 1fr); }
  }
  @media (max-width: 480px) {
    .stack-grid { grid-template-columns: 1fr; }
  }
  .stack-cat {
    background: var(--bg-soft);
    padding: 24px 22px;
  }
  .stack-cat h3 {
    font-family: var(--font-mono);
    font-size: 0.8rem;
    font-weight: 500;
    letter-spacing: 0.04em;
    color: var(--text-dimmer);
    text-transform: uppercase;
    margin-bottom: 14px;
  }
  .stack-cat ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
  .stack-cat li {
    font-size: 0.92rem;
    color: var(--text-dim);
    position: relative;
    padding-left: 15px;
  }
  .stack-cat li::before {
    content: "";
    position: absolute;
    left: 0; top: 0.55em;
    width: 5px; height: 5px;
    background: var(--amber-line);
    border-radius: 1px;
  }

  /* ---------- projects ---------- */
  .project-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
  }
  .project-card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 26px 24px;
    display: flex;
    flex-direction: column;
    gap: 14px;
    transition: border-color 0.18s ease, transform 0.18s ease;
  }
  .project-card:hover { border-color: var(--amber-line); transform: translateY(-3px); }
  .project-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
  .project-card h3 { font-size: 1.08rem; }
  .project-link {
    color: var(--text-dimmer);
    display: flex;
    transition: color 0.15s ease;
  }
  .project-card:hover .project-link { color: var(--amber); }
  .project-link svg { width: 17px; height: 17px; }
  .project-desc { color: var(--text-dim); font-size: 0.92rem; flex: 1; }
  .project-tags { display: flex; flex-wrap: wrap; gap: 6px; }
  .project-tags span {
    font-family: var(--font-mono);
    font-size: 0.72rem;
    color: var(--text-dimmer);
    border: 1px solid var(--border);
    padding: 3px 8px;
    border-radius: 4px;
  }
  .placeholder-note {
    margin-top: 22px;
    font-family: var(--font-mono);
    font-size: 0.78rem;
    color: var(--text-dimmer);
  }
  .placeholder-note .amber { color: var(--amber); }

  /* ---------- writings ---------- */
  .writing-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
  .writing-row {
    display: flex;
    align-items: baseline;
    gap: 22px;
    padding: 16px 0;
    border-bottom: 1px solid var(--border-soft);
    text-decoration: none;
    color: var(--text);
  }
  .writing-row .wdate {
    font-family: var(--font-mono);
    font-size: 0.8rem;
    color: var(--text-dimmer);
    flex: none;
    width: 92px;
  }
  .writing-row .wtitle { transition: color 0.15s ease; }
  .writing-row:hover .wtitle { color: var(--amber); }

  /* ---------- footer ---------- */
  footer {
    border-top: 1px solid var(--border-soft);
    padding: 44px 0 50px;
  }
  .footer-inner {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 16px;
  }
  .footer-links { display: flex; gap: 20px; list-style: none; margin: 0; padding: 0; }
  .footer-links a {
    text-decoration: none;
    color: var(--text-dim);
    font-size: 0.88rem;
    transition: color 0.15s ease;
  }
  .footer-links a:hover { color: var(--amber); }
  .footer-meta {
    font-family: var(--font-mono);
    font-size: 0.76rem;
    color: var(--text-dimmer);
  }
</style>
</head>
<body>

<header class="nav">
  <div class="wrap nav-inner">
    <a class="brand" href="#top">~/<span class="caret">dilshod</span></a>
    <ul class="nav-links">
      <li><a href="#about">Обо мне</a></li>
      <li><a href="#stack">Стек</a></li>
      <li><a href="#projects">Проекты</a></li>
      <li><a href="#writings">Заметки</a></li>
    </ul>
    <div class="nav-status">
      <span class="dot"></span>
      <span id="clock">--:--:--</span>
    </div>
    <button class="nav-toggle mono" aria-label="Меню" aria-expanded="false" onclick="toggleMobileNav(this)">≡</button>
  </div>
  <ul id="mnav" class="mono mobile-nav">
    <li><a href="#about">Обо мне</a></li>
    <li><a href="#stack">Стек</a></li>
    <li><a href="#projects">Проекты</a></li>
    <li><a href="#writings">Заметки</a></li>
  </ul>
</header>

<main id="top">

  <section class="hero" id="about">
    <div class="wrap hero-grid">
      <div>
        <p class="eyebrow"><span class="dash">—</span>Ведущий руководитель</p>
        <h1 class="hero-name">Дилшод<span class="accent">.</span></h1>
        <p class="hero-role">Ведущий руководитель проектов · инфраструктура и автоматизация</p>
        <p class="hero-bio">23+ года в системном администрировании — от серверной на сотню рабочих мест до распределённой инфраструктуры на полторы сотни площадок. Строю Windows- и Linux-инфраструктуру, автоматизирую рутину и в свободное время пишу на Python телеграм-ботов и мини-сайты для мониторинга.</p>
        <div class="tag-row">
          <span class="tag">23+ года в деле</span>
          <span class="tag">Linux / Windows Server</span>
          <span class="tag">VMware / Hyper-V</span>
          <span class="tag">Автоматизация</span>
        </div>
        <div class="cta-row">
          <a class="btn primary" href="mailto:i@rasulovdd.ru">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 4h16v16H4z"/><path d="m4 6 8 7 8-7"/></svg>
            Написать
          </a>
          <a class="btn" href="https://github.com/rasulovdd" target="_blank" rel="noopener">
            <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.58 2 12.2c0 4.5 2.87 8.32 6.84 9.67.5.1.68-.22.68-.49 0-.24-.01-.87-.01-1.71-2.78.62-3.37-1.37-3.37-1.37-.46-1.19-1.11-1.51-1.11-1.51-.91-.63.07-.62.07-.62 1 .07 1.53 1.05 1.53 1.05.89 1.55 2.34 1.1 2.91.84.09-.66.35-1.1.63-1.36-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.31.1-2.72 0 0 .84-.28 2.75 1.05a9.3 9.3 0 0 1 2.5-.35c.85 0 1.7.12 2.5.35 1.91-1.33 2.75-1.05 2.75-1.05.55 1.41.2 2.46.1 2.72.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.8-4.57 5.06.36.32.68.94.68 1.9 0 1.37-.01 2.47-.01 2.81 0 .27.18.6.69.49A10.02 10.02 0 0 0 22 12.2C22 6.58 17.52 2 12 2z"/></svg>
            GitHub
          </a>
          <a class="btn" href="https://t.me/rasulovdd" target="_blank" rel="noopener">
            <svg viewBox="0 0 24 24" fill="currentColor"><path d="M21.5 3.5 2.6 11c-1 .4-1 1.7.1 2l4.7 1.5 1.8 5.6c.2.7 1.1.9 1.6.4l2.6-2.5 4.7 3.5c.7.5 1.7.1 1.9-.7l3.1-15.1c.2-1-.7-1.7-1.6-1.3zM8.6 13.9l9-5.9c.3-.2.6.2.3.4l-7.4 6.8-.3 3.3-1.5-4.6z"/></svg>
            Telegram
          </a>
        </div>
      </div>

      <div class="term">
        <div class="term-bar">
          <span class="term-dot"></span><span class="term-dot"></span><span class="term-dot"></span>
          <span class="term-title">dilshod@server: ~</span>
        </div>
        <div class="term-body" id="termBody"></div>
      </div>
    </div>

    <div class="wrap">
      <div class="stats-strip reveal">
        <div class="stat">
          <p class="stat-num">220<span class="accent">+</span></p>
          <p class="stat-label">ВМ мигрировано при пересборке кластера VMware</p>
        </div>
        <div class="stat">
          <p class="stat-num">78 <span class="stat-unit">ТБ</span></p>
          <p class="stat-label">DFS-репликация между ЦОД и офисом без потерь</p>
        </div>
        <div class="stat">
          <p class="stat-num">8 <span class="stat-unit">мин</span></p>
          <p class="stat-label">восстановление сервера из бэкапа на 8 ТБ</p>
        </div>
        <div class="stat">
          <p class="stat-num">150<span class="accent">+</span></p>
          <p class="stat-label">территориально распределённых филиалов на одной инфраструктуре</p>
        </div>
      </div>
    </div>
  </section>

  <section id="stack">
    <div class="wrap">
      <div class="section-head reveal">
        <p class="eyebrow"><span class="dash">—</span>02 / Инструменты</p>
        <h2>С чем работаю</h2>
      </div>
      <div class="stack-grid reveal">
        <div class="stack-cat">
          <h3>Операционные системы</h3>
          <ul>
            <li>Windows Server 2003–2022</li>
            <li>Linux (Debian, Ubuntu)</li>
            <li>Active Directory / GPO / RADIUS</li>
          </ul>
        </div>
        <div class="stack-cat">
          <h3>Сети и инфраструктура</h3>
          <ul>
            <li>DNS / DHCP</li>
            <li>MikroTik / Cisco</li>
            <li>VPN, СКС, WIFI</li>
          </ul>
        </div>
        <div class="stack-cat">
          <h3>Виртуализация</h3>
          <ul>
            <li>VMware vSphere / ESXi</li>
            <li>Hyper-V</li>
            <li>Veeam Backup</li>
          </ul>
        </div>
        <div class="stack-cat">
          <h3>Автоматизация</h3>
          <ul>
            <li>Ansible</li>
            <li>Python / PowerShell</li>
            <li>Git</li>
          </ul>
        </div>
        <div class="stack-cat">
          <h3>Мониторинг</h3>
          <ul>
            <li>Zabbix / Prometheus / Grafana</li>
            <li>Veeam One</li>
            <li>Алертинг</li>
          </ul>
        </div>
      </div>
    </div>
  </section>

  <section id="projects">
    <div class="wrap">
      <div class="section-head reveal">
        <p class="eyebrow"><span class="dash">—</span>03 / Проекты</p>
        <h2>Что успел собрать</h2>
      </div>
      <div class="project-grid reveal">
        <div class="project-card">
          <div class="project-top">
            <h3>useradd</h3>
            <a class="project-link" href="https://github.com/rasulovdd/useradd" target="_blank" rel="noopener" aria-label="Открыть проект на GitHub">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 17 17 7"/><path d="M7 7h10v10"/></svg>
            </a>
          </div>
          <p class="project-desc">Автоматизация создания пользователей в Linux — единообразно и без ручных ошибок в правах доступа.</p>
          <div class="project-tags"><span>Shell</span><span>Linux</span></div>
        </div>
        <div class="project-card">
          <div class="project-top">
            <h3>ha-mikrotik-v2</h3>
            <a class="project-link" href="https://github.com/rasulovdd/ha-mikrotik-v2" target="_blank" rel="noopener" aria-label="Открыть проект на GitHub">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 17 17 7"/><path d="M7 7h10v10"/></svg>
            </a>
          </div>
          <p class="project-desc">Код для отказоустойчивости роутеров Mikrotik — резервирование там, где сеть не может лечь.</p>
          <div class="project-tags"><span>RouterOS</span><span>Networking</span></div>
        </div>
        <div class="project-card">
          <div class="project-top">
            <h3>nexus3-repository</h3>
            <a class="project-link" href="https://github.com/rasulovdd/nexus3-repository" target="_blank" rel="noopener" aria-label="Открыть проект на GitHub">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 17 17 7"/><path d="M7 7h10v10"/></svg>
            </a>
          </div>
          <p class="project-desc">Запуск и настройка Nexus как Docker-репозитория — воспроизводимая установка вместо ручной возни по гайдам.</p>
          <div class="project-tags"><span>Docker</span><span>Nexus</span></div>
        </div>
      </div>
      <p class="placeholder-note reveal"><span class="amber">#</span> ещё репозитории — на <a href="https://github.com/rasulovdd" target="_blank" rel="noopener" style="color:var(--amber);">github.com/rasulovdd</a></p>
    </div>
  </section>

  <section id="writings">
    <div class="wrap">
      <div class="section-head reveal">
        <p class="eyebrow"><span class="dash">—</span>04 / Заметки</p>
        <h2>Записи</h2>
      </div>
      <ul class="writing-list reveal">
        <li><a class="writing-row" href="https://dzen.ru/a/ahbW8rs87EC42PFx" target="_blank" rel="noopener"><span class="wdate mono">2026-06</span><span class="wtitle">Запускаем свой личный ИИ на обычном компьютере за 10 минут</span></a></li>
        <li><a class="writing-row" href="https://dzen.ru/a/aZ8oq6NgmFIOeK4Y" target="_blank" rel="noopener"><span class="wdate mono">2026-03</span><span class="wtitle">Hyper-V: ограничиваем скорость Live Migration</span></a></li>
        <li><a class="writing-row" href="https://dzen.ru/a/aZQkr8Pk8lPjeege" target="_blank" rel="noopener"><span class="wdate mono">2026-02</span><span class="wtitle">Ограничение доступа к ресурсам по GeoIP на MikroTik RouterOS 7</span></a></li>
        <li><a class="writing-row" href="https://dzen.ru/a/aSls18Pk8lPjahO0" target="_blank" rel="noopener"><span class="wdate mono">2025-12</span><span class="wtitle">Скрипт управления пользователями Linux</span></a></li>
        <li><a class="writing-row" href="https://dzen.ru/a/Zbo1q4ZnkSLnYVtX" target="_blank" rel="noopener"><span class="wdate mono">2024-08</span><span class="wtitle">Как поднять Local Bot API и подключить к нему бота</span></a></li>
        <li><a class="writing-row" href="https://dzen.ru/a/ZDLNIy_Bu0hZz-f2" target="_blank" rel="noopener"><span class="wdate mono">2023-08</span><span class="wtitle">Как настроить пул внешних адресов (Failover subnet) на CHR MikroTik</span></a></li>
      </ul>
      <p class="placeholder-note reveal"><span class="amber">#</span> ещё статьи — на <a href="https://dzen.ru/rasulovdd" target="_blank" rel="noopener" style="color:var(--amber);">dzen.ru/rasulovdd</a></p>
    </div>
  </section>

</main>

<footer>
  <div class="wrap footer-inner">
    <ul class="footer-links">
      <li><a href="mailto:i@rasulovdd.ru">Email</a></li>
      <li><a href="https://github.com/rasulovdd" target="_blank" rel="noopener">GitHub</a></li>
      <li><a href="https://t.me/rasulovdd" target="_blank" rel="noopener">Telegram</a></li>
    </ul>
    <p class="footer-meta">$ exit — dilshod, <span id="year"></span></p>
  </div>
</footer>

<script>
  function toggleMobileNav(btn) {
    var nav = document.getElementById('mnav');
    var open = nav.classList.toggle('open');
    btn.setAttribute('aria-expanded', open ? 'true' : 'false');
  }
  document.getElementById('mnav').addEventListener('click', function(e){
    if (e.target.tagName === 'A') {
      this.classList.remove('open');
      document.querySelector('.nav-toggle').setAttribute('aria-expanded', 'false');
    }
  });

  // live clock
  var clockEl = document.getElementById('clock');
  function tick() {
    var d = new Date();
    var p = function(n){ return String(n).padStart(2,'0'); };
    clockEl.textContent = p(d.getHours()) + ':' + p(d.getMinutes()) + ':' + p(d.getSeconds());
  }
  tick();
  setInterval(tick, 1000);
  document.getElementById('year').textContent = new Date().getFullYear();

  // scroll reveal
  var items = document.querySelectorAll('.reveal');
  if ('IntersectionObserver' in window) {
    var io = new IntersectionObserver(function(entries){
      entries.forEach(function(entry){
        if (entry.isIntersecting) {
          entry.target.classList.add('in');
          io.unobserve(entry.target);
        }
      });
    }, { threshold: 0.15 });
    items.forEach(function(el){ io.observe(el); });
  } else {
    items.forEach(function(el){ el.classList.add('in'); });
  }

  // terminal typing sequence
  var termBody = document.getElementById('termBody');
  var sequence = [
    { cmd: 'whoami', out: 'dilshod' },
    { cmd: 'years --in-field', out: '23<span class="amber">+</span>' },
    { cmd: 'status', out: '<span class="amber">online</span>, automating things' },
    { cmd: 'cat mood.txt', out: 'coffee, cron jobs, calm servers' }
  ];

  (function typeSequence(){
    termBody.innerHTML = '';
    var i = 0;

    function typeLine(cmd, out, cb) {
      var lineEl = document.createElement('p');
      lineEl.className = 'term-line';
      lineEl.innerHTML = '<span class="prompt">➜</span> <span class="path">~</span> <span class="cmdtext"></span><span class="cursor"></span>';
      termBody.appendChild(lineEl);
      var cmdSpan = lineEl.querySelector('.cmdtext');
      var cursor = lineEl.querySelector('.cursor');
      var ci = 0;
      (function typeChar(){
        if (ci < cmd.length) {
          cmdSpan.textContent += cmd[ci];
          ci++;
          setTimeout(typeChar, 32 + Math.random() * 28);
        } else {
          cursor.remove();
          setTimeout(function(){
            var outEl = document.createElement('p');
            outEl.className = 'term-out';
            outEl.innerHTML = out;
            termBody.appendChild(outEl);
            setTimeout(cb, 260);
          }, 180);
        }
      })();
    }

    function next() {
      if (i < sequence.length) {
        var s = sequence[i];
        i++;
        typeLine(s.cmd, s.out, next);
      } else {
        var lineEl = document.createElement('p');
        lineEl.className = 'term-line';
        lineEl.innerHTML = '<span class="prompt">➜</span> <span class="path">~</span> <span class="cursor"></span>';
        termBody.appendChild(lineEl);
      }
    }
    next();
  })();
</script>

</body>
</html>
