我多想能多陪你一场

00:00
00:00 / 00:00
    /* 重新定义颜色方案,更现代化且与WordPress背景协调 */ :root { –paper-color: #ffffff; –paper-shadow: 0 10px 20px rgba(0, 0, 0, 0.08); –paper-hover-shadow: 0 15px 30px rgba(0, 0, 0, 0.12); –border-color: #eaeaea; –line-color: rgba(0, 0, 0, 0.03); –dashed-border-color: rgba(0, 128, 128, 0.2); –overlay-bg-color: rgba(0, 0, 0, 0.7); –accent-color: #008080; –accent-light: rgba(0, 128, 128, 0.1); –text-color: #333333; –line-height: 2.2rem; –paper-padding: 25px; –modal-padding: 35px; –paper-margin: 15px; –border-radius: 12px; –button-radius: 50%; –wp-bg-color: #f3f3f3; } /* 基础信纸卡片样式,更柔和的视觉效果 */ .letter-paper { margin-top: 40px; padding: var(–paper-padding); background-color: var(–paper-color); border: 1px solid var(–border-color); border-radius: var(–border-radius); box-shadow: var(–paper-shadow); position: relative; font-family: “Nunito”, sans-serif; font-weight: 400; line-height: var(–line-height); background-image: linear-gradient(to bottom, var(–line-color) 1px, transparent 1px); background-size: 100% var(–line-height); max-width: 400px; height: 300px; margin-right: var(–paper-margin); margin-bottom: var(–paper-margin); float: left; overflow: hidden; /* Important for the card preview */ cursor: pointer; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); color: var(–text-color); } /* 改进的悬停效果 */ .letter-paper:hover { transform: translateY(-8px); box-shadow: var(–paper-hover-shadow); border-color: var(–accent-light); } /* 虚线边框装饰,使用柔和的颜色 */ .letter-paper:before { content: “”; position: absolute; top: 12px; left: 12px; right: 12px; bottom: 12px; border: 2px dashed var(–dashed-border-color); border-radius: calc(var(–border-radius) – 6px); pointer-events: none; opacity: 0.6; transition: opacity 0.3s ease; } .letter-paper:hover:before { opacity: 1; } /* 标题样式优化 */ .letter-paper h4, .modal-content h4 { /* Applied to all h4 within for consistency */ text-align: center; margin-top: 0; margin-bottom: 1rem; color: var(–accent-color); font-weight: 700; font-size: 1.4rem; position: relative; padding-bottom: 0.5rem; } .letter-paper h4:after, .modal-content h4:after { content: “”; position: absolute; bottom: 0; left: 25%; width: 50%; height: 2px; background: linear-gradient(to right, transparent, var(–accent-color), transparent); } /* Ensure h5 and h6 also get some styling if used within content */ .letter-paper h5, .modal-content h5 { color: var(–accent-color); font-weight: 700; font-size: 1.2rem; margin-top: 1rem; margin-bottom: 0.5rem; } .letter-paper h6, .modal-content h6 { color: var(–accent-color); font-weight: 500; font-size: 1.1rem; margin-top: 0.8rem; margin-bottom: 0.4rem; } /* 引用和诗句样式美化 */ .letter-paper blockquote.wp-block-quote, .letter-paper pre.wp-block-verse, .modal-content blockquote.wp-block-quote, .modal-content pre.wp-block-verse { background-color: var(–accent-light); padding: 15px; border-radius: 8px; margin: 15px 0; border-left: 4px solid var(–accent-color); font-style: italic; color: var(–text-color); } /* WordPress List styling */ .letter-paper .wp-block-list, .modal-content .wp-block-list { margin-left: 20px; padding-left: 0; } .letter-paper .wp-block-list li, .modal-content .wp-block-list li { margin-bottom: 0.5rem; } /* WordPress Image styling */ .letter-paper .wp-block-image, .modal-content .wp-block-image { margin: 1rem auto; text-align: center; } .letter-paper .wp-block-image img, .modal-content .wp-block-image img { max-width: 100%; height: auto; border-radius: 8px; box-shadow: 0 5px 15px rgba(0,0,0,0.1); } /* 清除浮动 */ .clearfix::after { content: “”; display: block; clear: both; } /* 模态窗口背景 */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 999; background-color: var(–overlay-bg-color); backdrop-filter: blur(3px); display: none; align-items: center; justify-content: center; opacity: 0; transition: opacity 0.4s cubic-bezier(0.19, 1, 0.22, 1); } .modal-overlay.active { opacity: 1; display: flex; } /* 模态内容样式美化 */ .modal-content { width: 800px; /* Or a percentage like 70vw */ max-width: 90%; max-height: 90vh; /* Use vh for viewport height percentage */ overflow-y: auto; /* Changed from overflow: auto for vertical scroll only */ background-color: var(–paper-color); padding: var(–modal-padding); border: 1px solid var(–border-color); border-radius: var(–border-radius); box-shadow: 0 25px 50px rgba(0, 0, 0, 0.25); position: relative; font-family: “Nunito”, sans-serif; font-weight: 400; line-height: var(–line-height); background-image: linear-gradient(to bottom, var(–line-color) 1px, transparent 1px); background-size: 100% var(–line-height); transform: scale(0.95) translateY(20px); transition: all 0.4s cubic-bezier(0.19, 1, 0.22, 1); color: var(–text-color); } /* Ensure inner container in modal allows content to flow */ .modal-content .wp-block-group__inner-container { max-height: none; /* Remove any height restrictions from card view */ overflow: visible; /* Allow content to be visible */ } .modal-overlay.active .modal-content { transform: scale(1) translateY(0); } /* 模态窗口多媒体内容 */ .modal-content video, .modal-content audio { max-height: 300px; max-width: 100%; display: block; margin: 20px auto; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .modal-content img { max-width: 100%; height: auto; display: block; margin: 20px auto; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } /* Specific for shortcode player in modal if needed */ .modal-content .wp-block-shortcode { margin: 20px 0; } /* 模态窗口内虚线边框 */ .modal-content:before { content: “”; position: absolute; top: 15px; left: 15px; right: 15px; bottom: 15px; border: 2px dashed var(–dashed-border-color); border-radius: calc(var(–border-radius) – 8px); pointer-events: none; z-index: -1; /* Ensure it’s behind content */ opacity: 0.6; } /* 美化的关闭按钮 */ .close-button { position: absolute; top: 15px; right: 15px; background-color: var(–accent-color); color: white; border: none; border-radius: var(–button-radius); width: 36px; height: 36px; font-size: 20px; line-height: 36px; text-align: center; cursor: pointer; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2); transition: all 0.2s ease; z-index: 1000; padding: 0; } .close-button:hover { background-color: #006666; transform: rotate(90deg); } /* 美化导航按钮 */ .nav-button { position: absolute; top: 50%; transform: translateY(-50%); background-color: rgba(0, 128, 128, 0.7); color: white; border: none; width: 40px; height: 40px; font-size: 18px; text-align: center; cursor: pointer; transition: all 0.3s ease; z-index: 1000; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); display: flex; align-items: center; justify-content: center; backdrop-filter: blur(2px); } /* 半透明半圆形按钮设计 */ .prev-button { left: 10px; border-radius: 0 20px 20px 0; padding-right: 5px; } .next-button { right: 10px; border-radius: 20px 0 0 20px; padding-left: 5px; } .nav-button:hover { background-color: var(–accent-color); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2); } /* 改进的加载指示器 */ .loader { border: 4px solid rgba(0, 128, 128, 0.1); border-top: 4px solid var(–accent-color); border-radius: 50%; width: 50px; height: 50px; animation: spin 1s cubic-bezier(0.68, -0.55, 0.27, 1.55) infinite; position: absolute; top: 50%; left: 50%; margin: -25px 0 0 -25px; display: none; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* 禁止外部页面滚动 */ body.no-scroll { overflow: hidden; } /* 改进无障碍支持 */ .letter-paper:focus, .close-button:focus, .nav-button:focus { outline: none; box-shadow: 0 0 0 3px var(–accent-light), var(–paper-shadow); } /* 卡片内段落文本样式 */ .letter-paper p, .modal-content p { margin-bottom: 1rem; font-size: 0.95rem; line-height: 1.6; } /* WordPress details block styling */ .letter-paper details, .modal-content details { border: 1px solid var(–border-color); border-radius: 8px; margin: 1rem 0; background-color: rgba(0,0,0,0.02); } .letter-paper details summary, .modal-content details summary { padding: 0.75rem; font-weight: 500; cursor: pointer; color: var(–accent-color); } .letter-paper details summary:hover, .modal-content details summary:hover { background-color: var(–accent-light); } .letter-paper details > div, .modal-content details > div, /* If content is wrapped in a div */ .letter-paper details > p, .modal-content details > p, /* If content is paragraphs directly */ .letter-paper details > ul, .modal-content details > ul, .letter-paper details > ol, .modal-content details > ol, .letter-paper details > table, .modal-content details > table { padding: 0 0.75rem 0.75rem 0.75rem; } /* 信纸卡片内容装饰效果 */ .letter-paper:after { content: “”; position: absolute; bottom: 10px; right: 10px; width: 30px; height: 30px; background: linear-gradient(135deg, transparent 45%, var(–accent-color) 45%, var(–accent-color) 50%, transparent 50%); border-radius: 0 0 var(–border-radius) 0; opacity: 0.5; transition: opacity 0.3s ease; } .letter-paper:hover:after { opacity: 1; } /* 响应式布局优化 */ @media (max-width: 479px) { .letter-paper { width: 100%; margin-right: 0; height: 280px; } .close-button { top: 10px; right: 10px; } .nav-button { width: 36px; height: 36px; font-size: 18px; } .modal-content { padding: 25px; width: 95%; } } @media (min-width: 480px) and (max-width: 767px) { .letter-paper { width: calc(50% – var(–paper-margin)); height: 290px; } .modal-content { width: 90%; } } @media (min-width: 768px) and (max-width: 1023px) { .letter-paper { width: calc(33.333% – var(–paper-margin)); height: 280px; } .modal-content { width: 80%; } } @media (min-width: 1024px) { .letter-paper { width: calc(25% – var(–paper-margin)); /* Adjust for desired columns */ /* Example: For 3 columns: calc(33.333% – var(–paper-margin)) */ /* Example: For 2 columns: calc(50% – var(–paper-margin)) */ height: 300px; } .modal-content { width: 800px; /* Fixed width for larger screens */ } } /* 移动设备上的导航按钮优化 */ @media (max-width: 767px) { .nav-button { top: auto; bottom: 20px; width: 36px; height: 36px; font-size: 16px; background-color: var(–accent-color); } .prev-button { left: calc(50% – 50px); /* 居中偏左 */ border-radius: 18px; } .next-button { right: calc(50% – 50px); /* 居中偏右 */ border-radius: 18px; } /* 为移动设备上的按钮添加更明显的图标 */ .prev-button::before { content: “←”; } .next-button::before { content: “→”; } } /* 修改模态内容底部边距,确保移动设备上按钮不遮挡内容 */ @media (max-width: 767px) { .modal-content { padding-bottom: 70px; /* Space for nav buttons */ } } /* 卡片和模态窗口自定义滚动条 */ .letter-paper, .modal-content { scrollbar-width: thin; scrollbar-color: var(–accent-color) var(–paper-color); } .letter-paper::-webkit-scrollbar, .modal-content::-webkit-scrollbar { width: 8px; } .letter-paper::-webkit-scrollbar-track, .modal-content::-webkit-scrollbar-track { background: var(–paper-color); } .letter-paper::-webkit-scrollbar-thumb, .modal-content::-webkit-scrollbar-thumb { background-color: var(–accent-color); border-radius: 20px; border: 2px solid var(–paper-color); } /* Ensure content wrapper div in modal is not restricted */ .modal-content .wp-block-group__inner-container.is-layout-constrained.wp-block-group-is-layout-constrained { height: auto; /* Allow content to determine height */ max-height: none; /* Remove any max-height from card view */ }
    <!– –> /** * 信纸模态窗口管理 * 实现点击信纸打开模态窗口,并提供导航功能 */ document.addEventListener(“DOMContentLoaded”, function() { const pageLoader = document.getElementById(‘page-loader’); if (pageLoader) pageLoader.style.display = ‘block’; try { // 初始化信纸元素 (MODIFIED) initLetterPapers(); // 创建和初始化模态窗口 createModalIfNotExists(); // Renamed for clarity // 模态窗口功能初始化 initModalFunctionality(); // 添加无障碍支持 addAccessibilitySupport(); } catch (error) { console.error(‘初始化失败:’, error); } finally { // 隐藏加载指示器 if (pageLoader) pageLoader.style.display = ‘none’; } }); /** * Helper function to build and append a single letter paper. * @param {Array} elements – Array of HTML elements for this entry. * @param {HTMLElement} container – The parent container to append the letter paper to. */ function buildAndAppendLetterPaper(elements, container) { if (!elements || elements.length === 0) return; const letterPaperDiv = document.createElement(‘div’); // This class is crucial for styling and for the modal script to find these elements letterPaperDiv.classList.add(‘letter-paper’); // The original script targeted .wp-block-group.letter-paper. // We can add .wp-block-group if needed for stricter CSS, but .letter-paper should be enough. // letterPaperDiv.classList.add(‘wp-block-group’); const innerContainer = document.createElement(‘div’); // Mimic the original structure that showModalContent expects for content extraction innerContainer.classList.add(‘wp-block-group__inner-container’, ‘is-layout-constrained’, ‘wp-block-group-is-layout-constrained’); elements.forEach(el => { innerContainer.appendChild(el); // el is already a clone from the calling function }); letterPaperDiv.appendChild(innerContainer); // Add accessibility attributes letterPaperDiv.setAttribute(‘tabindex’, ‘0’); letterPaperDiv.setAttribute(‘role’, ‘button’); const h4Title = innerContainer.querySelector(‘h4.wp-block-heading’); // Ensure we get the correct H4 if (h4Title) { letterPaperDiv.setAttribute(‘aria-label’, `打开日记: ${h4Title.textContent.trim()}`); } else { letterPaperDiv.setAttribute(‘aria-label’, ‘打开日记条目’); } container.appendChild(letterPaperDiv); } /** * 初始化信纸元素 (MODIFIED for new log format) * Parses flat WordPress block structure into letter paper cards. */ function initLetterPapers() { const logContainerSelector = ‘.entry-content’; // Common WordPress content area const mainLogContainer = document.querySelector(logContainerSelector); if (!mainLogContainer) { console.warn(`Log container “${logContainerSelector}” not found. Script will not process logs.`); // Try to find if the elements are direct children of body for testing purposes // This part is for robustness if .entry-content is missing in a test setup. // In a real WP environment, .entry-content or a theme equivalent should exist. const testNodes = Array.from(document.body.childNodes).filter(n => n.nodeType === 1 && n.classList.contains(‘wp-block-heading’)); if (testNodes.length > 0 && !document.querySelector(‘.entry-content’)) { console.warn(“No ‘.entry-content’ found, but found WP blocks in body. Attempting to process body children. This is not recommended for production.”); // In this specific test case, let’s wrap body contents for processing const tempWrapper = document.createElement(‘div’); tempWrapper.classList.add(‘entry-content’); // Give it the class we expect while(document.body.firstChild && document.body.firstChild.id !== ‘page-loader’ && !document.body.firstChild.classList.contains(‘modal-overlay’)) { tempWrapper.appendChild(document.body.firstChild); } document.body.insertBefore(tempWrapper, document.getElementById(‘page-loader’)); // Re-assign mainLogContainer // mainLogContainer = tempWrapper; // This line caused an issue, it should be used if we process from body. // For the provided HTML, .entry-content exists. } else if (!mainLogContainer) { return; } } // If mainLogContainer is still null after the warning and potential body processing attempt. if (!mainLogContainer) { console.error(`Log container “${logContainerSelector}” definitively not found. Aborting initLetterPapers.`); return; } const originalNodes = Array.from(mainLogContainer.childNodes); const processedContentContainer = document.createElement(‘div’); processedContentContainer.className = ‘clearfix’; // To contain floated letter-papers let currentEntryElements = []; let collectingEntry = false; originalNodes.forEach(node => { // We are interested in element nodes (type 1) and relevant WP comment nodes (type 8) if (node.nodeType !== 1 && node.nodeType !== 8) { // If it’s a text node with only whitespace, ignore. Otherwise, preserve non-block text. if (node.nodeType === 3 && node.textContent.trim() === ”) return; if (!collectingEntry) { // Preserve elements before the first H4 entry starts processedContentContainer.appendChild(node.cloneNode(true)); } else { // If inside an entry, and it’s not a block comment if(node.nodeType !== 8) currentEntryElements.push(node.cloneNode(true)); } return; } // Handle WordPress comment nodes – the actual element is usually the next ELEMENT sibling let elementNode = node; if (node.nodeType === 8) { let nextSibling = node.nextSibling; while(nextSibling && nextSibling.nodeType !== 1) { nextSibling = nextSibling.nextSibling; } if (nextSibling) { elementNode = nextSibling; } else { // This comment node doesn’t have an associated element, or it’s a closing block comment. // If it’s a closing block like /wp:shortcode and we are not collecting, add the comment itself. if (!collectingEntry && node.nodeValue.trim().startsWith(‘/wp:’)) { processedContentContainer.appendChild(node.cloneNode(true)); } return; } } // Now elementNode is an actual HTML element if (elementNode.tagName === ‘H4’ && elementNode.classList.contains(‘wp-block-heading’)) { if (collectingEntry && currentEntryElements.length > 0) { buildAndAppendLetterPaper(currentEntryElements, processedContentContainer); } currentEntryElements = [elementNode.cloneNode(true)]; collectingEntry = true; } else if (collectingEntry) { // Skip top-level separators that are truly between entries. // A separator is inter-entry if the *next actual block* is an H4. if (elementNode.tagName === ‘HR’ && elementNode.classList.contains(‘wp-block-separator’)) { let nextActualBlock = elementNode.nextElementSibling; while(nextActualBlock && nextActualBlock.nodeType === 8) { // Skip over comment nodes let temp = nextActualBlock.nextElementSibling; if (temp && temp.nodeType === 1) nextActualBlock = temp; else break; } if (nextActualBlock && nextActualBlock.tagName === ‘H4’ && nextActualBlock.classList.contains(‘wp-block-heading’)) { // This separator is between entries, so skip it. } else { currentEntryElements.push(elementNode.cloneNode(true)); } } else { currentEntryElements.push(elementNode.cloneNode(true)); } } else { // Element before the first H4 (e.g., music player) // The WP comment for the shortcode is preserved, then the shortcode div itself. if(node.nodeType === 8) processedContentContainer.appendChild(node.cloneNode(true)); // Add the wp:shortcode comment processedContentContainer.appendChild(elementNode.cloneNode(true)); // Add the actual div.wp-block-shortcode if(node.nodeType === 8) { // Add the /wp:shortcode comment if it’s paired let closingComment = elementNode.nextSibling; while(closingComment && closingComment.nodeType !== 8) closingComment = closingComment.nextSibling; if (closingComment && closingComment.nodeValue.trim().startsWith(‘/wp:’)) { processedContentContainer.appendChild(closingComment.cloneNode(true)); } } } }); // Append the last collected entry if (collectingEntry && currentEntryElements.length > 0) { buildAndAppendLetterPaper(currentEntryElements, processedContentContainer); } // Replace the original content of mainLogContainer with the new structured content mainLogContainer.innerHTML = ”; mainLogContainer.appendChild(processedContentContainer); } /** * Creates modal elements if they don’t already exist in the DOM. */ function createModalIfNotExists() { if (document.querySelector(‘.modal-overlay’)) { return; // Modal already exists } const modalOverlay = document.createElement(‘div’); modalOverlay.classList.add(‘modal-overlay’); modalOverlay.setAttribute(‘role’, ‘dialog’); modalOverlay.setAttribute(‘aria-modal’, ‘true’); modalOverlay.setAttribute(‘aria-labelledby’, ‘modal-title’); // Title will be set dynamically const modalContentWrapper = document.createElement(‘div’); modalContentWrapper.classList.add(‘modal-content’); // This is the styled “paper” for the modal const modalInnerContent = document.createElement(‘div’); modalInnerContent.setAttribute(‘id’, ‘modal-content-inner’); // Where actual content goes modalContentWrapper.appendChild(modalInnerContent); const loader = document.createElement(‘div’); loader.classList.add(‘loader’); loader.setAttribute(‘id’, ‘modal-loader’); modalContentWrapper.appendChild(loader); // Loader inside content wrapper for centering const closeButton = document.createElement(‘button’); closeButton.innerHTML = ‘×’; closeButton.classList.add(‘close-button’); closeButton.setAttribute(‘aria-label’, ‘关闭’); closeButton.setAttribute(‘title’, ‘关闭’); modalContentWrapper.appendChild(closeButton); // Close button also part of the paper // Nav buttons are part of the overlay, not the content paper const prevButton = document.createElement(‘button’); prevButton.classList.add(‘nav-button’, ‘prev-button’); prevButton.setAttribute(‘aria-label’, ‘上一个’); prevButton.setAttribute(‘title’, ‘上一个’); modalOverlay.appendChild(prevButton); const nextButton = document.createElement(‘button’); nextButton.classList.add(‘nav-button’, ‘next-button’); nextButton.setAttribute(‘aria-label’, ‘下一个’); nextButton.setAttribute(‘title’, ‘下一个’); modalOverlay.appendChild(nextButton); modalOverlay.appendChild(modalContentWrapper); document.body.appendChild(modalOverlay); } /** * (Original createModal function renamed and adapted slightly) * Create modal elements if they don’t already exist. */ function createModal() { // This is the original function, now createModalIfNotExists is preferred createModalIfNotExists(); } /** * 初始化模态窗口功能 */ function initModalFunctionality() { // IMPORTANT: Query for .letter-paper AFTER initLetterPapers has run and created them. const letterPapers = document.querySelectorAll(‘.letter-paper’); const body = document.body; const modalOverlay = document.querySelector(‘.modal-overlay’); const modalContent = document.querySelector(‘#modal-content-inner’); const closeButton = document.querySelector(‘.close-button’); const prevButton = document.querySelector(‘.prev-button’); const nextButton = document.querySelector(‘.next-button’); const modalLoader = document.querySelector(‘#modal-loader’); if (!modalOverlay || !modalContent || !closeButton || !prevButton || !nextButton || !modalLoader) { console.error(“Modal elements not found. Cannot initialize modal functionality.”); return; } let currentIndex = -1; function closeModal() { modalOverlay.classList.remove(‘active’); setTimeout(() => { modalOverlay.style.display = ‘none’; modalContent.innerHTML = ”; body.classList.remove(‘no-scroll’); }, 300); // Match transition duration } function showModalContent(letterPaper) { modalLoader.style.display = ‘block’; modalContent.innerHTML = ”; // Clear previous content setTimeout(() => { try { // The content for the modal is directly within the .wp-block-group__inner-container const contentContainer = letterPaper.querySelector(‘.wp-block-group__inner-container’); if (contentContainer) { const safeContent = contentContainer.cloneNode(true); const links = safeContent.querySelectorAll(‘a’); links.forEach(link => { link.setAttribute(‘target’, ‘_blank’); link.setAttribute(‘rel’, ‘noopener noreferrer’); }); modalContent.appendChild(safeContent); const titleElement = safeContent.querySelector(‘h4.wp-block-heading’); if (titleElement) { modalOverlay.setAttribute(‘aria-labelledby’, ‘modal-title-dynamic’); // Give an ID to the h4 titleElement.id = ‘modal-title-dynamic’; } else { modalOverlay.removeAttribute(‘aria-labelledby’); // No specific title } modalOverlay.style.display = ‘flex’; setTimeout(() => modalOverlay.classList.add(‘active’), 10); // For transition body.classList.add(‘no-scroll’); updateNavigationButtons(); } else { throw new Error(“Content container not found in letter paper.”); } } catch (error) { console.error(‘加载内容失败:’, error); showError(‘内容加载失败,请稍后重试.’); } finally { modalLoader.style.display = ‘none’; } }, 200); } function showError(message) { modalContent.innerHTML = `

    ${message}

    `; modalOverlay.setAttribute(‘aria-labelledby’, ‘modal-title-dynamic’); } function updateNavigationButtons() { prevButton.style.visibility = (currentIndex > 0) ? ‘visible’ : ‘hidden’; nextButton.style.visibility = (currentIndex 0) { currentIndex–; showModalContent(letterPapers[currentIndex]); // Ensure the new active element is focused for screen readers letterPapers[currentIndex].focus(); } } function navigateToNext() { if (currentIndex { event.stopPropagation(); navigateToPrevious(); }); nextButton.addEventListener(‘click’, (event) => { event.stopPropagation(); navigateToNext(); }); letterPapers.forEach((letterPaper, index) => { letterPaper.addEventListener(‘click’, (event) => { currentIndex = index; showModalContent(letterPaper); event.stopPropagation(); }); letterPaper.addEventListener(‘keydown’, (event) => { if (event.key === ‘Enter’ || event.key === ‘ ‘) { currentIndex = index; showModalContent(letterPaper); event.preventDefault(); } }); }); modalOverlay.addEventListener(‘click’, (event) => { if (event.target === modalOverlay) { closeModal(); } }); modalOverlay.style.display = ‘none’; // Ensure it’s hidden on load } /** * 添加键盘导航和无障碍支持 */ function addAccessibilitySupport() { document.addEventListener(‘keydown’, (event) => { const modalOverlay = document.querySelector(‘.modal-overlay’); if (modalOverlay && modalOverlay.style.display === ‘flex’ && modalOverlay.classList.contains(‘active’)) { switch(event.key) { case ‘Escape’: document.querySelector(‘.close-button’).click(); break; case ‘ArrowLeft’: const prevButton = document.querySelector(‘.prev-button’); if (prevButton.style.visibility !== ‘hidden’) prevButton.click(); break; case ‘ArrowRight’: const nextButton = document.querySelector(‘.next-button’); if (nextButton.style.visibility !== ‘hidden’) nextButton.click(); break; } } }); const modalOverlayForFocusTrap = document.querySelector(‘.modal-overlay’); if (modalOverlayForFocusTrap) { modalOverlayForFocusTrap.addEventListener(‘keydown’, function(event) { if (event.key === ‘Tab’) { const focusableElements = this.querySelectorAll(‘button, [href], input, select, textarea, [tabindex]:not([tabindex=”-1″])’); const visibleFocusableElements = Array.from(focusableElements).filter(el => { return el.offsetParent !== null && window.getComputedStyle(el).visibility !== ‘hidden’; }); if (visibleFocusableElements.length === 0) { event.preventDefault(); return; } const firstElement = visibleFocusableElements[0]; const lastElement = visibleFocusableElements[visibleFocusableElements.length – 1]; if (event.shiftKey) { if (document.activeElement === firstElement) { lastElement.focus(); event.preventDefault(); } } else { if (document.activeElement === lastElement) { firstElement.focus(); event.preventDefault(); } } } }); } } /** * 添加懒加载支持 (Optional, original function) * 当信纸元素进入视口时才加载内容 (currently placeholder images) */ function initLazyLoading() { if (‘IntersectionObserver’ in window) { const letterPapers = document.querySelectorAll(‘.letter-paper’); // Target dynamically created papers const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const letterPaper = entry.target; // Example: Load images within the letter paper if they use data-src const imagesToLoad = letterPaper.querySelectorAll(‘img[data-src]’); imagesToLoad.forEach(img => { img.src = img.getAttribute(‘data-src’); img.removeAttribute(‘data-src’); }); letterPaper.style.animationDelay = (Math.random() * 0.5) + ‘s’; // If you have entry animations observer.unobserve(letterPaper); } }); }, { root: null, rootMargin: ’50px’, /* Preload a bit before visible */ threshold: 0.1 /* 10% visible */ }); letterPapers.forEach(paper => observer.observe(paper)); } } // Initialize lazy loading after other DOM manipulations are complete window.addEventListener(‘load’, initLazyLoading);

    2025.1.1

    最近天天去Lanford那里做知觉实验的被试,还经常碰到DJC.

    2025.1.2

    我好像把刷哔哩哔哩知乎小红书当成一种精神寄托。周末定了计划这周什么都不是刷,只吃饭睡觉运动搞科研,但我完全耐不住这种孤独感,如果有一天下班后直接闭眼睡觉,第二天睁眼就上班,我会觉得自己好像没回家一样。没错,手机里那些软件就好像我的家人,回宿舍后看到他们好像才算回过家。

    2025.1.3

    使我们该与自己的占有欲作斗争,而不是要求别人为之买单。

    2025.1.4

    刷到一个俄乌战场上单兵近距离搏杀的视频,战争好可怕,又好荒谬。

    2025.1.5

    什么是人品?常听人说“人品好”“人品坏”,究竟怎样定义好坏?好坏的标准是否是一贯的,还是因人而异的?我们应该追求做一个人品“好”的人吗?


    Flash Phanta涉嫌虚假宣传,4~5s/kb,结果20s绕质粒一圈P出来8KB,害我缩短时间重做一次。第一次因为试剂过于优秀而实验失败。

    2025.1.10

    1. 设计同时做PCR和WB的实验方案,准备RTCB抗体和genomic DNA.
    2. 冻NCCIT stitchR. 传K562 Cas9-BFP + dox-Csm-T2A-tagBFP.
    3. XHY肯定没加G418,去补一下。
    4. 明日提PDAC446的RNA,做RNA-seq,同时从RNA反转录cDNA PCR目的基因片段做DNA-seq.
    5. 给XYY找个课题。
    6. 阅读ZT发在CNS交流群的nuclear actin相关论文。
    7. 写bw report.
    8. 仔细设计筛选流程。
    9. 重新设计N-MYL6的引物,检索splicing相关知识。

    2025.1.17

    xf来找zt讨论文章,给他们偷拍了一张照发在群里,觉得特别像沃森和克里克,但前者骂我有病让我撤回。emmm,人的悲欢并不相通。

    这两天跟xyy做RNA seq建库,一塌糊涂,几乎一步一错。我熬了好几个夜、前后耗时一个多星期的实验估计废掉了。今天他还弄断一把枪。想起来自己也给师兄师姐们填过不少麻烦,虽然很心疼,但尽量没表现出来,不过对方还是搞得很紧张。说到这里我又回头看了自己当初写的手残集锦,当初可真是有过之而无不及,每看一句血压都更高了,当初可能都没现在回过头看血压高。现在有种养儿方知父母恩的感觉。

    2025.2.9

    前天到的学校,最近一两天沉迷自己组装一台台式机,本来想着把我的联想天逸510S挂闲鱼卖掉,然后上网的时候查到它的i5-13400竟然还不错,于是打算直接在整机的基础上升级一个RTX4060,但是机箱和电源要重新买了,都在闲鱼买了二手货。但是等快递的时候打开机箱看了一下,联想竟然把PCIe接口给阉割了,根本没有插独显的插槽,于是又亏五百需要换一个主板。

    有一说一,因为我至今只用过两台台式机,第一台还是小学的时候家里逛电脑城对参与毫无概念的时候买的,以至于我现在才惊讶的发现同配置台式机和笔记本的性能是天上地下。我八千块的i7+3050ti运行同分辨率下冰汽时代竟然不如四千块的核显流畅。

    2025.2.13

    恭喜樊先生喜提爱机!

    2025.2.16

    Wowwwwwwwww……谁懂此刻我完成《底特律变人》二周目时的震撼心情啊。剧情肯定不是完美无缺,但如此细致入微如艺术品般精良的制作让我大开眼界,现在游戏产业的发展如此蓬勃(这甚至是2018年的老游戏),从剧本、美术、玩法、音乐、UI,每个细节都如此完美,通关后的”Extra”里的Videos和Artworks也好棒,每个都可以拿来当壁纸。游戏公司真了不起,这显然需要协调非常多的各方面的人才聚合在一起才能完成这样精良的作品,感慨人类合作的伟力,我以后肯定还会玩更多的游戏的。

    2025.2.22

    Today’s Task:

    1. Complete the RTCB review
    2. Write the detailed procedures of CRISPR screen
    3. Search literatures of mRNA decay feedback
    4. Advance the completion of RNA-seq library

    2025.2.28

    老板让我审一篇PLOS ONE的短小文章,一通宵搞完了,第一次当审稿人,好玩儿。这个身份很符合我的杠精本色。

    2025.3.3

    博客的目标读者,其实不是互联网人群,而是未来的你,你的文章会让你看到自己思想的演变。

    andysblog.uk

    原来只是觉得这么说很nb,还是想把自己写的东西让某些人看到。现在发自内心认同,也不去甚至不想让人看到了。

    2025.3.5

    我天塌了呀,养了那么久的reporter cell line莫名其妙地死了,我这几天还天天在lab打红警,实验进度一下相当于一个月没干活。

    2025.3.7

    是被Claude-sonnet 3.7和Cursor震惊的一天,咋没早点发现cursor这么好用的工具。往这俩怒花了五百块。

    2025.3.13

    ???我脑子好像有点问题。你要是个烂AI我可能扭头就不管了,这tm大名鼎鼎的Claude3.7,怎么有点反直觉呢

    我要相信国货了,白瞎了我充的20dollar。

    2025.3.14

    如此优雅的对数生长,我不信这次我还能养死它。

    2025.3.16

    最近想用php和mysql做一个前后端分离的动态网站,奈何零基础不会,网上看了几个小时视频,最后感觉学习效果不如问deepseek几个来回,学习这件事真的要被AI重塑了。

    2025.3.19

    事件回顾

    今天在进行K562细胞慢病毒感染实验时,我按照协议将细胞-病毒混合物在1000×g条件下离心30分钟 以促进病毒侵染。然而,由于没有及时取出样品,细胞在离心机中停留了过长时间,导致细胞死亡, 实验完全失败。

    直接后果分析
    • 所有准备的K562细胞全部损失
    • 宝贵的病毒材料被浪费
    • 至少一天的实验进度延误
    • 额外的试剂和材料成本约[500]元
    根本原因思考
    注意力因素
    • 在离心过程中,转去处理其他实验事务
    • 没有将注意力保持在当前关键步骤上
    提醒系统缺失
    • 未设置任何形式的计时提醒
    • 没有使用实验室现有的计时工具
    心理因素
    • 过度自信,错误地认为能依靠记忆控制实验时间
    • 对”简单”步骤的轻视态度
    流程管理问题
    • 没有严格遵循实验记录规范
    • 时间管理松散,缺乏清晰的步骤划分
    情感反思

    这次失误让我感到非常沮丧和自责。我意识到实验科研中,即使是看似简单的步骤也需要严谨对待。 这种由于粗心导致的失败尤其令人懊恼,因为它完全可以避免。我对浪费实验资源和时间感到愧疚, 也认识到这不仅影响自己的工作,也可能影响到依赖我结果的团队成员。

    改进计划
    建立个人提醒系统
    • 购买专用实验计时器,确保声音足够大
    • 手机设置多重闹钟,使用特殊铃声标记实验提醒
    • 在离心机旁放置醒目的计时卡片
    优化实验流程
    • 制作个人实验SOP,每个步骤进行打勾确认
    • 离心期间不安排其他复杂任务
    • 在实验记录本上明确标记实验关键时间点
    心态调整
    • 培养”完成一步,确认一步”的习惯
    • 不再依赖记忆,而是依赖系统和工具
    • 视每一步骤都同等重要,不区分”简单”或”复杂”步骤
    经验教训与承诺

    这次失误教会我,在科学研究中,精确的时间控制和严谨的操作流程与复杂的技术同样重要。我承诺将这次教训铭记于心,并将改进措施落实到今后的每一个实验中。通过这次失败,我希望能培养出更加专业和负责任的实验习惯,让类似的错误不再重演。

    2025.3.20

    虽然OpenAI在网络上常被调侃为“CloseAI”,但我认为他们最初倡导的“让AI触手可得,实现人人平等”的目标已经基本实现。如今的API价格堪称“白菜价”,各种大语言模型层出不穷。作为先驱,OpenAI开启了AI领域的“大航海时代”,即便后来它自己也无法始终保持领先地位。不那么“Open”又如何呢?通过商业化赚取收入以维持自身发展又有何不可?在我看来,这依然是一项伟大的事业。

    2025.3.24

    最近头上凉凉的。

    2025.3.26

    Beautiful ~

    2025.3.30

    在后海划船时偶遇青队,闲聊中得知一个意外消息:国科大新成立的龙舟队,队长竟然是小辉哥。”南开龙”真是人才辈出啊!

    这个消息让我们倍感压力。国科大对龙舟运动的重视程度远超想象——不仅专门开设龙舟课,还坐拥雁栖湖的天然训练场地。如果他们全力投入,一周练上十次都不成问题。虽然他们是新组建的队伍,但这样的条件,完全有可能在今年首高比赛中成为一匹黑马。要是我们连决赛都进不了,那可就太尴尬了。

    好在,我们也有自己的优势:国科大的队员基本是一年级研究生,二年级就要分散到各地研究所,队伍缺乏传承和积淀;而我们队里有许多经验丰富的老队员。我相信,只要发挥稳定,我们依然有实力战胜他们。

    想到这里,我不禁有些感慨。小辉哥曾是和我同一条船上的兄弟,如今却要作为对手在赛场上相见。他成了国科大的队长,而我虽然已从清华龙舟队队长的位置上退下,但依然作为舵手在队中效力。这场较量让我既兴奋又忐忑——既期待与老友重逢,又不想输给曾经的战友。

    2025.4.2

    死亡搁浅,花了三百块,挺好玩。尤其今天,从首都节点城第一次去打通港口节点城。中间有个必经之路有BT,废了九牛二虎之力想要绕开BT区,爬了周围一圈的山,发现绕不开。然后在惊悚的音乐下一步一步挪动穿越了BT区,鞋子也破了,中间还第一次发现了血液手榴弹这么好用。然后穿过BT区,走出大山,看到开阔视野里的港口节点城,舒缓的音乐响起,成就感油然而生。

    我甚至升起了想要去登山的欲望,咨询学校登山队和攀岩队的信息想要加入他们,不巧错过了报名时间。

    2025.4.7

    以前总觉得贸易战离自己很遥远。2018年那会儿,虽然新闻里闹得沸沸扬扬,但日常生活似乎没什么变化。可这次不一样了——影响直接砸到了身边。

    实验室的助理最近在群里疯狂@所有人:”有需要进口设备的赶紧买!” 因为涉及生命科学的高端仪器,很多都依赖美国进口,国内根本没有替代品。一旦关税加征30%甚至50%,价格就会直线飙升。

    2025.4.8

    今天专门打车去索尼的维修店,维修我的储存卡。高德地图上显示这是北京总店,但是去了人家才说这里不是售后是一个付费的第三方维修机构。看来信息还是要去官方查找,索尼官网上果然没有这个店。

    晚上Sun.和柯羽组织了一次赛前动员大会。我觉得Sun.批评人严肃认真起来真的好帅。

    2025.4.10

    最近中美关税大战,实验室管理员在群里喊大家趁政策生效前赶紧囤货,对我所在的如此依赖进口试剂和仪器的学科来说,不知道之后的日子会不会更难过。

    2025.4.11

    通关留念

    2025.4.12

    预告昨天和今天北京有瞬时11~13级大风,早上出门一看确实地上多了很多残枝,但也就还好,如果新闻不这么渲染,我一定不会注意这两天的风跟平时的有多大区别。自行车上倒是确实落了不薄的一层沙土,不过这种事在北京也是司空见惯了。气温骤降,好处是天变得非常干净,我用眼睛拍了照。

    2025.4.14

    开心,第一次内网穿透成功!我受够那个跑啥都能死机的云服务器了。

    2025.4.25

    “我不觉得她在物质上缺什么东西。”

    “当我看到你这句话,我的自私体现得淋漓尽致:我竟然因为对方的富足难过而非开心。”

    2025.4.26

    鼓捣了好几天,给小站每篇文章接入了大模型,好玩。

    2025.4.26

    本来今天训练回来没想继续做实验,于是九点多就躺床上刷手机准备睡觉了,结果老板在群里丢了一句 “Looking forward to the screen result.”我才知道我做的CRISPR screen(特别费钱 我做了好几个月的大实验)测序结果出了,因为我没电脑,所以用手机登录邮箱看了看附件里的质控报告。

    结果一眼扫到“GC 分布”这张图——完 – 全 – 错 – 得 – 离 – 谱 !

    通常如果出现这种(不是0就是100的)单一峰,说明所有序列几乎一样,大概率是当初包装文库病毒时把non-target sgRNA(无效的,因为它是个对照病毒,但是后续看不出差别)给整进去了。那意味着:半年实验归零,我自博资考后更换的第二课题整整一年白做了,还糟蹋了师妹和隔壁两个课题组的课题(因为这一批病毒都是我做好后,分给他们的)。

    这后果可太严重了,我顿时睡意全无,提上裤子就飞奔到lab(因为正式的数据量有40多个G必须到实验室的服务器下载)。路上蹬自行车的时候我还在想,是不是跟老板求情说“我前两年不算数从现在开始再卖命五年”,然后脑子里另一个小人就开始反驳“谁会想要一个做不成事只会浪费钱的牛马呢?”

    到了lab后紧张兮兮下载数据,解压完一看,子文库的Fastqc里GC分布是正常的,提取了20条测序reads做多序列比对,结果也正常,并不是单一的sgRNA,这才松一口气。不过,最开始手机上看的那个图确实是有问题,但大概率是测序公司某个步骤弄错了。

    虽然是虚惊一场,但是这两个小时真给我惊得不轻,现在肯定是想睡也睡不着了哈哈。心情平复之后回想一下还会想笑。

    2025.4.28

    第一次用了GPT-O3的deep research,有一说一,我要真看一两周文献不一定写得比它20min的结果好。相比之下,同时还用了Gemini的deep research,就不太够看了。而且现在chatGPT的界面和Agent优化是真的好,有种“简洁却不简单”的优雅。

    之前订阅ChatGPT还是GPT4和4o刚出那会儿,它一枝独秀。后来市面上免费or更便宜的大模型平替太多了,尤其deepseek刚火那会儿,现在回来一看,老大哥还是老大哥,体验比deepseek之类的国内模型体验强太多了。回顾一下22年以来的每一个重要节点,也确实都是OpenAI带头的,新闻总说OpenAI要不能领先了,实际上从GPT3.5、4o的多模态、直接跟AI视频交互、推理模型、deep research、最近的文生图、O3的看图定位,都是OpenAI引领的。

    给我的头像生成了几张表情包:

    不是,绝了,我刚夸完,…… 狗屁 O3,耽误我俩小时,一直以为我错了尝试理解它的思路……

    2025.5.1

    作息不规律太难受了,但我屡教不改,今天入睡的阶段简直难受恶心死,导致我眯一会之后虽然仍然很困,却刻意清醒“休息”一会儿。

    昨天承诺老板今天给他Screen结果的分析(后续研究hits选择),今天划船玩了一天(六块八的草帽真好用),一点儿没动,晚上继续熬夜了,估计明天也给不了他。

    2025.5.2

    I really love LLM. 夸张一点地说,它让我活下去的欲望增加了。一想到活着就有可能在未来接触到像LLM这么有趣的东西,就不想那么快通关了。

    笑死,cline有个优点,每次回复完都告诉我用了多少钱,cursor就没有这个功能,用了cline以后自己思考变多了,问AI克制了许多……(穷也有好处啊哈哈)

    2025.5.5

    昨天去国科大参加交流赛,见到了队长小辉哥,整个过程很愉快。雁栖湖划船感觉好棒,有不小也不大的浪,全程用的是不带浮漂的船,有自然水域的感觉了,跟后海没法比。组织的很棒,国科大的队员们也很热情,从刚下大巴,就有不认识的队员帮我拿东西,然后到了码头也是很正式的双方介绍,他们竟然还专门准备了一个大大的领奖台,后面有专门设计的海报。比赛也是麻雀虽小五脏俱全。有起终点裁判、抓龙尾的同学、发令是专门的汽笛。话筒和音响想必也废了不少功夫才能接电线拉过来。还有无人机拍摄。我太敬佩了。还有香蕉和西瓜。刚去的时候问了队员说他们没有多余的队服可以换,我都快放弃了,没想到小辉哥二话不说就把自己身上的脱了,心愿达成开心。

    晚上发了pyq,欢欢一提发现我确实好秃,然后我就把那句“读博有效果了”转发了,大家评论的关注点果然都是我的秃头……

    2025.5.6

    柯羽想组织晨练,Sun.给的理由是锻炼早起防止比赛当天迟到。今天第一天,一睁眼就距离集合时间五分钟了,凉水洗了把脸冲刺,还是迟了三分钟。过后在听涛吃饭,李小狐同学昨晚科普了一堆怎么减重的吃法,但我还是想嗦粉,听涛的粉是陪我通宵无数个夜晚的最佳伴侣。


    2025.5.12

    虽然有所准备,但看到这么一大袋子引物还是着实有一μμ颤抖。

    今天的任务:

    1. 准备好明天Yan老师报告的接待和设备检查和报名统计和主持介绍词
    2. 送测RNA seq
    3. 构建GGA sgRNA
    4. 给师弟们派活儿
    5. 设计一个mCherry偶联split-GFP的质粒 + 一个配套的no-mCherry的P320-puro质粒

    2025.5.13

    轰轰烈烈的中美贸易战,我等屁民看起来像过家家,就是玩笑开得有点大,确实让很多人收到了影响。

    2025.5.28

    这种东西终于也是成为现实了啊,还有看了最近google I/O大会发布的内容,好玩啊好玩啊,活着真有意思啊。

    2025.5.31

    今天首高,女三男四。不能说好,但也不差。至少在加入北体大和国科大两个强势对手后,还是保住了进决赛。

    2025.6.2

    有点可怕了就是说:【Veo 3 is insane~!! 真实?自由?一场硅基生命的“存在主义危机”】

    2025.6.3

    拜访了下艺妙神州(前几天学校的双选会上认识了HR),没约,自己在外围转了转。斗胆还是走进去晃了一圈,地方挺宽敞,不过每个人分到的还是一排排的玻璃隔板工位。大楼没有很显著的招牌,问了两个保安才找到地方,原来一栋楼里好几家公司,都是科技初创。

    遇到个华龛生物的哥,看我鬼鬼祟祟问我干嘛,我交代完了加我了微信,给他了一份简历,不过没带我进去,还震惊于我是清华来的怎么不认识杜亚楠老师。md确实,我还说我鬼鬼祟祟的理由是想来找工作,结果不认识人家创始人,有点子尴尬了。

    2025.6.4

    骑着我刚提的小车(某狐同款头盔今天才到)兜兜风,突然本路痴想挑战一下不靠导航回学校,于是我竟然在距离学校方圆三公里范围内兜转了三个多小时,愣是没找到回去的路,原来顺着双清路是找不到双清路30号的,它在清华东路。但清华东路我也徘徊了好几个来回。算了,路痴就承认自己路痴吧。最后看已经23点了,还是靠着高德找回去的。

    话说,从来没注意过,北京林业大学也在清华附近,跟北大差不多近。某条大路两边看到卖烤冷面和鸡蛋灌饼的小车摊,刚好饿了。结果饼还没拿到手上,摊主推着车就上去蹬了,回头一看,一城管坐着巡逻车停过来了。上面警灯忽闪忽闪的。幸亏我还没付钱。本路痴不到十分钟转了一会儿又转回来了,看见原来的位置摊主又回来了,不但没少还多了两个车摊,也不知道我那烤了一半的饼怎么处理了,没上去问。

    城管啊,摊主啊,人生啊,潮涨潮落。

    2025.6.5

    <!– 使用 标签来定义聊天窗口的样式 –> .chat-container-wp { background-color: #f0f0f0; /* 聊天背景色 */ padding: 15px 10px; font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, “Helvetica Neue”, Arial, sans-serif; border: 1px solid #ddd; border-radius: 8px; max-width: 700px; margin: auto; } .chat-message-wp { display: flex; margin-bottom: 12px; } .message-bubble-wp { max-width: 75%; padding: 10px 15px; border-radius: 18px; line-height: 1.5; } .message-bubble-wp p { margin: 0; padding: 0; word-wrap: break-word; } /* Sun. (白色) – 接收者 */ .message-receiver-wp { justify-content: flex-start; } .message-receiver-wp .message-bubble-wp { background-color: #ffffff; color: #000000; border-top-left-radius: 4px; } /* 我 (绿色) – 发送者 */ .message-sender-wp { justify-content: flex-end; } .message-sender-wp .message-bubble-wp { background-color: #95e089; /* 绿色气泡 */ color: #000000; border-top-right-radius: 4px; } /* 引用消息的样式 */ .quoted-message-wp { background-color: #e6e6e6; padding: 8px 12px; margin-bottom: 8px; border-left: 3px solid #c7c7c7; border-radius: 4px; font-size: 0.9em; color: #555; } .quoted-message-wp p { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* 系统提示消息 */ .system-info-wp { text-align: center; color: #888; font-size: 0.85em; margin: 15px 0; }

    我跟你说

    就在社团呆着挺好的

    不好 刚认识就离开,直到不想认识人,获得冠军也没有一路走来的人懂过往

    我要好好陪小雅

    虽然只有我主动,但是没关系。只要我一直保持不近不远的位置,即便她给别的男人生孩子,我们也依然是对方生命的见证者

    我: 不好 刚认识就离开,直到不想认识人,获得冠军也没有一路走来的人懂…

    这啥意思

    (图片消息:不知我近况,新人不知我过往。旧人不知旧人知,过往不与新人谈。阅人何其多,再无一人恰似你)

    你啊

    放弃了你自己,抛弃了我们

    我: 近况,新人…人知,过往…其多,再无…

    从哪冒出来的无稽之谈

    社团都是泛泛之交

    我要有长期社交

    哥们

    你在社团2年半都是泛泛之交

    你换个队就有长期社交了

    所有人都拥抱你,除了小雅

    你自绝于我们罢了

    Sun.: 所有人都拥抱你,除了小雅

    那都是很短期的 你毕业了也不会想要不要跟我一个城市

    但我会为了她这么想

    你撤回了一条消息

    所以她比你们加起来都重要

    你们留给我的只有一段记忆。故事的章节之间没什么关系,好像独立的副本

    非要比个1234吗

    如果你不珍惜你在我们队之间的感情,随你去留。

    但我代表社团挽留你

    你不想想你在自己建的队都呆不明白,你换个地就能呆明白了啊

    我们等你回来

    说真的,你和我们呆在一起还能练练和女生说话

    没有换个地。我说了不留在队里是怕没有小雅的社团的记忆混淆我脑子里有小雅的社团的记忆。

    老了会分不清的

    我: 老了会分不清的

    我已经分不清有些事情是发生在初中还是高中了

    第一我代表社团挽留你。第二你来去自留,我们尊重。第三我们等你回来。

    哥们,这踏马明显是两回事

    你给自己套着这么多约束条件不累吗

    我对那个问题的答案是:有小雅 老王 小李的……社团。不是有小张 小周的社团。虽然有一部分人还在,但就像忒休斯之船,最终有一天会无人知我。我只是选择了她离开的那一天作为斩断的结点了。

    你不理解我,你只是想达成你的目的说服我。就像我开始追她表现的那样

    我不说服你,我只是建议你

    并且不赞成你

    2025.6.8

    我给公路车买的打气筒到了,带气压表的,二十多块钱。这次知道为啥叫入了“骑行坑”了,里面门道还挺多,然后装备也多,商业化完整,所以消费无上限。而且,费时间,比如学习到轮胎最好2~3天就要打一次气保持胎压,以及轮胎尺寸有23c~32c等等型号,等时间久了,免不了会想换个别的轮胎体验体验。以及码表、骑行裤、锁鞋什么的装备,还有刷里程、配速之类的。甚至装脚撑、挡泥板会被“专业”玩家鄙视。不过,这些我都不打算搞,我不喜欢竞速,我希望有一天我可以骑着它去长途旅行。现阶段,我就只缺一个水壶架和挂包了。

    另一方面啊,我又觉得这些所谓的爱好呢,背后又有那么一丝丝孤独。骑行、摄影、钓鱼、赛车、划船……这些或便宜或贵的爱好都像是用来给无意义的人生打发时间,你当然可以美其名曰“体验人生无限可能”,但提到这些爱好,总觉得跟另一类用词格格不入——“呕心沥血”、“为国为民”、“宏图大志”、“建功立业”、“潜心研究”……

    当然,“正确”的观点是工作努力和生活多彩不冲突。不过,因为我pyq置顶着一条“I will be a great scientist”,我深知我花时间在“爱好”上心里总有负罪感,不是因为我是个奋斗逼,而是我根本没有努力工作,只是用爱好来逃避我“本应该”更感兴趣的工作。

    2025.6.9

    师弟能帮我做流式我很开心,因为每次去做富集都像在坐牢。但我在情绪上却更加烦躁,因为他高估太多自己处理细胞的速度了,导致迟到了0.5 h,想到那边老师等待那么久然后心里责怪我总是迟到,我加深了对师弟的负面印象,即便他客观上帮助了我。能力不对等,责任却相关联,社会性后果落在了我的头上,最后时长原因实验结果可能也被影响。收获是,提出帮助和接受帮助都是要动脑子的,不光是姿态问题。不是所有好的初心都会给别人带来好处,鲁莽的帮助或被帮助,也可能造成双输。另一方面,有计划、守时、有担当(态度能力并重)在哪里都是好品质。

    (好在最后阳性率很高,实验结果不错,于是我又好起来了。人啊……)


    下午又去索尼维修(终于找对地方了,高德不靠谱,还得是客服和官网)了,没掏钱给我换了一张新的SF-E128A(今天是去取,前几天去报修的),大厂还是靠谱的,忽略了我发票信息不全的事情。这一张卡要五百块呢,但我还是又自己买了一张。因为再也不想出现拍了一天回去发现存储卡坏掉的事情了。

    2025.6.10

    一直以为这种绵密的水流要用ND滤镜呢,今天试了一下裸镜头就可以,下面这个是1/10s曝光,感觉还能再拉长。不过手持真的容易虚,正经拍还得是带脚架。手机上也有一个这个长曝光功能,不过拍出来糊得像屎。

    2025.6.11

    求职经验:

    1. 企业起薪很重要:十年内涨薪空间相对有限,因此起薪高低具有长期影响
    2. 推荐路径:在大厂工作2–3年后跳槽到小公司,有机会快速建立项目管线并取得实质性影响力。(直接进入biotech初创企业是极大极大风险)
    3. HR不懂科研细节,主要评估候选人是否稳定、是否会“一年内跳槽”。若你稳定且匹配,会被邀请进入后续面试轮次。第一轮:HR或通用面试第二轮:技术主管/团队面试
    4. 高校/研究型单位的面试主要是科研报告:要求介绍科研成果、项目设计与成果总结。
    5. 相比于研究单位几乎全部看重publication,企业则对publication的关注权重很低,更看重课题是否能收尾、是否能落地,是否有企业所需的解决实际问题的能力。
    6. 注重领导力与组织能力,例如是否带领本科生团队、项目中起的作用。面试时应体现:你对公司岗位及实际工作内容的了解
    7. 实习/工作经历缺乏怎么办?可突出科研中的可转化技能其他闪光点(组织能力、技术背景、沟通协作等)。
    8. 清华大学生物医药2024年所有出站博士后中,仅1人去了企业。而博士毕业后直接去企业的,约占30–40%,比例明显更高。

    下午伟博(常驻内蒙)来学校找我,给我带了乳清炒米奶糖。我们一起去桃李三楼吃了顿饭。他今天竟然过生日,我好荣幸。

    2025.6.12

    我真是颓废啊,每次到这种重要的ddl之前,明天组会,这之前的一周反而是今年最颓废的一周,打游戏、刷手机、赖床、熬夜……应当比较明显,是焦虑的一种表现形式。

    刚才看新闻说韦东奕什么什么的,一个知乎回答让我回想起当初自己研一时沉浸在生物学中的那种感觉,结合6月8号的日记,还真有种想回到那种状态的想法。

    2025.6.14

    我突然看到南开曾经的袁辛老师连续发了很多天隔空对话校长书记讨说法的pyq。我从只言片语中得到的信息是:1. 她的心理健康教育必修课程被学校领导“破坏”了;2. 2023年,南开曾经出过一个消防事故,但是没有调查报告。

    袁辛老师是那种特别热爱生活的人,她每年都会带着相机或手机到处记录,我印象中,她甚至会跟路过的保安、三轮大爷自然的搭话,然后问对方可不可以一起合照记录。

    我认识她,是因为我大一的时候参加了南开大学红十字会,她是指导老师。她当时给我起外号叫“樊小猫”。

    这是袁老师为一次志愿活动写的推送

    所以,看到她现在发这种反差的朋友圈,我很惊讶。但是,我并没有打算私聊询问。因为,我们很多年没有过联系了,她不一定记得我;我问她细节,也帮不到她,看起来更像是在八卦。

    我感慨的是,人生无常,大家都是很浪漫的人啊,都有坚持不放弃的信念、或者也可以是执念。

    2025.6.15

    今天晚上,我主动约了柯羽讨论她的博资考答辩。我的动机:一是我去年经历过这个时刻,我希望能够缓解她的压力;二是她好像完全没有开始筹划今年的毕业生送行(毕业照、聚餐、推送)……我眼看着时间一天天过去,马上就要离校了,担心她继续拖下去就凑不齐人了;第三,毕竟是大同行,我也对她的研究内容感兴趣。

    今天学院的博资考具体答辩时间还没有确定,我希望帮帮她过一遍,加快进度,不要刚好答辩前后冲刺期跟毕业生送行冲突。我开始以为二三十分钟就结束了,但是最后搞了快两个小时。不过也算相谈甚欢,完全没有感觉到时间流逝,她带的荔枝也很好吃。有一说一,她准备的proposal距离充分还差远了,希望不会像我去年一样沦落到打复活赛。

    当然,我更在意的还是毕业聚,这届是我的同龄人,龙新、含宜、信文、雨涵是我亲手拉的第一批队员,我当然希望还能有在一起举杯送别的机会。我也有把这个动机跟柯羽说,不过看样子她连毕业生名单都还没开始统计。结束前我提醒了她这件事情。


    今天下午和吕哥、衍泽、家元一起在紫操做引体。不知道算成熟还是堕落,我对现在队里的朋友们不那么看重了,有时甚至刻意保持在简简单单的关系。而两年前,我会发自内心觉得进了龙舟队就是一家人,要利益共享、同甘共苦、荣辱与共了。过去的一些事情教会我,“好”的关系不是距离更“近”,而是更加“恰当”。

    2025.6.18

    凌晨一点半,微雨,刚刚推着自行车回到宿舍,躺在床上五分钟不到,外面响起打雷的轰鸣声,然后是雨声骤大。好幸运啊。

    2025.6.19

    突然好孤独啊。因为今天约了师弟很早做实验,作息又是不熬夜到4点睡不着。所以昨天休息很不好,中午实验室去聚餐了(庆祝部分同学毕业和最近zq的文章被cell接收了),中午自助海鲜烤肉吃的特别撑,然后回来做完实验到晚上八点多了,又饥肠辘辘,去吃李先生的路上,耳机里听着周杰伦的歌。孤独突然涌上来。

    2025.6.20

    感觉,人还是得有理想。在这个没有意识、只是存在着的宇宙中,没有长远的理想,一辈子就太漫无目的了。即便——不管多大的理想——解构之后都没有意义,从好好活着的角度讲,还是需要有个理想。

    2025.6.22

    一个幸福的周日:睡到自然醒,带师弟成功送出了测序样品,骑着崔克往返后海,划船时身体状态也很棒,回来后洗了攒了一周的衣服和鞋子,到了晚上坐在电脑桌前吃了好几天前就想吃的泡面🤤,一边没有目的的刷着bilibili。

    2025.6.23

    嗯,900ml倒了200个板,很有成就感!

    建库PCR循环数刚刚好,不用补加cycles,又幸福了!

    2025.6.23

    看了影视飓风的视频买了一台H2D,拆包装是真费劲啊,整了一个多小时才开机,开机之后连续两个报错,发现原来我还遗漏了一条胶带和一个泡绵没摘。买了一卷PLA和一卷PETG,结果开机自检到一半突然跳闸了。我才发现我竟然没有考虑宿舍限电的问题。当时把我慌得,以为两万块又打水漂了。马上上网查和问AI。打算是不是买个UPS电源(因为虽然H2D最大功率2200W,但其实就加热的那几分钟能达到这么大功率,平稳打印的时候并不需要)。但是比较复杂,还贵。然后突然发现,跳闸后灯灭了,但是空调没关,因为它走专线,查了查发现,普通市电是220V 10A,空调专线用的是16A电流。当然10A的也够用,但是学校公寓限制不可能达到上限,于是就企图用空调的线。

    然后就发现,插头不匹配,空调那个插座的孔大了一圈。又上网搜,发现可以买一个16A→10A的插座转接头。因为迫不及待想尝试新机器,斥资88CNY闪送了一个,走普通网购应该便宜得多。到货后插上果然work了。现在就是怕会不会有一天被安全检查发现,记过处分什么的是小事,不让我用机器了的话我就亏死了。

    做的第一个自己建模的东西是,Pepitte 20 μL to 10 μL adaptor。

    看着模型拔地而起果然还是很爽!

    2025.6.25

    晚上去听了学校的毕业音乐会,原来听原唱现场唱歌是这种感觉。太阳完全落下之后,灯光效果提升好几个档次,配着能够引起胸腔共振的大音响,即便是没听过的歌也能很嗨。最后两个嘉宾是许飞和胡彦斌,《我要的飞翔》我还在KTV鬼哭狼嚎过,还有《父亲的散文诗》《月光》《你要的全拿走》也听过。

    还有之前老笑话别人怎么看演唱会一直拿手机拍,你自己拍的能有官方回放质量好吗?今天我也忍不住拍照录像。想记录的不是音乐,是当天的天气、坐在草地上感受到的热风、挥着双手摇摆的身体……

    End.

    评论

    您的邮箱地址不会被公开。必填项已用 * 标注

    9 + 9 = ?

    我多想能多陪你一场

    Agent Fox 智能助手

    您好!我是 Agent Fox 智能助手,有什么可以帮您的?