<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>老郭的安全屋</title><link>https://blog.gdw1986.top/</link><description>Recent content on 老郭的安全屋</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 大伟</copyright><lastBuildDate>Mon, 11 May 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://blog.gdw1986.top/index.xml" rel="self" type="application/rss+xml"/><item><title>退休倒计时</title><link>https://blog.gdw1986.top/retirement/</link><pubDate>Mon, 11 May 2026 08:00:00 +0800</pubDate><guid>https://blog.gdw1986.top/retirement/</guid><description>&lt;div class="retirement-timeline" id="retirement-timeline"&gt;
 &lt;style&gt;
 .retirement-timeline {
 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
 max-width: 800px; margin: 2em auto; padding: 1.5em;
 background: var(--entry); border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.1);
 }
 .rt-header { text-align: center; margin-bottom: 1.5em; }
 .rt-title { font-size: 1.5em; font-weight: 600; margin-bottom: 0.5em; color: var(--primary); }
 .rt-info { font-size: 0.9em; color: var(--secondary); line-height: 1.8; }
 .rt-info-highlight { color: #22c55e; font-weight: 600; }
 .rt-countdown {
 text-align: center; margin: 1.5em 0; padding: 1em;
 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
 border-radius: 8px; color: white;
 }
 .rt-countdown-number { font-size: 2.5em; font-weight: 700; }
 .rt-countdown-label { font-size: 0.9em; opacity: 0.9; }
 .rt-progress-bar {
 width: 100%; height: 8px; background: rgba(255,255,255,0.3);
 border-radius: 4px; margin-top: 0.5em; overflow: hidden;
 }
 .rt-progress-fill { height: 100%; background: rgba(255,255,255,0.9); border-radius: 4px; transition: width 0.3s ease; }
 .rt-grid {
 display: grid; grid-template-columns: 50px repeat(12, 1fr); gap: 4px; margin-top: 1em;
 }
 .rt-year-label {
 font-weight: 600; font-size: 0.85em; display: flex; align-items: center; justify-content: center; color: var(--primary);
 }
 .rt-month-header { font-size: 0.7em; text-align: center; padding: 0.3em; color: var(--secondary); font-weight: 500; }
 .rt-month {
 aspect-ratio: 1; display: flex; align-items: center; justify-content: center;
 font-size: 0.7em; border-radius: 4px; cursor: pointer;
 transition: all 0.15s ease; border: 2px solid transparent; user-select: none;
 }
 .rt-month:hover { transform: scale(1.12); border-color: var(--primary); }
 .rt-month.readonly { cursor: not-allowed; opacity: 0.95; }
 .rt-month.readonly:hover { transform: none; border-color: transparent; }
 .rt-month.future { background: var(--code-bg); color: var(--secondary); }
 .rt-month.pending-add { background: #fbbf24; color: #78350f; }
 .rt-month.pending-del { background: #fca5a5; color: #7f1d1d; text-decoration: line-through; }
 .rt-month.completed { background: #22c55e; color: white; }
 .rt-month.target { background: linear-gradient(135deg, #f59e0b 0%, #ef4444 100%); color: white; font-weight: 600; }
 .rt-month.target.pending-add { background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); color: #78350f; }
 .rt-month.target.pending-del { background: linear-gradient(135deg, #fca5a5 0%, #ef4444 100%); color: #7f1d1d; text-decoration: line-through; }
 .rt-month.target.completed { background: linear-gradient(135deg, #10b981 0%, #059669 100%); }
 .rt-month.after-target { background: var(--code-bg); color: var(--secondary); opacity: 0.3; }
 .rt-legend { display: flex; justify-content: center; flex-wrap: wrap; gap: 1.2em; margin-top: 1em; font-size: 0.8em; color: var(--secondary); }
 .rt-legend-item { display: flex; align-items: center; gap: 0.3em; }
 .rt-legend-box { width: 16px; height: 16px; border-radius: 3px; }
 .rt-actions { display: flex; justify-content: center; gap: 0.8em; margin-top: 1.2em; }
 .rt-actions button {
 padding: 0.6em 1.5em; border: 1px solid var(--border); background: var(--entry);
 border-radius: 6px; cursor: pointer; font-size: 0.85em; color: var(--primary); transition: all 0.2s;
 }
 .rt-actions button:hover { background: var(--primary); color: white; }
 .rt-actions button.rt-save-btn { background: #22c55e; color: white; border-color: #22c55e; font-weight: 600; }
 .rt-actions button.rt-save-btn:hover { background: #16a34a; border-color: #16a34a; }
 .rt-actions button.rt-save-btn:disabled { background: #9ca3af; border-color: #9ca3af; cursor: not-allowed; }
 .rt-actions button.rt-lock-btn { background: #3b82f6; color: white; border-color: #3b82f6; font-weight: 600; }
 .rt-actions button.rt-lock-btn:hover { background: #2563eb; border-color: #2563eb; }
 .rt-actions button.rt-unlock-btn { background: #ef4444; color: white; border-color: #ef4444; font-weight: 600; }
 .rt-actions button.rt-unlock-btn:hover { background: #dc2626; border-color: #dc2626; }
 .rt-actions button:disabled { opacity: 0.5; cursor: not-allowed; }
 .rt-toast {
 position: fixed; bottom: 2em; left: 50%; transform: translateX(-50%) translateY(100px);
 background: #22c55e; color: white; padding: 0.8em 1.5em; border-radius: 8px; font-size: 0.9em;
 opacity: 0; transition: all 0.3s ease; z-index: 9999; pointer-events: none;
 }
 .rt-toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
 .rt-toast.error { background: #ef4444; }
 .rt-dirty-hint { text-align: center; margin-top: 0.5em; font-size: 0.8em; color: #f59e0b; opacity: 0; transition: opacity 0.2s; }
 .rt-dirty-hint.show { opacity: 1; }
 .rt-lock-hint { text-align: center; margin-top: 0.8em; font-size: 0.8em; color: #3b82f6; display: flex; align-items: center; justify-content: center; gap: 0.4em; cursor: pointer; }
 .rt-lock-hint:hover { text-decoration: underline; }
 .rt-lock-hint.unlocked { color: #22c55e; }
 .rt-loading { text-align: center; padding: 2em; color: var(--secondary); }
 .rt-updated { text-align: center; font-size: 0.75em; color: var(--secondary); margin-top: 0.3em; }
 .rt-password-overlay {
 position: fixed; top: 0; left: 0; right: 0; bottom: 0;
 background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 10000;
 }
 .rt-password-box { background: var(--entry); border-radius: 12px; padding: 2em; min-width: 320px; text-align: center; box-shadow: 0 4px 20px rgba(0,0,0,0.3); }
 .rt-password-box h3 { margin: 0 0 1em 0; color: var(--primary); }
 .rt-password-box input {
 width: 100%; padding: 0.6em 1em; border: 1px solid var(--border); border-radius: 6px;
 font-size: 1em; background: var(--code-bg); color: var(--primary); box-sizing: border-box; margin-bottom: 1em;
 }
 .rt-password-box input:focus { outline: none; border-color: #3b82f6; }
 .rt-password-box .rt-pw-actions { display: flex; gap: 0.8em; justify-content: center; }
 .rt-password-box button { padding: 0.5em 1.5em; border: 1px solid var(--border); border-radius: 6px; cursor: pointer; font-size: 0.9em; transition: all 0.2s; }
 .rt-password-box .rt-pw-confirm { background: #3b82f6; color: white; border-color: #3b82f6; }
 .rt-password-box .rt-pw-confirm:hover { background: #2563eb; }
 .rt-password-box .rt-pw-cancel { background: var(--entry); color: var(--primary); }
 .rt-password-box .rt-pw-error { color: #ef4444; font-size: 0.85em; margin-top: 0.5em; min-height: 1.2em; }
 &lt;/style&gt;

 &lt;div class="rt-loading" id="rt-loading"&gt;加载中...&lt;/div&gt;

 &lt;div id="rt-content" style="display:none;"&gt;
 &lt;div class="rt-header"&gt;
 &lt;div class="rt-title"&gt;退休倒计时&lt;/div&gt;
 &lt;div class="rt-info"&gt;
 &lt;span id="rt-author"&gt;&lt;/span&gt;&lt;br&gt;
 参加工作时间 &lt;span id="rt-start-work"&gt;&lt;/span&gt;&lt;br&gt;
 已缴纳社保 &lt;span class="rt-info-highlight"&gt;&lt;span id="rt-completed-count"&gt;0&lt;/span&gt;个月&lt;/span&gt;&lt;br&gt;
 目标：社保缴纳满 &lt;span id="rt-need-months"&gt;&lt;/span&gt; 个月，截至 &lt;span id="rt-target-month"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="rt-countdown"&gt;
 &lt;div class="rt-countdown-number" id="rt-remaining"&gt;--&lt;/div&gt;
 &lt;div class="rt-countdown-label"&gt;还需缴纳多少个月&lt;/div&gt;
 &lt;div class="rt-progress-bar"&gt;&lt;div class="rt-progress-fill" id="rt-progress" style="width: 0%"&gt;&lt;/div&gt;&lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="rt-grid" id="rt-grid"&gt;
 &lt;div&gt;&lt;/div&gt;
 &lt;div class="rt-month-header"&gt;1月&lt;/div&gt;&lt;div class="rt-month-header"&gt;2月&lt;/div&gt;&lt;div class="rt-month-header"&gt;3月&lt;/div&gt;
 &lt;div class="rt-month-header"&gt;4月&lt;/div&gt;&lt;div class="rt-month-header"&gt;5月&lt;/div&gt;&lt;div class="rt-month-header"&gt;6月&lt;/div&gt;
 &lt;div class="rt-month-header"&gt;7月&lt;/div&gt;&lt;div class="rt-month-header"&gt;8月&lt;/div&gt;&lt;div class="rt-month-header"&gt;9月&lt;/div&gt;
 &lt;div class="rt-month-header"&gt;10月&lt;/div&gt;&lt;div class="rt-month-header"&gt;11月&lt;/div&gt;&lt;div class="rt-month-header"&gt;12月&lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="rt-legend"&gt;
 &lt;div class="rt-legend-item"&gt;&lt;div class="rt-legend-box" style="background: var(--code-bg);"&gt;&lt;/div&gt;&lt;span&gt;待完成&lt;/span&gt;&lt;/div&gt;
 &lt;div class="rt-legend-item"&gt;&lt;div class="rt-legend-box" style="background: #fbbf24;"&gt;&lt;/div&gt;&lt;span&gt;待添加&lt;/span&gt;&lt;/div&gt;
 &lt;div class="rt-legend-item"&gt;&lt;div class="rt-legend-box" style="background: #fca5a5;"&gt;&lt;/div&gt;&lt;span&gt;待删除&lt;/span&gt;&lt;/div&gt;
 &lt;div class="rt-legend-item"&gt;&lt;div class="rt-legend-box" style="background: #22c55e;"&gt;&lt;/div&gt;&lt;span&gt;已完成&lt;/span&gt;&lt;/div&gt;
 &lt;div class="rt-legend-item"&gt;&lt;div class="rt-legend-box" style="background: linear-gradient(135deg, #f59e0b 0%, #ef4444 100%);"&gt;&lt;/div&gt;&lt;span&gt;目标月&lt;/span&gt;&lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="rt-updated" id="rt-updated"&gt;&lt;/div&gt;
 &lt;div class="rt-dirty-hint" id="rt-dirty-hint"&gt;⚠ 有未保存的修改&lt;/div&gt;

 &lt;div class="rt-lock-hint" id="rt-lock-hint"&gt;
 &lt;span id="rt-lock-icon"&gt;🔒&lt;/span&gt;
 &lt;span id="rt-lock-text"&gt;只读模式 — 点击解锁编辑&lt;/span&gt;
 &lt;/div&gt;

 &lt;div class="rt-actions"&gt;
 &lt;button class="rt-lock-btn" id="rt-lock-btn"&gt;🔓 解锁编辑&lt;/button&gt;
 &lt;button class="rt-save-btn" id="rt-save-btn" disabled style="display:none;"&gt;💾 保存修改&lt;/button&gt;
 &lt;button id="rt-reset-btn" style="display:none;"&gt;重置全部&lt;/button&gt;
 &lt;/div&gt;
 &lt;/div&gt;

 &lt;div class="rt-toast" id="rt-toast"&gt;✓ 已保存&lt;/div&gt;

 &lt;script&gt;
 (function() {
 var API_URL = '/retirement-api/api/retirement';
 var STORAGE_KEY = 'retirement-auth';
 var PASSWORD_HASH = '2be1a3e861cca9f52c7cdbe08f3626a0d856b8a890d824fac9e5bfb64704a503';

 var isDirty = false;
 var isUnlocked = false;
 var needMonths = 240;
 var gStartWork = "2010-10";
 var serverIds = []; 
 var pendingAdd = []; 
 var pendingDel = []; 

 function $(id) { return document.getElementById(id); }

 function showToast(msg, isError) {
 var t = $('rt-toast');
 t.textContent = msg || '✓ 已保存';
 t.className = 'rt-toast show' + (isError ? ' error' : '');
 setTimeout(function() { t.className = 'rt-toast'; }, 2500);
 }

 function markDirty() {
 isDirty = true;
 $('rt-save-btn').disabled = false;
 $('rt-dirty-hint').classList.add('show');
 }

 function markClean() {
 isDirty = false;
 $('rt-save-btn').disabled = true;
 $('rt-dirty-hint').classList.remove('show');
 }

 function calcPaidMonths() {
 var parts = gStartWork.split('-');
 var sy = parseInt(parts[0]), sm = parseInt(parts[1]);
 var now = new Date();
 var cy = now.getFullYear(), cm = now.getMonth() + 1;
 return (cy - sy) * 12 + (cm - sm);
 }

 function updateCountdown() {
 var autoPaid = calcPaidMonths();
 var finalIds = getFinalIds();
 var marked = finalIds.length;
 var remaining = Math.max(0, needMonths - marked);
 var percent = (Math.min(marked, needMonths) / needMonths * 100).toFixed(1);
 $('rt-remaining').textContent = remaining;
 $('rt-progress').style.width = percent + '%';
 $('rt-completed-count').textContent = autoPaid;
 }

 
 function getFinalIds() {
 var r = serverIds.slice();
 pendingAdd.forEach(function(id) { if (r.indexOf(id) === -1) r.push(id); });
 pendingDel.forEach(function(id) {
 var i = r.indexOf(id); if (i !== -1) r.splice(i, 1);
 });
 return r;
 }

 function buildGrid() {
 var grid = $('rt-grid');
 while (grid.children.length &gt; 13) grid.removeChild(grid.lastChild);

 var finalIds = getFinalIds();
 var years = [2026, 2027, 2028, 2029, 2030, 2031];

 years.forEach(function(year) {
 var label = document.createElement('div');
 label.className = 'rt-year-label';
 label.textContent = year;
 grid.appendChild(label);

 for (var m = 1; m &lt;= 12; m++) {
 var month = m.toString().padStart(2, '0');
 var id = year + '-' + month;
 var isTarget = (year === 2031 &amp;&amp; m === 10);
 var isAfterTarget = (year === 2031 &amp;&amp; m &gt; 10);
 var isFuture = (year &gt; 2026) || (year === 2026 &amp;&amp; m &gt;= 1);

 var onServer = serverIds.indexOf(id) !== -1;
 var willAdd = pendingAdd.indexOf(id) !== -1;
 var willDel = pendingDel.indexOf(id) !== -1;
 var isCompleted = onServer &amp;&amp; !willDel;

 var cell = document.createElement('div');
 cell.className = 'rt-month readonly';
 cell.dataset.id = id;

 if (isAfterTarget) {
 cell.classList.add('after-target');
 cell.textContent = month;
 } else if (isTarget) {
 cell.classList.add('target');
 if (isCompleted) cell.classList.add('completed');
 else if (willDel) cell.classList.add('pending-del');
 else if (willAdd) cell.classList.add('pending-add');
 cell.textContent = '★';
 } else {
 if (isCompleted) cell.classList.add('completed');
 else if (willDel) cell.classList.add('pending-del');
 else if (willAdd) cell.classList.add('pending-add');
 else if (!isFuture) cell.classList.add('after-target');
 else cell.classList.add('future');
 cell.textContent = month;
 }

 cell.addEventListener('click', function() {
 if (!isUnlocked) { showToast('🔒 只读模式，请先解锁', true); return; }
 var cid = this.dataset.id;
 toggleId(cid);
 });

 grid.appendChild(cell);
 }
 });
 }

 
 function toggleId(id) {
 var wasOnServer = serverIds.indexOf(id) !== -1;
 var wasPendingAdd = pendingAdd.indexOf(id) !== -1;
 var wasPendingDel = pendingDel.indexOf(id) !== -1;

 if (wasPendingDel) {
 
 pendingDel.splice(pendingDel.indexOf(id), 1);
 } else if (wasPendingAdd) {
 
 pendingAdd.splice(pendingAdd.indexOf(id), 1);
 } else if (wasOnServer) {
 
 pendingDel.push(id);
 } else {
 
 pendingAdd.push(id);
 }
 markDirty();
 buildGrid();
 updateCountdown();
 }

 function renderData(data) {
 $('rt-author').textContent = data.author || '大伟';
 $('rt-start-work').textContent = data.startWork || '2010-10';
 gStartWork = data.startWork || '2010-10';
 $('rt-target-month').textContent = data.targetMonth || '2031-10';
 $('rt-need-months').textContent = data.needMonths || 53;
 $('rt-updated').textContent = '最后更新: ' + (data.lastUpdated || '');

 needMonths = data.needMonths || 53;
 serverIds = data.completedIds || [];
 pendingAdd = [];
 pendingDel = [];

 buildGrid();
 updateCountdown();
 markClean();

 $('rt-loading').style.display = 'none';
 $('rt-content').style.display = 'block';

 if (localStorage.getItem(STORAGE_KEY) === '1') setLockState(true);
 else setLockState(false);
 }

 function setLockState(unlocked) {
 isUnlocked = unlocked;
 if (unlocked) {
 $('rt-lock-btn').textContent = '🔒 锁定';
 $('rt-lock-btn').className = 'rt-unlock-btn';
 $('rt-save-btn').style.display = '';
 $('rt-reset-btn').style.display = '';
 $('rt-lock-icon').textContent = '🔓';
 $('rt-lock-text').textContent = '编辑模式 — 点击格子切换标记';
 $('rt-lock-hint').className = 'rt-lock-hint unlocked';
 document.querySelectorAll('.rt-month').forEach(function(c) { c.classList.remove('readonly'); });
 localStorage.setItem(STORAGE_KEY, '1');
 } else {
 $('rt-lock-btn').textContent = '🔓 解锁编辑';
 $('rt-lock-btn').className = 'rt-lock-btn';
 $('rt-save-btn').style.display = 'none';
 $('rt-reset-btn').style.display = 'none';
 $('rt-lock-icon').textContent = '🔒';
 $('rt-lock-text').textContent = '只读模式 — 点击解锁编辑';
 $('rt-lock-hint').className = 'rt-lock-hint';
 document.querySelectorAll('.rt-month').forEach(function(c) { c.classList.add('readonly'); });
 localStorage.removeItem(STORAGE_KEY);
 pendingAdd = [];
 pendingDel = [];
 buildGrid();
 updateCountdown();
 markClean();
 }
 }

 function showPasswordDialog() {
 var overlay = document.createElement('div');
 overlay.className = 'rt-password-overlay';
 overlay.innerHTML =
 '&lt;div class="rt-password-box"&gt;' +
 '&lt;h3&gt;🔒 输入密码解锁编辑&lt;/h3&gt;' +
 '&lt;input type="password" id="rt-pw-input" placeholder="请输入密码" autocomplete="off" /&gt;' +
 '&lt;div class="rt-pw-actions"&gt;' +
 '&lt;button class="rt-pw-cancel" id="rt-pw-cancel"&gt;取消&lt;/button&gt;' +
 '&lt;button class="rt-pw-confirm" id="rt-pw-confirm"&gt;确认&lt;/button&gt;' +
 '&lt;/div&gt;&lt;div class="rt-pw-error" id="rt-pw-error"&gt;&lt;/div&gt;&lt;/div&gt;';
 document.body.appendChild(overlay);
 var input = $('rt-pw-input');
 input.focus();

 function verify() {
 crypto.subtle.digest('SHA-256', new TextEncoder().encode(input.value)).then(function(buf) {
 var hex = Array.from(new Uint8Array(buf)).map(function(b){ return b.toString(16).padStart(2,'0'); }).join('');
 if (hex === PASSWORD_HASH) {
 setLockState(true);
 document.body.removeChild(overlay);
 showToast('🔓 已解锁');
 } else {
 $('rt-pw-error').textContent = '密码错误';
 input.value = ''; input.focus();
 }
 });
 }
 $('rt-pw-confirm').addEventListener('click', verify);
 $('rt-pw-cancel').addEventListener('click', function() { document.body.removeChild(overlay); });
 input.addEventListener('keydown', function(e) {
 if (e.key === 'Enter') verify();
 if (e.key === 'Escape') document.body.removeChild(overlay);
 });
 }

 function saveToServer() {
 var pw = prompt('输入密码以保存：');
 if (!pw) return;
 localStorage.setItem('rt-session-pw', pw);

 var finalIds = getFinalIds();
 fetch(API_URL, {
 method: 'POST',
 headers: { 'Content-Type': 'application/json', 'X-Password': pw },
 body: JSON.stringify({
 completedIds: finalIds,
 lastUpdated: new Date().toISOString().replace('T',' ').substring(0,16)
 })
 }).then(function(r) {
 if (r.status === 401) { showToast('密码错误', true); return null; }
 return r.json();
 }).then(function(res) {
 if (res &amp;&amp; res.success) {
 serverIds = res.data.completedIds;
 pendingAdd = [];
 pendingDel = [];
 $('rt-updated').textContent = '最后更新: ' + res.data.lastUpdated;
 buildGrid();
 updateCountdown();
 markClean();
 showToast();
 }
 }).catch(function() { showToast('保存失败', true); });
 }

 $('rt-lock-btn').addEventListener('click', function() {
 if (isUnlocked) {
 if (isDirty &amp;&amp; !confirm('有未保存的修改，确定锁定吗？')) return;
 setLockState(false);
 showToast('🔒 已锁定');
 } else {
 showPasswordDialog();
 }
 });
 $('rt-lock-hint').addEventListener('click', function() { if (!isUnlocked) showPasswordDialog(); });
 $('rt-save-btn').addEventListener('click', saveToServer);

 $('rt-reset-btn').addEventListener('click', function() {
 if (!confirm('重置所有标记？')) return;
 var pw = prompt('输入密码确认重置：');
 if (!pw) return;
 localStorage.setItem('rt-session-pw', pw);
 fetch(API_URL, {
 method: 'POST',
 headers: { 'Content-Type': 'application/json', 'X-Password': pw },
 body: JSON.stringify({ completedIds: [], lastUpdated: new Date().toISOString().replace('T',' ').substring(0,16) })
 }).then(function(r) { return r.status === 401 ? Promise.reject() : r.json(); })
 .then(function(res) {
 if (res &amp;&amp; res.success) {
 serverIds = []; pendingAdd = []; pendingDel = [];
 buildGrid(); updateCountdown(); markClean();
 showToast('✓ 已重置');
 }
 }).catch(function() { showToast('密码错误', true); });
 });

 window.addEventListener('beforeunload', function(e) {
 if (isDirty) { e.preventDefault(); e.returnValue = ''; }
 });

 fetch(API_URL).then(function(r){ return r.json(); }).then(renderData)
 .catch(function() {
 $('rt-loading').textContent = '加载失败，请刷新';
 showToast('加载失败', true);
 });
 })();
 &lt;/script&gt;
&lt;/div&gt;</description></item><item><title>一个人的正常</title><link>https://blog.gdw1986.top/posts/yi-ge-ren-de-zheng-chang/</link><pubDate>Mon, 11 May 2026 07:50:00 +0800</pubDate><guid>https://blog.gdw1986.top/posts/yi-ge-ren-de-zheng-chang/</guid><description>&lt;p&gt;最近刷到两个视频，再一次对我想要的生活产生了一些回响。&lt;/p&gt;

&lt;div style="position:relative;padding-bottom:66.67%;width:100%;height:0;margin-bottom:2em;"&gt;
 &lt;iframe src="//player.bilibili.com/player.html?bvid=BV14fQ4BEEWd&amp;page=1&amp;autoplay=0" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true" style="position:absolute;top:0;left:0;width:100%;height:100%;"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;老杨玩了一辈子游戏，从街机厅到模拟器，一生没有结婚、没有存款、没有所谓的&amp;quot;正经事业&amp;quot;。2023年春天，他走了。258万人看了这个视频，15万人点了赞——评论区里全是&amp;quot;这才是我想要的人生&amp;quot;和&amp;quot;可我做不到&amp;quot;。&lt;/p&gt;</description></item><item><title>关于</title><link>https://blog.gdw1986.top/about/</link><pubDate>Sun, 10 May 2026 20:30:00 +0800</pubDate><guid>https://blog.gdw1986.top/about/</guid><description>&lt;p&gt;👋 你好，我是老郭，一名伪码农。&lt;/p&gt;
&lt;p&gt;10年以上测试经验，先后就职于数码视讯、华为，SAS。擅长基础设施自动化、容器化部署和 SRE 实践。&lt;/p&gt;</description></item><item><title>搜索</title><link>https://blog.gdw1986.top/search/</link><pubDate>Sun, 10 May 2026 20:30:00 +0800</pubDate><guid>https://blog.gdw1986.top/search/</guid><description/></item><item><title>勇哥餐饮588例投资分析报告V2</title><link>https://blog.gdw1986.top/posts/can-yin-588-li-tou-zi-fen-xi/</link><pubDate>Fri, 01 May 2026 08:31:30 +0800</pubDate><guid>https://blog.gdw1986.top/posts/can-yin-588-li-tou-zi-fen-xi/</guid><description>&lt;h2 class="relative group"&gt;勇哥餐饮588例投资分析报告V2
 &lt;div id="勇哥餐饮588例投资分析报告v2" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8b%87%e5%93%a5%e9%a4%90%e9%a5%ae588%e4%be%8b%e6%8a%95%e8%b5%84%e5%88%86%e6%9e%90%e6%8a%a5%e5%91%8av2" aria-label="锚点"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;基于588期B站视频AI字幕全量深度分析（非标题关键词猜测）
分析时间：2026年5月1日&lt;/p&gt;</description></item><item><title>下一步该怎么走呢</title><link>https://blog.gdw1986.top/posts/xia-yi-bu-gai-zen-me-zou/</link><pubDate>Thu, 16 Apr 2026 21:28:15 +0800</pubDate><guid>https://blog.gdw1986.top/posts/xia-yi-bu-gai-zen-me-zou/</guid><description>&lt;p&gt;最近感觉也没什么面试机会了，之前攒的那些也消耗得差不多了。不知道是我真的不行，还是不合适。&lt;/p&gt;</description></item><item><title>如何在一天内修复你的整个人生</title><link>https://blog.gdw1986.top/posts/xiu-fu-zheng-ge-ren-sheng/</link><pubDate>Thu, 16 Apr 2026 20:37:38 +0800</pubDate><guid>https://blog.gdw1986.top/posts/xiu-fu-zheng-ge-ren-sheng/</guid><description>&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://letters.thedankoe.com/p/how-to-fix-your-entire-life-in-1" target="_blank" rel="noreferrer"&gt;How to fix your entire life in 1 day&lt;/a&gt; — The Daily DAO（作者：Dan）&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;你大概会放弃你的新年计划。
这没关系。大多数人都是如此（研究表明失败率高达 80-90%），因为大多数人并不想在深层真正改变。他们设定新年计划，只是因为别人都在这么做——人类想给别人留下深刻印象的程度，远超想给自己留下深刻印象……我们将肤浅的意义寄托在身份游戏上——但这并不满足真正改变的要求。真正的改变远比说服自己今年要更自律、更有生产力要深刻得多。&lt;/p&gt;</description></item><item><title>游戏</title><link>https://blog.gdw1986.top/games/</link><pubDate>Sun, 12 Apr 2026 13:53:55 +0800</pubDate><guid>https://blog.gdw1986.top/games/</guid><description>&lt;div style="text-align:center;margin-bottom:20px;"&gt;
 &lt;a href="https://blog.gdw1986.top/2048_v2/" target="_blank" style="font-size:1.2em;text-decoration:none;color:var(--accent);"&gt;🎮 在新标签页打开 2048&lt;/a&gt;
&lt;/div&gt;
&lt;iframe src="https://blog.gdw1986.top/2048_v2/" style="width:100%;height:80vh;border:none;border-radius:8px;" allow="autoplay"&gt;&lt;/iframe&gt;</description></item><item><title>我从零搭了一个股票回测框架，踩了哪些坑</title><link>https://blog.gdw1986.top/posts/gu-piao-hui-ce-kuang-jia/</link><pubDate>Sat, 11 Apr 2026 10:25:51 +0800</pubDate><guid>https://blog.gdw1986.top/posts/gu-piao-hui-ce-kuang-jia/</guid><description>&lt;p&gt;做量化交易两年多了，我一直用聚宽、米筐这些平台回测。功能是挺全的，但总有些东西想自己控制——数据格式、策略逻辑、报告样式。更重要的是，&lt;strong&gt;我发现自己对量化交易的本质理解得还不够深&lt;/strong&gt;，与其继续当一个”调参侠”，不如自己从零搭一个框架，把每个环节都想清楚。&lt;/p&gt;</description></item><item><title>失业第 100 天</title><link>https://blog.gdw1986.top/posts/shi-ye-di-100-tian/</link><pubDate>Fri, 10 Apr 2026 15:53:07 +0800</pubDate><guid>https://blog.gdw1986.top/posts/shi-ye-di-100-tian/</guid><description>&lt;p&gt;从去年 12 月 31 日到现在，刚好 100 天了。这个数字有点巧，像是老天在提醒我：该给自己一个节点。这三个月，说长不长，说短不短。刚开始还有点新鲜感——久违地睡到自然醒，不用挤早高峰，不用回复那些&amp;quot;收到&amp;quot;和&amp;quot;好的&amp;quot;。但慢慢地，焦虑还是会爬上来。&lt;/p&gt;</description></item></channel></rss>