mirror of
https://github.com/versun/blog_archive.git
synced 2025-05-08 06:28:22 +01:00
5741 lines
301 KiB
HTML
5741 lines
301 KiB
HTML
<!DOCTYPE html>
|
||
<html>
|
||
|
||
<head>
|
||
<meta name="generator" content="Hugo 0.91.2" />
|
||
|
||
<title>
|
||
|
||
Versun
|
||
|
||
</title>
|
||
|
||
</head>
|
||
|
||
|
||
<body>
|
||
|
||
|
||
|
||
|
||
<div class="h-feed">
|
||
|
||
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/16/121502.html" class="u-url"><time class="dt-published" datetime="2024-06-16 12:15:02 +0800">Jun 16, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>最近在看<李光耀观天下>,书内的观点犀利准确细致,最重要的是能用最简单的文字表达这些观点,虽然知道李光耀很厉害,但看了这书才知道,不止是厉害,简直是神人</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/11/githubyoutubedl-ytdlp-youtubedl.html" class="u-url"><time class="dt-published" datetime="2024-06-11 09:57:15 +0800">Jun 11, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>疯狂的世界:曾经被Github封禁的youtube-dl,现在官方教你怎么下载和使用 yt-dlp (youtube-dl的分支)</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/11/ghostactivitypub-buildinpublic-build.html" class="u-url"><time class="dt-published" datetime="2024-06-11 09:52:19 +0800">Jun 11, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>没想到我竟然被Ghost的Activitypub开发日记吸引住了,写作风格生动有趣, 很有BuildInPublic的魅力。<br>
|
||
对于任何想尝试Build In Public的人, 这些日记博文很有参考价值<br>
|
||
<a href="https://activitypub.ghost.org">Landing Page</a><br>
|
||
<a href="https://activitypub.ghost.org/archive/">Blog</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/07/flickrflickr-flickypedia-flickr.html" class="u-url"><time class="dt-published" datetime="2024-06-07 09:58:41 +0800">Jun 7, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Flickr有一个<a href="https://www.flickr.org/">基金会</a>,专门负责备份Flickr上无版权/共享的照片,确保百年后还能够访问。<br>
|
||
为此还开发了一个工具<a href="https://www.flickr.org/tools/flickypedia/">flickypedia</a>, 可以为Flickr上的照片添加描述然后备份到维基百科上。 <br>
|
||
真的很羡慕有这么多公司愿意去做这种吃力不讨好的事,希望国内的公司也能有这种意识,中文内容真不应该再消失了</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/07/jetbrainsdjango-django-flask.html" class="u-url"><time class="dt-published" datetime="2024-06-07 09:07:48 +0800">Jun 7, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>JetBrains发布了<a href="https://blog.jetbrains.com/pycharm/2024/06/the-state-of-django/">《2024年Django的现状》</a>报告。<br>
|
||
有几个有趣的发现:</p>
|
||
<ol>
|
||
<li>每三个 Django 开发人员中就有一个使用 Flask 或 FastAPI</li>
|
||
<li>在前端的选择中,htmx超过了Vue排在第三位,React和jQuery位列第一第二</li>
|
||
<li>对于CSS框架,Django开发者仍然首选Bootstrap或Tailwind</li>
|
||
<li>在所有受访者中,31-39岁的占 38%,21-29岁的占 30%,44%位于欧洲,19%位于北美,17%位于亚洲</li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/03/pplxpagepromptsonnetopussonnet.html" class="u-url"><time class="dt-published" datetime="2024-06-03 10:20:56 +0800">Jun 3, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>pplx上周在发布Page时,肯定也优化了prompt,今天用起来感觉质量高很多,平时要sonnet搭配opus才能解决一个复杂问题,早上问了几个sonnet都能很完美的解决,质量很高。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/06/02/220330.html" class="u-url"><time class="dt-published" datetime="2024-06-03 06:03:30 +0800">Jun 3, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>刚看完<银河帝国1 基地>,不愧是最好看的科幻小说,1951年写的竟然想象力这么丰富!</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/31/gpto.html" class="u-url"><time class="dt-published" datetime="2024-05-31 13:41:41 +0800">May 31, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>刚看完电影《她》,不知道有多少人和我一样,第一次看这部电影,也知道了为啥GPT-4o的推出让《她》又爆火了。<br>
|
||
电影确实不错,很多拍摄场景竟然都是在中国,有点意外。<br>
|
||
或许有空我还会再看一遍</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/31/kagi-heptabase.html" class="u-url"><time class="dt-published" datetime="2024-05-31 10:34:48 +0800">May 31, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>最近非常想订阅 Kagi搜索 和 Heptabase 这2个服务,但看了下目前订阅的年费用后,就冷静下来了。。。。<br>
|
||
豆包又不是不能看,苹果的无边记又不是不能用,对吧</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/30/222652.html" class="u-url"><time class="dt-published" datetime="2024-05-31 06:26:52 +0800">May 31, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>今天早上开始看<银河帝国>,不愧是最伟大的科幻作家,1951年写的书,现在看都觉得想象力丰富</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/30/rssmorerssrss-rss.html" class="u-url"><time class="dt-published" datetime="2024-05-30 10:18:32 +0800">May 30, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>今天发现一个很不错的RSS收集站<a href="https://morerss.com/">MoreRSS</a>,也有翻译后的英文RSS,后端竟然也是用我的 RSS翻译器 实现的。<br>
|
||
本来想关注下站长,找了半天没找到是谁,最后在网页代码里找到了,竟然是创建过易购网的<a href="https://www.zyzhang.com/">张智勇</a>大佬,荣幸荣幸</p>
|
||
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/29/pkm.html" class="u-url"><time class="dt-published" datetime="2024-05-29 14:36:41 +0800">May 29, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>我发现,折腾笔记软件,折腾PKM(个人知识管理)系统,唯一的好处就是,督促你去整理和删除你的笔记。<br>
|
||
因为你要转移笔记,要更换所谓的框架,否则那些笔记永远不会去碰它,类似鞭尸。。<br>
|
||
平时常用的不超过10个笔记,就这点有用的内容,一个文本文档够了</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/26/093516.html" class="u-url"><time class="dt-published" datetime="2024-05-26 17:35:16 +0800">May 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>呼,终于摆脱了豆瓣😂😂</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/26/072845.html" class="u-url"><time class="dt-published" datetime="2024-05-26 15:28:45 +0800">May 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>看了动漫电影<a href="https://zh.wikipedia.org/wiki/%E6%88%91%E7%9A%84%E9%AC%BC%E5%A5%B3%E5%AD%A9">《我的鬼女孩》</a>,挺好看,讲的是压抑情感的心理问题,很有想象力很唯美。<br>
|
||
准备去看看<a href="https://zh.wikipedia.org/wiki/%E6%BC%82%E6%B5%81%E5%AE%B6%E5%9C%92">《漂流家園》</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/25/the-last-duel.html" class="u-url"><time class="dt-published" datetime="2024-05-25 15:04:56 +0800">May 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>我竟然看完了《最后的决斗 / The Last Duel》这部电影,同样的一段故事,通过3个不同人物的视角呈现,有点无聊,不过对于历史爱好者可能会更有感触。<br>
|
||
但有一说一,演技还是在线的,故事很流畅,拍的很不错。</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/25/ai-crewai-agenttaskcrew.html" class="u-url"><time class="dt-published" datetime="2024-05-25 10:04:56 +0800">May 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>总算找到一个方便使用的多AI代理框架: <a href="https://www.crewai.com/">crewAI</a>,可用于生产系统! <br>
|
||
只要定义Agent,定义Task,然后Crew就行了,非常易用<br>
|
||
Deeplearning上还有和官方合作的<a href="https://www.deeplearning.ai/short-courses/multi-ai-agent-systems-with-crewai/">教程</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/23/kindlenote-x.html" class="u-url"><time class="dt-published" datetime="2024-05-23 19:15:30 +0800">May 23, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>升级了我的泡面神器,kindle青春版->文石note x3</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/23/144025.html" class="u-url"><time class="dt-published" datetime="2024-05-23 14:40:25 +0800">May 23, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>分享个经验:<br>
|
||
如果你有很多的事情等着去做,而你却因无从下手而感到焦虑时,可以先从手边/眼前的事情开始做,或者随便选一件事去做。<br>
|
||
烦恼的原因,是因为你想找到优先级最高,效益最高的事去做,但好像每件事都很差不多,你想不出哪件事应该先去做,所以就很难开始。 <br>
|
||
但比起因为无法决定如何开始而停滞不前时,不如先走一步看看,让一些事情取得进展,至少开始了。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/05/20/python.html">Python中的异步功能入门(1)</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/05/20/python.html" class="u-url"><time class="dt-published" datetime="2024-05-23 13:09:38 +0800">May 23, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>ref:
|
||
<a href="https://realpython.com/python-async-features/">Getting Started With Async Features in Python</a></p>
|
||
<h2 id="什么是同步">什么是同步</h2>
|
||
<p>程序按顺序一步一步执行,每完成一步才可以继续执行下一步的过程,即为同步</p>
|
||
<h2 id="同步的优劣">同步的优劣</h2>
|
||
<p>程序简单明了,但对于web服务很容易造成请求拥堵,因为需要处理完一个请求才能处理下一个,无法同时处理多个请求。</p>
|
||
<h2 id="改善同步的方法1轮询polling">改善同步的方法1:轮询(Polling)</h2>
|
||
<p>每隔一段时间,检查当前是否有其他任务需要处理,如果有则先去处理完后再返回原来的任务。</p>
|
||
<h2 id="改善同步的方法2线程threading">改善同步的方法2:线程(Threading)</h2>
|
||
<p>克隆程序的多个部分代码,在共享同步一个内存空间的情况下,分别执行不同的任务。 <br>
|
||
但由于所有线程共享一个内存空间,所以如果一个线程正在使用其中一个资源/变量,则另一个线程就无法使用,必需等待该资源被释放后才可以继续使用。 <br>
|
||
因此,多线程容易导致数据损坏、在无效状态下读取数据以及数据混乱,大部分情况系统会正确处理这些问题,但有时我们也需要通过锁机制来确保重要的资源的准确性。</p>
|
||
<h2 id="什么是阻塞调用">什么是阻塞调用</h2>
|
||
<p>阻止CPU执行其它操作的代码,比如time.sleep函数或者IO操作</p>
|
||
<h2 id="什么是异步非阻塞调用">什么是异步/非阻塞调用</h2>
|
||
<p>程序可以在执行某个任务时,不必等待其完成,便可以去执行另一个任务,等任务执行完成后再返回来处理结果。 <br>
|
||
Python 3 中提供了 asyncio/await 来实现异步。</p>
|
||
<hr>
|
||
<p>接下来,我们来看看相关代码实例</p>
|
||
<h2 id="同步机制代码">同步机制代码:</h2>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">import</span> queue
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">task</span>(name, work_queue):
|
||
<span style="color:#66d9ef">if</span> work_queue<span style="color:#f92672">.</span>empty():
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> nothing to do"</span>)
|
||
<span style="color:#66d9ef">else</span>:
|
||
<span style="color:#66d9ef">while</span> <span style="color:#f92672">not</span> work_queue<span style="color:#f92672">.</span>empty():
|
||
count <span style="color:#f92672">=</span> work_queue<span style="color:#f92672">.</span>get()
|
||
total <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> running"</span>)
|
||
<span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> range(count):
|
||
total <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> total: </span><span style="color:#e6db74">{</span>total<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>)
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">main</span>():
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> This is the main entry point for the program
|
||
</span><span style="color:#e6db74"> """</span>
|
||
<span style="color:#75715e"># Create the queue of work</span>
|
||
work_queue <span style="color:#f92672">=</span> queue<span style="color:#f92672">.</span>Queue()
|
||
|
||
<span style="color:#75715e"># Put some work in the queue</span>
|
||
<span style="color:#66d9ef">for</span> work <span style="color:#f92672">in</span> [<span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">2</span>]:
|
||
work_queue<span style="color:#f92672">.</span>put(work)
|
||
|
||
<span style="color:#75715e"># Create some synchronous tasks</span>
|
||
tasks <span style="color:#f92672">=</span> [(task, <span style="color:#e6db74">"One"</span>, work_queue), (task, <span style="color:#e6db74">"Two"</span>, work_queue)]
|
||
|
||
<span style="color:#75715e"># Run the tasks</span>
|
||
<span style="color:#66d9ef">for</span> t, n, q <span style="color:#f92672">in</span> tasks:
|
||
t(n, q)
|
||
|
||
<span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">"__main__"</span>:
|
||
main()
|
||
</code></pre></div><p>输出:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">Task One running
|
||
Task One total: <span style="color:#ae81ff">15</span>
|
||
Task One running
|
||
Task One total: <span style="color:#ae81ff">10</span>
|
||
Task One running
|
||
Task One total: <span style="color:#ae81ff">5</span>
|
||
Task One running
|
||
Task One total: <span style="color:#ae81ff">2</span>
|
||
Task Two nothing to <span style="color:#66d9ef">do</span>
|
||
</code></pre></div><h3 id="使用yield实现简单的协同运行">使用yield实现简单的协同运行</h3>
|
||
<p>关于yield的定义和用法可以查看这里<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> <br>
|
||
根据之前的代码,加上yield:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">import</span> queue
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">task</span>(name, queue):
|
||
<span style="color:#66d9ef">while</span> <span style="color:#f92672">not</span> queue<span style="color:#f92672">.</span>empty():
|
||
count <span style="color:#f92672">=</span> queue<span style="color:#f92672">.</span>get()
|
||
total <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> running"</span>)
|
||
<span style="color:#66d9ef">for</span> x <span style="color:#f92672">in</span> range(count):
|
||
total <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||
<span style="color:#75715e"># 模拟阻塞调用:time.sleep(count)</span>
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"---Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> total: </span><span style="color:#e6db74">{</span>total<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>)
|
||
<span style="color:#66d9ef">yield</span>
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Finish Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> total: </span><span style="color:#e6db74">{</span>total<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>)
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">main</span>():
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> This is the main entry point for the program
|
||
</span><span style="color:#e6db74"> """</span>
|
||
<span style="color:#75715e"># Create the queue of work</span>
|
||
work_queue <span style="color:#f92672">=</span> queue<span style="color:#f92672">.</span>Queue()
|
||
|
||
<span style="color:#75715e"># Put some work in the queue</span>
|
||
<span style="color:#66d9ef">for</span> work <span style="color:#f92672">in</span> [<span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">2</span>]:
|
||
work_queue<span style="color:#f92672">.</span>put(work)
|
||
|
||
<span style="color:#75715e"># Create some tasks</span>
|
||
tasks <span style="color:#f92672">=</span> [task(<span style="color:#e6db74">"One"</span>, work_queue), task(<span style="color:#e6db74">"Two"</span>, work_queue)]
|
||
|
||
<span style="color:#75715e"># Run the tasks</span>
|
||
done <span style="color:#f92672">=</span> <span style="color:#66d9ef">False</span>
|
||
<span style="color:#66d9ef">while</span> <span style="color:#f92672">not</span> done:
|
||
<span style="color:#66d9ef">for</span> t <span style="color:#f92672">in</span> tasks:
|
||
<span style="color:#66d9ef">try</span>:
|
||
next(t)
|
||
<span style="color:#66d9ef">except</span> <span style="color:#a6e22e">StopIteration</span>:
|
||
tasks<span style="color:#f92672">.</span>remove(t)
|
||
<span style="color:#66d9ef">if</span> len(tasks) <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>:
|
||
done <span style="color:#f92672">=</span> <span style="color:#66d9ef">True</span>
|
||
|
||
<span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">"__main__"</span>:
|
||
main()
|
||
</code></pre></div><p>输出:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Task One running
|
||
---Task One total: <span style="color:#ae81ff">1</span>
|
||
Task Two running
|
||
---Task Two total: <span style="color:#ae81ff">1</span>
|
||
---Task One total: <span style="color:#ae81ff">2</span>
|
||
---Task Two total: <span style="color:#ae81ff">2</span>
|
||
---Task One total: <span style="color:#ae81ff">3</span>
|
||
---Task Two total: <span style="color:#ae81ff">3</span>
|
||
---Task One total: <span style="color:#ae81ff">4</span>
|
||
---Task Two total: <span style="color:#ae81ff">4</span>
|
||
---Task One total: <span style="color:#ae81ff">5</span>
|
||
---Task Two total: <span style="color:#ae81ff">5</span>
|
||
---Task One total: <span style="color:#ae81ff">6</span>
|
||
---Task Two total: <span style="color:#ae81ff">6</span>
|
||
---Task One total: <span style="color:#ae81ff">7</span>
|
||
---Task Two total: <span style="color:#ae81ff">7</span>
|
||
---Task One total: <span style="color:#ae81ff">8</span>
|
||
---Task Two total: <span style="color:#ae81ff">8</span>
|
||
---Task One total: <span style="color:#ae81ff">9</span>
|
||
---Task Two total: <span style="color:#ae81ff">9</span>
|
||
---Task One total: <span style="color:#ae81ff">10</span>
|
||
---Task Two total: <span style="color:#ae81ff">10</span>
|
||
---Task One total: <span style="color:#ae81ff">11</span>
|
||
Finish Task Two total: <span style="color:#ae81ff">10</span>
|
||
Task Two running
|
||
---Task Two total: <span style="color:#ae81ff">1</span>
|
||
---Task One total: <span style="color:#ae81ff">12</span>
|
||
---Task Two total: <span style="color:#ae81ff">2</span>
|
||
---Task One total: <span style="color:#ae81ff">13</span>
|
||
---Task Two total: <span style="color:#ae81ff">3</span>
|
||
---Task One total: <span style="color:#ae81ff">14</span>
|
||
---Task Two total: <span style="color:#ae81ff">4</span>
|
||
---Task One total: <span style="color:#ae81ff">15</span>
|
||
---Task Two total: <span style="color:#ae81ff">5</span>
|
||
Finish Task One total: <span style="color:#ae81ff">15</span>
|
||
Task One running
|
||
---Task One total: <span style="color:#ae81ff">1</span>
|
||
Finish Task Two total: <span style="color:#ae81ff">5</span>
|
||
---Task One total: <span style="color:#ae81ff">2</span>
|
||
Finish Task One total: <span style="color:#ae81ff">2</span>
|
||
</code></pre></div><p>可以看到两个任务交换执行,类似异步,实际上依旧是同步程序。 <br>
|
||
当任务是IO密集型时,比如在tas函数中的<code>total += 1</code>下添加<code>time.sleep(count)</code>来模拟IO操作,这时就会产生阻塞,效率就会和普通的同步程序差不多。</p>
|
||
<h3 id="使用-asyncioawait-实现异步">使用 asyncio/await 实现异步</h3>
|
||
<p>Python 异步系统的核心是“事件循环(event loop)”,它运行所有代码,包括main()。 <br>
|
||
当执行到 await 关键字时,会发生上下文切换,执行控制权会回到”事件循环“,然后”事件循环“会查找已完成的事件,然后把执行控制权传递给已完成的任务。<br>
|
||
所以即使异步程序以单线程执行,也可以实现异步的功能,但要手动控制上下文切换时对数据的影响。</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">import</span> asyncio
|
||
<span style="color:#f92672">from</span> codetiming <span style="color:#f92672">import</span> Timer
|
||
|
||
<span style="color:#66d9ef">async</span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">task</span>(name, work_queue):
|
||
timer <span style="color:#f92672">=</span> Timer(text<span style="color:#f92672">=</span><span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> elapsed time: </span><span style="color:#ae81ff">{{</span><span style="color:#e6db74">:.1f</span><span style="color:#ae81ff">}}</span><span style="color:#e6db74">"</span>)
|
||
<span style="color:#66d9ef">while</span> <span style="color:#f92672">not</span> work_queue<span style="color:#f92672">.</span>empty():
|
||
delay <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> work_queue<span style="color:#f92672">.</span>get()
|
||
print(<span style="color:#e6db74">f</span><span style="color:#e6db74">"Task </span><span style="color:#e6db74">{</span>name<span style="color:#e6db74">}</span><span style="color:#e6db74"> running"</span>)
|
||
timer<span style="color:#f92672">.</span>start()
|
||
<span style="color:#66d9ef">await</span> asyncio<span style="color:#f92672">.</span>sleep(delay)
|
||
timer<span style="color:#f92672">.</span>stop()
|
||
|
||
<span style="color:#66d9ef">async</span> <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">main</span>():
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> This is the main entry point for the program
|
||
</span><span style="color:#e6db74"> """</span>
|
||
<span style="color:#75715e"># Create the queue of work</span>
|
||
work_queue <span style="color:#f92672">=</span> asyncio<span style="color:#f92672">.</span>Queue()
|
||
|
||
<span style="color:#75715e"># Put some work in the queue</span>
|
||
<span style="color:#66d9ef">for</span> work <span style="color:#f92672">in</span> [<span style="color:#ae81ff">15</span>, <span style="color:#ae81ff">10</span>, <span style="color:#ae81ff">5</span>, <span style="color:#ae81ff">2</span>]:
|
||
<span style="color:#66d9ef">await</span> work_queue<span style="color:#f92672">.</span>put(work)
|
||
|
||
<span style="color:#75715e"># Run the tasks</span>
|
||
<span style="color:#66d9ef">with</span> Timer(text<span style="color:#f92672">=</span><span style="color:#e6db74">"</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Total elapsed time: </span><span style="color:#e6db74">{:.1f}</span><span style="color:#e6db74">"</span>):
|
||
<span style="color:#66d9ef">await</span> asyncio<span style="color:#f92672">.</span>gather(
|
||
asyncio<span style="color:#f92672">.</span>create_task(task(<span style="color:#e6db74">"One"</span>, work_queue)),
|
||
asyncio<span style="color:#f92672">.</span>create_task(task(<span style="color:#e6db74">"Two"</span>, work_queue)),
|
||
)
|
||
|
||
<span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">"__main__"</span>:
|
||
asyncio<span style="color:#f92672">.</span>run(main())
|
||
</code></pre></div><p>输出:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">Task One running
|
||
Task Two running
|
||
Task Two total elapsed time: 10.0
|
||
Task Two running
|
||
Task One total elapsed time: 15.0
|
||
Task One running
|
||
Task Two total elapsed time: 5.0
|
||
Task One total elapsed time: 2.0
|
||
|
||
Total elapsed time: 17.0
|
||
</code></pre></div><p>可以看到,程序的总执行时间少于各部分的总和,这就是异步功能的作用,可以充分利用CPU,让其可以同时执行多个任务。</p>
|
||
<section class="footnotes" role="doc-endnotes">
|
||
<hr>
|
||
<ol>
|
||
<li id="fn:1" role="doc-endnote">
|
||
<p>yield用于定义生成器函数(generator function),生成器函数与普通函数的区别在于:</p>
|
||
<ol>
|
||
<li>生成器函数包含yield语句,普通函数使用return语句返回结果。</li>
|
||
<li>当生成器函数被调用时,它返回一个生成器对象(generator object),而不是立即执行函数体。</li>
|
||
<li>当第一次调用生成器的next()方法或使用for循环迭代它时,函数开始执行,直到遇到yield语句为止。yield会返回一个值,并暂停函数的执行。</li>
|
||
<li>当再次调用next()或继续for循环时,函数从上次暂停的位置继续执行,直到再次遇到yield。</li>
|
||
<li>当函数执行完毕没有更多的yield语句时,生成器自动抛出StopIteration异常结束迭代。 <br>
|
||
比如:</li>
|
||
</ol>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">countdown</span>(n):
|
||
<span style="color:#66d9ef">while</span> n <span style="color:#f92672">></span> <span style="color:#ae81ff">0</span>:
|
||
<span style="color:#66d9ef">yield</span> n
|
||
n <span style="color:#f92672">-=</span> <span style="color:#ae81ff">1</span>
|
||
|
||
<span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> countdown(<span style="color:#ae81ff">5</span>):
|
||
print(i)
|
||
</code></pre></div><p>输出:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#ae81ff">5</span>
|
||
<span style="color:#ae81ff">4</span>
|
||
<span style="color:#ae81ff">3</span>
|
||
<span style="color:#ae81ff">2</span>
|
||
<span style="color:#ae81ff">1</span>
|
||
</code></pre></div><p>可以看到,生成器让我们可以用非常简洁的方式生成一系列的值,而不需要构造一个列表存储所有的值。这在处理大量数据时非常有用,因为生成器并不需要在内存中存储所有生成的值。<br>
|
||
总结一下yield的特点和优点:</p>
|
||
<ol>
|
||
<li>使用yield可以实现延迟计算(lazy evaluation),按需生成结果,节省内存。</li>
|
||
<li>生成器函数可以看成是一种特殊的迭代器,它自动实现了__iter__和__next__方法。</li>
|
||
<li>生成器表达式提供了一种更简洁的创建生成器的语法。</li>
|
||
<li>Python协程(coroutine)也是使用yield语句来实现的。</li>
|
||
<li>使用yield语句可以非常方便地实现管道(pipeline)式的数据处理。</li>
|
||
</ol>
|
||
 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></li>
|
||
</ol>
|
||
</section>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/23/gitpod-vscode-githubcodespacesdocker.html" class="u-url"><time class="dt-published" datetime="2024-05-23 08:58:21 +0800">May 23, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Gitpod的云端 vscode 优化的有点厉害啊,同样的项目、同样的插件,内存占用比Github的Codespaces低很多,能多开好几个docker了!!</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/20/081334.html" class="u-url"><time class="dt-published" datetime="2024-05-20 08:13:34 +0800">May 20, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>刚看完《A.I.创世者 / The Creator》,比预想中的要好看,那小孩(Alphie / Madeleine Yuna Voyles)的演技炸裂,特别是最后一幕,深刻演示了“喜极而泣"。<br>
|
||
准备去看看1个小时的幕后花絮《True Love: Making ‘The Creator’》</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/05/19/llm.html">主流LLM模型翻译测试</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/05/19/llm.html" class="u-url"><time class="dt-published" datetime="2024-05-19 16:56:41 +0800">May 19, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>目的:为了给<a href="https://rsstranslator.com">RSS翻译器</a>选一个可替代gpt-3.5-turbo的便宜模型做为主力翻译引擎。</p>
|
||
<p>判定规则:能翻译出下方3句话,质量能看懂即可,且仅输出翻译结果</p>
|
||
<p>提示词:</p>
|
||
<pre tabindex="0"><code>System Message: Translate only the text into Chinese, return only the translations, do not explain the original text.
|
||
User Messages:
|
||
Don't ask if a monorepo is good for you – ask if you're good enough for a monorepo
|
||
Want more ways to post? for iOS, macOS, Android, and the web.
|
||
Does Offering ChatGPT a Tip Cause it to Generate Better Text? An Analysis
|
||
|
||
</code></pre><p>参数:</p>
|
||
<pre tabindex="0"><code>temperature=0.2,
|
||
top_p=0.2,
|
||
max_tokens = 1000
|
||
</code></pre><p>注意:
|
||
测试均使用API进行,非playground环境。<br>
|
||
仅供本人参考使用,非常不严谨,勿喷,谢谢。<br>
|
||
不定时更新</p>
|
||
<p><a href="https://airtable.com/appikG45x7SoRcxw1/shruYkNj5P1S6Kz6a">在线可筛选版</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/05/18/092416.html">Django数据迁移历险记</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/05/18/092416.html" class="u-url"><time class="dt-published" datetime="2024-05-18 18:22:32 +0800">May 18, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>⚠️不到万不得已,不建议手写migration文件,大佬除外。</p>
|
||
<h2 id="事情的起因">事情的起因:</h2>
|
||
<p>在RSS翻译器的缓存模型中,有一个做为hash的主键,当初脑抽使用了BinaryField类型,导致数据库的检索速度一直不理想。
|
||
所以这次准备换成检索速度最快的Integer类型。
|
||
正如所料,事情没那么简单,这事得从hash的计算方式说起。</p>
|
||
<h2 id="过程">过程:</h2>
|
||
<p>为了能在低配置的机器上尽可能快的运行,我使用了谷歌开发的CityHash64来计算hash,理由很简单,它的代码逻辑比SHA的要简单的多,对于长文的计算要快的多,又能保证唯一性,所以非常理想。</p>
|
||
<p>接着在将<code>BinaryField</code>改为<code>BigIntegerField</code>,并在migrate后,测试存储数据时,程序报错了:<code>OverflowError: Python int too large to convert to SQLite INTEGER</code>,一番GPT后才知道,SQLite只能存储64位的有符号整数,而CityHash64的值是无符号64位,超出了范围。</p>
|
||
<p>于是,为了方便后期维护和扩展,决定使用char类型来存储值,虽然比Integer的检索慢,但至少比Binary快呀。<br>
|
||
既然使用了char类型,就没有大小限制,果断升级到CityHash128来计算hash,并限制39个字符数,相关代码<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/models/base.py#L46">在此</a></p>
|
||
<p><strong>接下来就是重头戏:数据迁移</strong> <br>
|
||
首先需要重新计算所有的hash值,所以简单的类型migrate只是做了第一步,还需要在migration文件中手动更新数据。<br>
|
||
于是我更改了migration文件:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#f92672">from</span> django.db <span style="color:#f92672">import</span> migrations, models
|
||
<span style="color:#f92672">import</span> cityhash
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">update_hash</span>(apps, schema_editor):
|
||
MyModel <span style="color:#f92672">=</span> apps<span style="color:#f92672">.</span>get_model(<span style="color:#e6db74">'translator'</span>, <span style="color:#e6db74">'translated_content'</span>)
|
||
<span style="color:#66d9ef">for</span> obj <span style="color:#f92672">in</span> MyModel<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>all():
|
||
obj<span style="color:#f92672">.</span>hash <span style="color:#f92672">=</span> cityhash<span style="color:#f92672">.</span>CityHash128(<span style="color:#e6db74">f</span><span style="color:#e6db74">"</span><span style="color:#e6db74">{</span>obj<span style="color:#f92672">.</span>original_content<span style="color:#e6db74">}{</span>obj<span style="color:#f92672">.</span>translated_language<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>)
|
||
obj<span style="color:#f92672">.</span>save()
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Migration</span>(migrations<span style="color:#f92672">.</span>Migration):
|
||
dependencies <span style="color:#f92672">=</span> [
|
||
(<span style="color:#e6db74">'translator'</span>, <span style="color:#e6db74">'0030_alter_azureaitranslator_content_translate_prompt_and_more'</span>),
|
||
]
|
||
|
||
operations <span style="color:#f92672">=</span> [
|
||
migrations<span style="color:#f92672">.</span>AlterField(
|
||
model_name<span style="color:#f92672">=</span><span style="color:#e6db74">'translated_content'</span>,
|
||
name<span style="color:#f92672">=</span><span style="color:#e6db74">'hash'</span>,
|
||
field<span style="color:#f92672">=</span>models<span style="color:#f92672">.</span>CharField(editable<span style="color:#f92672">=</span><span style="color:#66d9ef">False</span>, max_length<span style="color:#f92672">=</span><span style="color:#ae81ff">39</span>, primary_key<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>, serialize<span style="color:#f92672">=</span><span style="color:#66d9ef">False</span>),
|
||
),
|
||
migrations<span style="color:#f92672">.</span>RunPython(update_hash),
|
||
]
|
||
</code></pre></div><p>加了<code>update_hash</code>函数和RunPython,不要问为啥不用<code>bulk_update</code>,因为它无法用于主键类型字段的更新。<br>
|
||
接着migrate没有报错,添加数据也正常,在我以为大功告成时,我检查了表里的数据,果然我还是太乐观了,表里原有的数据没有被更新,而是重新创建了新的一条数据。</p>
|
||
<p>又是一番GPT,了解到Django为了安全,任何migrate都不能修改原有的数据,但我不死心,改了update_hash函数:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">update_hash</span>(apps, schema_editor):
|
||
MyModel <span style="color:#f92672">=</span> apps<span style="color:#f92672">.</span>get_model(<span style="color:#e6db74">'translator'</span>, <span style="color:#e6db74">'translated_content'</span>)
|
||
<span style="color:#66d9ef">for</span> obj <span style="color:#f92672">in</span> MyModel<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>all():
|
||
new_hash <span style="color:#f92672">=</span> cityhash<span style="color:#f92672">.</span>CityHash128(<span style="color:#e6db74">f</span><span style="color:#e6db74">"</span><span style="color:#e6db74">{</span>obj<span style="color:#f92672">.</span>original_content<span style="color:#e6db74">}{</span>obj<span style="color:#f92672">.</span>translated_language<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>)
|
||
MyModel<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>filter(hash<span style="color:#f92672">=</span>obj<span style="color:#f92672">.</span>hash)<span style="color:#f92672">.</span>update(hash<span style="color:#f92672">=</span>new_hash)
|
||
</code></pre></div><p>这次没有意外,依旧无法修改,filter无法正常筛选出数据,一直为空。</p>
|
||
<p>只能另辟蹊径,创建多个migration来完成这次的迁移:</p>
|
||
<ol>
|
||
<li>保留原有的hash字段(BinaryField),创建新字段<code>hash_new</code>(CharField)。(<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/0031_translated_content_new_hash.py">代码</a>)</li>
|
||
<li>计算<code>hash_new</code>值。(<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/0032_update_current_hash_value.py">代码</a>)</li>
|
||
<li>删除hash字段,并设置<code>hash_new</code>为主键。(<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/0033_remove_translated_content_hash_and_more.py">代码</a>)</li>
|
||
<li>重命名<code>hash_new</code>为hash。(<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/0034_rename_new_hash_translated_content_hash.py">代码</a>)<br>
|
||
同时,为了数据安全,写了一个<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/__init__.py"><code>backup_db</code></a>函数,在执行迁移前,拷贝一份sqlite数据库做<a href="https://github.com/rss-translator/RSS-Translator/blob/main/translator/migrations/0031_translated_content_new_hash.py#L18">备份</a>。</li>
|
||
</ol>
|
||
<p>好了,万事俱备,只欠东风。<br>
|
||
本地运行测试,一切正常。<br>
|
||
服务器dev环境运行测试,一切正常。<br>
|
||
demo环境运行测试,一切正常。<br>
|
||
个人使用的生产环境运行测试,一切正常。</p>
|
||
<p>在我以为肯定还有什么问题的时候,它运行正常了。。。。 <br>
|
||
我怀着忐忑不安的心,将新的docker镜像push了。。。。</p>
|
||
<p>接下来就是等待迎接新的Bug了。</p>
|
||
<p>PS:我相信我的方案肯定不是最完美的,如果你有更好的方案,欢迎留言联系我哈,感激不尽!</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/18/djangomigration.html" class="u-url"><time class="dt-published" datetime="2024-05-18 16:46:58 +0800">May 18, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>纪念,今天是我第一次徒手写Django的migration文件!</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/17/ai.html" class="u-url"><time class="dt-published" datetime="2024-05-17 20:33:30 +0800">May 17, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>之前推特在严格模式下是可以开的,现在不行了,估计需要更多数据来训练AI。。。<br>
|
||
至于图2中所说的像往常一样保持一致,有种此地无银三百两的感觉。。。。</p>
|
||
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/17/ldapjs.html" class="u-url"><time class="dt-published" datetime="2024-05-17 14:58:57 +0800">May 17, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>看到<a href="https://github.com/ldapjs/node-ldapjs">LDAPjs</a>的维护者因为一封恶意邮件而归档了项目,深感惋惜,开源环境正在变的越来越差,我们该做些什么呢? <br>
|
||
还有一篇<<a href="https://www.hezmatt.org/~mpalmer/blog/2024/05/14/is-this-project-still-maintained.html">这个项目还在维护吗?</a>></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/17/netbsd.html" class="u-url"><time class="dt-published" datetime="2024-05-17 14:12:23 +0800">May 17, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>很喜欢<a href="https://www.netbsd.org/">NetBSD</a>的主页设计和颜色搭配</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/16/153518.html" class="u-url"><time class="dt-published" datetime="2024-05-16 15:35:18 +0800">May 16, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>在我Debug了2天后,才发现Django的<code>ModelAdmin</code>模块中, <code>list_filter</code>也会调用<code>get_search_results</code>函数来查询数据库 <br>
|
||
因此如果你设置了<code>list_filter</code>列表,但在admin页面上并没有成功筛选<br>
|
||
可能是你自定义了<code>get_search_results</code>函数,对筛选结果进行了额外的操作。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/15/perplexitygptosonnetopus.html" class="u-url"><time class="dt-published" datetime="2024-05-15 09:46:40 +0800">May 15, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>已将Perplexity的默认模型改为GPT-4o,即刻拥有Sonnet的简洁和快速,又有Opus的智商,非常完美</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/05/14/python-pycache.html">关于Python的 __pycache__ 文件夹小记</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/05/14/python-pycache.html" class="u-url"><time class="dt-published" datetime="2024-05-14 16:19:21 +0800">May 14, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>ref: <a href="https://realpython.com/python-pycache/#what-actions-invalidate-the-cache">https://realpython.com/python-pycache/#what-actions-invalidate-the-cache</a></p>
|
||
<ul>
|
||
<li>Python 中的 <code>__pycache__</code> 文件夹是什么?<br>
|
||
Python模块的缓存文件夹,将需要的模块编译为字节码,并缓存(.pyc)到该文件夹中,实现更快的导入速度。<br>
|
||
除了<code>__pycache__</code> 文件夹,Python还在内存中创建了模块缓存,缓存需要导入多次的模块,减少导入模块的开销。</li>
|
||
<li>如何判断缓存的模块是否过期?<br>
|
||
默认基于时间戳判断,也可以基于哈希值</li>
|
||
<li>即使使用了 from … import 语法,Python 还是会读取并编译整个模块,包括未使用的。</li>
|
||
<li>可以在python命令后使用-X importtime参数来显示每个模块的导入时间</li>
|
||
<li>递归删除所有 <code>__pycache__</code> 文件夹(linux):<code>find . -type d -name __pycache__ -exec rm -rf {} +</code></li>
|
||
<li>如何禁止Python创建缓存文件?<br>
|
||
向 python 命令传递 -B 选项,或者设置环境变量<code>PYTHONDONTWRITEBYTECODE=1</code></li>
|
||
<li>集中存储缓存<br>
|
||
方法1:<code>python -X pycache_prefix=/tmp/pycache calculator.py</code> <br>
|
||
方法2:设置环境变量<code>PYTHONPYCACHEPREFIX=/tmp/pycache</code><br>
|
||
它会在指定的文件夹下镜像项目的目录结构,由于这种集中式缓存的层次结构与项目结构相匹配,因此可以在多个项目之间共享该缓存文件夹</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/13/home-serverstatus-page.html" class="u-url"><time class="dt-published" datetime="2024-05-13 19:49:32 +0800">May 13, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>给我的Home Server加了<a href="https://status.versun.me">Status Page</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/11/rss-webfeedbincommafeedminiflux-reeder.html" class="u-url"><time class="dt-published" datetime="2024-05-11 20:39:04 +0800">May 11, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>我使用了几乎所有的RSS阅读器,目前体验最好的:<br>
|
||
Web端:Feedbin(三栏式),CommaFeed(展开式),Miniflux(单栏式)<br>
|
||
客户端:Reeder <br>
|
||
目前最期待的:<a href="https://twitter.com/DIYgod">DIYgod</a>正在开发的ReadOK/Follow</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/11/app.html" class="u-url"><time class="dt-published" datetime="2024-05-11 19:13:03 +0800">May 11, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>自从打开国内所有app的<长辈模式>后,屏幕时间骤降到2小时半每天!!
|
||
目前还有戒断反应,会时不时拿出来划拉几下,所以应该还能再降一半,争取控制在每天1小时左右!</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/10/manas-j-saloi.html" class="u-url"><time class="dt-published" datetime="2024-05-10 18:42:21 +0800">May 10, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>发现一个很不错的博客:<a href="https://manassaloi.com/">Manas J. Saloi</a> <br>
|
||
喜欢它的博客内容安排:<br>
|
||
Blog:记录未经过滤的想法<br>
|
||
Bookshelf:记录看过的书<br>
|
||
Summaries:记录读书笔记文摘<br>
|
||
Links:记录常用的和个人相关的链接<br>
|
||
POW:工作经历<br>
|
||
Uses This:使用的工具、服务、技术等</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/10/httpscqco.html" class="u-url"><time class="dt-published" datetime="2024-05-10 16:22:30 +0800">May 10, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>这个工具非常适合进行 多人深度/复杂 的 文字讨论/评论<br>
|
||
<a href="https://cq2.co/">cq2.co</a></p>
|
||
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/10/aitldr.html" class="u-url"><time class="dt-published" datetime="2024-05-10 09:43:14 +0800">May 10, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>AI摘要/TL;DR 会不会就是文字版的 短视频?</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/10/deepseek-xjpkey-findings.html" class="u-url"><time class="dt-published" datetime="2024-05-10 08:52:00 +0800">May 10, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>DeepSeek虽然便宜,但内容审核也太严格了吧,基本不可用啊。<br>
|
||
你过滤个XJP我能理解,但为啥“Key Findings”、“ Welcome to the 52nd!”也过滤??<br>
|
||
后台还调不了过滤等级。。。。</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/08/jetbrains-idesshdockergatewayideide-ide.html" class="u-url"><time class="dt-published" datetime="2024-05-08 20:48:21 +0800">May 8, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>JetBrains IDE的远程开发功能也太弱鸡了吧,无论是SSH还是Docker还是单独的Gateway,都需要在远端安装IDE后台,然后在本地安装IDE前端。。。<br>
|
||
本地已经安装好的IDE完成没用,就是一个远程启动器。。。。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/05/183622.html" class="u-url"><time class="dt-published" datetime="2024-05-05 18:36:22 +0800">May 5, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>迷茫时读书,忙碌时运动,独处时思考</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/04/223159.html" class="u-url"><time class="dt-published" datetime="2024-05-04 22:31:59 +0800">May 4, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>刚看完电影<铃芽之旅>,故事讲得很好,点到为止,不煽情不做作,很好看。
|
||
真羡慕这种想象力和叙事技巧</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/04/realpython.html" class="u-url"><time class="dt-published" datetime="2024-05-04 16:31:42 +0800">May 4, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>realpython的内容是真不错,但一个月300多的价格下不了手啊……</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/03/neato.html" class="u-url"><time class="dt-published" datetime="2024-05-03 06:57:28 +0800">May 3, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>期待<a href="https://neato.pub">Neato</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/05/02/195616.html" class="u-url"><time class="dt-published" datetime="2024-05-02 19:56:16 +0800">May 2, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>每次在看大自然纪录片,比如<地球>时,恨不得游遍整个地球!<br>
|
||
然后今天游个良渚村,就累的不行…………</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/30/ghostactivitypubechofeedactivitypub.html" class="u-url"><time class="dt-published" datetime="2024-04-30 15:03:46 +0800">Apr 30, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Ghost即将<a href="https://activitypub.ghost.org/">支持ActivityPub</a>了,再加上最近很火的<a href="https://echofeed.app/">EchoFeed</a>,感觉ActivityPub要火了</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/30/til-httpstailscalecominstallsh.html" class="u-url"><time class="dt-published" datetime="2024-04-30 13:07:45 +0800">Apr 30, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>TIL: 所有的代码都被包裹在一个主函数中,然后在文件底部调用该函数,这样可以避免执行下载不完整的脚本的风险<br>
|
||
<a href="https://tailscale.com/install.sh">tailscale.com/install.s…</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/29/215407.html" class="u-url"><time class="dt-published" datetime="2024-04-30 05:54:07 +0800">Apr 30, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>果然这个bug被烂用了,看看github多久修复。
|
||
留2个链接测试下:<br>
|
||
<a href="https://github.com/github/docs/assets/2398708/2893bb6d-76a3-48f4-931d-39256cd76cfa">github.com/github/docs/assets/2398708/2893bb6d-76a3-48f4-931d-39256cd76cfa</a> <br>
|
||
<a href="https://github.com/openai/openai-cookbook/assets/2398708/fbe33081-1b90-4fd3-9f81-213b6979eeae">github.com/openai/openai-cookbook/assets/2398708/fbe33081-1b90-4fd3-9f81-213b6979eeae</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/29/roadmaps-ai.html" class="u-url"><time class="dt-published" datetime="2024-04-29 16:53:40 +0800">Apr 29, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>刚发现,专门做开发人员学习路线图的<a href="https://roadmap.sh/">Roadmaps</a>,添加了好多内容,<br>
|
||
特别是每个节点都有推荐的学习资料,还有个AI定制学习路线,简直不要太方便了</p>
|
||
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/04/24/092845.html">我的Home Server迁移记录</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/04/24/092845.html" class="u-url"><time class="dt-published" datetime="2024-04-27 07:50:34 +0800">Apr 27, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>本篇文章记录了我的Home server从原先的 Debian + Yunohost 迁移到 Ubuntu + <a href="https://dockge.kuma.pet">Dockge</a>的过程<br>
|
||
迁移理由:</p>
|
||
<ol>
|
||
<li>为了装更多应用压榨VPS的8G内存</li>
|
||
<li>使用docker方便调试和开发</li>
|
||
<li>Yunohost很多应用的更新没法及时跟上</li>
|
||
<li>Caddy在Debian下有很多小问题,Ubuntu就能一键启用,很奇怪</li>
|
||
</ol>
|
||
<h2 id="备份已有应用的数据">备份已有应用的数据</h2>
|
||
<p>好在所有的应用都提供了导出数据功能,所以很快就完成了备份</p>
|
||
<h2 id="初始化系统">初始化系统</h2>
|
||
<ol>
|
||
<li>将系统重装为Ubuntu 22.04后,升级重启。</li>
|
||
<li>安装必需软件:<code>apt install vim sudo curl uidmap fail2ban -y</code></li>
|
||
<li>启用fail2ban:<code>systemctl enable fail2ban</code></li>
|
||
<li>创建非root用户:<code>adduser versun</code></li>
|
||
<li>将versun用户加入sudo:<code>visudo</code></li>
|
||
<li>配置sshd:<code>vim /etc/ssh/sshd_config</code> 禁止root登陆和密码登陆</li>
|
||
</ol>
|
||
<pre tabindex="0"><code>PasswordAuthentication no
|
||
PermitRootLogin no
|
||
</code></pre><ol start="7">
|
||
<li>重启sshd服务:<code>sudo systemctl restart sshd</code></li>
|
||
<li>给versun用户添加ssh public key</li>
|
||
</ol>
|
||
<pre tabindex="0"><code>su versun
|
||
mkdir ~/.ssh
|
||
echo "Your ssh public key" > ~/.ssh/authorized_keys
|
||
|
||
sudo chmod 600 ~/.ssh/authorized_keys
|
||
</code></pre><ol start="9">
|
||
<li>新建一个终端使用versun账户和密钥确保能登陆成功。</li>
|
||
</ol>
|
||
<h2 id="安装docker">安装Docker</h2>
|
||
<p>根据<a href="https://docs.docker.com/engine/install/ubuntu/">官方文档</a>安装即可<br>
|
||
将versun账户添加到 docker 组,以便以非root用户身份运行 Docker 命令:<code>sudo usermod -aG docker versun</code><br>
|
||
重启或者重新登陆versun账户</p>
|
||
<h2 id="安装caddy">安装Caddy</h2>
|
||
<p>同样,根据<a href="https://caddyserver.com/docs/install">官方文档</a>安装即可</p>
|
||
<h2 id="安装dockge">安装Dockge</h2>
|
||
<p><a href="https://github.com/louislam/dockge?tab=readme-ov-file#basic">官方安装步骤</a>如下:</p>
|
||
<pre tabindex="0"><code>#Create directories that store your stacks and stores Dockge's stack
|
||
mkdir -p /opt/stacks /opt/dockge
|
||
cd /opt/dockge
|
||
|
||
#Download the compose.yaml
|
||
curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
|
||
</code></pre><p>在下载完compose.yaml后,我们需要修改端口,将<code>- 5001:5001</code>改为<code>- 127.0.0.1:5001:5001</code> <br>
|
||
因为我使用caddy来代理服务,所以就限制它只能通过本地访问,而不是暴露到外网。<br>
|
||
然后启动服务:<code>docker compose up -d</code></p>
|
||
<h2 id="配置caddyfile">配置Caddyfile</h2>
|
||
<p>修改/etc/caddy/Caddyfile,内容参考如下</p>
|
||
<pre tabindex="0"><code>{
|
||
log {
|
||
output file /var/log/caddy/versun.log
|
||
}
|
||
}
|
||
dockge.example.com {
|
||
reverse_proxy localhost:5001
|
||
}
|
||
blog.example.com {
|
||
reverse_proxy localhost:8001
|
||
}
|
||
</code></pre><p>个人比较喜欢使用subdomain的形式,但每个subdomain都要在域名服务商那添加,你也可以使用子路径形式,更方便:</p>
|
||
<pre tabindex="0"><code>versun.me {
|
||
reverse_proxy /dockge/* localhost:5001
|
||
reverse_proxy /blog/* localhost:8001
|
||
}
|
||
</code></pre><p>修改完后,格式化下文件:<code>sudo caddy fmt /etc/caddy/Caddyfile --overwrite</code> <br>
|
||
然后重载配置:<code>sudo systemctl reload caddy</code></p>
|
||
<h2 id="配置cloudflare的dns记录">配置Cloudflare的DNS记录</h2>
|
||
<p>强烈建议使用Cloudflare来管理DNS记录,不仅有免费CDN,还有免费的代理防止服务器IP泄漏,还有防基础的DDOS。<br>
|
||
添加A记录到你的服务器IP,并开启Proxy<br>
|
||
然后在左侧面板,选择<code>SSL/TLS</code>,将加密模式设置为完全(Full)<br>
|
||
过1分钟左右,通过域名应该就能访问到你的服务了。</p>
|
||
<h2 id="安装应用">安装应用</h2>
|
||
<p>之后就是在Dockage上安装Docker应用,基本步骤如下:</p>
|
||
<ol>
|
||
<li>修改应用的docker compose内容中的port为只监听本地</li>
|
||
<li>修改caddyfile配置文件,添加服务端口</li>
|
||
<li>重启caddy</li>
|
||
<li>配置DNS记录</li>
|
||
</ol>
|
||
<p>注意:如果有需要映射文件夹的,需要确保映射到当前路径:<code>./</code>,这样才能确保所有数据都在<code>/opt/stacks</code>里面。</p>
|
||
<h2 id="定时备份docker数据">定时备份docker数据</h2>
|
||
<p>我使用<a href="https://www.backblaze.com/docs/cloud-storage-command-line-tools">backblaze</a>的b2服务。</p>
|
||
<ol>
|
||
<li>
|
||
<p>下载官方的<a href="https://github.com/Backblaze/B2_Command_Line_Tool/releases/latest/download/b2-linux">b2程序</a></p>
|
||
</li>
|
||
<li>
|
||
<p>执行命令:</p>
|
||
<pre tabindex="0"><code>chmod a+x b2-linux
|
||
sudo mv b2-linux /usr/bin/b2
|
||
</code></pre></li>
|
||
<li>
|
||
<p>在backblaze上<a href="https://secure.backblaze.com/b2_buckets.htm">创建</a>私有存储桶和新的[应用密钥]
|
||
(<a href="https://secure.backblaze.com/app_keys.htm">https://secure.backblaze.com/app_keys.htm</a>)</p>
|
||
</li>
|
||
<li>
|
||
<p>使用root完成认证: <code>sudo b2 authorize-account</code></p>
|
||
</li>
|
||
<li>
|
||
<p>首次上传:<code>sudo b2 sync /opt/stacks/ b2://Your-Bucket-Name/</code></p>
|
||
</li>
|
||
<li>
|
||
<p>创建cron定时任务:<code>sudo crontab -e</code></p>
|
||
<pre tabindex="0"><code># 每周一的3点上传一次,以本地版本为准,旧版本保留30天,
|
||
0 3 * * 1 /usr/bin/b2 sync --keep-days 30 --replace-newer /opt/stacks/ b2://Your-Bucket-Name/ >> /var/log/b2sync.log 2>&1
|
||
</code></pre></li>
|
||
</ol>
|
||
<p>完成</p>
|
||
<h2 id="其它">其它</h2>
|
||
<p>你也可以安装一个Homepage,方便汇总所有的服务,挑一个吧:<a href="https://gethomepage.dev">Homepage</a>, <a href="https://dashy.to/">Dashy</a>, <a href="https://github.com/bastienwirtz/homer">Homer</a>, <a href="https://homarr.dev/">Homarr</a> <br>
|
||
如果没有自带认证的,可以<a href="https://joshstrange.com/2020/01/13/securing-your-self-hosted-apps-with-single-signon/">使用caddy来做认证</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/commafeedminiflux.html" class="u-url"><time class="dt-published" datetime="2024-04-26 18:03:25 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>CommaFeed的移动端界面比Miniflux好用很多</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/100335.html" class="u-url"><time class="dt-published" datetime="2024-04-26 10:03:35 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>我每周最勇敢的时刻:将“全部标为已读”</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/home-server-debian.html" class="u-url"><time class="dt-published" datetime="2024-04-26 09:26:45 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>总算忙完工作了,我要开始重装我的 Home Server 了<br>
|
||
从原先的 Debian + Yunohost 系统转为Ubuntu + Dockge<br>
|
||
理由:</p>
|
||
<ol>
|
||
<li>为了装更多应用压榨VPS的8G内存</li>
|
||
<li>使用docker方便调试</li>
|
||
<li>Yunohost很多应用的更新没法及时跟上</li>
|
||
<li>Caddy在Debian下有很多小问题,Ubuntu就能一键启用,很奇怪</li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/pegasusdjango-saas-htmxcssbulmatailwind.html" class="u-url"><time class="dt-published" datetime="2024-04-26 09:14:16 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p><a href="https://www.saaspegasus.com/">Pegasus</a>的Django SaaS模板看起来很不错啊<br>
|
||
前端用htmx,CSS框架可选bulma和tailwind,<br>
|
||
还内置了登录系统和Stripe订阅,还有REST API,省了很多事情,就是稍微有点贵</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/cpuweb-nand.html" class="u-url"><time class="dt-published" datetime="2024-04-26 08:28:27 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>好希望我也能写出这么个玩具来<br>
|
||
一台图灵16位计算机,实现了CPU、汇编器、虚拟机翻译器和编译器的规范,同时将该平台移植到web上,并集成开发环境和用户界面<br>
|
||
<a href="https://github.com/ArhanChaudhary/NAND">NAND</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/isp-start-your.html" class="u-url"><time class="dt-published" datetime="2024-04-26 08:16:54 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>不要再折腾软路由了,试一试搭个ISP🤣 <br>
|
||
<a href="https://startyourownisp.com/">Start Your Own ISP</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/26/rss.html" class="u-url"><time class="dt-published" datetime="2024-04-26 06:04:53 +0800">Apr 26, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>昨晚是不是发生了什么?<br>
|
||
国内的RSS都挂了,刚刚手动更新后恢复了</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/25/pythonformat-country-pythonmystr.html" class="u-url"><time class="dt-published" datetime="2024-04-25 21:05:59 +0800">Apr 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>原来python的format函数是必需给所有的占位符赋值的,不能只赋值其中一个。<br>
|
||
比如下面的代码会报错,因为country没有赋值</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python">my_str <span style="color:#f92672">=</span> <span style="color:#e6db74">"My name is </span><span style="color:#e6db74">{name}</span><span style="color:#e6db74">, I'm from </span><span style="color:#e6db74">{country}</span><span style="color:#e6db74">"</span>
|
||
print( my_str<span style="color:#f92672">.</span>format(name<span style="color:#f92672">=</span><span style="color:#e6db74">'Versun'</span>) )
|
||
</code></pre></div><p>所以如果对于用户输入的字符串,比如用于AI的提示词,用replace更合适些。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/25/justin-dukestripebuttondown.html" class="u-url"><time class="dt-published" datetime="2024-04-25 15:34:14 +0800">Apr 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>分享篇文章<<a href="https://jmduke.com/posts/essays/two-years/">做为独立开发者的这两年</a>>,作者Justin Duke从Stripe公司离职后,创办了Buttondown,做为独立开发者,工作生活难平衡,虽灵活但更孤独,而且收入并没有比工作时的多。
|
||
“但是,如果你认为它可能适合你,如果不是现在,那是什么时候?”</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/25/jsgorustpython.html" class="u-url"><time class="dt-published" datetime="2024-04-25 15:33:36 +0800">Apr 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>朋友:“我现在学哪个编程语言能战未来?”
|
||
我:“前端JS,后端Go,底层Rust”
|
||
朋友:“那你学的是哪个?”
|
||
我:“Python”</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/25/feed-feed-rss.html" class="u-url"><time class="dt-published" datetime="2024-04-25 07:56:42 +0800">Apr 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>早上才发现我博客的feed链接有问题。。。。。<br>
|
||
现在修复了<br>
|
||
Feed: <a href="https://versun.me/feed">rss</a>, <a href="https://versun.me/feed.json">json</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/25/075015.html" class="u-url"><time class="dt-published" datetime="2024-04-25 07:50:15 +0800">Apr 25, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>“我可不能接受周末休息是为了有力气去上班"😄</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/24/rss-ai-deeplgpt.html" class="u-url"><time class="dt-published" datetime="2024-04-24 14:24:10 +0800">Apr 24, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>总算给 RSS翻译器 添加了 AI 摘要功能,可单独指定引擎,比如翻译使用DeepL,摘要使用GPT,完美配合。<br>
|
||
还加了摘要细粒度控制,对长文更友好。<br>
|
||
同时还优化了 AI 提示词的设置,现在可以给每个RSS源添加额外的提示词,方便针对性优化</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/24/122325.html" class="u-url"><time class="dt-published" datetime="2024-04-24 12:46:32 +0800">Apr 24, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>人变老的一个迹象就是喜欢看照片。<br>
|
||
以前是拍了没时间看,现在是有时间就看</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/24/dwarkesh-patelpodcastmetallamaquesthorizon-meta.html" class="u-url"><time class="dt-published" datetime="2024-04-24 11:32:31 +0800">Apr 24, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>看完 扎克伯格和Dwarkesh Patel访谈<a href="https://www.dwarkeshpatel.com/p/mark-zuckerberg">podcast</a>,总算明白Meta为啥要开源Llama大模型和开放Quest的Horizon系统<br>
|
||
虽然对Meta没好感,但还是佩服扎克伯格的战略眼光</p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/19/ai-chatdev.html" class="u-url"><time class="dt-published" datetime="2024-04-19 15:37:41 +0800">Apr 19, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>发现一个很好玩的AI应用: ChatDev<br>
|
||
可以模拟一家虚拟软件公司,定义不同角色的代理,比如产品, 程序员, 测试, 设计等 <br>
|
||
然后你做为甲方给一个命题,让它们自己去讨论实现<br>
|
||
这可不是玩具,人家是有正儿八经的论文做支撑的: 软件开发代理的经验协同学习框架 <br>
|
||
<a href="https://github.com/OpenBMB/ChatDev">项目</a>, <a href="https://arxiv.org/abs/2312.17025">论文</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/19/til-python-requirementstxt.html" class="u-url"><time class="dt-published" datetime="2024-04-19 11:23:34 +0800">Apr 19, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>TIL: 错误地在全局 Python 环境中安装了软件包?<br>
|
||
使用空白 requirements.txt 运行 pip-sync ,可进行清理 <a href="https://x.com/_TylerHillery/status/1777707017328877676">[via]</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/19/linuxpop-oscosmic-rustalpha.html" class="u-url"><time class="dt-published" datetime="2024-04-19 09:44:21 +0800">Apr 19, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>在Linux系统上,我目前最期待的软件就是Pop OS正在开发的Cosmic桌面环境<br>
|
||
从零使用Rust开始编写,预计今年7月份发布alpha版本<br>
|
||
Pop OS也是我目前主用的Linux系统桌面发行版,开箱即用,体验非常好。<br>
|
||
<a href="https://github.com/pop-os/cosmic-epoch">github.com/pop-os/co…</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/18/til-httpszhwikipediaorgwikiebaeebbeacebafebb.html" class="u-url"><time class="dt-published" datetime="2024-04-18 14:18:42 +0800">Apr 18, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>TIL: 才发现亚洲不仅有泛亚铁路,还有 泛亚公路!<br>
|
||
从日本能开车到上海!! (轮船到韩国)<br>
|
||
<a href="https://zh.wikipedia.org/wiki/%E4%BA%9E%E6%B4%B2%E5%85%AC%E8%B7%AF%E7%B6%B2">zh.wikipedia.org/wiki/%E4%…</a></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/18/063143.html" class="u-url"><time class="dt-published" datetime="2024-04-18 06:31:43 +0800">Apr 18, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Google Gemini真的是不想让人用,gemini-pro不支持system_instruction参数(类system message),只有gemini-1.5-pro才支持, 那我还得给这2个模型写2个方法? 无法理解。 <br>
|
||
只能设置为"only support gemini-1.5-pro-latest"</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/17/microblog.html" class="u-url"><time class="dt-published" datetime="2024-04-17 14:10:40 +0800">Apr 17, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>自从笔记和博客转到micro.blog后,轻松了好多,感觉又找回了“记录”的感觉,<br>
|
||
不再受迫与各种分类、框架、层级、标题、目的等压力。 <br>
|
||
准备写一篇博文记录下这次笔记系统和观念的转变<br>
|
||
Blog: versun.me<br>
|
||
Tweets存档: versun.me/tweets<br>
|
||
Mastodon: versun.me/@versun</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/16/twitterxmastodon-x-xx.html" class="u-url"><time class="dt-published" datetime="2024-04-16 14:25:21 +0800">Apr 16, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>要想完全放弃Twitter(X),转战Mastodon(via micro.blog)还是有点难,原因主要有2点:</p>
|
||
<ol>
|
||
<li>互动性:大部分人还是在X上,发推和发嘟的覆盖面和互动性完全不是一个量级,没有互动也就很难产生新想法<br>
|
||
解决方法:尽量发嘟,然后转发到X上。X上只进行转发评论互动,定期归档到micro.blog上</li>
|
||
<li>虚荣心:X粉丝数涨的快,Micro.blog不显示粉丝数也是这个原因,为了保持真实,注重内容 <br>
|
||
解决方法:X并没有完全弃用,所以影响不大。<br>
|
||
总结:在micro.blog上发post(嘟文),按需转发到X,定期归档X</li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/16/061607.html" class="u-url"><time class="dt-published" datetime="2024-04-16 06:16:07 +0800">Apr 16, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>写作提示:
|
||
删除所有使用"……对我来说……"、“在我看来”、“有些人可能不同意”、“我认为 “等词语的地方。
|
||
这些词语会让你的文章变得脆弱,缺乏任何说服力,阻碍你去描述你所热爱的事物。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/15/tillinux-cat-procpidstatus.html" class="u-url"><time class="dt-published" datetime="2024-04-15 20:46:03 +0800">Apr 15, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>TIL: Linux查看具体进程的内存占用情况</p>
|
||
<p><code>cat /proc/[PID]/status | grep VmRSS</code></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/13/192724.html" class="u-url"><time class="dt-published" datetime="2024-04-13 19:27:24 +0800">Apr 13, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>如果你只做能力范围内的事,则永远不会进步
|
||
—-功夫熊猫3</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
|
||
<a href="https://versun.me/2024/04/12/microblog.html" class="u-url"><time class="dt-published" datetime="2024-04-13 06:52:46 +0800">Apr 13, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>我正式搬迁到Micro.blog平台啦🎉🎉🎉</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/03/29/tilrag.html">TIL-什么是RAG</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/03/29/tilrag.html" class="u-url"><time class="dt-published" datetime="2024-03-29 22:38:00 +0800">Mar 29, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>RAG是Retrieval Augmented Generation的缩写,中文名为检索增强生成。</p>
|
||
<p>它是一种结合了信息检索和文本生成的技术,旨在增强大语言模型处理知识密集型任务的能力。</p>
|
||
<p>RAG的基本工作流程如下</p>
|
||
<ol>
|
||
<li>检索:根据用户的查询,利用检索模型从外部知识库中获取相关的背景信息。通常是将查询向量化,然后在向量数据库中进行相似度搜索,找出最相关的若干条记录。</li>
|
||
<li>增强:将用户查询和检索到的背景信息一起嵌入到预设的提示模板中,生成增强后的提示。</li>
|
||
<li>生成:将增强后的提示输入到语言模型中,生成最终的输出文本。
|
||
通过融合外部知识,RAG可以让语言模型生成更加准确、符合上下文的回答,减少幻觉和错误信息。同时RAG也比较灵活,可以通过更新知识库来适应知识的变化,而无需重新训练整个语言模型</li>
|
||
</ol>
|
||
<p>与微调(fine-tuning)相比,RAG有以下优势</p>
|
||
<ol>
|
||
<li>更新知识更加高效,只需修改知识库即可,不用重新训练模型</li>
|
||
<li>更适合知识会随时间变化的动态场景</li>
|
||
<li>可以利用更大规模的外部知识,不受模型参数规模的限制</li>
|
||
</ol>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/02/28/python.html">Python打包简明教程</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/02/28/python.html" class="u-url"><time class="dt-published" datetime="2024-02-28 05:56:30 +0800">Feb 28, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>参考文档:</p>
|
||
<p><a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/">https://packaging.python.org/en/latest/tutorials/packaging-projects/</a></p>
|
||
<p><a href="https://setuptools.pypa.io/en/latest/userguide/quickstart.html">https://setuptools.pypa.io/en/latest/userguide/quickstart.html</a>
|
||
<a href="https://docs.djangoproject.com/zh-hans/5.0/intro/reusable-apps/">https://docs.djangoproject.com/zh-hans/5.0/intro/reusable-apps/</a></p>
|
||
<h1 id="准备工作">准备工作</h1>
|
||
<p><strong>安装相关工具</strong></p>
|
||
<p><code>python3 -m pip install --upgrade pip</code></p>
|
||
<p><code>python3 -m pip install --upgrade twine</code></p>
|
||
<p><code>python3 -m pip install --upgrade setuptools</code></p>
|
||
<p><code>python3 -m pip install --upgrade build</code></p>
|
||
<p><strong>注册pypi账号</strong></p>
|
||
<p>正式环境:<a href="https://pypi.org">https://pypi.org</a></p>
|
||
<p>测试环境:<a href="https://test.pypi.org">https://test.pypi.org</a></p>
|
||
<p><strong>文件结构</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-plain" data-lang="plain">my-project/
|
||
└── src/
|
||
└── my_package/
|
||
├── __init__.py
|
||
└── example.py
|
||
</code></pre></div><p>my_package是你的包名</p>
|
||
<h1 id="创建打包的相关文件">创建打包的相关文件</h1>
|
||
<p>按照下方的结构创建对应文件:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-plain" data-lang="plain">my-project/
|
||
├── LICENSE
|
||
├── pyproject.toml
|
||
├── README.md
|
||
├── setup.cfg
|
||
├── setup.py
|
||
├── MANIFEST.in
|
||
├── src/
|
||
│ └── my_package/
|
||
│ ├── __init__.py
|
||
│ └── example.py
|
||
└── tests/
|
||
</code></pre></div><p>各文件内容参考如下:</p>
|
||
<p>pyproject.toml</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml">[build-system]
|
||
requires = ['setuptools>=69.1.0']
|
||
build-backend = 'setuptools.build_meta'
|
||
</code></pre></div><p>setup.cfg</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml">[metadata]
|
||
name = django-text-translator
|
||
version = 2024.02.28
|
||
description = A Django application that supports adding multiple third-party engines for text translation.
|
||
long_description_content_type = text/markdown
|
||
long_description = file: README.md
|
||
url = https://github.com/versun/django-text-translator
|
||
author = versun
|
||
author_email = django-text-translator@versun.me
|
||
license = MIT
|
||
classifiers =
|
||
Environment :: Web Environment
|
||
Framework :: Django
|
||
Framework :: Django :: 5.0
|
||
Intended Audience :: Developers
|
||
License :: OSI Approved :: MIT License
|
||
Operating System :: OS Independent
|
||
Programming Language :: Python
|
||
Programming Language :: Python :: 3
|
||
Programming Language :: Python :: 3 :: Only
|
||
Programming Language :: Python :: 3.10
|
||
Programming Language :: Python :: 3.11
|
||
Programming Language :: Python :: 3.12
|
||
Topic :: Internet :: WWW/HTTP
|
||
Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
||
Topic :: Software Development :: Libraries :: Application Frameworks
|
||
Topic :: Software Development :: Libraries :: Python Modules
|
||
|
||
[options]
|
||
include_package_data = true
|
||
packages = find:
|
||
python_requires = >=3.10
|
||
install_requires =
|
||
django >= 5.0
|
||
</code></pre></div><p>License可参考<a href="https://choosealicense.com/">https://choosealicense.com/</a></p>
|
||
<p>setup.py</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> setuptools <span style="color:#f92672">import</span> setup
|
||
setup()
|
||
</code></pre></div><p>MANIFEST.in</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-plain" data-lang="plain">include LICENSE
|
||
include README.md
|
||
recursive-include docs *
|
||
recursive-include django_text_translator/static *
|
||
recursive-include django_text_translator/templates *
|
||
</code></pre></div><p>recursive-include表示循环包含后面的文件夹和子文件夹</p>
|
||
<h1 id="打包">打包</h1>
|
||
<p>使用python自带的打包工具<a href="https://pypi.org/project/setuptools/">setuptools</a>,如果没有,可使用pip安装它</p>
|
||
<p>然后在my-project文件夹下运行:<code>python -m build</code>或<code>python setup.py sdist</code></p>
|
||
<p>以上命令均会在dist文件夹下生成一个tar.gz源代码文件包</p>
|
||
<h1 id="上传">上传</h1>
|
||
<p>可以先上传到test pypi进行测试。</p>
|
||
<p>首先需要在 <a href="https://test.pypi.org/manage/account/#api-tokens">https://test.pypi.org/manage/account/#api-tokens</a> 创建一个token,将 “范围 “设置为 “整个账户”,并保存复制token,该token只显示一次。</p>
|
||
<p>运行命令<code>python3 -m twine upload --repository testpypi dist/*</code>,输入token上传就行了。</p>
|
||
<p>如果需要上传到正式环境,则运行<code>python3 -m twine upload dist/*</code>,并使用正式环境的token即可</p>
|
||
<h1 id="测试安装包">测试安装包</h1>
|
||
<p><code>python3 -m pip install --index-url [https://test.pypi.org/simple/](https://test.pypi.org/simple/) --no-deps my-package</code></p>
|
||
<p>也可以直接通过git安装</p>
|
||
<p><code>pip install git+https://github.com/versun/django-text-translator</code></p>
|
||
<h1 id="完成">完成</h1>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/01/18/hueydjango.html">Huey在Django下的使用</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/01/18/hueydjango.html" class="u-url"><time class="dt-published" datetime="2024-01-18 22:40:00 +0800">Jan 18, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>参考:
|
||
<a href="https://huey.readthedocs.io/en/latest/index.html">Huey</a>
|
||
<a href="https://huey.readthedocs.io/en/latest/django.html#setting-things-up">官方文档Django</a></p>
|
||
<p>对于小型的应用,轻量化的Huey非常适合做为Celery的替代品</p>
|
||
<h2 id="安装huey">安装huey</h2>
|
||
<p>参考:https://huey.readthedocs.io/en/latest/installation.html</p>
|
||
<p><code>pip install huey</code>
|
||
由于我直接使用sqlite,所以就不安装redis了</p>
|
||
<h2 id="django配置">Django配置</h2>
|
||
<p>参考:https://huey.readthedocs.io/en/latest/django.html#setting-things-up</p>
|
||
<h3 id="第一步是添加模块">第一步是添加模块</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e"># settings.py</span>
|
||
<span style="color:#75715e"># ...</span>
|
||
INSTALLED_APPS <span style="color:#f92672">=</span> (
|
||
<span style="color:#75715e"># ...</span>
|
||
<span style="color:#e6db74">'huey.contrib.djhuey'</span>, <span style="color:#75715e"># Add this to the list.</span>
|
||
<span style="color:#75715e"># ...</span>
|
||
)
|
||
</code></pre></div><h3 id="第二步添加配置">第二步添加配置</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e"># settings.py</span>
|
||
|
||
HUEY <span style="color:#f92672">=</span> {
|
||
<span style="color:#e6db74">'huey_class'</span>: <span style="color:#e6db74">'huey.SqliteHuey'</span>,
|
||
<span style="color:#e6db74">'filename'</span>: DATA_FOLDER <span style="color:#f92672">/</span> <span style="color:#e6db74">"huey.sqlite3"</span>,
|
||
<span style="color:#e6db74">'consumer'</span>: {
|
||
<span style="color:#e6db74">'workers'</span>: <span style="color:#ae81ff">1</span>,
|
||
<span style="color:#e6db74">'worker_type'</span>: <span style="color:#e6db74">'thread'</span>,
|
||
},
|
||
<span style="color:#e6db74">"immediate"</span>: <span style="color:#66d9ef">False</span>,
|
||
}
|
||
</code></pre></div><p>filename可自行设置其它路径</p>
|
||
<h3 id="第三步添加任务">第三步添加任务</h3>
|
||
<p>在需要添加任务的app里创建tasks.py</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e"># my_app/my_app/tasks.py</span>
|
||
<span style="color:#f92672">from</span> huey <span style="color:#f92672">import</span> crontab
|
||
<span style="color:#f92672">from</span> huey.contrib.djhuey <span style="color:#f92672">import</span> periodic_task, task
|
||
|
||
<span style="color:#a6e22e">@task</span>()
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">count_beans</span>(number):
|
||
print(<span style="color:#e6db74">'-- counted </span><span style="color:#e6db74">%s</span><span style="color:#e6db74"> beans --'</span> <span style="color:#f92672">%</span> number)
|
||
<span style="color:#66d9ef">return</span> <span style="color:#e6db74">'Counted </span><span style="color:#e6db74">%s</span><span style="color:#e6db74"> beans'</span> <span style="color:#f92672">%</span> number
|
||
|
||
<span style="color:#a6e22e">@periodic_task</span>(crontab(minute<span style="color:#f92672">=</span><span style="color:#e6db74">'*/5'</span>))
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">every_five_mins</span>():
|
||
print(<span style="color:#e6db74">'Every five minutes this will be printed by the consumer'</span>)
|
||
</code></pre></div><h3 id="第四步运行">第四步运行</h3>
|
||
<p><code>python ./manage.py run_huey</code></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/01/15/223800.html">笔记_怎么写日记</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/01/15/223800.html" class="u-url"><time class="dt-published" datetime="2024-01-15 22:38:00 +0800">Jan 15, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Youtube:<a href="https://www.youtube.com/watch?v=E8vwGLMTx5I">https://www.youtube.com/watch?v=E8vwGLMTx5I</a></p>
|
||
<h3 id="level-1-开始写">Level 1 开始写</h3>
|
||
<p><strong>方法一:Homework for Life —《Soryworthy by Matthew Dicks》</strong>
|
||
每天结束后,问自己“今天发生在我身上的,最有故事价值的事情是什么”,然后以这件事为素材,讲一个5分钟的故事。
|
||
这种方法可以锻炼自己写故事的能力
|
||
<strong>方法二:模版</strong>
|
||
今天学到了什么?
|
||
今天见了什么人?
|
||
今天有什么惊喜?
|
||
<strong>方法三:晨间笔记 —《The Artist’s Way by Julia Cameron》</strong>
|
||
每天早上写,想到写什么,清空大脑,写15-20分钟</p>
|
||
<h3 id="level-2-写感受">Level 2 写感受</h3>
|
||
<p>方法一:感恩日记
|
||
写下感激的三件事情
|
||
找到你想感谢的人,然后举出3个这个人的优点,然后写下展现这些优点的事情,最后和TA分享这份感激</p>
|
||
<h3 id="level-3-做什么怎么做">Level 3 做什么/怎么做</h3>
|
||
<p>日记不仅仅是了解你的想法和感受,还可以帮助你弄清楚你该做什么
|
||
<strong>方法一:Odyssey Plan — 《Designing Your Life by Bill Burnett & Dave Evans》</strong>
|
||
如果我继续照这这条路走下去,5年后我的生活会是什么样的
|
||
如果我走一条完全不同的路,5年后我的生活会是什么样的
|
||
如果我走一条完全不同的路,同时我不用担心钱,也不用在乎别人的眼光,5年后我的生活会是什么样的
|
||
<strong>方法二:The Wheel of Life</strong>
|
||
把你的生活分成多个不同的组成部分,然后定期给它们打分/评价/幸福度/满意度
|
||
参考:职业/商业、财务、健康、家庭/朋友、浪漫、个人成长、娱乐和休闲、物质环境
|
||
<strong>方法三:12月庆典(The 12 Month Celebration)</strong>
|
||
从现在起12个月后,在生活的不同方面,我想和朋友庆祝什么?(加薪?创业?坚持健身?)
|
||
<strong>方法四:恐惧设定练习(Fear Setting Exercise)— Tim Ferriss</strong>
|
||
一般用户面临选择/害怕选择事
|
||
如果我去做了我害怕的事,最糟糕的后果是什么?
|
||
我能做些什么来防止那些坏事发生?
|
||
如果最坏的情况发生了,我能做什么来修复它?
|
||
如果我试过了甚至取得了小小的成功,那我会得到什么好处?
|
||
如果我害怕的事一件不做,半年、一年、三年后我的生活会怎么样
|
||
<strong>方法五:和未来的自己对话</strong>
|
||
一人饰两角,假装和85岁的自己对话</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2024/01/12/222300.html">我的2023</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2024/01/12/222300.html" class="u-url"><time class="dt-published" datetime="2024-01-12 22:23:00 +0800">Jan 12, 2024</time></a>
|
||
|
||
<div class="e-content">
|
||
<h2 id="做了什么">做了什么:</h2>
|
||
<p><a href="https://54321.versun.me">54321周刊</a>
|
||
<a href="https://rsstranslator.com">RSS翻译器</a>
|
||
<a href="https://twitter.com/VersunPan">开通Twitter</a></p>
|
||
<h2 id="变动">变动:</h2>
|
||
<p><a href="https://blog.versun.me">博客</a>从纯html -> Astro -> Obsidian Publish -> Listed.to
|
||
笔记软件从Obsidian -> Standard Notes</p>
|
||
<h2 id="大事件">大事件:</h2>
|
||
<p>第一次参与第三方项目<a href="https://immersivetranslate.com/">沉浸式翻译插件</a>
|
||
第一次和网友面基(<a href="https://www.owenyoung.com/">Owen</a>)
|
||
第一次赞助和被赞助
|
||
第一次长途自驾游
|
||
第一次摸到雪</p>
|
||
<h2 id="习惯打卡app-小日常">习惯打卡(App: 小日常):</h2>
|
||
<p>学习:329天
|
||
感觉良好:266天
|
||
运动:327天
|
||
吃点心:200天
|
||
读书:102天
|
||
冥想:66天
|
||
日记:48天
|
||
反思:39天
|
||
感觉非常棒:31天
|
||
无所事事:35天</p>
|
||
<h2 id="新购买的服务">新购买的服务</h2>
|
||
<p><a href="https://mullvad.net">Mullvad VPN</a>
|
||
<a href="https://standardnotes.com/">Standard Notes</a>
|
||
<a href="https://pikapods.com">Pikapods</a>
|
||
<a href="https://openai.com/">OpenAI API</a>
|
||
<a href="https://secure.backblaze.com/r/04iqc9">Backblaze Computer Backup</a>
|
||
<a href="https://migadu.com/">Migadu mail</a></p>
|
||
<h3 id="想学但还未学的">想学但还未学的:</h3>
|
||
<p>htmlx
|
||
加密货币/区块链
|
||
fediverse</p>
|
||
<h3 id="想培养的习惯">想培养的习惯:</h3>
|
||
<p>看书
|
||
写作</p>
|
||
<h3 id="总结">总结</h3>
|
||
<p>谈不上丰富,也谈不上虚度,还凑合</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/12/18/django.html">笔记_编写你的第一个Django应用</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/12/18/django.html" class="u-url"><time class="dt-published" datetime="2023-12-18 08:00:00 +0800">Dec 18, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>以下内容是本人学习 <a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial01/">Django 5.0官方介绍文档</a> 的笔记</p>
|
||
<h1 id="第一部分httpsdocsdjangoprojectcomzh-hans50introtutorial01"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial01/">第一部分</a></h1>
|
||
<h2 id="创建项目">创建项目</h2>
|
||
<p><code>django-admin startproject mysite</code></p>
|
||
<p>这些目录和文件的用处是:</p>
|
||
<ul>
|
||
<li>
|
||
<p>最外层的 <code>mysite/</code> 根目录只是你项目的容器, 根目录名称对 Django 没有影响,你可以将它重命名为任何你喜欢的名称。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>manage.py</code>: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/">django-admin 和 manage.py</a> 获取所有 <code>manage.py</code> 的细节。</p>
|
||
</li>
|
||
<li>
|
||
<p>里面一层的 <code>mysite/</code> 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 <code>mysite.urls</code>).</p>
|
||
</li>
|
||
<li>
|
||
<p><code>mysite/__init__.py</code>:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 <a href="https://docs.python.org/3/tutorial/modules.html#tut-packages" title="(在 Python v3.12)">更多关于包的知识</a>。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>mysite/settings.py</code>:Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/settings/">Django 配置</a> 了解细节。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>mysite/urls.py</code>:Django 项目的 URL 声明,就像你网站的“目录”。阅读 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/http/urls/">URL调度器</a> 文档来获取更多关于 URL 的内容。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>mysite/asgi.py</code>:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。阅读 <a href="https://docs.djangoproject.com/zh-hans/5.0/howto/deployment/asgi/">如何使用 ASGI 来部署</a> 了解更多细节。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>mysite/wsgi.py</code>:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 <a href="https://docs.djangoproject.com/zh-hans/5.0/howto/deployment/wsgi/">如何使用 WSGI 进行部署</a> 了解更多细节。</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="用于开发的简易服务器">用于开发的简易服务器</h2>
|
||
<p><code>python manage.py runserver</code>
|
||
or
|
||
<code>python manage.py runserver 80080</code>
|
||
or
|
||
<code>python manage.py runserver 0.0.0.0:8000</code></p>
|
||
<p>关于这个简易服务器的完整信息可以在 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/#django-admin-runserver">runserver</a> 文档中找到。</p>
|
||
<h2 id="创建投票应用">创建投票应用</h2>
|
||
<blockquote>
|
||
<p>项目 VS 应用</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>项目和应用有什么区别?应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者小型的投票程序。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。</p>
|
||
</blockquote>
|
||
<p><code>python manage.py startapp polls</code></p>
|
||
<h2 id="编写第一个视图">编写第一个视图</h2>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/view.py</span>
|
||
<span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> HttpResponse
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">index</span>(request):
|
||
<span style="color:#66d9ef">return</span> HttpResponse(<span style="color:#e6db74">"Hello, world. You're at the polls index."</span>)
|
||
</code></pre></div><p>URL映射</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/urls.py</span>
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> path
|
||
<span style="color:#f92672">from</span> . <span style="color:#f92672">import</span> views
|
||
|
||
urlpatterns <span style="color:#f92672">=</span> [
|
||
path(<span style="color:#e6db74">""</span>, views<span style="color:#f92672">.</span>index, name<span style="color:#f92672">=</span><span style="color:#e6db74">"index"</span>),
|
||
]
|
||
</code></pre></div><p>项目的URL映射</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># mysite/urls.py</span>
|
||
<span style="color:#f92672">from</span> django.contrib <span style="color:#f92672">import</span> admin
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> include, path
|
||
|
||
urlpatterns <span style="color:#f92672">=</span> [
|
||
path(<span style="color:#e6db74">"polls/"</span>, include(<span style="color:#e6db74">"polls.urls"</span>)),
|
||
path(<span style="color:#e6db74">"admin/"</span>, admin<span style="color:#f92672">.</span>site<span style="color:#f92672">.</span>urls),
|
||
]
|
||
</code></pre></div><p>函数 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/urls/#django.urls.path" title="django.urls.path">path()</a> 具有四个参数,两个必须参数:<code>route</code> 和 <code>view</code>,两个可选参数:<code>kwargs</code> 和 <code>name</code></p>
|
||
<h3 id="参数route">参数:<code>route</code></h3>
|
||
<p><code>route</code> 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 <code>urlpatterns</code> 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。</p>
|
||
<p>这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 <code>https://www.example.com/myapp/</code> 时,它会尝试匹配 <code>myapp/</code> 。处理请求 <code>https://www.example.com/myapp/?page=3</code> 时,也只会尝试匹配 <code>myapp/</code>。</p>
|
||
<h3 id="参数view">参数:<code>view</code></h3>
|
||
<p>当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpRequest" title="django.http.HttpRequest">HttpRequest</a> 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子。</p>
|
||
<h3 id="参数kwargs">参数:<code>kwargs</code></h3>
|
||
<p>任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。</p>
|
||
<h3 id="参数name">参数:<code>name</code></h3>
|
||
<p>为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。</p>
|
||
<h1 id="第二部分httpsdocsdjangoprojectcomzh-hans50introtutorial02"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial02/">第二部分</a></h1>
|
||
<h2 id="数据库配置">数据库配置</h2>
|
||
<p><code>mysite/settings.py</code>是项目配置文件,默认使用SQLite作为默认数据库,如果你想使用其他数据库,你需要安装合适的 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/install/#database-installation">database bindings</a> ,然后改变设置文件中 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-DATABASES">DATABASES</a> <code>'default'</code> 项目中的一些键值:</p>
|
||
<ul>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-DATABASE-ENGINE">ENGINE</a> – 可选值有 <code>'django.db.backends.sqlite3'</code>,<code>'django.db.backends.postgresql'</code>,<code>'django.db.backends.mysql'</code>,或 <code>'django.db.backends.oracle'</code>。其它 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/databases/#third-party-notes">可用后端</a>。</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-NAME">NAME</a> – 数据库的名称。如果你使用 SQLite,数据库将是你电脑上的一个文件,在这种情况下,<a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-NAME">NAME</a> 应该是此文件完整的绝对路径,包括文件名。默认值 <code>BASE_DIR / 'db.sqlite3'</code> 将把数据库文件储存在项目的根目录。</p>
|
||
</li>
|
||
</ul>
|
||
<p>如果你不使用 SQLite,则必须添加一些额外设置,比如 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-USER">USER</a> 、 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-PASSWORD">PASSWORD</a> 、 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-HOST">HOST</a> 等等。想了解更多数据库设置方面的内容,请看文档:<a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-DATABASES">DATABASES</a> 。</p>
|
||
<blockquote>
|
||
<p>除了SQLite外,其它数据库需在使用前手动创建数据库</p>
|
||
</blockquote>
|
||
<p>执行命令<code>python manage.py migrate</code></p>
|
||
<blockquote>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/#django-admin-migrate">migrate</a> 命令只会为在 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-INSTALLED_APPS">INSTALLED_APPS</a> 里声明了的应用进行数据库迁移。</p>
|
||
</blockquote>
|
||
<h3 id="创建模型">创建模型</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/models.py</span>
|
||
<span style="color:#f92672">from</span> django.db <span style="color:#f92672">import</span> models
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Question</span>(models<span style="color:#f92672">.</span>Model):
|
||
question_text <span style="color:#f92672">=</span> models<span style="color:#f92672">.</span>CharField(max_length<span style="color:#f92672">=</span><span style="color:#ae81ff">200</span>)
|
||
pub_date <span style="color:#f92672">=</span> models<span style="color:#f92672">.</span>DateTimeField(<span style="color:#e6db74">"date published"</span>)
|
||
<span style="color:#66d9ef">def</span> __str__(self):
|
||
<span style="color:#66d9ef">return</span> self<span style="color:#f92672">.</span>question_text
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">was_published_recently</span>(self):
|
||
<span style="color:#66d9ef">return</span> self<span style="color:#f92672">.</span>pub_date <span style="color:#f92672">>=</span> timezone<span style="color:#f92672">.</span>now() <span style="color:#f92672">-</span> datetime<span style="color:#f92672">.</span>timedelta(days<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>)
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Choice</span>(models<span style="color:#f92672">.</span>Model):
|
||
question <span style="color:#f92672">=</span> models<span style="color:#f92672">.</span>ForeignKey(Question, on_delete<span style="color:#f92672">=</span>models<span style="color:#f92672">.</span>CASCADE)
|
||
choice_text <span style="color:#f92672">=</span> models<span style="color:#f92672">.</span>CharField(max_length<span style="color:#f92672">=</span><span style="color:#ae81ff">200</span>)
|
||
votes <span style="color:#f92672">=</span> models<span style="color:#f92672">.</span>IntegerField(default<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>)
|
||
<span style="color:#66d9ef">def</span> __str__(self):
|
||
<span style="color:#66d9ef">return</span> self<span style="color:#f92672">.</span>choice_text<span style="color:#960050;background-color:#1e0010"></span>
|
||
</code></pre></div><p>注意在最后,我们使用 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/models/fields/#django.db.models.ForeignKey" title="django.db.models.ForeignKey">ForeignKey</a> 定义了一个关系。这将告诉 Django,每个 <code>Choice</code> 对象都关联到一个 <code>Question</code> 对象。Django 支持所有常用的数据库关系:多对一、多对多和一对一</p>
|
||
<h3 id="激活模型">激活模型</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e"># mysite/settings.py</span>
|
||
INSTALLED_APPS <span style="color:#f92672">=</span> [
|
||
<span style="color:#75715e"># ...</span>
|
||
<span style="color:#e6db74">"polls.apps.PollsConfig"</span>,
|
||
]
|
||
</code></pre></div><p>运行命令 <code>python manage.py makemigrations polls</code></p>
|
||
<p>通过运行 <code>makemigrations</code> 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 <em>迁移</em>。</p>
|
||
<p>查看具体的迁移SQL语句 <code>python manage.py sqlmigrate polls 0001</code></p>
|
||
<p>检查项目中的问题 <code>python manage.py check</code></p>
|
||
<p>再次运行migrate完成修改 <code>python manage.py migrate</code></p>
|
||
<blockquote>
|
||
<p>改变模型需要3个步骤</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>编辑 <code>models.py</code> 文件,改变模型。</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>运行 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/#django-admin-makemigrations">python manage.py makemigrations</a> 为模型的改变生成迁移文件。</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>运行 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/#django-admin-migrate">python manage.py migrate</a> 来应用数据库迁移。</p>
|
||
</blockquote>
|
||
<h3 id="数据库api">数据库API</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> polls.models <span style="color:#f92672">import</span> Choice, Question
|
||
<span style="color:#f92672">from</span> django.utils <span style="color:#f92672">import</span> timezone
|
||
current_year <span style="color:#f92672">=</span> timezone<span style="color:#f92672">.</span>now()<span style="color:#f92672">.</span>year
|
||
|
||
Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>all()
|
||
<span style="color:#75715e">#<QuerySet [<Question: What's up?>]></span>
|
||
|
||
q <span style="color:#f92672">=</span> Question(question_text<span style="color:#f92672">=</span><span style="color:#e6db74">"What's new?"</span>, pub_date<span style="color:#f92672">=</span>timezone<span style="color:#f92672">.</span>now())
|
||
<span style="color:#75715e"># <QuerySet [<Question: What's up?>]></span>
|
||
|
||
q<span style="color:#f92672">.</span>save()
|
||
q<span style="color:#f92672">.</span>id
|
||
<span style="color:#75715e"># 1</span>
|
||
|
||
q<span style="color:#f92672">.</span>question_text<span style="color:#960050;background-color:#1e0010"></span>
|
||
<span style="color:#75715e"># "What's new?"</span>
|
||
|
||
q<span style="color:#f92672">.</span>pub_date
|
||
<span style="color:#75715e"># datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)</span>
|
||
|
||
q<span style="color:#f92672">.</span>question_text <span style="color:#f92672">=</span> <span style="color:#e6db74">"What's up?"</span>
|
||
q<span style="color:#f92672">.</span>save()
|
||
|
||
Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>get(pk<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>) <span style="color:#75715e"># shortcut for primary-key exact lookups.</span>
|
||
<span style="color:#75715e"># <Question: What's up?></span>
|
||
|
||
q<span style="color:#f92672">.</span>was_published_recently()
|
||
<span style="color:#75715e"># True</span>
|
||
|
||
q<span style="color:#f92672">.</span>choice_set<span style="color:#f92672">.</span>all() <span style="color:#75715e"># 查找关联到q这个Question的所有choice集</span>
|
||
<span style="color:#75715e"># <QuerySet []></span>
|
||
|
||
q<span style="color:#f92672">.</span>choice_set<span style="color:#f92672">.</span>create(choice_text<span style="color:#f92672">=</span><span style="color:#e6db74">"Not much"</span>, votes<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>) <span style="color:#75715e"># 创建一个关联到q到choice类数据</span>
|
||
<span style="color:#75715e"># <Choice: Not much></span>
|
||
|
||
q<span style="color:#f92672">.</span>choice_set<span style="color:#f92672">.</span>count()
|
||
<span style="color:#75715e"># 1</span>
|
||
|
||
Choice<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>filter(question__pub_date__year<span style="color:#f92672">=</span>current_year)
|
||
<span style="color:#75715e"># <QuerySet [<Choice: Not much>]></span>
|
||
|
||
c <span style="color:#f92672">=</span> q<span style="color:#f92672">.</span>choice_set<span style="color:#f92672">.</span>filter(choice_text__startswith<span style="color:#f92672">=</span><span style="color:#e6db74">"Not much"</span>)
|
||
c<span style="color:#f92672">.</span>delete()
|
||
</code></pre></div><h2 id="django管理界面">Django管理界面</h2>
|
||
<blockquote>
|
||
<p>管理界面不是为了网站的访问者,而是为管理者准备的</p>
|
||
</blockquote>
|
||
<h3 id="创建管理员账户">创建管理员账户</h3>
|
||
<p><code>python manage.py createsuperuser</code></p>
|
||
<h3 id="访问管理后台">访问管理后台</h3>
|
||
<p><a href="http://127.0.0.1:8000/admin/">http://127.0.0.1:8000/admin/</a></p>
|
||
<p>如果你设置了 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-LANGUAGE_CODE">LANGUAGE_CODE</a>,登录界面将显示你设置的语言(如果 Django 有相应的翻译)</p>
|
||
<h3 id="向管理界面注册question模型类">向管理界面注册<code>Question</code>模型类</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"><span style="color:#75715e"># polls/admin.py</span>
|
||
<span style="color:#f92672">from</span> django.contrib <span style="color:#f92672">import</span> admin
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Question
|
||
|
||
admin<span style="color:#f92672">.</span>site<span style="color:#f92672">.</span>register(Question)
|
||
</code></pre></div><h2 id="创建模板">创建模板</h2>
|
||
<p>ref: <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/templates/">模板指南</a></p>
|
||
<p>默认的设置文件设置了 DjangoTemplates 后端,并将 APP_DIRS 设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 “templates” 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。</p>
|
||
<blockquote>
|
||
<p>虽然我们现在可以将模板文件直接放在 <code>polls/templates</code> 文件夹中(而不是再建立一个 <code>polls</code> 子文件夹),但是这样做不太好。Django 将会选择第一个匹配的模板文件,如果你有一个模板文件正好和另一个应用中的某个模板文件重名,Django 没有办法 <em>区分</em> 它们。我们需要帮助 Django 选择正确的模板,最好的方法就是把他们放入各自的 <em>命名空间</em> 中,也就是把这些模板放入一个和 <em>自身</em> 应用重名的子文件夹里。</p>
|
||
</blockquote>
|
||
<p>创建文件: <strong><code>polls/templates/polls/index.html</code></strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">{% if latest_question_list %}
|
||
<<span style="color:#f92672">ul</span>>
|
||
{% for question in latest_question_list %}
|
||
<span style="color:#75715e"><!--<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>--></span>
|
||
<<span style="color:#f92672">li</span>><<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% url 'detail' question.id %}"</span>>{{ question.question_text }}</<span style="color:#f92672">a</span>></<span style="color:#f92672">li</span>>
|
||
{% endfor %}
|
||
</<span style="color:#f92672">ul</span>>
|
||
{% else %}
|
||
<<span style="color:#f92672">p</span>>No polls are available.</<span style="color:#f92672">p</span>>
|
||
{% endif %}
|
||
</code></pre></div><blockquote>
|
||
<p>为了让教程看起来不那么长,所有的模板文件都只写出了核心代码。在你自己创建的项目中,你应该使用 <a href="https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started#anatomy_of_an_html_document">完整的 HTML 文档</a> 。</p>
|
||
</blockquote>
|
||
<h1 id="第三部分httpsdocsdjangoprojectcomzh-hans50introtutorial03"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial03/">第三部分</a></h1>
|
||
<h2 id="视图">视图</h2>
|
||
<p>每一个视图表现为一个 Python 函数</p>
|
||
<p>Django 将会根据用户请求的 URL 来选择使用哪个视图(更准确的说,是根据 URL 中域名之后的部分)。</p>
|
||
<p>URL 一般形式:<code>/newsarchive/<year>/<month>/</code>。</p>
|
||
<p>Django 使用 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/http/urls/">URLconfs</a> 将 URL 模式映射到视图。</p>
|
||
<p>Django 只要求视图返回的是一个 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponse" title="django.http.HttpResponse">HttpResponse</a> ,或者抛出一个异常。</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/view.py</span>
|
||
<span style="color:#f92672">from</span> django.shortcuts <span style="color:#f92672">import</span> render
|
||
<span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> HttpResponse
|
||
<span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> Http404
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Question
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">index</span>(request):
|
||
latest_question_list <span style="color:#f92672">=</span> Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>order_by(<span style="color:#e6db74">"-pub_date"</span>)[:<span style="color:#ae81ff">5</span>]
|
||
template <span style="color:#f92672">=</span> loader<span style="color:#f92672">.</span>get_template(<span style="color:#e6db74">"polls/index.html"</span>)
|
||
context <span style="color:#f92672">=</span> { <span style="color:#75715e"># 传递一个上下文(context)。这个上下文是一个字典,它将模板内的变量映射为 Python 对象</span>
|
||
<span style="color:#e6db74">"latest_question_list"</span>: latest_question_list,
|
||
}
|
||
<span style="color:#75715e">#return HttpResponse(template.render(context, request)) #等效于render</span>
|
||
<span style="color:#66d9ef">return</span> render(request, <span style="color:#e6db74">"polls/index.html"</span>, context) <span style="color:#75715e"># return an HttpResponse object</span>
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">detail</span>(request, question_id):
|
||
<span style="color:#66d9ef">return</span> HttpResponse(<span style="color:#e6db74">"You're looking at question </span><span style="color:#e6db74">%s</span><span style="color:#e6db74">."</span> <span style="color:#f92672">%</span> question_id)
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">results</span>(request, question_id):
|
||
response <span style="color:#f92672">=</span> <span style="color:#e6db74">"You're looking at the results of question </span><span style="color:#e6db74">%s</span><span style="color:#e6db74">."</span>
|
||
<span style="color:#66d9ef">return</span> HttpResponse(response <span style="color:#f92672">%</span> question_id)
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">vote</span>(request, question_id):
|
||
<span style="color:#66d9ef">return</span> HttpResponse(<span style="color:#e6db74">"You're voting on question </span><span style="color:#e6db74">%s</span><span style="color:#e6db74">."</span> <span style="color:#f92672">%</span> question_id)
|
||
</code></pre></div><p>把这些新视图添加进 <code>polls.urls</code> 模块里</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/urls.py</span>
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> path
|
||
<span style="color:#f92672">from</span> . <span style="color:#f92672">import</span> views
|
||
|
||
urlpatterns <span style="color:#f92672">=</span> [
|
||
<span style="color:#75715e"># ex: /polls/</span>
|
||
path(<span style="color:#e6db74">""</span>, views<span style="color:#f92672">.</span>index, name<span style="color:#f92672">=</span><span style="color:#e6db74">"index"</span>),
|
||
<span style="color:#75715e"># ex: /polls/5/</span>
|
||
path(<span style="color:#e6db74">"<int:question_id>/"</span>, views<span style="color:#f92672">.</span>detail, name<span style="color:#f92672">=</span><span style="color:#e6db74">"detail"</span>),
|
||
<span style="color:#75715e"># ex: /polls/5/results/</span>
|
||
path(<span style="color:#e6db74">"<int:question_id>/results/"</span>, views<span style="color:#f92672">.</span>results, name<span style="color:#f92672">=</span><span style="color:#e6db74">"results"</span>),
|
||
<span style="color:#75715e"># ex: /polls/5/vote/</span>
|
||
path(<span style="color:#e6db74">"<int:question_id>/vote/"</span>, views<span style="color:#f92672">.</span>vote, name<span style="color:#f92672">=</span><span style="color:#e6db74">"vote"</span>),
|
||
]
|
||
</code></pre></div><h3 id="抛出404错误">抛出404错误</h3>
|
||
<p>更新<code>polls/views.py</code></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> Http404
|
||
<span style="color:#75715e">#...</span>
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">detail</span>(request, question_id):
|
||
<span style="color:#66d9ef">try</span>:
|
||
question <span style="color:#f92672">=</span> Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>get(pk<span style="color:#f92672">=</span>question_id)
|
||
<span style="color:#66d9ef">except</span> Question<span style="color:#f92672">.</span>DoesNotExist:
|
||
<span style="color:#66d9ef">raise</span> Http404(<span style="color:#e6db74">"Question does not exist"</span>)
|
||
<span style="color:#66d9ef">return</span> render(request, <span style="color:#e6db74">"polls/detail.html"</span>, {<span style="color:#e6db74">"question"</span>: question})
|
||
<span style="color:#75715e">#...</span>
|
||
</code></pre></div><p><strong>使用快捷函数</strong><code>get()</code></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/views.py</span>
|
||
<span style="color:#f92672">from</span> django.shortcuts <span style="color:#f92672">import</span> get_object_or_404, render
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Question
|
||
|
||
<span style="color:#75715e"># ...</span>
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">detail</span>(request, question_id):
|
||
question <span style="color:#f92672">=</span> get_object_or_404(Question, pk<span style="color:#f92672">=</span>question_id)
|
||
<span style="color:#66d9ef">return</span> render(request, <span style="color:#e6db74">"polls/detail.html"</span>, {<span style="color:#e6db74">"question"</span>: question})
|
||
</code></pre></div><p>也有 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/http/shortcuts/#django.shortcuts.get_list_or_404" title="django.shortcuts.get_list_or_404">get_list_or_404()</a>函数, 如果列表为空的话会抛出 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/http/views/#django.http.Http404" title="django.http.Http404">Http404</a> 异常。</p>
|
||
<p><strong>添加detail.html</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><<span style="color:#f92672">h1</span>>{{ question.question_text }}</<span style="color:#f92672">h1</span>>
|
||
<<span style="color:#f92672">ul</span>>
|
||
{% for choice in question.choice_set.all %}
|
||
<<span style="color:#f92672">li</span>>{{ choice.choice_text }}</<span style="color:#f92672">li</span>>
|
||
{% endfor %}
|
||
</<span style="color:#f92672">ul</span>>
|
||
</code></pre></div><p>在示例 <code>{{ question.question_text }}</code> 中,首先 Django 尝试对 <code>question</code> 对象使用字典查找(也就是使用 obj.get(str) 操作),如果失败了就尝试属性查找(也就是 obj.str 操作),结果是成功了。如果这一操作也失败的话,将会尝试列表查找(也就是 obj[int] 操作)</p>
|
||
<h2 id="为url名称添加命名空间">为URL名称添加命名空间</h2>
|
||
<p>举个例子,<code>polls</code> 应用有 <code>detail</code> 视图,可能另一个博客应用也有同名的视图。Django 如何知道 <code>{% url %}</code> 标签到底对应哪一个应用的 URL 呢?</p>
|
||
<p>答案是:在根 URLconf 中添加命名空间。在 <code>polls/urls.py</code> 文件中稍作修改,加上 <code>app_name</code> 设置命名空间:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/urls.py</span>
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> path
|
||
<span style="color:#f92672">from</span> . <span style="color:#f92672">import</span> views
|
||
|
||
app_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"polls"</span>
|
||
|
||
urlpatterns <span style="color:#f92672">=</span> [
|
||
path(<span style="color:#e6db74">""</span>, views<span style="color:#f92672">.</span>index, name<span style="color:#f92672">=</span><span style="color:#e6db74">"index"</span>),
|
||
path(<span style="color:#e6db74">"<int:question_id>/"</span>, views<span style="color:#f92672">.</span>detail, name<span style="color:#f92672">=</span><span style="color:#e6db74">"detail"</span>),
|
||
path(<span style="color:#e6db74">"<int:question_id>/results/"</span>, views<span style="color:#f92672">.</span>results, name<span style="color:#f92672">=</span><span style="color:#e6db74">"results"</span>),
|
||
path(<span style="color:#e6db74">"<int:question_id>/vote/"</span>, views<span style="color:#f92672">.</span>vote, name<span style="color:#f92672">=</span><span style="color:#e6db74">"vote"</span>),
|
||
]
|
||
</code></pre></div><p>现在,编辑 <code>polls/templates/polls/index.html</code> 文件,从:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><<span style="color:#f92672">li</span>><<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% url 'detail' question.id %}"</span>>{{ question.question_text }}</<span style="color:#f92672">a</span>></<span style="color:#f92672">li</span>>
|
||
</code></pre></div><p>修改为指向具有命名空间的详细视图:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><<span style="color:#f92672">li</span>><<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% url 'polls:detail' question.id %}"</span>>{{ question.question_text }}</<span style="color:#f92672">a</span>></<span style="color:#f92672">li</span>>
|
||
</code></pre></div><h1 id="第四部分httpsdocsdjangoprojectcomzh-hans50introtutorial04"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial04/">第四部分</a></h1>
|
||
<h2 id="表单">表单</h2>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"> <span style="color:#75715e"><!-- polls/templates/polls/detail.html --></span>
|
||
|
||
<<span style="color:#f92672">form</span> <span style="color:#a6e22e">action</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% url 'polls:vote' question.id %}"</span> <span style="color:#a6e22e">method</span><span style="color:#f92672">=</span><span style="color:#e6db74">"post"</span>>
|
||
{% csrf_token %}
|
||
<<span style="color:#f92672">fieldset</span>>
|
||
<<span style="color:#f92672">legend</span>><<span style="color:#f92672">h1</span>>{{ question.question_text }}</<span style="color:#f92672">h1</span>></<span style="color:#f92672">legend</span>>
|
||
{% if error_message %}
|
||
<<span style="color:#f92672">p</span>><<span style="color:#f92672">strong</span>>{{ error_message }}</<span style="color:#f92672">strong</span>></<span style="color:#f92672">p</span>>
|
||
{% endif %}
|
||
|
||
{% for choice in question.choice_set.all %}
|
||
<<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">"radio"</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">"choice"</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">"choice{{ forloop.counter }}"</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{{ choice.id }}"</span>>
|
||
<<span style="color:#f92672">label</span> <span style="color:#a6e22e">for</span><span style="color:#f92672">=</span><span style="color:#e6db74">"choice{{ forloop.counter }}"</span>>{{ choice.choice_text }}</<span style="color:#f92672">label</span>><<span style="color:#f92672">br</span>>
|
||
{% endfor %}
|
||
</<span style="color:#f92672">fieldset</span>>
|
||
<<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">"submit"</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">"Vote"</span>>
|
||
</<span style="color:#f92672">form</span>>
|
||
</code></pre></div><p>简要说明:</p>
|
||
<ul>
|
||
<li>
|
||
<p>上面的模板在 Question 的每个 Choice 前添加一个单选按钮。 每个单选按钮的 <code>value</code> 属性是对应的各个 Choice 的 ID。每个单选按钮的 <code>name</code> 是 <code>"choice"</code> 。这意味着,当有人选择一个单选按钮并提交表单提交时,它将发送一个 POST 数据 <code>choice=#</code> ,其中# 为选择的 Choice 的 ID。这是 HTML 表单的基本概念。</p>
|
||
</li>
|
||
<li>
|
||
<p>我们将表单的 <code>action</code> 设置为 <code>{% url 'polls:vote' question.id %}</code>,并设置 <code>method="post"</code>。使用 <code>method="post"</code> (而不是 <code>method="get"</code> )是非常重要的,因为提交这个表单的行为将改变服务器端的数据。当你创建一个改变服务器端数据的表单时,使用 <code>method="post"</code>。这不是 Django 的特定技巧;这是优秀的网站开发技巧。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>forloop.counter</code> 指示 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/templates/builtins/#std-templatetag-for">for</a> 标签已经循环多少次。</p>
|
||
</li>
|
||
<li>
|
||
<p>由于我们创建一个 POST 表单(它具有修改数据的作用),所以我们需要小心跨站点请求伪造。 谢天谢地,你不必太过担心,因为 Django 自带了一个非常有用的防御系统。 简而言之,所有针对内部 URL 的 POST 表单都应该使用 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/templates/builtins/#std-templatetag-csrf_token">{% csrf_token %}</a> 模板标签。</p>
|
||
</li>
|
||
</ul>
|
||
<p>更新<code>polls/views.py</code></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> HttpResponse, HttpResponseRedirect
|
||
<span style="color:#f92672">from</span> django.shortcuts <span style="color:#f92672">import</span> get_object_or_404, render
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> reverse
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Choice, Question
|
||
<span style="color:#75715e"># ...</span>
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">results</span>(request, question_id):
|
||
question <span style="color:#f92672">=</span> get_object_or_404(Question, pk<span style="color:#f92672">=</span>question_id)
|
||
<span style="color:#66d9ef">return</span> render(request, <span style="color:#e6db74">"polls/results.html"</span>, {<span style="color:#e6db74">"question"</span>: question})
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">vote</span>(request, question_id):
|
||
question <span style="color:#f92672">=</span> get_object_or_404(Question, pk<span style="color:#f92672">=</span>question_id)
|
||
<span style="color:#66d9ef">try</span>:
|
||
selected_choice <span style="color:#f92672">=</span> question<span style="color:#f92672">.</span>choice_set<span style="color:#f92672">.</span>get(pk<span style="color:#f92672">=</span>request<span style="color:#f92672">.</span>POST[<span style="color:#e6db74">"choice"</span>])
|
||
<span style="color:#66d9ef">except</span> (<span style="color:#a6e22e">KeyError</span>, Choice<span style="color:#f92672">.</span>DoesNotExist):
|
||
<span style="color:#75715e"># Redisplay the question voting form.</span>
|
||
<span style="color:#66d9ef">return</span> render(
|
||
request,
|
||
<span style="color:#e6db74">"polls/detail.html"</span>,
|
||
{
|
||
<span style="color:#e6db74">"question"</span>: question,
|
||
<span style="color:#e6db74">"error_message"</span>: <span style="color:#e6db74">"You didn't select a choice."</span>,
|
||
},
|
||
)
|
||
<span style="color:#66d9ef">else</span>:
|
||
selected_choice<span style="color:#f92672">.</span>votes <span style="color:#f92672">+=</span> <span style="color:#ae81ff">1</span>
|
||
selected_choice<span style="color:#f92672">.</span>save()
|
||
<span style="color:#75715e"># Always return an HttpResponseRedirect after successfully dealing</span>
|
||
<span style="color:#75715e"># with POST data. This prevents data from being posted twice if a</span>
|
||
<span style="color:#75715e"># user hits the Back button.</span>
|
||
<span style="color:#66d9ef">return</span> HttpResponseRedirect(reverse(<span style="color:#e6db74">"polls:results"</span>, args<span style="color:#f92672">=</span>(question<span style="color:#f92672">.</span>id,)))
|
||
<span style="color:#75715e">#..</span>
|
||
</code></pre></div><ul>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpRequest.POST" title="django.http.HttpRequest.POST">request.POST</a> 是一个类字典对象,让你可以通过关键字的名字获取提交的数据。 这个例子中, <code>request.POST['choice']</code> 以字符串形式返回选择的 Choice 的 ID。 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpRequest.POST" title="django.http.HttpRequest.POST">request.POST</a> 的值永远是字符串。注意,Django 还以同样的方式提供 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpRequest.GET" title="django.http.HttpRequest.GET">request.GET</a> 用于访问 GET 数据 —— 但我们在代码中显式地使用 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpRequest.POST" title="django.http.HttpRequest.POST">request.POST</a> ,以保证数据只能通过 POST 调用改动。</p>
|
||
</li>
|
||
<li>
|
||
<p>如果在 <code>request.POST['choice']</code> 数据中没有提供 <code>choice</code> , POST 将引发一个 <a href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(在 Python v3.12)">KeyError</a> 。上面的代码检查 <a href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(在 Python v3.12)">KeyError</a> ,如果没有给出 <code>choice</code> 将重新显示 Question 表单和一个错误信息。</p>
|
||
</li>
|
||
<li>
|
||
<p>在增加 Choice 的得票数之后,代码返回一个 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponseRedirect" title="django.http.HttpResponseRedirect">HttpResponseRedirect</a> 而不是常用的 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponse" title="django.http.HttpResponse">HttpResponse</a> 、 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponseRedirect" title="django.http.HttpResponseRedirect">HttpResponseRedirect</a> 只接收一个参数:用户将要被重定向的 URL(请继续看下去,我们将会解释如何构造这个例子中的 URL)。正如上面的 Python 注释指出的,在成功处理 POST 数据后,你应该总是返回一个 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponseRedirect" title="django.http.HttpResponseRedirect">HttpResponseRedirect</a>。这不是 Django 的特殊要求,这是那些优秀网站在开发实践中形成的共识。</p>
|
||
</li>
|
||
<li>
|
||
<p>在这个例子中,我们在 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/request-response/#django.http.HttpResponseRedirect" title="django.http.HttpResponseRedirect">HttpResponseRedirect</a> 的构造函数中使用 <code>reverse()</code> 函数。这个函数避免了我们在视图函数中硬编码 URL。它需要我们给出我们想要跳转的视图的名字和该视图所对应的 URL 模式中需要给该视图提供的参数。 在本例中,使用在 <a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial03/">教程第 3 部分</a> 中设定的 URLconf, <code>reverse()</code> 调用将返回一个这样的字符串:<code>"/polls/3/results/"</code></p>
|
||
</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>我们的 <code>vote()</code> 视图代码有一个小问题。代码首先从数据库中获取了 <code>selected_choice</code> 对象,接着计算 <code>vote</code> 的新值,最后把值存回数据库。如果网站有两个方可同时投票在 <em>同一时间</em> ,可能会导致问题。同样的值,42,会被 <code>votes</code> 返回。然后,对于两个用户,新值43计算完毕,并被保存,但是期望值是44。</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>这个问题被称为 <em>竞争条件</em> 。如果你对此有兴趣,你可以阅读 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/models/expressions/#avoiding-race-conditions-using-f">使用 F() 避免竞争条件</a> 来学习如何解决这个问题。</p>
|
||
</blockquote>
|
||
<h2 id="使用通用视图">使用通用视图</h2>
|
||
<p>通用视图对常见模式进行了抽象,使您甚至不需要编写 Python 代码就能编写应用程序。例如, <code>ListView</code> 和 <code>DetailView</code> 通用视图分别抽象了 “显示对象列表 “和 “显示特定类型对象的详细页面 “的概念</p>
|
||
<p>更多关于通用视图的详细信息,请查看 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/class-based-views/">通用视图的文档</a></p>
|
||
<p><strong>修改</strong><code>polls/urls.py</code></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> path
|
||
<span style="color:#f92672">from</span> . <span style="color:#f92672">import</span> views
|
||
|
||
app_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"polls"</span>
|
||
urlpatterns <span style="color:#f92672">=</span> [
|
||
path(<span style="color:#e6db74">""</span>, views<span style="color:#f92672">.</span>IndexView<span style="color:#f92672">.</span>as_view(), name<span style="color:#f92672">=</span><span style="color:#e6db74">"index"</span>),
|
||
path(<span style="color:#e6db74">"<int:pk>/"</span>, views<span style="color:#f92672">.</span>DetailView<span style="color:#f92672">.</span>as_view(), name<span style="color:#f92672">=</span><span style="color:#e6db74">"detail"</span>),
|
||
path(<span style="color:#e6db74">"<int:pk>/results/"</span>, views<span style="color:#f92672">.</span>ResultsView<span style="color:#f92672">.</span>as_view(), name<span style="color:#f92672">=</span><span style="color:#e6db74">"results"</span>),
|
||
path(<span style="color:#e6db74">"<int:question_id>/vote/"</span>, views<span style="color:#f92672">.</span>vote, name<span style="color:#f92672">=</span><span style="color:#e6db74">"vote"</span>),
|
||
]
|
||
</code></pre></div><p>请注意,第二和第三个模式的路径字符串中匹配模式的名称已从 <code><question_id></code> 变为 <code><pk></code> 。这是必要的,因为我们将使用 <code>DetailView</code> 通用视图来替换 <code>detail()</code> 和 <code>results()</code> 视图,它希望从 URL 获取的主键值称为 <code>"pk"</code></p>
|
||
<p><strong>修改</strong><code>polls/views.py</code>删除旧的 <code>index</code>, <code>detail</code>, 和 <code>results</code> 视图,并用 Django 的通用视图代替</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#f92672">from</span> django.http <span style="color:#f92672">import</span> HttpResponseRedirect
|
||
<span style="color:#f92672">from</span> django.shortcuts <span style="color:#f92672">import</span> get_object_or_404, render
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> reverse
|
||
<span style="color:#f92672">from</span> django.views <span style="color:#f92672">import</span> generic
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Choice, Question
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">IndexView</span>(generic<span style="color:#f92672">.</span>ListView):
|
||
template_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"polls/index.html"</span>
|
||
<span style="color:#75715e"># 如果不指定template_name,则默认将会使用polls/question_list.html</span>
|
||
context_object_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"latest_question_list"</span>
|
||
<span style="color:#75715e"># 如果不指定context_object_name, 则默认将会使用question_list</span>
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">get_queryset</span>(self):
|
||
<span style="color:#e6db74">"""Return the last five published questions."""</span>
|
||
<span style="color:#66d9ef">return</span> Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>order_by(<span style="color:#e6db74">"-pub_date"</span>)[:<span style="color:#ae81ff">5</span>]
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">DetailView</span>(generic<span style="color:#f92672">.</span>DetailView):
|
||
model <span style="color:#f92672">=</span> Question
|
||
template_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"polls/detail.html"</span>
|
||
<span style="color:#75715e"># 如果不指定template_name,则默认将会使用polls/question_detail.html</span>
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">get_queryset</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> Excludes any questions that aren't published yet.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
<span style="color:#66d9ef">return</span> Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>filter(pub_date__lte<span style="color:#f92672">=</span>timezone<span style="color:#f92672">.</span>now())
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ResultsView</span>(generic<span style="color:#f92672">.</span>DetailView):
|
||
model <span style="color:#f92672">=</span> Question
|
||
template_name <span style="color:#f92672">=</span> <span style="color:#e6db74">"polls/results.html"</span>
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">vote</span>(request, question_id):
|
||
<span style="color:#f92672">...</span> <span style="color:#75715e"># same as above, no changes needed.</span>
|
||
|
||
</code></pre></div><p>每个通用视图都需要知道它将对什么模型采取行动。这可以通过模型属性(在本例中,DetailView 和 ResultsView 的model = Question)或定义 get_queryset() 方法(如 IndexView 所示)来提供。</p>
|
||
<h1 id="第五部分httpsdocsdjangoprojectcomzh-hans50introtutorial05"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial05/">第五部分</a></h1>
|
||
<h2 id="测试">测试</h2>
|
||
<p>ref:<a href="https://docs.djangoproject.com/zh-hans/5.0/topics/testing/">Django中的测试</a></p>
|
||
<p>Django 应用的测试应该写在应用的 tests.py 文件里,测试系统会自动的在所有文件里寻找并执行以 test 开头的测试函数。</p>
|
||
<h3 id="模型测试">模型测试</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/tests.py</span>
|
||
<span style="color:#f92672">import</span> datetime
|
||
|
||
<span style="color:#f92672">from</span> django.test <span style="color:#f92672">import</span> TestCase
|
||
<span style="color:#f92672">from</span> django.utils <span style="color:#f92672">import</span> timezone
|
||
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Question
|
||
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionModelTests</span>(TestCase):
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test_was_published_recently_with_future_question</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> was_published_recently() returns False for questions whose pub_date is in the future.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
time <span style="color:#f92672">=</span> timezone<span style="color:#f92672">.</span>now() <span style="color:#f92672">+</span> datetime<span style="color:#f92672">.</span>timedelta(days<span style="color:#f92672">=</span><span style="color:#ae81ff">30</span>)
|
||
future_question <span style="color:#f92672">=</span> Question(pub_date<span style="color:#f92672">=</span>time)
|
||
self<span style="color:#f92672">.</span>assertIs(future_question<span style="color:#f92672">.</span>was_published_recently(), <span style="color:#66d9ef">False</span>)
|
||
</code></pre></div><h3 id="运行测试">运行测试</h3>
|
||
<p><code>python manage.py test polls</code></p>
|
||
<h3 id="视图测试">视图测试</h3>
|
||
<p>Django 提供了一个供测试使用的 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/testing/tools/#django.test.Client" title="django.test.Client">Client</a> 来模拟用户和视图层代码的交互。我们能在 <code>tests.py</code> 甚至是 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/django-admin/#django-admin-shell">shell</a> 中使用它。</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/tests.py</span>
|
||
|
||
<span style="color:#f92672">from</span> django.urls <span style="color:#f92672">import</span> reverse
|
||
<span style="color:#75715e">#...</span>
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">create_question</span>(question_text, days):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> Create a question with the given `question_text` and published the
|
||
</span><span style="color:#e6db74"> given number of `days` offset to now (negative for questions published
|
||
</span><span style="color:#e6db74"> in the past, positive for questions that have yet to be published).
|
||
</span><span style="color:#e6db74"> """</span>
|
||
time <span style="color:#f92672">=</span> timezone<span style="color:#f92672">.</span>now() <span style="color:#f92672">+</span> datetime<span style="color:#f92672">.</span>timedelta(days<span style="color:#f92672">=</span>days)
|
||
<span style="color:#66d9ef">return</span> Question<span style="color:#f92672">.</span>objects<span style="color:#f92672">.</span>create(question_text<span style="color:#f92672">=</span>question_text, pub_date<span style="color:#f92672">=</span>time)
|
||
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionIndexViewTests</span>(TestCase):
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test_no_questions</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> If no questions exist, an appropriate message is displayed.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
response <span style="color:#f92672">=</span> self<span style="color:#f92672">.</span>client<span style="color:#f92672">.</span>get(reverse(<span style="color:#e6db74">"polls:index"</span>))
|
||
self<span style="color:#f92672">.</span>assertEqual(response<span style="color:#f92672">.</span>status_code, <span style="color:#ae81ff">200</span>)
|
||
self<span style="color:#f92672">.</span>assertContains(response, <span style="color:#e6db74">"No polls are available."</span>)
|
||
self<span style="color:#f92672">.</span>assertQuerySetEqual(response<span style="color:#f92672">.</span>context[<span style="color:#e6db74">"latest_question_list"</span>], [])
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test_two_past_questions</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> The questions index page may display multiple questions.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
question1 <span style="color:#f92672">=</span> create_question(question_text<span style="color:#f92672">=</span><span style="color:#e6db74">"Past question 1."</span>, days<span style="color:#f92672">=-</span><span style="color:#ae81ff">30</span>)
|
||
question2 <span style="color:#f92672">=</span> create_question(question_text<span style="color:#f92672">=</span><span style="color:#e6db74">"Past question 2."</span>, days<span style="color:#f92672">=-</span><span style="color:#ae81ff">5</span>)
|
||
response <span style="color:#f92672">=</span> self<span style="color:#f92672">.</span>client<span style="color:#f92672">.</span>get(reverse(<span style="color:#e6db74">"polls:index"</span>))
|
||
self<span style="color:#f92672">.</span>assertQuerySetEqual(
|
||
response<span style="color:#f92672">.</span>context[<span style="color:#e6db74">"latest_question_list"</span>],
|
||
[question2, question1],
|
||
)
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionDetailViewTests</span>(TestCase):
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test_future_question</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> The detail view of a question with a pub_date in the future
|
||
</span><span style="color:#e6db74"> returns a 404 not found.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
future_question <span style="color:#f92672">=</span> create_question(question_text<span style="color:#f92672">=</span><span style="color:#e6db74">"Future question."</span>, days<span style="color:#f92672">=</span><span style="color:#ae81ff">5</span>)
|
||
url <span style="color:#f92672">=</span> reverse(<span style="color:#e6db74">"polls:detail"</span>, args<span style="color:#f92672">=</span>(future_question<span style="color:#f92672">.</span>id,))
|
||
response <span style="color:#f92672">=</span> self<span style="color:#f92672">.</span>client<span style="color:#f92672">.</span>get(url)
|
||
self<span style="color:#f92672">.</span>assertEqual(response<span style="color:#f92672">.</span>status_code, <span style="color:#ae81ff">404</span>)
|
||
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test_past_question</span>(self):
|
||
<span style="color:#e6db74">"""
|
||
</span><span style="color:#e6db74"> The detail view of a question with a pub_date in the past
|
||
</span><span style="color:#e6db74"> displays the question's text.
|
||
</span><span style="color:#e6db74"> """</span>
|
||
past_question <span style="color:#f92672">=</span> create_question(question_text<span style="color:#f92672">=</span><span style="color:#e6db74">"Past Question."</span>, days<span style="color:#f92672">=-</span><span style="color:#ae81ff">5</span>)
|
||
url <span style="color:#f92672">=</span> reverse(<span style="color:#e6db74">"polls:detail"</span>, args<span style="color:#f92672">=</span>(past_question<span style="color:#f92672">.</span>id,))
|
||
response <span style="color:#f92672">=</span> self<span style="color:#f92672">.</span>client<span style="color:#f92672">.</span>get(url)
|
||
self<span style="color:#f92672">.</span>assertContains(response, past_question<span style="color:#f92672">.</span>question_text)
|
||
</code></pre></div><h1 id="第六部分httpsdocsdjangoprojectcomzh-hans50introtutorial06"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial06/">第六部分</a></h1>
|
||
<h2 id="静态文件">静态文件</h2>
|
||
<p>Django 的 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-STATICFILES_FINDERS">STATICFILES_FINDERS</a> 设置包含了一系列的查找器,它们知道去哪里找到 static 文件。<code>AppDirectoriesFinder</code> 是默认查找器中的一个,它会在每个 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-INSTALLED_APPS">INSTALLED_APPS</a> 中指定的应用的子文件中寻找名称为 <code>static</code> 的特定文件夹</p>
|
||
<p>建议在每个应用目录下创建static/appname文件夹来存放该应该的静态文件。</p>
|
||
<p>比如:<strong><code>polls/static/polls/style.css</code></strong></p>
|
||
<p>你可以在 Django 中以 <code>polls/style.css</code> 的形式引用此文件,类似你引用模板路径的方式</p>
|
||
<p>虽然可以直接放到<code>polls/static</code>文件夹下,Django 只会使用第一个找到的静态文件。如果你在<em></em>其它应用中有一个相同名字的静态文件,Django 将无法区分它们。</p>
|
||
<p>我们需要指引 Django 选择正确的静态文件,而最好的方式就是把它们放入各自的 <em>命名空间</em> 。也就是把这些静态文件放入 <em>另一个</em> 与应用名相同的目录中,既**<code>polls/static/polls/</code>**</p>
|
||
<p><strong>导入静态文件</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html"><span style="color:#75715e"><!-- polls/templates/polls/index.html --></span>
|
||
{% load static %}
|
||
|
||
<<span style="color:#f92672">link</span> <span style="color:#a6e22e">rel</span><span style="color:#f92672">=</span><span style="color:#e6db74">"stylesheet"</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% static 'polls/style.css' %}"</span>>
|
||
</code></pre></div><p><code>{% static %}</code> 模板标签会生成静态文件的绝对路径。</p>
|
||
<p><strong>添加一个背景图</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-css" data-lang="css"><span style="color:#960050;background-color:#1e0010">#</span> <span style="color:#f92672">polls</span><span style="color:#f92672">/</span><span style="color:#f92672">static</span><span style="color:#f92672">/</span><span style="color:#f92672">polls</span><span style="color:#f92672">/</span><span style="color:#f92672">style</span>.<span style="color:#a6e22e">css</span>
|
||
<span style="color:#f92672">body</span> {
|
||
<span style="color:#66d9ef">background</span>: <span style="color:#66d9ef">white</span> url(<span style="color:#e6db74">"images/background.png"</span>) <span style="color:#66d9ef">no-repeat</span>;
|
||
}
|
||
</code></pre></div><p>需在**<code>polls/static/polls/images/</code>**文件夹下存放background.png,url使用相对路径。</p>
|
||
<p>更多关于设置和框架的资料,参考 <a href="https://docs.djangoproject.com/zh-hans/5.0/howto/static-files/">静态文件解惑</a> 和 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/staticfiles/">静态文件指南</a>。<a href="https://docs.djangoproject.com/zh-hans/5.0/howto/static-files/deployment/">部署静态文件</a> 介绍了如何在真实服务器上使用静态文件</p>
|
||
<h1 id="第七部分httpsdocsdjangoprojectcomzh-hans50introtutorial07"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial07/">第七部分</a></h1>
|
||
<h2 id="自定义后台表单">自定义后台表单</h2>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/admin.py</span>
|
||
<span style="color:#f92672">from</span> django.contrib <span style="color:#f92672">import</span> admin
|
||
<span style="color:#f92672">from</span> .models <span style="color:#f92672">import</span> Question
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionAdmin</span>(admin<span style="color:#f92672">.</span>ModelAdmin):
|
||
fields <span style="color:#f92672">=</span> [<span style="color:#e6db74">"pub_date"</span>, <span style="color:#e6db74">"question_text"</span>]
|
||
|
||
admin<span style="color:#f92672">.</span>site<span style="color:#f92672">.</span>register(Question, QuestionAdmin)
|
||
</code></pre></div><p><img src="https://versun.micro.blog/uploads/2024/d8efb76244.jpg" alt=""></p>
|
||
<p><strong>使用字段集</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionAdmin</span>(admin<span style="color:#f92672">.</span>ModelAdmin):
|
||
fieldsets <span style="color:#f92672">=</span> [
|
||
(<span style="color:#66d9ef">None</span>, {<span style="color:#e6db74">"fields"</span>: [<span style="color:#e6db74">"question_text"</span>]}),
|
||
(<span style="color:#e6db74">"Date information"</span>, {<span style="color:#e6db74">"fields"</span>: [<span style="color:#e6db74">"pub_date"</span>]}),
|
||
]
|
||
</code></pre></div><p><img src="https://versun.micro.blog/uploads/2024/f93ab9874f.jpg" alt=""></p>
|
||
<p><strong>关联对象</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ChoiceInline</span>(admin<span style="color:#f92672">.</span>StackedInline):
|
||
model <span style="color:#f92672">=</span> Choice
|
||
extra <span style="color:#f92672">=</span> <span style="color:#ae81ff">3</span> <span style="color:#75715e"># 提供3个choice的字段</span>
|
||
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionAdmin</span>(admin<span style="color:#f92672">.</span>ModelAdmin):
|
||
fieldsets <span style="color:#f92672">=</span> [
|
||
(<span style="color:#66d9ef">None</span>, {<span style="color:#e6db74">"fields"</span>: [<span style="color:#e6db74">"question_text"</span>]}),
|
||
(<span style="color:#e6db74">"Date information"</span>, {<span style="color:#e6db74">"fields"</span>: [<span style="color:#e6db74">"pub_date"</span>], <span style="color:#e6db74">"classes"</span>: [<span style="color:#e6db74">"collapse"</span>]}),
|
||
]
|
||
inlines <span style="color:#f92672">=</span> [ChoiceInline
|
||
</code></pre></div><p><img src="https://versun.micro.blog/uploads/2024/40dc58743d.jpg" alt=""></p>
|
||
<p><strong>使用表格式</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-javascript" data-lang="javascript"><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ChoiceInline</span>(<span style="color:#a6e22e">admin</span>.<span style="color:#a6e22e">TabularInline</span>)<span style="color:#f92672">:</span>
|
||
...
|
||
</code></pre></div><p><img src="https://versun.micro.blog/uploads/2024/e489b23318.jpg" alt=""></p>
|
||
<p><strong>更改显示列表</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># polls/admin.py</span>
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">QuestionAdmin</span>(admin<span style="color:#f92672">.</span>ModelAdmin):
|
||
<span style="color:#75715e"># ...</span>
|
||
list_display <span style="color:#f92672">=</span> [<span style="color:#e6db74">"question_text"</span>, <span style="color:#e6db74">"pub_date"</span>,<span style="color:#e6db74">"was_published_recently"</span>]
|
||
list_filter <span style="color:#f92672">=</span> [<span style="color:#e6db74">"pub_date"</span>]
|
||
search_fields <span style="color:#f92672">=</span> [<span style="color:#e6db74">"question_text"</span>] <span style="color:#75715e">#后台使用 LIKE 来查询数据</span>
|
||
|
||
<span style="color:#75715e"># polls/models.py</span>
|
||
<span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Question</span>(models<span style="color:#f92672">.</span>Model):
|
||
<span style="color:#75715e"># ...</span>
|
||
[<span style="color:#a6e22e">@admin</span>](https:<span style="color:#f92672">//</span>micro<span style="color:#f92672">.</span>blog<span style="color:#f92672">/</span>admin)(
|
||
boolean<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>,
|
||
ordering<span style="color:#f92672">=</span><span style="color:#e6db74">"pub_date"</span>,
|
||
description<span style="color:#f92672">=</span><span style="color:#e6db74">"Published recently?"</span>,
|
||
)
|
||
<span style="color:#66d9ef">def</span> <span style="color:#a6e22e">was_published_recently</span>(self):
|
||
<span style="color:#75715e"># ...</span>
|
||
</code></pre></div><p><img src="https://versun.micro.blog/uploads/2024/4b45d32c86.jpg" alt=""></p>
|
||
<p>其它修改:<a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page" title="django.contrib.admin.ModelAdmin.list_per_page">变更页分页</a>, <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields" title="django.contrib.admin.ModelAdmin.search_fields">搜索框</a>, <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter" title="django.contrib.admin.ModelAdmin.list_filter">过滤器</a>, <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy" title="django.contrib.admin.ModelAdmin.date_hierarchy">日期层次结构</a>, 和 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display" title="django.contrib.admin.ModelAdmin.list_display">列标题排序</a></p>
|
||
<h2 id="自定义后台界面和风格">自定义后台界面和风格</h2>
|
||
<p>新建项目级模板<code>mysite/templates</code>,并添加到设置中</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-py" data-lang="py"><span style="color:#75715e"># mysite/settings.py</span>
|
||
TEMPLATES <span style="color:#f92672">=</span> [
|
||
{
|
||
<span style="color:#e6db74">"BACKEND"</span>: <span style="color:#e6db74">"django.template.backends.django.DjangoTemplates"</span>,
|
||
<span style="color:#e6db74">"DIRS"</span>: [BASE_DIR <span style="color:#f92672">/</span> <span style="color:#e6db74">"templates"</span>],
|
||
<span style="color:#e6db74">"APP_DIRS"</span>: <span style="color:#66d9ef">True</span>,
|
||
<span style="color:#75715e">#... </span>
|
||
}
|
||
]
|
||
</code></pre></div><p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-TEMPLATES-DIRS">DIRS</a> 是一个包含多个系统目录的文件列表,用于在载入 Django 模板时使用,是一个待搜索路径。</p>
|
||
<p>新建文件:<code>mysite/templates/admin/base_site.html</code>, 可粘贴<a href="https://github.com/django/django/blob/main/django/contrib/admin/templates">默认的模板</a>再进行修改。</p>
|
||
<p><strong>修改站点名</strong></p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">{% block branding %}
|
||
<<span style="color:#f92672">div</span> <span style="color:#a6e22e">id</span><span style="color:#f92672">=</span><span style="color:#e6db74">"site-name"</span>><<span style="color:#f92672">a</span> <span style="color:#a6e22e">href</span><span style="color:#f92672">=</span><span style="color:#e6db74">"{% url 'admin:index' %}"</span>>Polls Administration</<span style="color:#f92672">a</span>><<span style="color:#f92672">div</span>>
|
||
{% endblock %}
|
||
</code></pre></div><p>在一个实际工程中,你可能更期望使用 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header" title="django.contrib.admin.AdminSite.site_header">django.contrib.admin.AdminSite.site_header</a> 来进行简单的定制.</p>
|
||
<h3 id="自定义应用管理模板">自定义应用管理模板</h3>
|
||
<p>我们的投票应用不是非常复杂,所以无需自定义后台模板。不过,如果它变的更加复杂,需要修改 Django 的标准后台模板功能时,修改 <em>应用</em> 的模板会比 <em>工程</em> 的更加明智。这样,在其它工程包含这个投票应用时,可以确保它总是能找到需要的自定义模板文件。</p>
|
||
<p>更多关于 Django 如何查找模板的文档,参见 <a href="https://docs.djangoproject.com/zh-hans/5.0/topics/templates/#template-loading">加载模板文档</a>。</p>
|
||
<h2 id="自定义后台主页">自定义后台主页</h2>
|
||
<p>默认情况下,它展示了所有配置在 <a href="https://docs.djangoproject.com/zh-hans/5.0/ref/settings/#std-setting-INSTALLED_APPS">INSTALLED_APPS</a> 中,已通过后台应用注册,按字母排序的应用。</p>
|
||
<p>需要自定义的模板是 <code>admin/index.html</code>,修改<code>app_list</code> 的模板变量,可以使用硬编码链接(链接至特定对象的管理页)替代使用这个变量</p>
|
||
<h1 id="第八部分httpsdocsdjangoprojectcomzh-hans50introtutorial08"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial08/">第八部分</a></h1>
|
||
<h2 id="安装django调式工具栏">安装Django调式工具栏</h2>
|
||
<p>这是一个常用的第三方软件包<a href="https://django-debug-toolbar.readthedocs.io/">Django Debug Toolbar</a>, 由<a href="https://jazzband.co/">Jazzband</a>开发</p>
|
||
<p><code>pip install django-debug-toolbar</code></p>
|
||
<p>具体的安装方法查看<a href="https://django-debug-toolbar.readthedocs.io/en/latest/installation.html">官方文档</a></p>
|
||
<p>通常第三方软件包安装后,需要添加到<strong>INSTALLED_APPS</strong>中,可能还需要添加到URLconf (<code>urls.py</code>) 中。</p>
|
||
<p>还有更多的第三方软件包,可以在<a href="https://djangopackages.org">这里</a>搜索</p>
|
||
<h1 id="下一步看什么httpsdocsdjangoprojectcomzh-hans50introwhatsnext"><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/whatsnext/">下一步看什么</a></h1>
|
||
<p>可以开始你的项目了,下面是相关文档供查找</p>
|
||
<ul>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/genindex/">索引</a></p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/topics/">主题指南</a>:深入介绍 Django 的各个部分</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/howto/">操作指南</a>:你将在此找到大量回答形如“我该如何……”问题的简答,帮你快速完成常见的任务</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/ref/">API 参考</a>:所有的函数细节</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/faq/">FAQ</a>:常见问题</p>
|
||
</li>
|
||
<li>
|
||
<p>其它:<a href="https://docs.djangoproject.com/zh-hans/5.0/releases/">发布说明</a> / <a href="https://docs.djangoproject.com/zh-hans/5.0/internals/">内部文档</a> / <a href="https://docs.djangoproject.com/zh-hans/5.0/misc/">杂记</a></p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="references">References</h2>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/misc/design-philosophies">设计理念</a></p>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/reusable-apps/">创建可复用的应用教程</a></p>
|
||
<p><a href="https://docs.djangoproject.com/zh-hans/5.0/intro/contributing/">编写你的第一个 Django 补丁</a></p>
|
||
<p><a href="https://blog.versun.me/django-list">Djiano List</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/12/13/uvicornguvicorn.html">Uvicorn和Guvicorn的使用场景</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/12/13/uvicornguvicorn.html" class="u-url"><time class="dt-published" datetime="2023-12-13 08:00:00 +0800">Dec 13, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>Uvicorn 是一个异步服务器网关接口 (ASGI) 实现,它能够通过异步IO在单个进程中并发地处理多个请求。
|
||
这意味着,尽管 Uvicorn 是单线程的,但由于 Python 的异步特性,它还是能够同时处理多个请求。
|
||
这与传统的同步服务器不同,后者通常会为每个请求分配一个线程或进程。</p>
|
||
<p>Uvicorn 非常适合 IO 密集型的应用,如大量的网络请求和数据库操作,因为它们可以在等待 IO 操作完成时处理其他请求。
|
||
然而,对于 CPU 密集型任务,异步IO并不能提高性能,因为 Python 解释器的全局解释器锁 (GIL) 限制了在任何给定时间只有一个线程执行 Python 字节码。</p>
|
||
<p>因此,如果需要处理多个 CPU 密集型任务,需要使用多个 Uvicorn 工作进程来充分利用多核心 CPU。在这种情况下,可以使用像 Gunicorn 这样的工具来管理多个 Uvicorn 工作进程,每个进程都有自己的事件循环和内存空间。</p>
|
||
<p>在大多数情况下,Uvicorn 足以处理中等流量的应用程序,并且可以通过添加更多的工作进程来水平扩展以处理更高的负载。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/12/11/uvicorn.html">在云开发机上运行uvicorn的问题</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/12/11/uvicorn.html" class="u-url"><time class="dt-published" datetime="2023-12-11 08:00:00 +0800">Dec 11, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>今天在使用uvicorn运行fastapi的app时,遇到了几个问题:</p>
|
||
<h3 id="无法在code-server上正常访问">无法在code server上正常访问</h3>
|
||
<p>由于我的开发环境在云上,用的code server,并非是本地,因此默认命令<code>uvicorn main:app --reload</code> 是无法正常访问的,因为code server代理的网址是<code>https://example.com/proxy/8000</code></p>
|
||
<p>因此需要更改root-path才可以正常访问:</p>
|
||
<p><code>uvicorn main:app --root-path https://example.com/proxy/8000 --reload</code></p>
|
||
<h3 id="对于python的自定义包无法正常载入解析">对于python的自定义包无法正常载入解析</h3>
|
||
<p>在我的<code>main.py</code>中,导入自定义包:<code>from myapp.utils.database import Database</code>
|
||
但在<code>myapp</code>文件夹下执行<code>uvicorn main:app</code>时,会出现无法找到<code>myapp</code>模块的错误,因此需要返回上一级文件夹,然后执行<code>uvicorn myapp.main:app</code>,这样就可以了</p>
|
||
<h3 id="reload监控文件夹设置">reload监控文件夹设置</h3>
|
||
<p>由于uvicorn在启用reload时,默认是监控当前文件夹的变动,但如果使用了<code>uvicorn myapp.main:app</code>,则需要指定监控的文件:</p>
|
||
<p><code>uvicorn myapp.main:app --reload --reload-dir /path/to/myapp/</code></p>
|
||
<p>综上,全部命令为:</p>
|
||
<p><code>uvicorn myapp.main:app --reload --root-path https://example.com/proxy/8000 --reload-dir /path/to/myapp/</code></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/12/10/listedto.html">博客搬家到Listed-to</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/12/10/listedto.html" class="u-url"><time class="dt-published" datetime="2023-12-10 08:00:00 +0800">Dec 10, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>这次搬家主要是因为我的笔记应用从Obsidian(下称ob)搬到了Standard Notes(下称sn)。</p>
|
||
<p>我用ob也有一年多了,一直是开了sync和publish服务,但ob有很多操作一直习惯不来,比如左栏视图切换,总要想一下才能反应过来,还有就是鸡肋的搜索和没有web端,但让我下定决心搬家的原因是插件,正所谓成也插件败也插件,原先想自己做一个插件,深入了解后发现,插件的权限非常大,读取任意笔记不说,甚至可以在没有通知的情况下删除笔记……这顿时让我脊背发凉。</p>
|
||
<p>所以趁着黑五sn全场5折,一年只要49美金,还有免费的listed博客发布平台,比ob的sync + publish = 192美金要划算很多,而且sn不仅端到端加密,还本地加密,还有自动邮件和本地备份,操作和印象笔记也差不多,之前因为价格太贵一直没入手,所以这次就抓紧上车了。</p>
|
||
<p>下面简单介绍下Listed的设置,以备不时之需</p>
|
||
<h3 id="关于博客数量">关于博客数量</h3>
|
||
<p>可以开无数个Listed,不过默认的listed.to域名国内被墙,需要绑定域名才可以在国内访问</p>
|
||
<h3 id="自定义日期或者设置唯一的urldochttpsstandardnotescomhelp67how-do-i-specify-a-custom-date-for-a-post-or-set-the-canonical-url">自定义日期或者设置唯一的URL(<a href="https://standardnotes.com/help/67/how-do-i-specify-a-custom-date-for-a-post-or-set-the-canonical-url">doc</a>):</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-javascript" data-lang="javascript"><span style="color:#f92672">---</span>
|
||
<span style="color:#a6e22e">date</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">2017</span><span style="color:#f92672">-</span><span style="color:#ae81ff">11</span><span style="color:#f92672">-</span><span style="color:#ae81ff">20</span> <span style="color:#ae81ff">17</span><span style="color:#f92672">:</span><span style="color:#ae81ff">08</span><span style="color:#f92672">:</span><span style="color:#ae81ff">05</span>
|
||
<span style="color:#a6e22e">canonical</span><span style="color:#f92672">:</span> [<span style="color:#a6e22e">mysite</span>.<span style="color:#a6e22e">com</span><span style="color:#f92672">/</span><span style="color:#a6e22e">blog</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1</span><span style="color:#f92672">/</span><span style="color:#a6e22e">po</span>...](<span style="color:#a6e22e">https</span><span style="color:#f92672">:</span><span style="color:#75715e">//mysite.com/blog/1/post-im-importing)
|
||
</span><span style="color:#75715e"></span><span style="color:#f92672">---</span>
|
||
<span style="color:#a6e22e">Your</span> <span style="color:#a6e22e">story</span>...
|
||
</code></pre></div><p>可用元数据字段列表:</p>
|
||
<p><strong>created_at</strong> 博文创建时间</p>
|
||
<p><strong>canonical</strong> 该帖子的规范 URL,供搜索引擎使用。</p>
|
||
<p><strong>custom_path</strong> 覆盖帖子的默认路径。如果是从其他博客迁移过来,这很有用。(例如: my-blog-post )</p>
|
||
<p><strong>desc</strong> 本帖的自定义元描述,供搜索引擎使用。</p>
|
||
<p><strong>hidden</strong> true/false. 是否应从作者简介中隐藏文章(但仍可通过 URL 访问)</p>
|
||
<p><strong>image_url</strong> 社交媒体网站在链接预览卡中使用的图片。</p>
|
||
<p><strong>metatype</strong> [css, html, json]. 用于创建自定义主题。</p>
|
||
<p><strong>page</strong> true/false. 用于在作者标题中创建专用链接。</p>
|
||
<p><strong>page_link</strong> 如果 page 为 true,且设置了该值,页面将作为外部 URL 打开。</p>
|
||
<p><strong>page_sort</strong> 一个数字。数字越小,页面链接出现在作者页眉的时间就越早。</p>
|
||
<h3 id="关于自定义css">关于自定义CSS</h3>
|
||
<p>先根据<a href="https://standardnotes.com/help/66/how-do-i-change-the-colors-fonts-and-general-layout-of-my-listed-blog">官方文档</a>创建css文件</p>
|
||
<p>如果想做成twitter类型,不显示正文,只显示标题:</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-javascript" data-lang="javascript"><span style="color:#f92672">---</span>
|
||
<span style="color:#a6e22e">metatype</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">css</span>
|
||
<span style="color:#f92672">---</span>
|
||
.<span style="color:#a6e22e">author</span><span style="color:#f92672">-</span><span style="color:#a6e22e">post</span> .<span style="color:#a6e22e">post</span><span style="color:#f92672">-</span><span style="color:#a6e22e">body</span> {
|
||
<span style="color:#a6e22e">display</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">none</span>;
|
||
}
|
||
</code></pre></div><p>我博客在用的css:<a href="https://gist.github.com/versun/381d08679f5d36b52a26299f3a8ae4e0">gist.github.com/versun/38…</a></p>
|
||
<h3 id="关于newsletter">关于Newsletter</h3>
|
||
<p>默认开通newsletter,所有邮件都是从mail@listed.to发出的,而且为了隐私安全,博主是无法看到订阅人邮箱的,只能知道人数。
|
||
所以以后如果转平台,是无法批量导出订阅人的,只能发邮件让订阅者重新在新平台订阅。</p>
|
||
<h3 id="关于图片">关于图片</h3>
|
||
<p>虽然Standard Notes笔记里可以添加图片,但发布到Listed后并不会显示,因此需要自行使用图床,稍微麻烦了些</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/11/21/onedrive.html">解决macOS下OneDrive的同步问题</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/11/21/onedrive.html" class="u-url"><time class="dt-published" datetime="2023-11-21 08:00:00 +0800">Nov 21, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/11/18/macospython.html">macOS的Python环境配置</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/11/18/macospython.html" class="u-url"><time class="dt-published" datetime="2023-11-18 22:40:00 +0800">Nov 18, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>警告:千万不要使用macOS默认安装的python。。。。
|
||
最佳配置是使用pyenv,因为它可以控制shell路径,可以配置全局默认版本</p>
|
||
<h3 id="安装pyenv">安装pyenv</h3>
|
||
<p><a href="https://github.com/pyenv/pyenv">Github仓库</a>
|
||
<a href="https://github.com/pyenv/pyenv#installation">官方安装指南</a>
|
||
这边只建议使用Homebrew来安装,可以省很多麻烦
|
||
首先需要安装依赖 <code>brew install openssl readline sqlite3 xz zlib tcl-tk</code>
|
||
然后再pyenv<code>brew install pyenv</code></p>
|
||
<h3 id="安装python">安装Python</h3>
|
||
<p>可先运行<code>pyenv install --list</code>查看所有可安装的版本
|
||
<code>pyenv install 3.12.0</code></p>
|
||
<h3 id="设置全局默认">设置全局默认</h3>
|
||
<p>`pyenv global 3.12.0</p>
|
||
<h3 id="设置默认环境">设置默认环境</h3>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">echo <span style="color:#e6db74">'export PYENV_ROOT="$HOME/.pyenv"'</span> >> ~/.zshrc
|
||
echo <span style="color:#e6db74">'[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"'</span> >> ~/.zshrc
|
||
echo <span style="color:#e6db74">'eval "$(pyenv init -)"'</span> >> ~/.zshrc
|
||
</code></pre></div><p>重启终端就可以自动生效了</p>
|
||
<h3 id="使用pdm来管理虚拟环境">使用PDM来管理虚拟环境</h3>
|
||
<p><a href="https://github.com/pdm-project/pdm/blob/main/README_zh.md">Github仓库</a> | <a href="https://pdm-project.org/latest/">官方文档</a>
|
||
安装<code>brew install pdm</code>
|
||
初始化一个新的 PDM 项目: <code>pdm init</code>
|
||
(可选) 选择python版本号 <code>pdm use 3.11</code>
|
||
安装包:<code>pdm add django</code>
|
||
添加依赖: <code>pdm add requests django</code></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/08/28/vscode.html">树莓派4安装vscode并开启tunnel</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/08/28/vscode.html" class="u-url"><time class="dt-published" datetime="2023-08-28 08:00:00 +0800">Aug 28, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>如果你的树莓派可以外网访问,或者只想在内网使用vscode server,则建议直接使用Remove SSH会好些。
|
||
但如果无法外网访问,除了设置DDNS外,还可以使用tunnel,还可以网页访问vscode,很方便
|
||
参考:https://code.visualstudio.com/docs/remote/tunnels</p>
|
||
<p>如果你的树莓派是Raspberry Pi OS,则直接运行下面的代码安装即可:</p>
|
||
<pre tabindex="0"><code>sudo apt update
|
||
sudo apt install code
|
||
</code></pre><p>如果是debian或者其它第三方的系统,则运行下面的代码安装:
|
||
ref:https://code.visualstudio.com/docs/setup/linux</p>
|
||
<pre tabindex="0"><code>sudo apt-get install wget gpg
|
||
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||
sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||
rm -f packages.microsoft.gpg
|
||
sudo apt install apt-transport-https
|
||
sudo apt update
|
||
sudo apt install code # or code-insiders
|
||
</code></pre><p>接着,下载CLI工具:https://code.visualstudio.com/download
|
||
选择Linux下的Arm64版本的CLI
|
||
解压后放到/usr/local/bin下</p>
|
||
<h3 id="开启断开连接后服务保持功能">开启断开连接后服务保持功能</h3>
|
||
<pre tabindex="0"><code>code tunnel service install
|
||
sudo loginctl enable-linger $USER
|
||
</code></pre><p>查看日志的命令: <code>code tunnel service log</code>
|
||
关闭服务保持功能: <code>code tunnel service uninstall</code></p>
|
||
<h3 id="开启tunnel">开启Tunnel</h3>
|
||
<p><code>code tunnel</code>
|
||
需确保树莓派的网络能正常访问Github
|
||
后续按照提示完成认证即可</p>
|
||
<h3 id="客户端配置">客户端配置</h3>
|
||
<p>客户端的vscode上,安装Remote - Tunnel插件后,点击左下方的绿色按钮,选择Connect to Tunnel,通过Github认证后,你的树莓派名称就会显示,点击即可连接使用。
|
||
Web版:https://vscode.dev/tunnel/你设置的名称</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/08/21/nas.html">NAS惊险记</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/08/21/nas.html" class="u-url"><time class="dt-published" datetime="2023-08-21 08:00:00 +0800">Aug 21, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/07/12/newsletter.html">如何自建Newsletter服务</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/07/12/newsletter.html" class="u-url"><time class="dt-published" datetime="2023-07-12 08:00:00 +0800">Jul 12, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
<p>if (!user || !repo) {
|
||
return new Response(‘Invalid URL format.')
|
||
}</p>
|
||
<p>try {
|
||
const response = await fetch(<code>[raw.githubusercontent.com/$](https://raw.githubusercontent.com/$){user}/${repo}/main/README.md</code>)
|
||
const text = await response.text()
|
||
const markdown = await renderMarkdown(text)
|
||
const modifiedHtml = addSubscriptionForm(markdown)
|
||
return new Response(modifiedHtml, {
|
||
headers: {
|
||
‘Content-Type’: ‘text/html; charset=utf-8’,
|
||
‘Cache-Control’: ‘public, max-age=3600’
|
||
}
|
||
})
|
||
} catch (error) {
|
||
return new Response(<code>Error fetching README.md for ${user}/${repo}: ${error}</code>, { status: 500 })
|
||
}
|
||
}
|
||
//处理markdown内容
|
||
async function renderMarkdown(markdown) {
|
||
const response = await fetch('<a href="https://api.github.com/markdown',">api.github.com/markdown’…</a> {
|
||
method: ‘POST’,
|
||
headers: {
|
||
‘Content-Type’: ‘application/json’,
|
||
‘User-Agent’: ‘54321-Weekly’ //随便写
|
||
},
|
||
body: JSON.stringify({
|
||
text: markdown,
|
||
mode: ‘gfm’,
|
||
context: ‘gollum/gollum’
|
||
})
|
||
})
|
||
const html = await response.text()
|
||
return html
|
||
}</p>
|
||
<p>addEventListener(‘fetch’, event => {
|
||
const url = new URL(event.request.url)
|
||
//设置跳转,54321.versun.me/feed 跳转到 repo release的rss
|
||
if (url.hostname === ‘54321.versun.me’) {
|
||
if (url.pathname.startsWith('/feed')) {
|
||
event.respondWith(Response.redirect('<a href="https://github.com/versun/54321-Weekly/releases.atom',">github.com/versun/54…</a> 301))
|
||
return
|
||
}
|
||
// 54321.versun.me/p/number 跳转到 repo release的tag上
|
||
if (url.pathname.startsWith('/p/')) {
|
||
const tag = url.pathname.split('/p/')[1]
|
||
event.respondWith(Response.redirect(<code>[github.com/versun/54...](https://github.com/versun/54321-Weekly/releases/tag/$){tag}</code>, 301))
|
||
return
|
||
}
|
||
}</p>
|
||
<p>event.respondWith(handleRequest(event.request))
|
||
})
|
||
<!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/05/13/githubsponsorkit.html">Github-Sponsorkit使用说明</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/05/13/githubsponsorkit.html" class="u-url"><time class="dt-published" datetime="2023-05-13 22:39:00 +0800">May 13, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<h2 id="第一步在需要添加sponsor模块的repo根目录下新建文件sponsorkitconfigjs">第一步:在需要添加sponsor模块的repo根目录下新建文件sponsorkit.config.js</h2>
|
||
<p>该文件会自动输出svg,png和json格式的sponsor信息</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-js" data-lang="js"><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">defineConfig</span>, <span style="color:#a6e22e">presets</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">'sponsorkit'</span>
|
||
|
||
<span style="color:#66d9ef">export</span> <span style="color:#66d9ef">default</span> <span style="color:#a6e22e">defineConfig</span>({
|
||
<span style="color:#75715e">// Rendering configs
|
||
</span><span style="color:#75715e"></span> <span style="color:#a6e22e">width</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">800</span>,
|
||
<span style="color:#a6e22e">formats</span><span style="color:#f92672">:</span> [<span style="color:#e6db74">'svg'</span>, <span style="color:#e6db74">'png'</span>,<span style="color:#e6db74">'json'</span>],
|
||
<span style="color:#a6e22e">tiers</span><span style="color:#f92672">:</span> [
|
||
<span style="color:#75715e">// Past sponsors, currently only supports GitHub
|
||
</span><span style="color:#75715e"></span> {
|
||
<span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Past Sponsors'</span>,
|
||
<span style="color:#a6e22e">monthlyDollars</span><span style="color:#f92672">:</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>,
|
||
<span style="color:#a6e22e">preset</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">presets</span>.<span style="color:#a6e22e">xs</span>,
|
||
},
|
||
<span style="color:#75715e">// Default tier
|
||
</span><span style="color:#75715e"></span> {
|
||
<span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Backers'</span>,
|
||
<span style="color:#a6e22e">preset</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">presets</span>.<span style="color:#a6e22e">base</span>,
|
||
},
|
||
{
|
||
<span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Sponsors'</span>,
|
||
<span style="color:#a6e22e">monthlyDollars</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0.5</span>,
|
||
<span style="color:#a6e22e">preset</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">presets</span>.<span style="color:#a6e22e">medium</span>,
|
||
},
|
||
{
|
||
<span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Silver Sponsors'</span>,
|
||
<span style="color:#a6e22e">monthlyDollars</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span>,
|
||
<span style="color:#a6e22e">preset</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">presets</span>.<span style="color:#a6e22e">large</span>,
|
||
},
|
||
{
|
||
<span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">'Gold Sponsors'</span>,
|
||
<span style="color:#a6e22e">monthlyDollars</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">5</span>,
|
||
<span style="color:#a6e22e">preset</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">presets</span>.<span style="color:#a6e22e">xl</span>,
|
||
},
|
||
],
|
||
})
|
||
</code></pre></div><h2 id="第二步目录添加packagejson文件">第二步:目录添加package.json文件</h2>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">{
|
||
<span style="color:#f92672">"type"</span>: <span style="color:#e6db74">"module"</span>,
|
||
<span style="color:#f92672">"packageManager"</span>: <span style="color:#e6db74">"pnpm@9.1.0"</span>,
|
||
<span style="color:#f92672">"scripts"</span>: {
|
||
<span style="color:#f92672">"build"</span>: <span style="color:#e6db74">"sponsorkit"</span>
|
||
},
|
||
<span style="color:#f92672">"devDependencies"</span>: {
|
||
<span style="color:#f92672">"@types/node"</span>: <span style="color:#e6db74">"^20.12.11"</span>,
|
||
<span style="color:#f92672">"sponsorkit"</span>: <span style="color:#e6db74">"^0.14.0"</span>
|
||
}
|
||
}
|
||
</code></pre></div><h2 id="第三步获取token">第三步:获取token</h2>
|
||
<p>SPONSORKIT_GITHUB_TOKEN在头像->Settings->Developer settings->Personal->Tokens添加,需要有<code>read:user</code> and <code>read:org</code>权限
|
||
其它Token的获取地址请参考<a href="https://github.com/antfu-collective/sponsorkit">这里</a></p>
|
||
<h2 id="第四步添加token">第四步:添加Token</h2>
|
||
<p>打开repo -> Settings -> Secrets and variables -> Actions, 点击New repository secret
|
||
添加你需要的token:
|
||
<img src="https://f004.backblazeb2.com/file/blog-versun-me/img/Pasted%20image%2020230424085126.png" alt=""></p>
|
||
<h2 id="第五步添加github-action">第五步:添加Github action</h2>
|
||
<p>也就是在.github/workflows文件夹下新建scheduler.yml文件</p>
|
||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yml" data-lang="yml"><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Scheduler</span>
|
||
|
||
<span style="color:#f92672">on</span>:
|
||
<span style="color:#f92672">workflow_dispatch</span>:
|
||
<span style="color:#f92672">schedule</span>:
|
||
- <span style="color:#f92672">cron</span>: <span style="color:#e6db74">'30 5,17 * * *'</span>
|
||
<span style="color:#f92672">push</span>:
|
||
<span style="color:#f92672">branches</span>: [<span style="color:#ae81ff">main]</span>
|
||
|
||
<span style="color:#f92672">jobs</span>:
|
||
<span style="color:#f92672">update-sponsors</span>:
|
||
<span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
|
||
<span style="color:#f92672">steps</span>:
|
||
- <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v4</span>
|
||
|
||
- <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">pnpm/action-setup@v3</span>
|
||
|
||
- <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set node</span>
|
||
<span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/setup-node@v4</span>
|
||
<span style="color:#f92672">with</span>:
|
||
<span style="color:#f92672">node-version</span>: <span style="color:#ae81ff">lts/*</span>
|
||
|
||
- <span style="color:#f92672">run</span>: <span style="color:#ae81ff">corepack enable && pnpm i</span>
|
||
|
||
- <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Update sponsors</span>
|
||
<span style="color:#f92672">run</span>: <span style="color:#ae81ff">pnpm exec sponsorkit --dir .</span>
|
||
<span style="color:#f92672">env</span>:
|
||
<span style="color:#f92672">SPONSORKIT_GITHUB_LOGIN</span>: <span style="color:#ae81ff">versun</span>
|
||
<span style="color:#f92672">SPONSORKIT_GITHUB_TOKEN</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_GITHUB_TOKEN }}</span>
|
||
<span style="color:#f92672">SPONSORKIT_AFDIAN_USER_ID</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_AFDIAN_USER_ID }}</span>
|
||
<span style="color:#f92672">SPONSORKIT_AFDIAN_TOKEN</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_AFDIAN_TOKEN }}</span>
|
||
<span style="color:#f92672">SPONSORKIT_OPENCOLLECTIVE_KEY</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_OPENCOLLECTIVE_KEY }}</span>
|
||
<span style="color:#f92672">SPONSORKIT_OPENCOLLECTIVE_SLUG</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_OPENCOLLECTIVE_SLUG }}</span>
|
||
<span style="color:#f92672">SPONSORKIT_OPENCOLLECTIVE_TYPE</span>: <span style="color:#ae81ff">collective</span>
|
||
<span style="color:#f92672">SPONSORKIT_POLAR_TOKEN</span>: <span style="color:#ae81ff">${{ secrets.SPONSORKIT_POLAR_TOKEN }}</span>
|
||
|
||
- <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Commit</span>
|
||
<span style="color:#f92672">uses</span>: <span style="color:#ae81ff">EndBug/add-and-commit@v5</span>
|
||
<span style="color:#f92672">with</span>:
|
||
<span style="color:#f92672">message: 'chore</span>: <span style="color:#ae81ff">update sponsors.svg'</span>
|
||
<span style="color:#f92672">add</span>: <span style="color:#e6db74">'sponsors.*'</span>
|
||
<span style="color:#f92672">env</span>:
|
||
<span style="color:#f92672">GITHUB_TOKEN</span>: <span style="color:#ae81ff">${{ secrets.GITHUB_TOKEN }}</span>
|
||
</code></pre></div><p>最后,授予Action写权限: <br>
|
||
打开Repo -> Settings -> Actions -> General<br>
|
||
在最后的Workflow permissions勾选“Read and write permissions”即可。 <br>
|
||
完成,你现在可以去Actions运行workflow,正常情况下会把输出的svg等文件提交到根目录的sponsorkit文件夹下</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/05/13/pinboardin.html">Pinboard_in快速上手</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/05/13/pinboardin.html" class="u-url"><time class="dt-published" datetime="2023-05-13 08:00:00 +0800">May 13, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<h3 id="pinboard功能">==Pinboard功能==</h3>
|
||
<ol>
|
||
<li>书签管理</li>
|
||
<li>稍后阅读</li>
|
||
<li>同步 Pocket, Twitter, Instapaper</li>
|
||
<li>浏览器标签页保存</li>
|
||
<li>简易note</li>
|
||
<li>RSS, 插件</li>
|
||
<li>书签存档服务</li>
|
||
</ol>
|
||
<h3 id="隐私设置">==隐私设置==</h3>
|
||
<p>Pinboard默认书签是公开的,如果您要私人使用,建议您打开隐私模式后再导入书签:
|
||
settings -> privacy -> <a href="https://pinboard.in/settings/privacy">Turn Privacy Lock On</a>
|
||
打开后,名字旁边会有个🔒图案:
|
||
<img src="https://versun.micro.blog/uploads/2024/f780d467ea.jpg" alt=""></p>
|
||
<h3 id="导入导出书签">==导入导出书签==</h3>
|
||
<p>导入: 使用浏览器导出的html文件来导入: <a href="https://pinboard.in/settings/import">settings -> import</a>
|
||
通过邮箱导入: 首先启用该功能(<a href="https://pinboard.in/settings/settings">勾选最后的Email设置</a>), 将会显示专属的邮件地址, 邮件格式如下:
|
||
主题: 书签的标题
|
||
内容:第一行为网址,第二行为描述,第三行为标签
|
||
导出: <a href="https://pinboard.in/export/">export</a></p>
|
||
<h3 id="添加插件">==添加插件==</h3>
|
||
<p>查看<a href="https://pinboard.in/resources/">Pinboard Resources</a>, 选择您要添加的插件或应用
|
||
如果你要添加书签栏的插件,查看<a href="https://pinboard.in/howto/">howto</a></p>
|
||
<h3 id="书签管理">==书签管理==</h3>
|
||
<p>Pinboard只有2种管理方式: Tags和Bundles
|
||
<strong>标签Tags</strong>
|
||
每个链接可以添加多个标签(tags1,tags2)
|
||
<strong>集合Bundles</strong>
|
||
整合多个标签,类似标签文件夹(bundles1:tags1,bundles1:tags2)
|
||
需先在settings中打开bundles功能
|
||
打开后,点击首页的no tag bundles
|
||
<img src="https://versun.micro.blog/uploads/2024/94383fff50.jpg" alt="">
|
||
然后再点击new bundle
|
||
在Create Tag Bundle页面,左边为所有的tag,右边为需添加到bundle的tag
|
||
<img src="https://versun.micro.blog/uploads/2024/a35562b573.jpg" alt="">
|
||
点击左边需要添加的tag(可多个),然后点击中间的转换按钮,选中的tag将会显示在右边栏中
|
||
最后输入上方的bundle name,点击保存即可将所选择的tag加到对应的bundle下
|
||
<img src="https://versun.micro.blog/uploads/2024/4eb432a9ef.jpg" alt=""></p>
|
||
<p>Tips:</p>
|
||
<ul>
|
||
<li>可双击tag快速转换左右列表</li>
|
||
<li>bundle暂时无法在添加书签时指定,只能手动</li>
|
||
<li>不能嵌套bundle</li>
|
||
</ul>
|
||
<h3 id="rss订阅">==RSS订阅==</h3>
|
||
<p>可用RSS订阅自己/某人的pinboard页面变化,具体查看<a href="https://pinboard.in/howto">这里</a></p>
|
||
<h4 id="浏览器标签页保存">==浏览器标签页保存==</h4>
|
||
<p>该功能需要安装浏览器插件才能使用<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/42f775e68d.jpg" alt="">
|
||
点击后会跳出新页面,选择需要保存的tab,输入Name后点保存即可<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/4c680edcf5.jpg" alt="">
|
||
保存后,即可在首页的tabs里面看到<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/c376ffa7cc.jpg" alt="">
|
||
<img src="https://versun.micro.blog/uploads/2024/47799fb7e3.jpg" alt=""></p>
|
||
<h4 id="同步twitter">==同步Twitter==</h4>
|
||
<p>在settings里面绑定twitter账户,最多3个
|
||
<img src="https://versun.micro.blog/uploads/2024/c159bb6452.jpg" alt="">
|
||
之后即可在首页查看自己发的twitter和喜欢的twitter
|
||
<img src="https://versun.micro.blog/uploads/2024/60f4a85ef4.jpg" alt="">
|
||
点击favs可查看喜欢的推
|
||
<img src="https://versun.micro.blog/uploads/2024/5816baa0de.jpg" alt="">
|
||
主要功能就是这些,其它可在<a href="https://pinboard.in/howto/">how-to</a> 上查看</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/05/13/codecademy-courses-path.html">UX-Learning-Path</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/05/13/codecademy-courses-path.html" class="u-url"><time class="dt-published" datetime="2023-05-13 08:00:00 +0800">May 13, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<h2 id="codecademy-courses-path">Codecademy Courses Path</h2>
|
||
<ol>
|
||
<li><a href="https://www.codecademy.com/learn/intro-to-ui-ux">Introduction to UI and UX Design</a></li>
|
||
<li><a href="https://www.codecademy.com/learn/learn-user-research-generative">Learn User Research: Generative</a></li>
|
||
<li><a href="https://www.codecademy.com/learn/learn-design-thinking-ideation">Learn Design Thinking: Ideation</a></li>
|
||
<li><a href="https://www.codecademy.com/learn/learn-interaction-design">Learn Interaction Design</a></li>
|
||
<li><a href="https://www.codecademy.com/learn/create-a-professional-website-with-velo-by-wix">Create a Professional Website with Velo by Wix | Codecademy</a></li>
|
||
</ol>
|
||
<h2 id="designlab-courses-path">Designlab Courses Path</h2>
|
||
<p><a href="https://designlab.com/ux-academy/">UX Academy: Learn UX UI Design | Designlab</a></p>
|
||
<h4 id="1-design-is">1 Design Is…</h4>
|
||
<p>Begin your learning journey by gaining essential information about the field of UX and UI design.
|
||
Determine what design means to you and set achievable goals for yourself.
|
||
17 Lessons / 5 Projects</p>
|
||
<h4 id="2-user-research">2 User Research</h4>
|
||
<p>Get started on a realistic design project by practicing various research methods such as interviewing actual human beings.
|
||
Synthesize your research into actionable insights.
|
||
21 Lessons / 14 Projects</p>
|
||
<h4 id="3-ideation-to-prioritization">3 Ideation to Prioritization</h4>
|
||
<p>Learn how to think divergently using numerous brainstorming techniques before deciding on a product idea that would bring value to the people you interviewed.
|
||
10 Lessons / 8 Projects</p>
|
||
<h4 id="4-information-architecture">4 Information Architecture</h4>
|
||
<p>Build up your skills in organizing information, content strategy, navigational design, search engine optimization, and sitemap diagramming, all of which contribute to your project.
|
||
13 Lessons / 6 Projects</p>
|
||
<h4 id="5-interaction-design">5 Interaction Design</h4>
|
||
<p>Develop task flows, user flows, and learn the fundamentals of usability, accessibility, and inclusion.
|
||
Then, take a mobile-first approach to creating responsive wireframes.
|
||
29 Lessons / 12 Projects</p>
|
||
<h4 id="6-user-interface-design">6 User Interface Design</h4>
|
||
<p>Apply visual design principles to the creation of components that will be utilized in your prototype.
|
||
Learn the basics of branding, typography, color theory, and iconography.
|
||
22 Lessons / 8 Projects</p>
|
||
<h4 id="7-prototyping-and-testing">7 Prototyping and Testing</h4>
|
||
<p>Prepare a high-fidelity prototype that you will then test and iterate upon.
|
||
Wrap up your first major design project by preparing your designs for hand-off to software developers.
|
||
16 Lessons / 10 Projects</p>
|
||
<h4 id="8-personal-brand-and-portfolio-setup">8 Personal Brand and Portfolio Setup</h4>
|
||
<p>Register a domain name for your portfolio
|
||
Create a first draft of your portfolio site</p>
|
||
<h4 id="capstone-project-1-responsive-web-design">Capstone Project 1: Responsive Web Design</h4>
|
||
<p>Design a website with mobile, tablet, and desktop breakpoints
|
||
Showcase your ability to use layout grids and design for multiple devices</p>
|
||
<h4 id="capstone-project-2-add-a-feature-to-an-existing-product">Capstone Project 2: Add a Feature to an Existing Product</h4>
|
||
<p>Design a new feature for an existing digital product
|
||
Demonstrate how you can work within brand guidelines and integrate
|
||
with existing feature</p>
|
||
<h4 id="capstone-project-3-end-to-end-application">Capstone Project 3: End-to-End Application</h4>
|
||
<p>Design an iOS or Android mobile app experience from scratch
|
||
Show off your skills as a generalist UX designer, from research to handoff</p>
|
||
<h4 id="ux-academy-graduation">UX Academy Graduation</h4>
|
||
<p>Add the Capstone projects to your portfolio
|
||
Submit your portfolio to our expert panel for review
|
||
<img src="https://versun.micro.blog/uploads/2024/fa65b55389.jpg" alt=""></p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/03/01/lattics.html">笔记应用Lattics的体验分享</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/03/01/lattics.html" class="u-url"><time class="dt-published" datetime="2023-03-01 08:00:00 +0800">Mar 1, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/02/22/rubycheatsheet.html">Ruby-Cheatsheet</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/02/22/rubycheatsheet.html" class="u-url"><time class="dt-published" datetime="2023-02-22 08:00:00 +0800">Feb 22, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
<p>=begin
|
||
I am a multi line comment.
|
||
I can take as many lines as needed.
|
||
=end
|
||
<!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
<!-- raw HTML omitted -->
|
||
<p>if num == 5
|
||
print “number is 5”
|
||
elsif num == 10
|
||
print “number is 10”
|
||
else
|
||
print “number is something other than 5, 10”
|
||
end</p>
|
||
<h4 id="如果没有else则可用简写">如果没有else,则可用简写</h4>
|
||
<p>puts “This number is even!” if num % 2 == 0
|
||
<!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
<!-- raw HTML omitted -->
|
||
<p>puts proc_demo_method</p>
|
||
<h1 id="output-only-i-print">Output: Only I print!</h1>
|
||
<p>def lambda_demo_method
|
||
lambda_demo = lambda { return “Will I print?” }
|
||
lambda_demo.call
|
||
“Sorry - it’s me that’s printed.”
|
||
end</p>
|
||
<p>puts lambda_demo_method</p>
|
||
<h1 id="output-sorry---its-me-thats-printed">Output: Sorry - it’s me that’s printed.</h1>
|
||
<h1 id="lambda_demo调用了但并没有输出">lambda_demo调用了,但并没有输出</h1>
|
||
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
<!-- raw HTML omitted -->
|
||
<pre><code>public # 默认public,可省略
|
||
|
||
def say_hi
|
||
puts "Hi #{@name}!"
|
||
end
|
||
def say_bye
|
||
puts "Bye #{@name}, come back soon."
|
||
end
|
||
def get_count
|
||
return @@count
|
||
end
|
||
|
||
private
|
||
|
||
def bank_account_number
|
||
@account_number = 12345
|
||
puts "My bank account number is #{@account_number}."
|
||
end
|
||
</code></pre>
|
||
<p>end
|
||
greeter = Greeter.new(“Pat”)</p>
|
||
<h4 id="object的内置方法">Object的内置方法</h4>
|
||
<p>greeter.instance_of?(Greeter) # true
|
||
greeter.instance_variables # [:@name]
|
||
greeter.method(“say_hi”) # #<Method: Greeter#say_hi() eval:5>
|
||
greeter.methods # show all greeter’s methods
|
||
greeter.respond_to?(“say_hi”) # true;
|
||
greeter.respond_to?(“name”) # false;
|
||
tom = Greeter.new(“Tom”)
|
||
tom.get_count # 2
|
||
greeter.get_count # 2
|
||
<!-- raw HTML omitted --><!-- raw HTML omitted --></p>
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2023/01/11/gitcheatsheet.html">Git-Cheatsheet</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2023/01/11/gitcheatsheet.html" class="u-url"><time class="dt-published" datetime="2023-01-11 08:00:00 +0800">Jan 11, 2023</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2022/11/10/migadu.html">Migadu邮箱服务的使用配置</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2022/11/10/migadu.html" class="u-url"><time class="dt-published" datetime="2022-11-10 08:00:00 +0800">Nov 10, 2022</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>在个人域名的邮箱服务商的选择上,看似很多其实好用的不多,</p>
|
||
<p>比如国内的阿里云腾讯网易等,国外的gmail,zoho,mail还有各大域名注册商也有提供,</p>
|
||
<p>但用了一圈下来,没有一个能同时满足隐私性,自定义性,国内网络易用,费用低,稳定的要求。</p>
|
||
<p>所以后来我一直使用的是icloud和cloudflare的邮件路由功能,cloudflare确实很强大且稳定还免费,但唯一缺点就是无法用收件的地址发信,虽然发的不多,但硌得慌。</p>
|
||
<p>直到我找到了<a href="https://www.migadu.com/">Migadu</a> ,他们的宣发真是太低调了,直到最近我才发现到它。</p>
|
||
<p>同时,也很心水他们的网页设计和创办理念,收费方式是根据使用量而不是功能,简直是一股清流,二话不说果断转移。</p>
|
||
<p>官网也放出了<a href="https://www.migadu.com/procon/">优缺点</a>供参考。</p>
|
||
<p><!-- raw HTML omitted -->价格:<!-- raw HTML omitted --></p>
|
||
<p>不同档位的区别主要就是收发邮件的数量限制,域名子域名设置都不限制,14天免费试用,还有<a href="https://webmail.migadu.com">网页端</a>可用。</p>
|
||
<p>最低档一天可以收200封发20封,同时官方允许25%的超量,对于个人来说,这个量完全够用。</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/eefef5c60c.jpg" alt=""></p>
|
||
<p>在注册后,首先要修改些信息,保证账户安全</p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->开启两步验证和恢复用的邮箱<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/f6460b20fb.jpg" alt=""></p>
|
||
<p>由于我在注册后,就把登录邮箱改为了设置的域名邮箱,所以为了防止未来Migadu的服务器出现问题,无法登录收发邮件重置密码的情况,所以恢复用的邮箱设置为第三方服务的邮箱,比如谷歌或者微软的邮箱。</p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->增加通知邮箱,理由同上<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/67010fed2b.jpg" alt=""></p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->添加域名<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/3e2bb4e7f1.jpg" alt=""></p>
|
||
<p>不建议使用Migadu的Nameservers,这不是它们的主业,建议使用cloudflare</p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->添加DNS解析记录<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p>在点击Add Email Domain后,会跳到DNS设置页面(<strong>DNS Setup Instructions</strong>),需要添加的记录巨多,建议使用BIND zone records来批量添加</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/f44f2d5289.jpg" alt=""></p>
|
||
<p>复制所有的记录到txt文档中,然后在cloudflare的DNS管理页面,使用导入功能</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/a228387c4d.jpg" alt=""></p>
|
||
<p>导入完成后,稍等1分钟左右,回到Migadu点击检查按钮</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/59f50615f5.jpg" alt=""></p>
|
||
<p>检查通过的话,该按钮会消失,可以点击Overview查看状态</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/7a28449819.jpg" alt=""></p>
|
||
<p>如果有问题的话,可以点击Diagnostics来查看具体哪些记录没有生效</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/642eb0b2db.jpg" alt=""></p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->添加邮箱<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p>点击New Mailbox就可以按需添加邮箱,</p>
|
||
<p>个人建议添加一个即可,然后在Address Aliases或者Pattern Rewrites来设置不同前缀的邮箱,方便一个邮箱收发多个地址,</p>
|
||
<p>建议使用Pattern Rewrites设置,会方便很多</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/2ef46af817.jpg" alt=""></p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->设置Pattern Rewrites (模式重写?)<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p>该功能是我主要使用的,对于保护个人隐私非常有用,</p>
|
||
<p>比如不同网站,如果都是同一个邮箱注册的话,若其中一家网站被拖库(数据泄露),则黑客就可以用该邮箱在不同的网站上尝试撞库,当然你也可以使用密码管理器来设置不同密码,但是,该功能还可以防止大数据通过同一个邮箱来得到你的个人画像。</p>
|
||
<p>所以,使用不同邮箱地址来注册账户,就相对解决了以上问题,为什么说相对呢,如果还想进一步保护个人隐私,可以查看 <strong>这里</strong>。</p>
|
||
<p>配置可参考如下图,设置的功能是,所有发送到signup-开头的邮箱地址,均发到me@versun.me的邮箱里,</p>
|
||
<p>比如signup-amazon@versun.me和signup-google@versun.me,对外界来说是2个不同的邮箱,但实际上都是发送到me@versun.me里面去,</p>
|
||
<p>这样就能实现不同的注册邮箱地址,一个邮箱接收。</p>
|
||
<p>接下来就是设置可以从不同的邮箱地址发送邮件</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/914970bbe8.jpg" alt=""></p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->设置Wildcard Sender (通配符发件人)<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p>这个的作用,就是允许不同的邮箱前缀通过versun.me这个域名来发送邮件,就不用单独为一个账户创建一个邮箱。</p>
|
||
<p>比如我可以使用signup-amazon@versun.me这个邮箱来回复邮件, 当然邮件客户端上也要添加该别名</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/84cb319620.jpg" alt=""></p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted -->邮件客户端添加邮箱别名<!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<p>这里以我用的Canary为例,在Settings下,点击要添加别名的主邮箱,然后在Aliases里面添加别名即可: <a href="mailto:signup-amazon@versun.me">signup-amazon@versun.me</a></p>
|
||
<p>之后发送邮件时,就可以选择该邮箱地址为发件人。</p>
|
||
<p>以上就是我个人使用Migadu的一些主要配置,如有疑问,欢迎留言。</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2022/07/31/000000.html">冥想计划</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2022/07/31/000000.html" class="u-url"><time class="dt-published" datetime="2022-07-31 00:00:00 +0800">Jul 31, 2022</time></a>
|
||
|
||
<div class="e-content">
|
||
<h1 id="前言"><strong>前言</strong></h1>
|
||
<p>在这个迷乱的世界,所有的事物,时时刻刻都在尝试夺取我们宝贵的注意力,</p>
|
||
<p>而<strong>冥想</strong>,给我们带来了主动控制注意力的可能,锻炼“有意识”的能力,</p>
|
||
<p>冥想其实就是掌控念头的训练。</p>
|
||
<p>当某件事发生时,我们的大脑会给予反应(快乐、挫败、愤怒等),并倾向于用最简单的方式来回应,也就是惯性思维。</p>
|
||
<p>冥想就是教我们怎么去超越惯性,有意识的控制大脑的反应。</p>
|
||
<p>冥想时,我们的大脑可能有一半时间都在反抗,可能会想“我累了,今天就这样吧,放弃吧,别再专注在呼吸上了。” 或者注意力总是会飘到其它地方,这很正常,你要做的,就是意识到它们的存在,但不要马上跟随它们,然后把注意力转回到呼吸上,这就是在训练超越惯性的能力,可能之后还会分心,然后再专注,再分心,无限循环,但随着练习的次数越多,你会越快的意识到注意力的分散,越快的调整注意力,你也会发现适合自己的处理各种念头的方法,甚至在念头还没成型之前就意识到并处理掉。</p>
|
||
<p>随着不断地练习冥想,我们对发生的任何事/念头/人,都可以有意识的去处理,而不是跟随惯性,这会成为一种习惯,不让任何念头/情绪困扰你,不用最直接的情绪给予周遭事物任何反应,因为一旦掉入情绪的漩涡,你就会开始失控,开始胡思乱想。</p>
|
||
<p>比如在开车时,遇到超车或者塞车,不需要跟随最直接的愤怒情绪,而是有意识的发现情绪并处理它,这并不是简单的压抑情绪。</p>
|
||
<p>我们需要有意识的专注,对任何突然冒出的想法/事情/情绪,第一时间应该是意识到它们的存在,你可以记录下来,然后才是安排处理它们,而不是马上惯性地采取行动。</p>
|
||
<p>超越惯性,控制自己的念头,这就是冥想所能带来的。</p>
|
||
<hr>
|
||
<h1 id="计划说明"><strong>计划说明:</strong></h1>
|
||
<p>冥想基础:</p>
|
||
<ul>
|
||
<li>
|
||
<p>背景音乐可有可无,随你心意</p>
|
||
</li>
|
||
<li>
|
||
<p>最好有专门冥想的地方,比如专用的地垫等</p>
|
||
</li>
|
||
<li>
|
||
<p>两只脚平放在地上,移动到你的座椅边缘,手轻轻地放在膝盖上,打开胸腔,肩膀放松</p>
|
||
</li>
|
||
<li>
|
||
<p>闭眼,深呼吸1-3次,**然后回到自然呼吸,**开始冥想</p>
|
||
</li>
|
||
</ul>
|
||
<p>每次冥想结束前:深呼吸1-3次,再睁眼</p>
|
||
<p>每日训练内容可根据需要重复进行,您也可以一直进行P1-D1的训练,直到您想进一步,一切随你心意。</p>
|
||
<hr>
|
||
<h2 id="每日训练内容"><strong>每日训练内容:</strong></h2>
|
||
<h3 id="plan-1-day-1-p1-d1">Plan 1 Day 1 (P1-D1)</h3>
|
||
<p>时长:5分钟 | 技能:呼吸 | 目标:注意呼吸</p>
|
||
<ul>
|
||
<li>
|
||
<p>把你的注意力放在你的呼吸上,自然的呼吸,不用特意控制呼吸。</p>
|
||
</li>
|
||
<li>
|
||
<p>注意力飘移是很正常的,重新回到呼吸上即可</p>
|
||
</li>
|
||
<li>
|
||
<p>吸气的时候,默想“吸”,呼气的时候,默想“呼”</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d2">P1-D2</h3>
|
||
<p>时长:5分钟 | 技能:呼吸 | 目标:感受呼吸的精神变化</p>
|
||
<ul>
|
||
<li>
|
||
<p>吸气的时候,脑子默想“吸”,呼气的时候,默想“呼”</p>
|
||
</li>
|
||
<li>
|
||
<p>感受空气的温度,凉爽的吸入,温暖的呼出,如果没有感受,也是正常的</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>认真感受你的呼吸,感受空气的流动,大脑的感受,感受思绪在大脑的流动,注意力慢慢回到呼吸上</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>这些感受可能比较难,这是正常的,慢慢去体会</p>
|
||
</li>
|
||
<li>
|
||
<p>自问,你现在感觉如何? 你的身体感觉如何?</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d3">P1-D3</h3>
|
||
<p>时长:5分钟 | 技能:呼吸 | 目标:感受呼吸的身体变化</p>
|
||
<ul>
|
||
<li>感受<strong>呼吸的身体变化,比如腹部的扩张,胸腔等</strong></li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d4">P1-D4</h3>
|
||
<p>时长:5分钟 | 技能:呼吸 | 目标:训练专注能力</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>呼气的时候,默念数字1,计数到5后,从1再开始</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>如果注意力丢失,很正常,重新数即可</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d5p1-d6">P1-D5,P1-D6</h3>
|
||
<p>时长:5分钟 | 技能:呼吸 | 目标:训练专注能力</p>
|
||
<ul>
|
||
<li>
|
||
<p>像昨天一样,对呼吸计数</p>
|
||
</li>
|
||
<li>
|
||
<p>深入感受呼吸带来的精神和物理上的变化</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d7">P1-D7</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、扫描身体 | 目标:不同的方法来训练注意力</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>把注意力放在身体不同部位的感觉上</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>无论你注意到什么都是完全正常的,没有感觉也是正常的。</p>
|
||
</li>
|
||
<li>
|
||
<p>首先把注意力引向头顶,有注意到什么,温暖/凉爽?紧张?或者没有</p>
|
||
</li>
|
||
<li>
|
||
<p>然后按顺序感受额头、眼睛、嘴巴、下巴</p>
|
||
</li>
|
||
<li>
|
||
<p>然后是整个脸部和肌肉、脖子和肩膀</p>
|
||
</li>
|
||
<li>
|
||
<p>可以重复该扫描过程,你可以控制它们放松</p>
|
||
</li>
|
||
<li>
|
||
<p>现在检查一下你自己,你现在感觉如何? 你的身体感觉如何?</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d8">P1-D8</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、扫描身体 | 目标:扫描整个上半身</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>按顺序感受额头、眼睛、嘴巴、下巴、脸部、脖子、肩膀</strong></p>
|
||
</li>
|
||
<li>
|
||
<p><strong>继续感受胸、腹部、整个上身</strong></p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d9">P1-D9</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、扫描身体 | 目标:继续扫描下半身</p>
|
||
<ul>
|
||
<li>像昨天一样,继续感受大腿,膝盖,小腿,脚,脚趾,<strong>下半身</strong></li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p1-d10">P1-D10</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、扫描身体 | 目标:回顾主要的2种注意力训练方式</p>
|
||
<ul>
|
||
<li>
|
||
<p>呼气时,数数,从1到5</p>
|
||
</li>
|
||
<li>
|
||
<p>从头到脚,感受全身</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<hr>
|
||
<h3 id="p2-d1">P2-D1</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、扫描身体 | 目标:回顾</p>
|
||
<ul>
|
||
<li>
|
||
<p>呼气时,数数,从1到5</p>
|
||
</li>
|
||
<li>
|
||
<p>从头到脚,感受全身</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d2p2-d3">P2-D2,P2-D3</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:学习标签</p>
|
||
<ul>
|
||
<li>
|
||
<p>关注呼吸</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>当你的注意力游走时,意识到它,不评判,然后默念并给它一个标签“想法”,然后注意力回到呼吸上。</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>标签法可以应用在生活中,当注意力飘逸时,可以把想法标签化,比如写下里,然后继续手里的工作。</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d4">P2-D4</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:调正坐姿</p>
|
||
<ul>
|
||
<li>
|
||
<p>关于坐姿,最好向你的座位前缘移动一点。</p>
|
||
</li>
|
||
<li>
|
||
<p>脊椎稍微挺直,头部稍微上扬</p>
|
||
</li>
|
||
<li>
|
||
<p>关注呼吸,标签化你的想法</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d5">P2-D5</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:深入感受呼吸</p>
|
||
<ul>
|
||
<li>
|
||
<p>关注呼吸,标签化你的想法</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>深入感受呼吸,感受空气的流动,方向</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>感受呼吸带来的变化,胸腔、脉搏等</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d6">P2-D6</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:添加感觉标签</p>
|
||
<ul>
|
||
<li>
|
||
<p>除了"想法"标签,还可以使用"感觉"标签</p>
|
||
</li>
|
||
<li>
|
||
<p>深入感受身体的感觉,感受地面如何支撑你的脚和身体</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>当你察觉到任何身体带来的物理感觉(疼痛, 麻,温暖等),默念"感觉"</strong></p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d7">P2-D7</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:回顾</p>
|
||
<ul>
|
||
<li>
|
||
<p>没有必要给每一个想法或感觉贴上标签,只标签那些真正能带走你的注意力的</p>
|
||
</li>
|
||
<li>
|
||
<p>在冥想放松时,大脑会整理一直憋在脑袋里的大量想法,因此走神是很正常的</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>不要评判它,只要意识到它即可,允许它们跑来跑去</strong></p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p2-d8p2-d9p2-d10">P2-D8,P2-D9,P2-D10</h3>
|
||
<p>时长:5分钟 | 技能:呼吸、标签 | 目标:巩固</p>
|
||
<ul>
|
||
<li>
|
||
<p>如果你发现自己在打瞌睡,请尽力让自己的呼吸更深一点,或者睁开眼睛,让自己保持清醒</p>
|
||
</li>
|
||
<li>
|
||
<p>如果你遇到任何背部疼痛,你可以靠着你的椅背坐着,或者在你的背后放一个垫子</p>
|
||
</li>
|
||
<li>
|
||
<p>继续关注呼吸,使用标签</p>
|
||
</li>
|
||
<li>
|
||
<p>关注身体的变化</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<hr>
|
||
<h3 id="p3-d1">P3-D1</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描 | 目标:复习身体扫描</p>
|
||
<ul>
|
||
<li>从头到脚,感受全身</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d2">P3-D2</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描、感知 | 目标:初步感知身体</p>
|
||
<ul>
|
||
<li>
|
||
<p>从头到脚,感受全身</p>
|
||
</li>
|
||
<li>
|
||
<p>对于突然冒出的想法或者词汇,不要试图弄清楚为什么,只要意识到它的存在即可。</p>
|
||
</li>
|
||
<li>
|
||
<p>如有需要,可以深呼吸几次,想象每一次呼气都能释放出这种不舒服</p>
|
||
</li>
|
||
<li>
|
||
<p>然后感受整个身体,疲惫还是放松还是其他</p>
|
||
</li>
|
||
<li>
|
||
<p>注意在扫描身体的过程中,是否有意识到什么,这种意识帮助你更好地了解你身体的整体感觉</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d3">P3-D3</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描、感知 | 目标:训练感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>从头到脚,感受全身</p>
|
||
</li>
|
||
<li>
|
||
<p>除了感觉,同时<strong>要注意位置感知,比如脖子如何支撑你的头部,手臂是否是弯曲的,身体部位是否在微微晃动</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>感知任何微妙的身体运动</p>
|
||
</li>
|
||
<li>
|
||
<p>鼓励你把对身体位置的感知带到你的日常活动中去。 比如当你坐在电脑前或者散步时或者睡觉时,感知你身体的位置,了解你的线条如何影响你的舒适度,可以帮助你保持身体健康,感觉良好</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d4">P3-D4</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描、感知 | 目标:深入感知身体</p>
|
||
<ul>
|
||
<li>
|
||
<p>继续感知身体的位置,不加批评</p>
|
||
</li>
|
||
<li>
|
||
<p>把意识带到你的头部,它是直上直下,还是稍微向前或向后倾斜</p>
|
||
</li>
|
||
<li>
|
||
<p>是否注意到你颈部的肌肉变化</p>
|
||
</li>
|
||
<li>
|
||
<p>摸摸你的头,感觉是重还是轻</p>
|
||
</li>
|
||
<li>
|
||
<p>继续感受往下感受身体,可以触摸,可以稍微动一动,保持正常呼吸</p>
|
||
</li>
|
||
<li>
|
||
<p>不去做任何判断,只是感知身体部位的存在</p>
|
||
</li>
|
||
<li>
|
||
<p>学会以这种方式倾听你的身体</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d5">P3-D5</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描、感知 | 目标:向内感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>对身体保持开放的意识</p>
|
||
</li>
|
||
<li>
|
||
<p>从头开始,感受全身</p>
|
||
</li>
|
||
<li>
|
||
<p>可以睁眼,<strong>感知每个身体部位是怎么为你工作的,花点时间欣赏它们</strong>,比如脖子承受了头部的重量,并允许你转动头部; 鼻子可以闻到花香; 脚,让你可以立足; 屁股让你舒适的坐着</p>
|
||
</li>
|
||
<li>
|
||
<p>然后是整个身体,感知它是如何努力工作,支持现在的你</p>
|
||
</li>
|
||
<li>
|
||
<p>感知身体,可以帮助你在生活中保持对身体的关注,可以更容易的注意到身体的变化,保持健康。</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d6">P3-D6</h3>
|
||
<p>时长:10分钟 | 技能:标签、感知 | 目标:向外感知周围环境,听觉和视觉</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>感知周围的声音</strong>,汽车声音?冰箱声音?</p>
|
||
</li>
|
||
<li>
|
||
<p>不去评判,保持中性和好奇</p>
|
||
</li>
|
||
<li>
|
||
<p>提高对声音的敏感度,可以帮助你避免可能的事故或错过享受的机会</p>
|
||
</li>
|
||
<li>
|
||
<p>接着,<strong>睁开眼睛,保持呼吸</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>不需要寻找什么东西来关注,也不需要紧盯着什么东西。 只要把你的目光轻轻地落在你面前的任何东西上。</p>
|
||
</li>
|
||
<li>
|
||
<p>注意什么东西吸引了你的目光。</p>
|
||
</li>
|
||
<li>
|
||
<p>注意你视野中每个物体的形状和大小颜色,文字,光滑度,软硬等</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d7">P3-D7</h3>
|
||
<p>时长:10分钟 | 技能:标签、感知 | 目标:嗅觉感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>尽可能地保持一种善意和耐心的态度</p>
|
||
</li>
|
||
<li>
|
||
<p>先感知你的身体部位,包括位置/状态</p>
|
||
</li>
|
||
<li>
|
||
<p>开始把你的意识扩展到你的周围</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>用嗅觉来感知周围的任何气味</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>注意不要判断它们是好是坏</p>
|
||
</li>
|
||
<li>
|
||
<p>然后睁开眼睛,像昨天一样感知眼前的物品</p>
|
||
</li>
|
||
<li>
|
||
<p>试着把这变成一种新的探索</p>
|
||
</li>
|
||
<li>
|
||
<p>关注物体的明亮,光源,阴影</p>
|
||
</li>
|
||
<li>
|
||
<p>感知能力,可以在生活中随时练习,学会一点一点地注意周围环境</p>
|
||
</li>
|
||
<li>
|
||
<p>发展你的感知,将帮助你做出更好的决定并保持安全</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d8">P3-D8</h3>
|
||
<p>时长:10分钟 | 技能:标签、感知 | 目标:触觉感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>扫描身体,<strong>用手感知身体的位置和状态</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>把手放在腹部,感受呼吸带来的起伏</p>
|
||
</li>
|
||
<li>
|
||
<p>不要试图强求一种感觉</p>
|
||
</li>
|
||
<li>
|
||
<p>把手放会腿部,感受肌肤或者裤子的质地,可以稍微移动你的手</p>
|
||
</li>
|
||
<li>
|
||
<p>感受身上的织物,光滑/粗糙/纹理/质地,设置重量</p>
|
||
</li>
|
||
<li>
|
||
<p>睁开眼睛,看看周围,注意物体在空间上的分布</p>
|
||
</li>
|
||
<li>
|
||
<p>训练你的头脑不做判断,感受万物共生的关系,更多的欣赏周围的事物</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d9">P3-D9</h3>
|
||
<p>时长:10分钟 | 技能:标签、感知 | 目标:味觉感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>感知的关键是不加评判或解释,这有助于你对真正发生的事情做出准确的评估,而且它还能让你平静下来,专注于现在真正发生的事情, 而不是想当然。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>感知你的嘴是否干燥,温度?</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>想象嘴里的味道,甜酸苦辣或者其他</p>
|
||
</li>
|
||
<li>
|
||
<p>甚至可以回忆你尝过的食物,回忆那种味道</p>
|
||
</li>
|
||
<li>
|
||
<p>慢慢睁开眼睛,</p>
|
||
</li>
|
||
<li>
|
||
<p>不去判断或想太多关于什么东西在那里或它们的目的是什么</p>
|
||
</li>
|
||
<li>
|
||
<p>可以尝试想象以第三视角,来观察你在这个环境中的样子</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p3-d10">P3-D10</h3>
|
||
<p>时长:10分钟 | 技能:身体扫描、感知 | 目标:巩固感知</p>
|
||
<ul>
|
||
<li>
|
||
<p>向内开始身体感知</p>
|
||
</li>
|
||
<li>
|
||
<p>向外开始视觉感知,焦点尽量广泛</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="p4-d1">P4-D1</h3>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2022/07/22/000000.html">习惯养成</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2022/07/22/000000.html" class="u-url"><time class="dt-published" datetime="2022-07-22 00:00:00 +0800">Jul 22, 2022</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>所有习惯均出自Fabulous app
|
||
建议一次培养一个新习惯</p>
|
||
<ol>
|
||
<li><!-- raw HTML omitted --><strong>每天起床喝一杯水</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>可以买个好看的水杯放床头</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>吃健康早餐</strong><!-- raw HTML omitted --></li>
|
||
</ol>
|
||
<ul>
|
||
<li>做好准备</li>
|
||
</ul>
|
||
<ol>
|
||
<li>去超市购买一周的能量早餐</li>
|
||
<li>放在显眼易得的地方</li>
|
||
<li>扔掉垃圾食物</li>
|
||
<li><!-- raw HTML omitted --><strong>运动</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>低强度运动:
|
||
<ol>
|
||
<li>快步走</li>
|
||
<li>随音乐跳舞</li>
|
||
<li>简单瑜伽</li>
|
||
<li>甩摆小型壶铃</li>
|
||
</ol>
|
||
</li>
|
||
<li>做好准备
|
||
<ol>
|
||
<li>前一晚就做好准备</li>
|
||
<li>5分钟即可,3天后可适当增加时间</li>
|
||
</ol>
|
||
</li>
|
||
<li>获得动力
|
||
1. 写下所有从最后一次运动中获得的正面的感受,即使是几个月前的事</li>
|
||
<li>设计你的锻炼环境</li>
|
||
<li>挂上您最喜欢的运动员的海报</li>
|
||
<li>开始写运动日志</li>
|
||
<li>参加当地的运动项目俱乐部或团队</li>
|
||
<li>多和锻炼的人交往</li>
|
||
<li>找到一个有意义的物品,让它成为您的锻炼图腾:这个物品会时刻提醒您要开始锻炼</li>
|
||
<li>创建属于自己的Sphere仪式
|
||
<ol>
|
||
<li>对着图腾说:我要去锻炼了,我感觉很棒!</li>
|
||
<li>戴上头戴式耳机</li>
|
||
<li>开始播放最喜欢的锻炼音乐</li>
|
||
<li>穿上跑鞋</li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>每天庆祝</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>完成每个习惯后立刻庆祝是很重要的,只有这样才可以把正面的后续情绪与行为习惯连接起来</li>
|
||
<li>庆祝方式最好难忘切激情,要把情绪融入其中</li>
|
||
<li>最重要的是感受那兴奋的快感在血液里流淌,感受快乐传遍全身</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>培养良好的睡眠习惯</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>睡前不接触任何的电子产品,让电子产品远离床</li>
|
||
<li>让卧室在睡眠的时间段里保持黑暗</li>
|
||
<li>记录任何让您烦躁,惊醒的声音,尝试消除/解决它,可利用白噪音、耳塞</li>
|
||
<li>在床上只做2件事,睡觉和性爱</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>以积极的眼光看待世界</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>快乐与否,取决于自己的态度,只有自己可以控制如何看待日常发生的事情</li>
|
||
<li>留意身边让您开心的事情,把这养成一种习惯</li>
|
||
<li>每天写下2件以上让您开心或者值得感恩的事情</li>
|
||
<li>不要记录在电脑里</li>
|
||
<li>买一本笔记本,认真选购,可以的话,每去一次异地就买一本,这样,笔记本就会有本身的故事</li>
|
||
<li>不要觉得写的很乱,写得没有意义,不要隐藏自己的情绪,宣泄出来,和你的朋友或者宠物分享您的快乐</li>
|
||
<li>持续3天以上,就能感觉有活力和精神,压力也会减少,睡得更好</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>冥想</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li><a href="%E5%86%A5%E6%83%B3%E8%AE%A1%E5%88%92.md">冥想计划</a></li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>自我鼓励</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>每天一起床,便对自己大声说“我今天感觉精力充沛,今天将会是美好的一天”</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>聚焦重要的任务</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>晨间</li>
|
||
<li>按ABC分3个优先级</li>
|
||
<li>筛选今天要做的最重要的3件A优先级的事</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted --><strong>设定目标并调整计划</strong><!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>设定目标 3个以内 (一次性行动)
|
||
<ol>
|
||
<li>问自己:为什么我想要完成它?
|
||
<ol>
|
||
<li>必须清楚了解自己的动机,以便之后迷失时,可以重燃欲望</li>
|
||
<li>比如,我想要做更多的运动,因为我觉得运动可以给予我能量应付社会生活。</li>
|
||
</ol>
|
||
</li>
|
||
<li>问:我需要做什么来达成目标
|
||
<ol>
|
||
<li>不需要立刻写下所有任务,但至少需要3项</li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li>检阅并调整计划 (每天下午或一定的周期)
|
||
<ol>
|
||
<li>每天结束,检阅并调整自己的计划
|
||
<ol>
|
||
<li>今天有什么任务没有完成?</li>
|
||
<li>我需要改变什么?</li>
|
||
<li>接下来的任务是什么?</li>
|
||
</ol>
|
||
</li>
|
||
<li>比如,原计划去健身房锻炼,但已经连续2天没去,正因为每天检阅计划,所以意识到,我没有充足的时间去健身房,最后调整为在家,跟随教程短时锻炼的教程来运动</li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted -->光辉时刻<!-- raw HTML omitted -->
|
||
<ol>
|
||
<li>作用: 锁定习惯,重新激活动力,防止放弃</li>
|
||
<li>每周末选一个固定时间,回忆锻炼所带来的美好回忆,成就感等,越形象越有效果</li>
|
||
<li>然后问自己,下周还要锻炼吗?当然要!</li>
|
||
</ol>
|
||
</li>
|
||
<li><!-- raw HTML omitted -->写日记<!-- raw HTML omitted --></li>
|
||
<li>写下3个当天的消极想法:“我太老/年轻“、”我不相信别人“</li>
|
||
</ol>
|
||
<ul>
|
||
<li>写下今天犯的错误,包括前因后果</li>
|
||
</ul>
|
||
<ol start="2">
|
||
<li>识别偏见</li>
|
||
<li>社会认同偏见</li>
|
||
</ol>
|
||
<ul>
|
||
<li>为了社会认同(形象/面子),而做出错误的决定</li>
|
||
</ul>
|
||
<ol start="2">
|
||
<li>短缺偏见</li>
|
||
</ol>
|
||
<ul>
|
||
<li>由于担心失去一些已经拥有的事物而高估它们的价值</li>
|
||
</ul>
|
||
<ol start="3">
|
||
<li>权威偏见</li>
|
||
</ol>
|
||
<ul>
|
||
<li>专家也会犯错,要寻求第二方案。</li>
|
||
</ul>
|
||
<ol start="4">
|
||
<li>对比偏见</li>
|
||
</ol>
|
||
<ul>
|
||
<li>基于其他选择比较另一个选择的好坏</li>
|
||
<li>一个糟糕的事物不会因为旁边的事物更糟糕而变得好一点</li>
|
||
</ul>
|
||
<ol start="5">
|
||
<li>爱/恨偏见</li>
|
||
</ol>
|
||
<ul>
|
||
<li>我们经常忽视了朋友的缺点以及敌人的优点</li>
|
||
<li>对于自己喜欢的球队,往往都信心十足。</li>
|
||
<li>写下一天中遇到的2-3个偏见,具体发生的场景和影响,然后写下相反的场景,描述如果及时识别出这个偏见,会发生什么事。</li>
|
||
<li>去商店买衣服,导购说这条裤子要脱销了(短缺偏见), 以至于我买下了根本不需要的裤子</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2021/12/10/tutorials.html">技术文档框架</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2021/12/10/tutorials.html" class="u-url"><time class="dt-published" datetime="2021-12-10 08:00:00 +0800">Dec 10, 2021</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>ref:: <a href="https://diataxis.fr">Technical Documentation Framework</a></p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/d92cf43106.jpg" alt=""></p>
|
||
<h3 id="教程tutorials通过一系列步骤来帮助学习者正确的开始类似教学">教程(tutorials):通过一系列步骤来帮助学习者正确的开始(类似教学)</h3>
|
||
<ul>
|
||
<li>学习导向</li>
|
||
<li>告知用户将取得的成就</li>
|
||
<li>确保用户获得同样的结果</li>
|
||
<li>确保用户立即看到结果,且结果是有意义的</li>
|
||
<li>教程可在不同的环境下复现</li>
|
||
<li>描述具体步骤,而不是抽象概念</li>
|
||
<li>仅提供最低限度的、必要的解释</li>
|
||
<li>忽略那些可能分心的选项和替代方案</li>
|
||
<li>语言框架</li>
|
||
<li><em>在本教程中,您将…</em></li>
|
||
<li>描述学员将完成什么(注意-不是:“您将学习…”)。</li>
|
||
<li><em>首先,做x。现在,做y。既然你做了y,就做z。</em></li>
|
||
<li>没有模糊或怀疑的余地。</li>
|
||
<li><em>在做y之前,我们必须总是做x,因为……(有关更多详细信息,请参阅解释)。</em></li>
|
||
<li>用尽可能基本的语言对行动进行最少的解释。链接到更详细的解释。</li>
|
||
<li><em>输出应该看起来像这样……</em></li>
|
||
<li>明确地向学员提供预期。</li>
|
||
<li><em>注意……记住……</em></li>
|
||
<li>给你的学习者提供充足的线索,以帮助确认他们走在正确的轨道上,并调整方向。</li>
|
||
<li><em>您已经制造了一个安全的三层透明稳态发动机……</em></li>
|
||
<li>描述(并钦佩,以温和的方式)你的学习者所取得的成就(注意-而不是:“你学会了……”)</li>
|
||
</ul>
|
||
<h3 id="操作指南how-to解决一个具体的问题实现特定的结果类似食谱">操作指南(how-to):解决一个具体的问题/实现特定的结果(类似食谱)</h3>
|
||
<ul>
|
||
<li>目标导向</li>
|
||
<li>不必从头开始,那是教程做的事</li>
|
||
<li>直观的标题《如何 xxx》</li>
|
||
<li>提供可实践的步骤/做法</li>
|
||
<li>注重结果,而非解释</li>
|
||
<li>实用可用性比完整性更有帮助</li>
|
||
<li>语言框架</li>
|
||
<li><em>本指南介绍如何…</em></li>
|
||
<li>清楚地描述要解决的问题。</li>
|
||
<li><em>如果你想要x,则做y。要实现w,则做z。</em></li>
|
||
<li>灵活。</li>
|
||
<li><em>有关选项的完整列表,请参阅x参考指南。</em></li>
|
||
<li>把概念解释交给参考指南,专注目标的实现。</li>
|
||
</ul>
|
||
<h3 id="参考reference技术描述类似wiki">参考(reference):技术描述(类似wiki)</h3>
|
||
<ul>
|
||
<li>信息导向</li>
|
||
<li>简洁有序权威,只戳重点</li>
|
||
<li>使用内容相关的结构,有助于理解</li>
|
||
<li>语言一致性</li>
|
||
<li>仅描述</li>
|
||
<li>提供实例</li>
|
||
<li>保持准确</li>
|
||
<li>语言框架</li>
|
||
<li><em>X是y的一个子函数。W需要使用z初始化。此选项可以做到这一点。</em></li>
|
||
<li>陈述有关选项及其行为。</li>
|
||
<li><em>子命令是:a、b、c、d、e、f。</em></li>
|
||
<li>列出命令、选项、操作、功能、标志、限制、错误消息等。</li>
|
||
<li><em>你必须使用a。除非c,否则您不得申请b。从来没有d。</em></li>
|
||
<li>酌情提供警告。</li>
|
||
</ul>
|
||
<h3 id="解释explanation澄清和阐明特定话题加深和拓宽读者对某主题的理解">解释(explanation):澄清和阐明特定话题,加深和拓宽读者对某主题的理解</h3>
|
||
<ul>
|
||
<li>理解导向</li>
|
||
<li>一种更轻松自由的思考某事的讨论方法。</li>
|
||
<li>已"关于"开头为标题</li>
|
||
<li>与相关的事物建立连接,编织理解网络</li>
|
||
<li>提供背景和具体例子</li>
|
||
<li>可讨论大局观/历史/选择、替代方案、可能性/为什么:原因和理由</li>
|
||
<li>避免提供指导做法或技术描述</li>
|
||
<li>语言框架</li>
|
||
<li><em>x的原因是,从历史上看,y…</em></li>
|
||
<li>解释一下。</li>
|
||
<li><em>W比z好,因为…</em></li>
|
||
<li>在适当的情况下提供判断甚至意见。</li>
|
||
<li><em>系统y中的x类似于系统z中的w。然而……</em></li>
|
||
<li>提供有助于读者的上下文。</li>
|
||
<li><em>一些用户更喜欢w(因为z)。这可能是一个好方法,但是…</em></li>
|
||
<li>权衡替代方案。</li>
|
||
<li><em>x与y交互如下:…</em></li>
|
||
<li>揭开内部秘密,以帮助理解为什么某物会这么做。</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2020/12/02/pkm.html">PKM探索</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2020/12/02/pkm.html" class="u-url"><time class="dt-published" datetime="2020-12-02 08:00:00 +0800">Dec 2, 2020</time></a>
|
||
|
||
<div class="e-content">
|
||
<h3 id="2023-02-24-一些不错的资源">2023-02-24 一些不错的资源</h3>
|
||
<ul>
|
||
<li>Effie软件的<a href="https://blog.effie.co">blog</a></li>
|
||
<li>一个由org-mode生成的静态网站:<a href="https://ag91.github.io">https://ag91.github.io</a>
|
||
我发现只要用了emacs,则TA的github大部分都是围绕elisp的代码,哈哈,看来emacs真的很折腾</li>
|
||
<li>一个可以保存为HTML的笔记软件<a href="https://noteship.com">Noteship</a>
|
||
仅有mac端,移动端还在开发,无法iCloud同步,订阅制</li>
|
||
<li>最原始的卡片笔记法的软件<a href="https://zettelkasten.de/the-archive/"><em>The Archive</em></a><br>
|
||
有点简陋感觉,很纯粹</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="2023-01-20-关于任务管理方法">2023-01-20 关于任务管理方法</h3>
|
||
<p>ref: <a href="https://www.bentomethod.com/bentomethod">About The Bento Method</a></p>
|
||
<ul>
|
||
<li>Pack: 抽取3个任务
|
||
<ul>
|
||
<li>小:简单的任务,比如清理email,归档文件等,15-30分钟</li>
|
||
<li>中:需要一半的精力,项目导向,邮件事件,发布博客,完成撰写等,45-60分钟</li>
|
||
<li>大:需要深度集中,交付成果,编写报告,视频编辑等,90+分钟</li>
|
||
</ul>
|
||
</li>
|
||
<li>Flow: 选择一种工作流
|
||
<ul>
|
||
<li>吃掉那只青蛙:大 -> 中 -> 小</li>
|
||
<li>攀登:中 -> 大 -> 小</li>
|
||
<li>慢热:小 -> 中 -> 大</li>
|
||
</ul>
|
||
</li>
|
||
<li>Focus: 一次只处理一个任务</li>
|
||
</ul>
|
||
<hr>
|
||
<h3 id="2022-12-21">2022-12-21</h3>
|
||
<p>唯一适合你的笔记系统,是随着你的使用慢慢形成的,然后在其过程中慢慢完善。
|
||
不要一开始就想构建一个完美的笔记系统,这注定会失败的,因为该系统不是在生产环境中锤炼出来的,所以一开始不要浪费时间和热情在构建上,而应该在使用中学习并构建,享受这段渐进式的过程。
|
||
现在开始创建您的Home笔记</p>
|
||
<hr>
|
||
<h3 id="2022-10-08">2022-10-08</h3>
|
||
<p>每一个笔记是一个点,2个关联的笔记是一条线,多条线即构成面,多个面构成体</p>
|
||
<p>那么如何找到一个体中的点呢,很显然,需要3个维度来定位,</p>
|
||
<p>这时就需要标签,定义笔记的3个维度(X状态,Y类型,Z类别)</p>
|
||
<p>每个维度的初级类别是固定的,初级类别的子类别不限制,根据需要添加</p>
|
||
<p>每个笔记,必须要有XYZ标签,数量不限制</p>
|
||
<p>该标签系统的目的:快速定位笔记,每个维度的边界清晰,没有打标签的压力</p>
|
||
<p>也可自行定义这3个维度(但要注意,每个维度的边界要清晰,这样才便于标签,没有压力)</p>
|
||
<p><strong>X-status</strong>:open, in_progress, on_hold, closed</p>
|
||
<p><strong>Y-type</strong>:goal, project, resource, archived</p>
|
||
<p><strong>Z-class</strong>:relationship, healthy, financial, career</p>
|
||
<p>新笔记默认是open, resource状态,type下的goal的子标签,对应class,即每个class都需要有个长期目标/终极目标</p>
|
||
<p>关于class的分类,可依据自己的情况做修改,不建议过多,3个左右的大类即可,</p>
|
||
<p>新笔记默认是open, resource状态,type下的goal的子标签,对应class,即每个class都需要有个长期目标/终极目标</p>
|
||
<p>关于class的分类,可依据自己的情况做修改,不建议过多,3个左右的大类即可,</p>
|
||
<p>不用怕分类过于粗糙,因为project下的笔记不会太多,且每个project笔记其实就是一条线,已经是一种变相汇总了</p>
|
||
<p>整个系统,包括笔记和标签,都是目标导向,</p>
|
||
<hr>
|
||
<h3 id="2022-08-24-1">2022-08-24 [^1]</h3>
|
||
<p>关于Daily jots,就照常,但每天要把归类相关内容,其他无法归类的,就放着,等待自动archive</p>
|
||
<hr>
|
||
<h3 id="2022-08-08making20it20all20workmd"><a href="Making%20It%20All%20Work.md">2022-08-08</a></h3>
|
||
<ul>
|
||
<li>
|
||
<p>在daily note里面的todo,需要移动到对应的project或者goal笔记下</p>
|
||
</li>
|
||
<li>
|
||
<p>~每个todolist,都要添加 | ,后面跟一个project笔记的双链,或者area的,不用拖到对应的笔记中,这样在backlinks上可以看到时间线~</p>
|
||
</li>
|
||
<li>
|
||
<p>每个todolist,都要添加截至日期</p>
|
||
</li>
|
||
<li>
|
||
<p>每天睡前回顾,清理,具体化todolist,安排明天要做的事</p>
|
||
</li>
|
||
</ul>
|
||
<p><a href="https://www.amplenote.com/notes/b4f32d78-16e8-11ed-86a6-5e3d8aa45f69">Tag</a>:4个维度</p>
|
||
<p>宏观维度:Project、Goal、Resource、Archive</p>
|
||
<p>客观维度:Family、Personal、Professional</p>
|
||
<p>执行维度:Now、Later、Maybe</p>
|
||
<p>优先级维度:Urgent、Important</p>
|
||
<p>Note:</p>
|
||
<p>至少2个tag:</p>
|
||
<ul>
|
||
<li>
|
||
<p>PGRA</p>
|
||
</li>
|
||
<li>
|
||
<p>FPP/subTab</p>
|
||
</li>
|
||
</ul>
|
||
<p>priority和do维度在Project下必须要有: <a href="Check%20Notes.md">Check Notes</a></p>
|
||
<p>每个笔记至少包含一个以上的areas和type tag</p>
|
||
<p>tag的使用方法:<a href="https://www.amplenote.com/help/double-bracket-note-link-syntax">Using double brackets for note creation or linking - Amplenote</a></p>
|
||
<hr>
|
||
<h3 id="2022-08-05">2022-08-05</h3>
|
||
<p>可以使用Rich Footnotes 来把daily note的初步想法整理到相关的笔记中</p>
|
||
<p>rich footnotes的内容为想法思路流水,即笔记中产生该结果的心理路程</p>
|
||
<hr>
|
||
<p>2022-08-04 [^2]</p>
|
||
<ul>
|
||
<li>
|
||
<p>直观更便捷,直觉性的方式来组织,减少不必要的脑力活动,不过多的进行内容评判标签化,以内容为核心</p>
|
||
</li>
|
||
<li>
|
||
<p>按照之前的官方流程图,Jots的作用是capture,Notes是整理,Task是计划优先级,Calendar是安排完成</p>
|
||
</li>
|
||
<li>
|
||
<p>如果每个标签的年笔记少于5个,则需要考虑该标签是否有必要存在</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<p>2022-07-27</p>
|
||
<hr>
|
||
<p>2022-07-22</p>
|
||
<p>还有邮件问题,一堆订阅的还没看。。。</p>
|
||
<p>其实生活中,大部分都是潜意识在做决定,所以要将日常routine培养成习惯,同时要每日回顾,目的是写入潜意识中</p>
|
||
<p>amplenote会把超过30天没有活动的笔记,自动archive,这个倒是还不错,逼迫你去整理输出,否则就是没用的。</p>
|
||
<p>task增加<a href="https://www.amplenote.com/notes/30dc6f44-0992-11ed-b96e-7eb08a2c5cd0">emoji</a>标识,加入❓表示疑问,无标识的则为正常的todo list</p>
|
||
<p><strong>如无必要,勿增实体(最小化原则)</strong>: 除非马上要用到,否则不要在系统中增加其他元素,比如添加的问号,很容易就想添加其他的标识,但,目前的系统中,没有必要增加除问号外的标识,因为目前的Task只有2种,已经可以明确分辨了,所以没必要再添加新的标识。</p>
|
||
<hr>
|
||
<p>2022-05-04 ~ 2022-06-18 使用Agenda app [^3]</p>
|
||
<p>没什么大用,留个记录</p>
|
||
<hr>
|
||
<p><strong>2022-05-04 NOTE</strong><br>
|
||
今天经朋友介绍,试用了一个新的app: <a href="https://www.amplenote.com/">Amplenote</a><br>
|
||
感觉挺好的,整体流程和我目前的体系大致相同,可以应用过来<br>
|
||
主要有4个模块:</p>
|
||
<ol>
|
||
<li>
|
||
<p>Jot - 类似Roam的Daily,自动汇总每日新增的笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>Notes - 所有笔记存放的地方,没有子分级,通过tag来细分</p>
|
||
</li>
|
||
<li>
|
||
<p>Tasks - 汇总所有笔记内的Task任务</p>
|
||
</li>
|
||
<li>
|
||
<p>Calendar - 顾名思义,安排日程的地方<br>
|
||
<strong>官方的流程体系:</strong><img src="https://versun.micro.blog/uploads/2024/99a844df6e.jpg" alt="">应用截图:</p>
|
||
</li>
|
||
<li>
|
||
<p>Jot<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/ade3cdff71.jpg" alt=""></p>
|
||
</li>
|
||
<li>
|
||
<p>Notes<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/6165a541c3.jpg" alt=""></p>
|
||
</li>
|
||
<li>
|
||
<p>Tasks<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/9bdabd2241.jpg" alt=""></p>
|
||
</li>
|
||
<li>
|
||
<p>Calendar<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/a8fec9fd5f.jpg" alt="">笔记同时支持双链和反链<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/d08f0210b5.jpg" alt=""><br>
|
||
<strong>2022-05-03 NOTE</strong><br>
|
||
记录目前的笔记结构(更精简了)<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/b9ffbe9c0b.jpg" alt="">PAR为笔记本形式,只有Archives是个组,方便后期整理笔记本<br>
|
||
整体更接近实际使用笔记本的直觉。</p>
|
||
</li>
|
||
</ol>
|
||
<hr>
|
||
<p><strong>2022-02-16 NOTE</strong><br>
|
||
其实,Resources和Areas可以合并,没必要分那么清楚,看个人喜好吧, <br>
|
||
比如,如果大类太多了,可以建立Areas来专门放些优先级更高的大类。</p>
|
||
<p>记录下目前笔记本的大类:<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/c7b75d9421.jpg" alt=""></p>
|
||
<hr>
|
||
<p><strong>2022-02-15 OUT</strong></p>
|
||
<h1 id="知识管理除了建立系统还要升级你的认知"><strong>知识管理,除了建立系统,还要升级你的认知</strong></h1>
|
||
<p>距离上一篇我还在使用Roam Research的文章,已经过去了2年,即使后来我回到了Evernote国际版,仍然没有相关的文章更新。<br>
|
||
主要因为在使用RR期间,有一件事让我发现了一个问题,虽然至今还未完全解决该问题,但这引发了我对于知识管理的新的探索,<br>
|
||
该问题也让我明白,在知识管理领域,自认为有资格,其实我刚刚入门。<br>
|
||
因此在长达2年的时间里,我没有输出任何关于知识管理的文章,生怕误导他人。</p>
|
||
<p>具体的心理历程,大家可以查看我分享的Evernote笔记,可能需要科学上网。<br>
|
||
<a href="https://www.evernote.com/shard/s482/sh/fdde1865-4e95-e6bd-12dc-260746b9a306/af1c14c4143f3302f1eb723e8c047509">PKM (Personal knowledge management)</a><br>
|
||
这篇文章也只是该笔记的一个产出,同时也是我目前使用的知识管理流程的一个缩影。</p>
|
||
<p>好的,开始。<br>
|
||
先说下我遇到的问题,记录在2021年12月18号的一个卡片上,如下截图:<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/9f80d9c458.jpg" alt="">虽然后来我搜索出来了,但已经浪费了大量时间在整理和收集曾经整理过的资料。<br>
|
||
我发现,<strong>该问题产生的原因之一,是由于太过依赖强大的双链笔记的自动化,所谓成也萧何,败也萧何。</strong></p>
|
||
<p>曾经看过玉树芝兰老师的一篇文章,说的就是在RR上产生了大量的笔记后,即使有双链,依旧会出现无法搜索到需要的笔记。<br>
|
||
然后文章内有一学者的解决方法是:手动双链。。</p>
|
||
<p>看似双链功能解决了搜索笔记的问题,其实并没有。<br>
|
||
双链的理念是,尽可能让所有的笔记之间产生联系,上下都有钩子,也就是卢曼的卡片笔记一样,一张卡片能不断的勾出其他卡片,形成一个体系。<br>
|
||
<strong>其实,双链笔记软件没有错,它也成功的完成了它的工作,错的是,这个钩子只属于软件本身,并没有在我们的大脑里产生任何影响。</strong><br>
|
||
因为太简单了,只需要输入“ [[ ”即可,以至于钩子太多,我们再一次迷失在自己的笔记中。</p>
|
||
<p>因此,我选择回归到印象笔记,不过,这次,我选择的是Evernote国际版<br>
|
||
理由如下:</p>
|
||
<ul>
|
||
<li>
|
||
<p>稳定。这真的很重要,截至2022年2月16日,除了Evernote,onenote,notion,其他笔记软件,真没这三个稳定,包括我以为已经很稳定的wolai….</p>
|
||
</li>
|
||
<li>
|
||
<p>我需要强制自己慎重手动双链,来增加印象,如非必要,不会建立关联 (底气来自于<strong>一页日期式笔记</strong>的优点,可查看上面分享的Evernote笔记。)</p>
|
||
</li>
|
||
<li>
|
||
<p>国际版的web应用, 不像印象笔记的web应用那样残废,功能和客户端一致,让我可以在Linux下顺利使用。</p>
|
||
</li>
|
||
<li>
|
||
<p>国际版团队对于新功能的添加,很谨慎,非主要功能,都是适可而止。</p>
|
||
</li>
|
||
<li>
|
||
<p>Evernote被人吐槽最多的,比如笔记本无法多层级,笔记内的列表无法折叠展开,对于我来说反而是优点,是最像实体笔记本的体现。</p>
|
||
<ul>
|
||
<li>
|
||
<p>多层级功能会让我一直想去分类,导致一些笔记越藏越深,同时也会增加整理笔记的精神压力。</p>
|
||
</li>
|
||
<li>
|
||
<p>列表折叠,对于我来说,全部显示,可以让我更快的浏览相关笔记,而不会忽略掉那些折叠起来的列表,同时也会督促我简化笔记,而不是长篇的列表。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>国际版的任务和提醒功能和笔记的互动恰到好处</p>
|
||
</li>
|
||
<li>
|
||
<p>搜索功能强大且准确,不仅能搜索笔记内容,还能搜索图片和文档中的文字,还有相关的搜索语法可用。</p>
|
||
</li>
|
||
<li>
|
||
<p>还有个小细节,笔记列表可以按卡片形式显示,会显示顶部的摘要和首张图片,便于快速浏览。</p>
|
||
<ul>
|
||
<li>
|
||
<p>就这么一个小功能,其实在卡片笔记法中,是很重要的,因为在众多笔记中,如果要建立链接或者查找,有标题和摘要肯定要优与仅仅一行标题的</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/350241d524.jpg" alt=""></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>回到标题,“知识管理,除了建立系统,还要升级你的认知”<br>
|
||
<strong>展开来说,知识管理,不仅仅只是建立软件系统,还要为你的认知建立对应的系统,然后融入到你的工作/生活的流程中。</strong><br>
|
||
“重点是人,而不是工具” <br>
|
||
看似简单的一句话,其实很深刻。</p>
|
||
<p>目前已经使用Evernote国际版了近一年,新旧笔记转移也很顺利,印象笔记导出到Evernote是无痛的,RR笔记导出文本,除了样式丢失,其他也无大碍。</p>
|
||
<p>如果对我的整个PKM系统感兴趣的,可以留个言,我抽空写下我的整个流程。<br>
|
||
着急的话,也可以查看上面分享的<a href="https://www.evernote.com/shard/s482/client/snv?noteGuid=fdde1865-4e95-e6bd-12dc-260746b9a306&noteKey=af1c14c4143f3302f1eb723e8c047509&sn=https%3A%2F%2Fwww.evernote.com%2Fshard%2Fs482%2Fsh%2Ffdde1865-4e95-e6bd-12dc-260746b9a306%2Faf1c14c4143f3302f1eb723e8c047509&title=PKM%2B%2528Personal%2Bknowledge%2Bmanagement%2529">笔记</a>,也能一窥全貌。</p>
|
||
<p>注意:笔记中很多Reference参考链接,由于都是私人收集在cubox中,因此可能打不开。</p>
|
||
<hr>
|
||
<p><strong>2022-02-14 NOTE</strong><br>
|
||
关于卢曼的卡片笔记,卢曼的唯一目标是关于社会学,因此永久笔记里面,都有一个大的主题相关性,即社会学相关,因此无需分类,<br>
|
||
但是如果个人使用的话,若要all in one,则会出现很多不同类别的笔记,因此<strong>仍然需要分大类(利用PARA)</strong></p>
|
||
<p><strong>Reference</strong>: <a href="https://cubox.pro/share/SGB1bn">卢曼的卡片笔记编号是时代限制,在电子笔记下是不必要的</a><br>
|
||
Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
<ul>
|
||
<li>但如果在电子笔记上使用,则<strong>无需编码</strong>,因为可以随心更改 并且可以使用超链接/双链,但需要有更改记录来回溯**(一页日期式)** 和 tag</li>
|
||
</ul>
|
||
<p>Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
<ul>
|
||
<li>个人认为并不需要,因为笔记软件的搜索功能,相对于卡片更加强大,同时<strong>一页日期式</strong>类似于卡片,也能达到原子性,还兼顾回溯。</li>
|
||
</ul>
|
||
<p>综上,简化后,针对电子笔记改良后,<strong>目前使用到的理论方法</strong>如下:</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>卢曼卡片笔记写作法理念</strong></p>
|
||
<ul>
|
||
<li>
|
||
<p>阅读学习后要及时转述输出</p>
|
||
</li>
|
||
<li>
|
||
<p>要和旧知识建立联系</p>
|
||
</li>
|
||
<li>
|
||
<p>只分大类,其他小类用tag标记,或者直接使用内容本身,不设置tag</p>
|
||
</li>
|
||
<li>
|
||
<p>手动链接比自动链接效果更好</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>渐近式阅读</strong></p>
|
||
</li>
|
||
<li>
|
||
<p><strong>一页日期式</strong></p>
|
||
</li>
|
||
<li>
|
||
<p><strong>PARA</strong><br>
|
||
<strong>PARA为大框架,内部使用卢曼的理念来组织笔记</strong></p>
|
||
</li>
|
||
</ul>
|
||
<p>关于一页日期式的补充<br>
|
||
日期下标格式:日期 动作(new, add, delete)<br>
|
||
卡片日期格式:日期 动(NOTE, OUT)</p>
|
||
<p><strong>Reference</strong>: <a href="https://niklas-luhmann-archiv.de/bestand/zettelkasten/inhaltsuebersicht">尼克拉斯·卢曼档案馆 (niklas-luhmann-archiv.de)</a></p>
|
||
<p>间隙日记法 Reference: wolai模板</p>
|
||
<hr>
|
||
<p><strong>2022-01-13 NOTE</strong><br>
|
||
技术类的书籍,概念转述,可以检测你是否真的理解这个概念</p>
|
||
<hr>
|
||
<p><strong>2022-01-12 NOTE</strong></p>
|
||
<h2 id="pkm系统"><strong>PKM系统</strong></h2>
|
||
<p><strong>工具</strong>:Cubox, Evernote<br>
|
||
<strong>方法论</strong>:标签,CIPARA,渐进式总结法<br>
|
||
<strong>书籍</strong>:《卡片笔记写作法》<br>
|
||
<strong>CIRAPA:</strong></p>
|
||
<ul>
|
||
<li>
|
||
<p>**Collection(收集):所有信息的入口。**判断阅读信息价值,临时性的,定期来进行归档、整理或者删除。可以当做大脑的缓存,避免记录的时候纠结放在哪里。</p>
|
||
</li>
|
||
<li>
|
||
<p>**Inbox(收件箱):**阅读,学习,抽取信息,但不产出</p>
|
||
<ul>
|
||
<li><strong>临时笔记</strong></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>Resources(资源):自己消化过的内容,创作的东西</strong>,创建卡片的初步状态,记录卡片的来源。</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>文献笔记</strong> 未建立链接的笔记2022-02-14 add</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>永久笔记</strong> 没有适合的领域/类别2022-02-14 add</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**Areas(领域)(Pre-Projects):**即日常你需要精进的「领域」,比如健康就是一个领域,而跑步则是项目;写作是一个领域,而写一篇公众号文章则是一个项目;</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>永久笔记</strong> 可放在大类里</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>你要提升的领域或技能</strong> 2022-01-13 new</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>没有成体系或初步计划的,不能放在这里,只能在Resources里面</strong> 2022-01-13 new | 2022-02-14 delete</p>
|
||
</li>
|
||
<li>
|
||
<p>还有你想精进的领域,比如健身,网络安全员2022-02-14 delete</p>
|
||
</li>
|
||
<li>
|
||
<p>其他均放在Resource里</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>Projects(项目)</strong>:是指一个将要发生的独立事件,并且这个事件不是一次性就能完成的,至少需要多个动作才能完成。比如要写一本书,需要整理资料,罗列提纲,撰写内容,联系出版社。类似生活中还有组织一次旅游,录制一期播客等。</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>项目笔记</strong></p>
|
||
</li>
|
||
<li>
|
||
<p><strong>来源于Areas</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>有结束时间的</p>
|
||
</li>
|
||
<li>
|
||
<p>永久笔记的价值产出</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**Archives(仓库)**完成的Project和废弃的Project,所有的文件文档,包括非自主创作的笔记都存到这里。</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>流程 2022-02-14 add delete</strong><br>
|
||
[收集]—> 所有内容,比如待阅读的文章,日常的速记等<br>
|
||
<strong>Cubox[L1:高亮]</strong> 筛选有用的文章,并高亮重点内容;速记可筛选后直接放入Resources<br>
|
||
-–[导出L1]—> 将高亮内容导出到笔记软件的Inbox <br>
|
||
<strong>Inbox[L2、L3:加粗、高亮]</strong> 完成L1加粗和L2高亮<br>
|
||
-–[移动]—> 感觉理解其内容,可开始转述<br>
|
||
<strong>Resources[L4:转述/感想]</strong> 时常回顾,让笔记在这里等待发酵,产生感悟/想法,可分大类<br>
|
||
-–[创建/移动并关联永久笔记]—> 有自己领域相关的,或者成体系的,可移动到该区域。<br>
|
||
<strong>Areas[L4、L5:感悟、成体系]</strong> <br>
|
||
-–[创建项目笔记]—> 输出并产生价值/影响<br>
|
||
<strong>Projects[L5]</strong> <br>
|
||
-–[移动笔记]—><br>
|
||
<strong>Archives</strong> 完成的项目,不建议更改,如需更改可在上面区域中建立新的笔记来关联到这里</p>
|
||
<p>但该流程并非固定,随机应变,重要的是留下你的想法。</p>
|
||
<p><strong>References:</strong><a href="https://cubox.pro/share/lGkRna">实践卡片笔记法 - flomo</a><br>
|
||
对笔记的存放可以不局限于主题分类,而是要从笔记内容,以及未来可能的创作主题方向考虑,对笔记进行标签化管理,这样才能最大化我们的创作思路<br>
|
||
信赖自己的感觉,专注于那些让你有很多思考的知识。不要总担心错过重要的知识,硬着头皮去啃很多自己还没有满足先前条件的知识。[增量阅读]<br>
|
||
现在每天好的知识应接不暇,挑自己正需要的学习就好(学起来特别快),其它的如果真正重要以后总会有机会遇见的。</p>
|
||
<ul>
|
||
<li>
|
||
<p>少分类,少标签,让内容成为索引</p>
|
||
</li>
|
||
<li>
|
||
<p>相信直觉,勿硬啃,学会增量阅读</p>
|
||
</li>
|
||
<li>
|
||
<p>够用主义,学需要的,勿焦虑,会有机会再相遇<br>
|
||
<strong>References:</strong> <a href="https://cubox.pro/share/qXgpp6">渐进式总结2</a><br>
|
||
Here’s the crucial thing to understand: I don’t summarize notes on any sort of schedule, in any particular order, or as a part of a workflow. I summarize them completely opportunistically when I’m already reviewing the note for some other purpose anyway.<br>
|
||
我不会以任何形式的时间表、任何特定的顺序或流程的来总结笔记。并不是所有笔记都需要L4的总结,交给时间,当我因为某种原因再次看到该笔记时,时机合适时,自然会需要一个总结,相信直觉。<br>
|
||
Current Self can’t afford to do big, heavy lifts meticulously organizing hundreds of notes upfront.<br>
|
||
我们谁也负担不起精心组织数百个笔记的重大工作<br>
|
||
Progressive Summarization is really a method for creating value in an environment of uncertainty. You do concrete, relatively easy work now instead of speculative, difficult work for later. You pull time-consuming, but risk-free activities (reading, highlighting, summarizing) as early in time as possible, and push quick but risky activities (execution, decision making, delivery) as far into the future as possible. This way, you have all the ammunition you need ready and waiting at a moment’s notice, while waiting until the eve of battle to decide which target to attack.<br>
|
||
渐进式总结实际上是一种在不确定的环境中创造价值的方法。你现在做具体的、相对容易的工作,而不是以后投机的、困难的工作。您尽可能早地执行耗时但无风险的活动(L1阅读、L2突出显示、L34总结),并将快速但有风险的活动(执行、决策制定、交付)推向尽可能远的未来。这样,您就可以随时准备好所需的所有弹药并等待通知,同时等到战斗前夕决定攻击哪个目标。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>每次阅读或新建卡片,都进行简单的渐进式总结,之后不用阅读全篇笔记,只看它阅读的层数,就知道该卡片的重要性</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>离散的笔记并不可怕,可怕的是没有留下你的思绪</p>
|
||
</li>
|
||
<li>
|
||
<p>所有笔记都是弹药,等有目标了就可以攻击了。</p>
|
||
</li>
|
||
<li>
|
||
<p>笔记重要的是记录,而不是笔记在哪里</p>
|
||
</li>
|
||
</ul>
|
||
<p>Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
<ul>
|
||
<li>
|
||
<p>想法:放入Cubox?放在<strong>References</strong>上应该不错</p>
|
||
</li>
|
||
<li>
|
||
<p>结果:</p>
|
||
<ul>
|
||
<li>
|
||
<p>放入Cubox,然后用自己的语言归纳,把cubox深度链接放在<strong>References</strong>上</p>
|
||
</li>
|
||
<li>
|
||
<p>来不及归纳的,或者值得深入学习的,全文复制到Inbox</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>| 步骤<br>
|
||
| 归属<br>
|
||
| 渐进层<br>
|
||
| 笔记类型<br>
|
||
| 动作<br>
|
||
| 下一步的条件<br>
|
||
|<br>
|
||
| 1<br>
|
||
| Collection<br>
|
||
| L1: Note<br>
|
||
L2: Bold passages<br>
|
||
| 收集<br>
|
||
|</p>
|
||
<ol>
|
||
<li>
|
||
<p>导入Cubox</p>
|
||
</li>
|
||
<li>
|
||
<p>等待回顾</p>
|
||
</li>
|
||
<li>
|
||
<p>判断阅读信息价值</p>
|
||
</li>
|
||
<li>
|
||
<p>标注 L1<br>
|
||
| 值得学习的,或者觉得有必要开始渐进式学习的<br>
|
||
|<br>
|
||
| 2<br>
|
||
| Inbox<br>
|
||
| L2: Bold passages<br>
|
||
L3: Highlighted passages<br>
|
||
| 临时笔记<br>
|
||
|</p>
|
||
</li>
|
||
<li>
|
||
<p>建立卡片</p>
|
||
</li>
|
||
<li>
|
||
<p>全文复制 / 复制相关文章的摘要 从Cubox复制标注2022-02-14 delete new</p>
|
||
</li>
|
||
<li>
|
||
<p>加粗标注和新的关注点<br>
|
||
| 值得继续学习<br>
|
||
|<br>
|
||
| 3<br>
|
||
| Resources<br>
|
||
| L4: Mini-summary<br>
|
||
| 文献笔记<br>
|
||
永久笔记<br>
|
||
|</p>
|
||
</li>
|
||
<li>
|
||
<p>对加粗的内容,选择重点进行高亮</p>
|
||
</li>
|
||
<li>
|
||
<p>可进行<strong>转述,<strong>添加自己的</strong>感悟小结</strong>等</p>
|
||
</li>
|
||
<li>
|
||
<p>等待时机,可进行总结<br>
|
||
| 有邻域项目需要关联/链接<br>
|
||
创建新的邻域项目<br>
|
||
|<br>
|
||
| 4<br>
|
||
| Areas<br>
|
||
| L5: Remix<br>
|
||
| 永久笔记<br>
|
||
|</p>
|
||
</li>
|
||
<li>
|
||
<p>创建笔记,关联Resources中的多个笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>建立目标,可初步计划</p>
|
||
</li>
|
||
<li>
|
||
<p>进行<strong>深度思考、整合</strong><br>
|
||
随着永久笔记的增加,你将会越来越精进该领域,继而成为专家/高手<br>
|
||
| 为了完成目标,建立有期限的小目标<br>
|
||
|<br>
|
||
| 5<br>
|
||
| Projects<br>
|
||
| L5: Remix<br>
|
||
| 项目笔记<br>
|
||
|</p>
|
||
</li>
|
||
<li>
|
||
<p>创建笔记,关联Areas中的单个或多个笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>建立目标和期限,指定详细计划</p>
|
||
</li>
|
||
<li>
|
||
<p>开始执行<br>
|
||
| <br>
|
||
|<br>
|
||
| 6<br>
|
||
| Archives<br>
|
||
| <br>
|
||
| 归档<br>
|
||
|</p>
|
||
</li>
|
||
<li>
|
||
<p>将完成或失败或暂停的Projects中的项目移过来<br>
|
||
| 恢复 / 重启 <br>
|
||
|</p>
|
||
</li>
|
||
</ol>
|
||
<p>流程实施范例1:<br>
|
||
<strong>Reference</strong>: <br>
|
||
<a href="https://www.evernote.com/shard/s204/client/snv?noteGuid=f1de99c2-da59-4c18-90be-733ec2ab7a70&noteKey=b860228632c28869&sn=https%3A%2F%2Fwww.evernote.com%2Fshard%2Fs204%2Fsh%2Ff1de99c2-da59-4c18-90be-733ec2ab7a70%2Fb860228632c28869&title=The%2BRace%2B%2528Eliyahu%2BM.%2BGoldratt%252C%2BRobert%2BFox%2529%2Bnotes">The Race (Eliyahu M. Goldratt, Robert Fox) notes</a><br>
|
||
<a href="https://cubox.pro/share/eUyi9u">第二个大脑案例研究:婴儿的睡眠训练</a></p>
|
||
<ol>
|
||
<li>Collection</li>
|
||
</ol>
|
||
<ul>
|
||
<li>
|
||
<p>比如看到一篇文章,值得收藏或稍后阅读,则加入Cubox</p>
|
||
</li>
|
||
<li>
|
||
<p>每天定时定量的去Cubox阅读信息,判断其价值,做好相关标注</p>
|
||
</li>
|
||
<li>
|
||
<p>Inbox,L1,L2</p>
|
||
</li>
|
||
<li>
|
||
<p>如果发现某篇文章值得深入学习,则全文复制到Evernote:Inbox中,开始渐进式阅读,并添加提醒,日期选一个(明天,2天,1周),添加Reference</p>
|
||
</li>
|
||
<li>
|
||
<p>如果发现积累的相关文章值得为此做些笔记,则在Evernote:Inbox创建笔记,复制相关文章已<strong>标注</strong>的内容,添加Reference,并添加提醒,日期选一个(明天,2天,1周)</p>
|
||
</li>
|
||
<li>
|
||
<p>按提醒回顾笔记,如果需要进一步学习,则移入Resources</p>
|
||
</li>
|
||
<li>
|
||
<p>Resources,L3,L4</p>
|
||
</li>
|
||
<li>
|
||
<p>高亮并<strong>在当前卡片进行精准转述</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>添加Alert,日期选一个(明天,2天,1周)</p>
|
||
<ul>
|
||
<li>定期回顾,添加感悟小结等</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Areas,L5</p>
|
||
</li>
|
||
<li>
|
||
<p>创建 / 整合 / 双链 Resources中的笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>预备项目制,初步计划</p>
|
||
</li>
|
||
<li>
|
||
<p>添加Alert,可自定义时间</p>
|
||
</li>
|
||
<li>
|
||
<p>Projects,L5</p>
|
||
</li>
|
||
<li>
|
||
<p>等待时机,从Areas中分离出一个小项目</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>卡片笔记可选要素:</strong><br>
|
||
<strong>Title:</strong><br>
|
||
<strong>Tags:</strong><br>
|
||
<strong>Date:</strong><br>
|
||
<strong>Body: 笔记内容</strong><br>
|
||
<strong>Links: 双链接 [印象笔记应用内链接]</strong><br>
|
||
<strong>*Citation: 引用 [某个笔记内的某段内容]</strong><br>
|
||
<strong>References: Cubox深度链接和其他相关链接</strong><br>
|
||
<strong>Alert: 伪随机</strong><br>
|
||
Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
<ul>
|
||
<li>
|
||
<p>想法:搜索相关的关键字,链接所有笔记?</p>
|
||
</li>
|
||
<li>
|
||
<p>结果:按流程,Resource里的链接到Areas中,常提醒回顾,手动链接<br>
|
||
Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
</li>
|
||
<li>
|
||
<p>想法:目前这种方法就不错,就是搜索可能不友好</p>
|
||
</li>
|
||
<li>
|
||
<p>结果:设置为任务<br>
|
||
Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
</li>
|
||
<li>
|
||
<p>想法:一页式是为了方便追溯,但不方便双链接,也不符合信息粒度最小的卡片要求。</p>
|
||
<ul>
|
||
<li>
|
||
<p>不采取一页式</p>
|
||
<ul>
|
||
<li>
|
||
<p>优点</p>
|
||
<ul>
|
||
<li>
|
||
<p>便于搜索</p>
|
||
</li>
|
||
<li>
|
||
<p>便于双链接</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>缺点</p>
|
||
<ul>
|
||
<li>卡片过多,无法全局浏览,需点击卡片进入</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>解决方法</p>
|
||
<ul>
|
||
<li>
|
||
<p>可按创建时间排列,解决追溯问题</p>
|
||
</li>
|
||
<li>
|
||
<p>可适当合并笔记,来全局浏览</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>一页式</p>
|
||
<ul>
|
||
<li>
|
||
<p>优点</p>
|
||
<ul>
|
||
<li>
|
||
<p>全局浏览</p>
|
||
</li>
|
||
<li>
|
||
<p>可追溯</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>缺点</p>
|
||
<ul>
|
||
<li>
|
||
<p>搜索不友好</p>
|
||
</li>
|
||
<li>
|
||
<p>不方便双链接</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>解决方法</p>
|
||
<ul>
|
||
<li>可以添加日期来链接特定卡片</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>结果:不采取一页式,可适当合并笔记,来全局浏览</p>
|
||
<ul>
|
||
<li>采取一页式,日期卡片,便于回顾总结输出</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p><strong>References:</strong><br>
|
||
<a href="https://cubox.pro/share/jSSVkG">《卡片笔记写作法》:详解卢曼卡片笔记法,升级你的知识管理系统</a></p>
|
||
<hr>
|
||
<p><strong>2021-04-25 NOTE</strong></p>
|
||
<h3 id="关于双链笔记和碎片化学习的感悟">关于双链笔记和碎片化学习的感悟</h3>
|
||
<p>碎片化学习的前提是,成体系</p>
|
||
<p>我最近遇到过一种情况,看到一文章或者一知识点,很感兴趣,然后谷歌知乎各种了解学习,最后整理的时候,发现很早以前发现过,只不过关键词不是同一个,然后我就陷入思考,这感觉似曾相识,为啥用双链还解决不了这个问题,所以根本原因是什么?</p>
|
||
<p>Content not supported<br>
|
||
This block is a placeholder for Tasks, which has been officially released on the newest version of Evernote and is no longer supported on this version. Deleting or moving this block may cause unexpected behavior in newer versions of Evernote.</p>
|
||
<ul>
|
||
<li>
|
||
<p>手动双链</p>
|
||
</li>
|
||
<li>
|
||
<p>一页日期式</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2021-04-22 NOTE</strong></p>
|
||
<h3 id="渐进式总结法">渐进式总结法</h3>
|
||
<p><strong>References</strong>:<br>
|
||
<a href="https://cubox.pro/share/iFdnuo">渐进式总结1</a><br>
|
||
<a href="https://cubox.pro/share/qXgpp6">渐进式总结2</a><br>
|
||
L1: Note<br>
|
||
L2: Bold passages,加粗你认为重要的内容<br>
|
||
L3: Highlighted passages,从加粗的内容中,高亮你认为核心的内容<br>
|
||
L4: Mini-summary,写局部或整篇的小结/感悟/想法<br>
|
||
L5: Remix<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/321f422791.jpg" alt=""></p>
|
||
<hr>
|
||
<p><strong>2021-04-07 OUT</strong></p>
|
||
<h1 id="笔记应用的选择请谨慎勿盲目"><strong>笔记应用的选择,请谨慎,勿盲目</strong></h1>
|
||
<p>最近收到很多的私信,有的询问哪一个笔记系统好用,哪种功能多,怎样才能充分发挥它的作用。</p>
|
||
<p>对此,我一直无法给到明确的答案,我在想<br>
|
||
我们是否本末倒置了,很多人为了某种功能,而去创造满足该功能的需求,而不是为了自己的需求,去选择某个应用。</p>
|
||
<p>日常生活中,这种情况其实很常见,比如很多人喜欢逛淘宝,看到某种很稀奇,或者很便宜的东西,那么就会先入为主,想象在哪里可以用到它。</p>
|
||
<p>所以,如果你对于笔记应用的选择或者说某种功能的使用方法存在疑惑的话,我的建议是,<br>
|
||
先确定你的真实需求,可能你只是想记录而已,并不需要其他看似酷炫的功能。</p>
|
||
<p>还有一种可能,那就是你的笔记类型或者数量,在使用某种功能时达不到理想的效果,就像roam research的双链接功能,需要笔记达到一定数量的情况下,才能发挥它的作用。</p>
|
||
<p>如果你的需求就是简单的记录或者想开始建立自己的笔记系统的话,我的建议是,选择一款简单,易导出,全平台的笔记应用,其他不要考虑太多,重要的是马上开始记录。印象笔记,notion,workflowy,石墨等都可以。<br>
|
||
往往只有在开始记录的情况下,真实需求才会慢慢显现出来。</p>
|
||
<p>如果你在考虑要不要转到另一个笔记应用时,建议你先不要转移笔记,先开始使用它,过一段时间再考察看看是否适合,到时再决定也不迟。<br>
|
||
如果你仍旧在几个笔记应用之间纠结的话,我建议马上开始去使用它们,每个应用使用一周左右,然后选择用的最舒服的即可。<br>
|
||
记住,</p>
|
||
<p>千万不要想着选择一次就能终身使用,工具会随着需求的变化而变化。<br>
|
||
千万不要等万事俱备了再开始记录,很多需求或者问题是实践出来的,而不是想出来的。</p>
|
||
<hr>
|
||
<p><strong>2020-12-14 OUT</strong></p>
|
||
<h1 id="如何高效使用roam-research"><strong>如何高效使用Roam Research</strong></h1>
|
||
<ul>
|
||
<li>
|
||
<p>我的笔记系统目标</p>
|
||
<ul>
|
||
<li>
|
||
<p>简单,高效,灵活: 工具要简单,流程要简单,专注于笔记,而不是繁杂的流程</p>
|
||
</li>
|
||
<li>
|
||
<p>通用,跨平台: 随时随地,都可以记录</p>
|
||
</li>
|
||
<li>
|
||
<p>结果导向: 笔记要可跟踪,有进度,做到心里有数</p>
|
||
</li>
|
||
<li>
|
||
<p>模块化: 最大限度的降低因流程更新带来的变动</p>
|
||
</li>
|
||
<li>
|
||
<p>弹性省时: 时间是最重要的, 该系统对于时间要求最低,不能为了维护该系统而花费大量时间,也不能因为没有时间维护,而导致系统崩溃</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>使用的工具</p>
|
||
<ul>
|
||
<li>
|
||
<p>双链接笔记(选一即可,我目前用的是RR)</p>
|
||
<ul>
|
||
<li>
|
||
<p>Roam Research</p>
|
||
<ul>
|
||
<li>
|
||
<p>使用的第三款双链接笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>胜在操作逻辑和细节</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Obsidian</p>
|
||
<ul>
|
||
<li>
|
||
<p>这是我使用的第一款双链接笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>试用了一个月</p>
|
||
</li>
|
||
<li>
|
||
<p>很多细节和操作有点非人性化</p>
|
||
</li>
|
||
<li>
|
||
<p>无法顺畅使用</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Logseq</p>
|
||
<ul>
|
||
<li>
|
||
<p>使用的第二款双链接笔记</p>
|
||
</li>
|
||
<li>
|
||
<p>试用了一周</p>
|
||
</li>
|
||
<li>
|
||
<p>体验很不错, 利用github这个理念很好, 但是很不稳定, 试用两天丢了两次数据, 一次中文乱码</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>RoamEdit(UI操作有点怪,没有继续试用)</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>手机备忘录</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>基本概念介绍</p>
|
||
<ul>
|
||
<li>
|
||
<p>以PARA理念为主, 同时每个笔记尽量遵循卡片笔记的理念</p>
|
||
</li>
|
||
<li>
|
||
<p>P : Projects 项目</p>
|
||
<ul>
|
||
<li>
|
||
<p>作用:结果导向,清晰的进度,详细的步骤,有截止时间</p>
|
||
</li>
|
||
<li>
|
||
<p>来源:细分自areas</p>
|
||
</li>
|
||
<li>
|
||
<p>特点</p>
|
||
<ul>
|
||
<li>有目标和deadline</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>比如:写一篇关于para的博客;确定产品规格;参加会议</p>
|
||
</li>
|
||
<li>
|
||
<p>笔记模板:</p>
|
||
<ul>
|
||
<li>
|
||
<p>tag: 所属的区域,区域内的项目名,其他相关tag</p>
|
||
</li>
|
||
<li>
|
||
<p>目标:</p>
|
||
</li>
|
||
<li>
|
||
<p>截止日期:</p>
|
||
</li>
|
||
<li>
|
||
<p>进度:</p>
|
||
</li>
|
||
<li>
|
||
<p>截图<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/ea4a5711ac.jpg" alt=""> - 正在进行的子项目,记得加上TODO</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>A : Areas 领域</p>
|
||
<ul>
|
||
<li>
|
||
<p>作用:标准化某一个领域或者角色</p>
|
||
</li>
|
||
<li>
|
||
<p>来源:整合自resource</p>
|
||
</li>
|
||
<li>
|
||
<p>特点:</p>
|
||
<ul>
|
||
<li>
|
||
<p>没有时间限制,持续性</p>
|
||
</li>
|
||
<li>
|
||
<p>个人的角色或者近期的兴趣</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>比如:健康;财务;编程;英语;朋友;写作;运动;</p>
|
||
</li>
|
||
<li>
|
||
<p>模板:</p>
|
||
<ul>
|
||
<li>tag:</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>R : resources 资源</p>
|
||
<ul>
|
||
<li>
|
||
<p>作用:资源库,素材库</p>
|
||
</li>
|
||
<li>
|
||
<p>来源:每日笔记, 每个笔记默认都是在这里面的(需要加标签)</p>
|
||
</li>
|
||
<li>
|
||
<p>特点:感想,灵感,突然感兴趣但不准备长期的东西,拿不准的东西,不确定的</p>
|
||
</li>
|
||
<li>
|
||
<p>比如:咖啡;音乐;营销;设计;宠物;音乐;营销;</p>
|
||
</li>
|
||
<li>
|
||
<p>模板:</p>
|
||
<ul>
|
||
<li>tag:</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>A : Archives 档案</p>
|
||
<ul>
|
||
<li>
|
||
<p>作用:归档</p>
|
||
</li>
|
||
<li>
|
||
<p>来源:所有</p>
|
||
</li>
|
||
<li>
|
||
<p>特点:除了归档,也可以放一些不会变的东西,比如个人信息,密码,地址, 电器使用说明书,激活码等</p>
|
||
</li>
|
||
<li>
|
||
<p>比如:简历;完成的项目回顾;去年年终总结;提案;不再使用的项目资料</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>例子:</p>
|
||
<ul>
|
||
<li>
|
||
<p>跑马拉松是一个项目,而健康是一个领域</p>
|
||
</li>
|
||
<li>
|
||
<p>出版书是一个项目,而写作是一个领域</p>
|
||
</li>
|
||
<li>
|
||
<p>节省3个月的费用是一个项目,而财务是一个领域</p>
|
||
</li>
|
||
<li>
|
||
<p>去泰国度假是一个项目,而旅行是一个领域</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>启动步骤(第一次使用PARA)</p>
|
||
<ul>
|
||
<li>
|
||
<p>先创建4个快捷页面(Projects, Areas, Resources, Archives)</p>
|
||
</li>
|
||
<li>
|
||
<p>第一步:把近期正在做或者想做的事情写下来(项目)</p>
|
||
<ul>
|
||
<li>
|
||
<p>ESLpod听写跟读</p>
|
||
</li>
|
||
<li>
|
||
<p>刷完overthewire</p>
|
||
</li>
|
||
<li>
|
||
<p>cambly课程</p>
|
||
</li>
|
||
<li>
|
||
<p>刷完<剑指offer></p>
|
||
</li>
|
||
<li>
|
||
<p>Sam课程</p>
|
||
</li>
|
||
<li>
|
||
<p>刷完c primer plus练习题</p>
|
||
</li>
|
||
<li>
|
||
<p>busuu课程</p>
|
||
</li>
|
||
<li>
|
||
<p>刷完tryhackme</p>
|
||
</li>
|
||
<li>
|
||
<p>公司年终总结报告</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第二步:排列优先级(有截止日期的优先)</p>
|
||
<ul>
|
||
<li>
|
||
<p>(P)公司年终总结报告</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)ESL听写跟读</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)cambly课程</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)Sam课程</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)busuu课程</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)刷完overthewire</p>
|
||
</li>
|
||
<li>
|
||
<p>(P)刷完c primary plus练习题</p>
|
||
</li>
|
||
<li>
|
||
<p>(A)刷完tryhackme</p>
|
||
</li>
|
||
<li>
|
||
<p>(A)刷完<剑指offer></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第三步:给以上项目分大类(Areas)</p>
|
||
<ul>
|
||
<li>
|
||
<p>英语</p>
|
||
</li>
|
||
<li>
|
||
<p>编程</p>
|
||
</li>
|
||
<li>
|
||
<p>渗透测试</p>
|
||
</li>
|
||
<li>
|
||
<p>工作</p>
|
||
</li>
|
||
<li>
|
||
<p>网络兼职</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第四步:添加角色和近期兴趣(Areas)</p>
|
||
<ul>
|
||
<li>
|
||
<p>家庭</p>
|
||
</li>
|
||
<li>
|
||
<p>健康</p>
|
||
</li>
|
||
<li>
|
||
<p>财务</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第五步:关于Resources和Archives</p>
|
||
<ul>
|
||
<li>
|
||
<p>注意,不要马上把旧笔记移过来,等用到相关的笔记时候,再移过来即可,因为这样</p>
|
||
<ul>
|
||
<li>
|
||
<p>节省时间</p>
|
||
</li>
|
||
<li>
|
||
<p>重新吸收整理旧笔记,如果一下子全移过来,那跟复制粘贴没什么区别</p>
|
||
</li>
|
||
<li>
|
||
<p>如果该系统运行几天后, 发现不大合适, 则可以返回原来的系统</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第六步:补充内容</p>
|
||
<ul>
|
||
<li>
|
||
<p>创建TODO LIST页面,并加入快捷方式</p>
|
||
<ul>
|
||
<li>
|
||
<p>{{[[query]]: {and: [[TODO]] {not: [[query]]}}}}</p>
|
||
<ul>
|
||
<li>在页面内添加以上内容,之后会自动汇总所有todo,可以在sidebar随时查看<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/9f71355644.jpg" alt=""> - [[利用github自动备份Roam Research]]</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>第七步:马上开始使用</p>
|
||
<ul>
|
||
<li>
|
||
<p>千万不要想当然的觉得,等计划好所有东西后,再开始,这样永远也开始不了</p>
|
||
</li>
|
||
<li>
|
||
<p>大框架出来后,就可以了</p>
|
||
</li>
|
||
<li>
|
||
<p>一定要行动,在行动中再慢慢开始补充细节</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>注意事项</p>
|
||
<ul>
|
||
<li>
|
||
<p>撰写笔记的唯一入口,是 自动生成的以日期为标题的 “每日笔记”</p>
|
||
</li>
|
||
<li>
|
||
<p>每则笔记保持简洁(卡片),最多4个子标题,每个笔记只写一个知识点,这样方便链接</p>
|
||
</li>
|
||
<li>
|
||
<p>每则笔记必须要有自己输出的内容, 不能直接复制粘贴</p>
|
||
</li>
|
||
<li>
|
||
<p>每日笔记分2大块:Todo,Notes</p>
|
||
</li>
|
||
<li>
|
||
<p>Notes部分,每个标题在14个字以内,并在该标题的新页面内写你的相关Notes,相关名词记得[[]]起来,新名词不必急于填写内容,可以等链接的多了,再填也可以,优先完成Notes的内容.</p>
|
||
</li>
|
||
<li>
|
||
<p>每日笔记是每天主要面对的页面,写完后就不用管它,只要里面的名词有[[]]起来,坐等发酵即可</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>日常使用流程</p>
|
||
<ul>
|
||
<li>
|
||
<p>打开每日笔记, Todo List和Projects和Areas放在sidebar(按shift再点击相关页面即可)</p>
|
||
</li>
|
||
<li>
|
||
<p>查看todo list汇总页面</p>
|
||
</li>
|
||
<li>
|
||
<p>创建今日的todo</p>
|
||
<ul>
|
||
<li>todo根据情况链接新旧页面</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>如果看到新的有启发的文章时</p>
|
||
<ul>
|
||
<li>
|
||
<p>电脑方便的话,直接开RR记录</p>
|
||
</li>
|
||
<li>
|
||
<p>不方便电脑的话,利用纸笔或者备忘录,记录</p>
|
||
</li>
|
||
<li>
|
||
<p>最后在每日笔记的Notes下,添加标题,并记录感悟等</p>
|
||
</li>
|
||
<li>
|
||
<p>灵感,学习等内容同上</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>一天结束后,一般只是整理下笔记就完了,你也可以自己写写总结什么的。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2020-12-13 OUT</strong></p>
|
||
<h1 id="使用roam-research的细节问题"><strong>使用Roam Research的细节问题</strong></h1>
|
||
<ul>
|
||
<li>
|
||
<p>首要原则</p>
|
||
<ul>
|
||
<li>把精力花在内容上,其他东西能少花就少花,能不花就不花</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**关于标签**</p>
|
||
<ul>
|
||
<li>
|
||
<p>**只在tags块下添加标签**</p>
|
||
<ul>
|
||
<li>
|
||
<p>其他地方,除了添加表 时间 和 状态 的标签,其他类型的标签都不要加,统一用页面来解决</p>
|
||
<ul>
|
||
<li>因为标签是独立性的,连贯性不强,没有上下文,而使用[[]]页面的话,有上下文,方便理解、跳转和引用</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**标签只需加上最相关或者直接上级的关键词即可**</p>
|
||
<ul>
|
||
<li>
|
||
<p>省时省力</p>
|
||
</li>
|
||
<li>
|
||
<p>底部的链接模块更干净</p>
|
||
</li>
|
||
<li>
|
||
<p>截图<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/583fbd9802.jpg" alt=""> - **如果没有相关关键词,则使用Inbox或者Resource**</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**关于新建页面**</p>
|
||
<ul>
|
||
<li>
|
||
<p>所有页面,**均通过搜索框**或者在**有上下午的笔记中创建**</p>
|
||
<ul>
|
||
<li>
|
||
<p>比如,写[[西游记]]读后感</p>
|
||
<ul>
|
||
<li>
|
||
<p>如果你是在写日记或者其他笔记的时候,提到了[[西游记]],则可以直接[[]]起来</p>
|
||
</li>
|
||
<li>
|
||
<p>如果没有上下文,则直接在搜索框创建即可</p>
|
||
</li>
|
||
<li>
|
||
<p>然后打上主要标签</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**切记,千万不要在没有上下文的旧笔记中创建新页面,因为没有任何意义**,如下图</p>
|
||
<ul>
|
||
<li>而且如果数量很多的话,页面的链接引用部分会很乱</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**关于页面内容**</p>
|
||
<ul>
|
||
<li>
|
||
<p>标题性的块,直接使用子块,不要在主块的新页面中使用,方便联系上下文</p>
|
||
<ul>
|
||
<li>
|
||
<p>比如</p>
|
||
<ul>
|
||
<li>
|
||
<p>[[西游记]]</p>
|
||
<ul>
|
||
<li>
|
||
<p>[[第一回 灵根育孕源流出 心性修持大道生]]</p>
|
||
</li>
|
||
<li>
|
||
<p>链接部分如图,很容易就知道当初为什么创建该页面 (为了举例说明才创建的)</p>
|
||
</li>
|
||
<li>
|
||
<p>但如果是在西游记的页面中创建的话:</p>
|
||
<ul>
|
||
<li>
|
||
<p>就完全丢失了上下文,如图</p>
|
||
<ul>
|
||
<li></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**关于笔记系统的结构**</p>
|
||
<ul>
|
||
<li>
|
||
<p>千万不要太过纠结于结构</p>
|
||
<ul>
|
||
<li>重点在内容</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>千万不要太沉迷于去分类整理</p>
|
||
<ul>
|
||
<li>重点在内容</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>**该笔记不定时更新,欢迎交流**</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2020-12-12 OUT</strong></p>
|
||
<h1 id="roam-research-间隔重复功能类anki"><strong>Roam Research 间隔重复功能(类Anki)</strong></h1>
|
||
<ul>
|
||
<li>
|
||
<p>对于Anki软件,大家应该都不陌生了吧。</p>
|
||
</li>
|
||
<li>
|
||
<p>之前也有很多人利用Roam和Anki来回顾知识点。</p>
|
||
</li>
|
||
<li>
|
||
<p>但是现在,不用这么麻烦了,Roam已经实现间隔重复功能,虽然相对粗糙,但对我来说,也够用了。</p>
|
||
</li>
|
||
<li>
|
||
<p>用法一样很简单,右键 需要重复块的圆点,选择 ∆ 即可,Roam就会按艾宾浩斯的遗忘天数来提醒你,也就是在回忆日的每日笔记中出现<br>
|
||
* 如图<br>
|
||
- 编辑状态如图</p>
|
||
<ul>
|
||
<li>只要到了回忆日,该日的每日笔记,就会自动添加该块,会显示一个 ∆</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>如果完成记忆,记得点击 ∆ 来触发下一个遗忘日的提醒</p>
|
||
</li>
|
||
<li>
|
||
<p>进入编辑状态的话,如图</p>
|
||
<ul>
|
||
<li>后面的数字,表示这是第1天,下次出现在2天后</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>好了,该功能介绍到此,有什么问题尽管留言哈,欢迎交流。</p>
|
||
</li>
|
||
<li></li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2020-12-11 OUT</strong></p>
|
||
<h1 id="roam-research不是这样用的"><strong>Roam Research不是这样用的</strong></h1>
|
||
<ul>
|
||
<li>
|
||
<p>最近,我突然发现,大部分人对Roam Research的用法,都是错误的。</p>
|
||
</li>
|
||
<li>
|
||
<p>很多人,都是从别的笔记应用转到RR来的,比如notion,印象笔记,为知笔记等。</p>
|
||
</li>
|
||
<li>
|
||
<p>所以,多多少少,会把线性思维或者说线性笔记的习惯一起转移了过来。</p>
|
||
</li>
|
||
<li>
|
||
<p>比如:</p>
|
||
<ul>
|
||
<li>
|
||
<p>我们在查找、记录、整理一条笔记的时候,</p>
|
||
<ul>
|
||
<li>
|
||
<p>首先,我们会想该笔记属于什么类型,日常?技能?公司?财务?健康?运动等</p>
|
||
</li>
|
||
<li>
|
||
<p>然后找到对应的文件夹,如果文件夹下面还有其他细分类别,就会重复该动作</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>有时候还会使用标签,但也和查找相关类别的文件夹是差不多的动作</p>
|
||
</li>
|
||
<li>
|
||
<p>有时候还会用到关键词,当然大部分是在关键词非常明确,或者实在找不到笔记的时候。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>这个就是典型的线性笔记的大概流程</p>
|
||
</li>
|
||
<li>
|
||
<p>但是 ,Roam Research的诞生就是为了摆脱这种经典的文件树,也就是线性笔记的束缚。在笔记之间建立联系,构成一张网,而不是依靠单一的父子树关系,永远的沉淀下去。</p>
|
||
</li>
|
||
<li>
|
||
<p>你可能会说,“OK,那就加个双链接呗,不就可以链接起来了吗?”</p>
|
||
</li>
|
||
<li>
|
||
<p>不是的,如果只是简单的链接,但不改变线性笔记的习惯,那不就变成了wiki了吗,不就变成了一个个小的互联网了吗,那我还不如直接谷歌百度,信息更多更快。</p>
|
||
</li>
|
||
<li>
|
||
<p>所以,Roam Research只是一个工具,背后的理念很重要,你们可以看看他的白皮书</p>
|
||
<ul>
|
||
<li>
|
||
<p>原著:Conor White-Sullivan | <a href="mailto:cwhitesullivan@gmail.com">cwhitesullivan@gmail.com</a></p>
|
||
</li>
|
||
<li>
|
||
<p>英文:<a href="https://link.zhihu.com/?target=https%3A//roamresearch.com/%23/app/help/page/Vu1MmjinS">https://roamresearch.com/#/app/help/page/Vu1MmjinS</a></p>
|
||
</li>
|
||
<li>
|
||
<p>中文:<a href="https://link.zhihu.com/?target=https%3A//roamresearch.com/%23/app/trade/page/nhzz3wRuM">https://roamresearch.com/#/app/trade/page/nhzz3wRuM</a></p>
|
||
</li>
|
||
<li>
|
||
<p>翻译:<a href="https://www.zhihu.com/people/91b6b9eed3b094aa9067f9d643358ff3">@Zack</a> | <a href="mailto:zack.fan@gmail.com">zack.fan@gmail.com</a></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>重点是,我们要尽量摆脱线性的方法去使用它,不要孤立每个知识点或者每一条笔记,要让新的知识点在旧的知识点上构建起来,这才是双链接的魅力所在。</p>
|
||
</li>
|
||
<li>
|
||
<p>具体来说</p>
|
||
<ul>
|
||
<li>
|
||
<p>不要像我之前那样,</p>
|
||
<ul>
|
||
<li>
|
||
<p>创建PARA四个页面,做为类文件夹,</p>
|
||
<ul>
|
||
<li>
|
||
<p>然后在该页面内,添加新的相关页面(比如:项目,编程,英语等)</p>
|
||
<ul>
|
||
<li>
|
||
<p>再然后,在相关页面内,填写新的具体内容或者知识点或者项目</p>
|
||
</li>
|
||
<li>
|
||
<p>如果要添加新的笔记,则是先写在每日笔记上</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>然后,整理的时候,把它拖到相关页面比如:项目,编程,英语等)</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>最后,如果是新项目,则在PARA上添加新页面</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>以上就是典型的线性笔记的流程</p>
|
||
</li>
|
||
<li>
|
||
<p>接下来说说我理解中,正确的或者说非线性笔记应该是这样的</p>
|
||
<ul>
|
||
<li>
|
||
<p>每日笔记依旧是每天笔记的主要入口</p>
|
||
<ul>
|
||
<li>
|
||
<p>通过标签来初步分类PARA笔记,这样就不用特地把笔记移动到PARA的相关页面,更灵活</p>
|
||
<ul>
|
||
<li>
|
||
<p>我的主要标签:Projects, Areas, Resources, Archives, Inbox</p>
|
||
<ul>
|
||
<li>关于PARA的具体用法可以看这里[[如何高效使用Roam Research]]</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>其他标签:</p>
|
||
<ul>
|
||
<li>
|
||
<p>日期标签:如果是一个日程的话,就可以添加一个日期标签,等到了那天,每日笔记下面就会出现相关链接</p>
|
||
</li>
|
||
<li>
|
||
<p>A\B\C\D:如果需要,可以添加任务的优先级</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>查找项目的时候,直接搜索PARA标签或者关键字</p>
|
||
</li>
|
||
<li>
|
||
<p>有新笔记的时候,直接创建新页面,然后打上相关标签,相关的关键字同样,也要[[]]起来</p>
|
||
</li>
|
||
<li>
|
||
<p>当网络建立起来后,通过笔记来漫游,就会出现很多以前没有注意到的灵感</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>乍一看,感觉只是把文件夹变成了标签 ,事实上确实如此</p>
|
||
<ul>
|
||
<li>
|
||
<p>这样就可以剔除“移动笔记到相关页面”这个动作,更专注于笔记,**笔记在哪里并不重要,重要的是它的内容,它的关键词,是否可以成为别的笔记的基础**</p>
|
||
</li>
|
||
<li>
|
||
<p>小小的一个动作的简化,确是一种完全不同理念的系统,有时候进步就是这么简单的一步,却很难迈出。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>OK,以上就是我对于Roam Research的新感悟,希望对你有所帮助</p>
|
||
</li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2020-12-09 OUT</strong></p>
|
||
<h1 id="roam-research更改标签颜色"><strong>Roam Research更改标签颜色</strong></h1>
|
||
<ul>
|
||
<li>
|
||
<p>tags:#[[Roam Research系列]]</p>
|
||
</li>
|
||
<li>
|
||
<p>其实很简单,新建一个page: [[roam/css]]</p>
|
||
</li>
|
||
<li>
|
||
<p>然后直接插入以下css代码块即可,根据需要,自行修改,可以设置多个</p>
|
||
<ul>
|
||
<li><code>css span.rm-page-ref\[data-tag="在这输入你的标签名"\]{ background: \#ACEDF6; /\\\*背景颜色,可点击色块自行选择\\\*/ color: #000000; /\\\*字体颜色\\\*/ padding: 3px 7px; /\\\*背景颜色的大小,可删除不用设置\\\*/ font-weight: 300; /\\\*字体的粗细,可删除不用设置\\\*/ }</code></li>
|
||
</ul>
|
||
</li>
|
||
<li></li>
|
||
</ul>
|
||
<hr>
|
||
<p><strong>2020-12-02 OUT</strong></p>
|
||
<h1 id="比较roamresearchobsidianremnote"><strong>比较RoamResearch,Obsidian,Remnote</strong></h1>
|
||
<p>先说下背景吧。</p>
|
||
<p>在双向链接的笔记应用大火之前,我是用印象笔记,TheBrain和Notion三者结合着用。</p>
|
||
<p>痛苦并快乐着。。</p>
|
||
<p>直到发现RR这个宝藏之后,才发现,其实相关应用早就有了,只是没发现而已。</p>
|
||
<p>对于RR,我一直是观望状态,因为RR是网页版的,数据都在云端,我比较喜欢自己掌控数据,所以一直再找替代品。先后接触过org-mode,tiddlywiki等,org的话,上手难度太高,tiddlywiki的stroll,毕竟不是强项,所以</p>
|
||
<p>最后选了Obsidian和Remnote来做比较(比较粗糙,将就下哈):<br>
|
||
<img src="https://versun.micro.blog/uploads/2024/e55b189803.jpg" alt=""><br>
|
||
Remnote已支持win、mac、linux和Android(2020-12-22更新)</p>
|
||
<p>最后我选择了Obsidian,不仅是因为离线存储,更因为他们的社区很活跃,开发者还是国人,回答社区里的问题很耐心,而且 <a href="https://link.zhihu.com/?target=https%3A//trello.com/b/Psqfqp7I/obsidian-roadmap">进展</a>看得见很清晰。</p>
|
||
<p>虽然block功能没有,但其实这也是迟早的事。</p>
|
||
<p>目前已经更新了block级别的同步了哈</p>
|
||
<p>对了,手机端app也已经在日程里了。目前我是直接在网盘里查看,因为都是md格式,很方便。</p>
|
||
<p>还有remnote,也很优秀,适合在校学生使用,闪卡功能很赞!不过块引用不支持中文</p>
|
||
<p>最后说下我目前的笔记流程吧:</p>
|
||
<p>主要就是 PARA 和 Zettelkasten(卡片盒)的结合。</p>
|
||
<p>PARA模式很适合不喜欢把笔记分类打标签的人,比如我。。</p>
|
||
<p>我很讨厌那种一长串的笔记目录,因为分类和整理很耗费时间,而且很不好找。</p>
|
||
<p>所以才有了双向链接,这里就不赘述了。</p>
|
||
<p>不知道PARA的可以去 <a href="https://link.zhihu.com/?target=https%3A//fortelabs.co/page/1/%3Fs%3DPARA">这里</a>看看。这里我就截个图,可以做个初步了解</p>
|
||
<p><img src="https://versun.micro.blog/uploads/2024/8d32e26de1.jpg" alt=""><br>
|
||
Obsidian里面创建5个文件夹:Projects, Areas, Resources, Archives, attachment</p>
|
||
<ol>
|
||
<li>
|
||
<p>平时的临时笔记和文献笔记,都在Resources里面。</p>
|
||
</li>
|
||
<li>
|
||
<p>然后如果有计划(感兴趣)新起一个项目时,但暂时没有deadline的,在Areas里面新建一个Page,慢慢从Resources里面添加相关信息。</p>
|
||
</li>
|
||
<li>
|
||
<p>当决定立项时,移动到Projects里,然后给个deadline。</p>
|
||
</li>
|
||
<li>
|
||
<p>项目完成后就放在Archives里。</p>
|
||
</li>
|
||
</ol>
|
||
<p>平时看到的文章什么的,全部都用印象笔记收集起来。</p>
|
||
<p>印象笔记就是个大杂烩(文献管理),然后每天利用 Zettelkasten 流程,整理到 Obsidian。</p>
|
||
<p>学习笔记的话直接添加到 Resources,标题统一是 时间格式,因为我连标题都懒的起。。</p>
|
||
<p>核心思想:只管记,尽情链接。</p>
|
||
<p>利用双向链接,一个新的知识点,可以很深入,平时有空就可以继续深入添加。</p>
|
||
<ul>
|
||
<li><input checked="" disabled="" type="checkbox"> 邮件处理时间和方式,参阅Tigo的方法</li>
|
||
</ul>
|
||
<hr>
|
||
<h4 id="2022-08-24">2022-08-24</h4>
|
||
<pre><code>~关于Daily-jots应该是保持清空状态,也就是每个jot,需要有归处,而不是保持在inbox里,~
|
||
|
||
~可以有短暂时间的发酵,但要控制数量,不能太多。~
|
||
|
||
~如果没用的,添加删除线~
|
||
|
||
~还有很多无法归类的,等待自动archive吧~
|
||
</code></pre>
|
||
<hr>
|
||
<h4 id="2022-08-04">2022-08-04</h4>
|
||
<pre><code>关于areas分类,是否可以尝试使用情绪标签或者功能标签,比如health, happiness, finances, life quality
|
||
|
||
或者欲望/结果标签,confotable zone标签?有用的?想做的?有益的
|
||
|
||
主要是为了更直观更便捷,直觉性的方式来组织,减少不必要的脑力活动,不过多的进行内容评判标签化,以内容为核心。
|
||
|
||
2个维度,兴趣指数I和困难指数D,还有其它的可以考虑,比如时间敏感度,优先级,最多选择2个,否则物极必反
|
||
|
||
同时,不使用tag/subtag,没有分类压力,也方便删减
|
||
|
||
areas作为pre-projects,其他均放入resources里面,或者areas都可以不要了,或者做为长期目标的projects
|
||
|
||
**按照之前的官方流程图,Jots的作用是capture,Notes是整理,Task是计划优先级,Calendar是安排完成**
|
||
|
||
**所以,以上这些笔记应该在Jot的daily note中,有一定结构/结果后在放入Notes中**
|
||
|
||
~似乎是有些道理 ,但这样的话,不方便回顾,不如目前的一页日志形式直观~
|
||
|
||
**但可以给daily note添加标签,这个不错**
|
||
|
||
如果每个标签的年笔记少于5个,则需要考虑该标签是否有必要存在
|
||
</code></pre>
|
||
<hr>
|
||
<h4 id="使用agenda-app">使用Agenda app</h4>
|
||
<pre><code>Jun 18, 2022
|
||
|
||
笔记结构
|
||
|
||
突发奇想
|
||
|
||
每个大主题下使用para来管理,
|
||
|
||
比如编程大类下,分别新建para四个笔记本
|
||
|
||
这样感觉分类会很多,还是算了
|
||
|
||
May 16, 2022
|
||
|
||
渐进式阅读
|
||
|
||
agenda貌似没法渐进式阅读,所以可以在cubox里完成,然后再导入agenda
|
||
|
||
ReminderMay 13, 2022
|
||
|
||
其实利用Agenda assign date的功能就可以了
|
||
|
||
除非是要提醒备忘,则可以添加reminder
|
||
|
||
Areas的Plan笔记怎么处理May 12, 2022
|
||
|
||
会一直显示在Not done里面,要不要把它mark 为done?
|
||
|
||
May 13, 2022
|
||
|
||
Areas和Projects统一使用Overview模板
|
||
|
||
可以使用tag来标记,然后保存一个search就可以分别Overview了
|
||
|
||
Todo List 的优先级划分May 12, 2022
|
||
|
||
原先是按著名的四象限划分,即:紧急且重要,紧急但不重要,不紧急但重要,不紧急也不重要。
|
||
|
||
但这种方法,在任务创建时就要考虑并分类,脑力耗费较高,且有些任务模棱两可,所以,更新为以下方法:
|
||
|
||
类别只有两种:重要和不重要
|
||
|
||
然后用3种优先级,再在类别里面,把近期要做的打上标签,区分紧急程度
|
||
|
||
可根据需求,也可先分紧急程度,然后再用标签分重要程度
|
||
|
||
每日流程May 11, 2022
|
||
|
||
1\.先从Not Done里面安排今天要做的事,可以加reminder,方便追踪
|
||
|
||
2\.添加无需note的reminder
|
||
|
||
3\.~可以把今天要做的make as on the agenda~ 。
|
||
|
||
4\.在reminder里,给任务打上priority
|
||
|
||
5\.到晚上把Inbox清空
|
||
|
||
平日看到的需要细读或笔记的,加到cubox或inbox中,随意,按分享简易程度
|
||
|
||
due date和Assign dateMay 11, 2022
|
||
|
||
note可以直接assign date,可以不用due date
|
||
|
||
due date可以在note里面使用
|
||
|
||
还有On the Agenda功能,也要利用起来
|
||
|
||
可以把需要关注的加到这里来,其他就assign date就可以了
|
||
|
||
**May 12, 2022**
|
||
|
||
默认使用assign date(主要任务) 和 due date(子任务)
|
||
|
||
要安排到日程里时,一般安排在明后天,可以再添加reminder,供每日todo时查看,
|
||
|
||
due date和reminder可以同时存在
|
||
|
||
尽量使用assign date,有due date的也要拆分为note
|
||
|
||
PARA流程更新May 11, 2022
|
||
|
||
Project必须是从Areas里面诞生的,使用Overview模板
|
||
|
||
Areas使用Plan模板
|
||
|
||
更新任务管理流程May 11, 2022
|
||
|
||
ref: [<----的功能](agenda://note/A5351B82-5692-46CB-8535-A76143AE2431)
|
||
|
||
每个笔记使用New note模板
|
||
|
||
每个任务就是一个note,可以添加笔记或者子任务
|
||
|
||
日常没必要note的,可以直接添加reminder,可以在reminder里加,但需要note的,最好在agenda里加
|
||
|
||
◉什么时候note,什么时候checklist,什么时候reminder
|
||
|
||
•Note: 执行的基本单位,尽量都用note
|
||
|
||
•Checklist: 每个任务的step,类似菜谱的步骤,而不是无意义的流水,反面教材如下:
|
||
|
||
建议拆分checklist为note,然后在为每个note留下笔记,附有相关的意义
|
||
|
||
•**Reminder: 只有Checklist可以使用,Note请用due date**
|
||
|
||
•Event: 比如要去参加某个活动的,暂时用不到,待考究。
|
||
|
||
Goals管理May 10, 2022
|
||
|
||
目前只有一个goals笔记,不够细化或者阶段化,需要一个简洁又能阶段化的管理方式
|
||
|
||
应该要把goals和todo分开
|
||
|
||
todo里面如果某个任务完成了一个gola,可以链接过去
|
||
|
||
现在问题就是,goals页面要怎么布置
|
||
|
||
May 11, 2022
|
||
|
||
暂时和任务管理一致,加个tags就好了,在使用中再改吧。
|
||
|
||
任务管理May 9, 2022
|
||
|
||
~由于agenda没法筛选全部的todo,因此,所有todo都加个reminder ,日期都定一个,统一在reminder里面查看和完成~
|
||
|
||
~May 10, 2022~
|
||
|
||
~但是reminder如果完成,貌似没发同步到agenda~
|
||
|
||
~测试了,可以同步,不错~
|
||
|
||
~但是agenda中,checklist和reminder是分开的,打钩并不会完成reminder~
|
||
|
||
~所以还是统一在reminder上完成。~
|
||
|
||
~那目前流程就是:~
|
||
|
||
1\.~每个笔记本都有个置顶的笔记,把相关任务添加到置顶笔记,然后搜索todo即可显示全部~
|
||
|
||
2\.~然后每天早上安排今天要做的任务,添加全天提醒~
|
||
|
||
3\.~在reminder app上来完成任务~
|
||
|
||
~注意,任务只在agenda创建,reminder只负责浏览和完成~
|
||
|
||
2022/5/7, 07:10May 7, 2022
|
||
|
||
cubox稍后阅读
|
||
|
||
agenda inbox所有内容的入口,包括任务或者todolist,可以往下发展为资源,领域或项目
|
||
|
||
工具、流程汇总May 7, 2022
|
||
|
||
工具:
|
||
|
||
•Agenda
|
||
|
||
•Cubox
|
||
|
||
May 4, 2022May 4, 2022
|
||
|
||
从Evernote导入不完整,顾导入PDF格式和HTML格式
|
||
</code></pre>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2019/12/21/080000.html">树莓派超频设置</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2019/12/21/080000.html" class="u-url"><time class="dt-published" datetime="2019-12-21 08:00:00 +0800">Dec 21, 2019</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>设备:树莓派4b 4G内存.
|
||
编辑/boot/config.txt<br>
|
||
添加以下代码:<br>
|
||
arm_freq=2000<br>
|
||
over_voltage=10<br>
|
||
保存,重启即可。<br>
|
||
建议可以从1750开始超,如果能顺利重启,则再设置为2000<br>
|
||
如果无法顺利重启,可以把SD卡插到其他电脑上,去修改config文件即可。<br>
|
||
<strong>其他相关命令:</strong><br>
|
||
当前电压:<br>
|
||
vcgencmd measure_volts<br>
|
||
当前温度:<br>
|
||
vcgencmd measure_temp<br>
|
||
当前频率:<br>
|
||
sudo cat /sys/devices/system/cpu/cpu0/cpufreqq/cpuinfo_cur_freq<br>
|
||
最大频率:<br>
|
||
sudo cat /sys/devices/system/cpu/cpu0/cpufreqq/cpuinfo_max_freq<br>
|
||
<strong>性能测试</strong></p>
|
||
<ul>
|
||
<li>
|
||
<p>表示创建4个线程来寻找 √ ̄20000 以内的质数:<br>
|
||
sysbench –num-threads=4 –test=cpu –cpu-max-prime=20000 run</p>
|
||
</li>
|
||
<li>
|
||
<p>跑分软件nbench<br>
|
||
wget <<a href="http://www.math.utah.edu/~mayer/linux/nbench-byte-2.2.3.tar.gz">http://www.math.utah.edu/~mayer/linux/nbench-byte-2.2.3.tar.gz</a>><br>
|
||
tar -xvzf nbench-byte-2.2.3.tar.gz<br>
|
||
cd nbench-byte-2.2.3<br>
|
||
make<br>
|
||
./nbench<br>
|
||
<strong>压力测试</strong><br>
|
||
期间温度不超85度为正常。<br>
|
||
sudo apt install stress<br>
|
||
stress -c 4 -t 10m -v</p>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2019/06/28/httpsgithubcomrapidmetasploitable-packer-vagrant.html">Windows下虚拟机安装Metasploitable3</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2019/06/28/httpsgithubcomrapidmetasploitable-packer-vagrant.html" class="u-url"><time class="dt-published" datetime="2019-06-28 00:00:00 +0800">Jun 28, 2019</time></a>
|
||
|
||
<div class="e-content">
|
||
<p>项目地址:<a href="https://github.com/rapid7/metasploitable3">https://github.com/rapid7/metasploitable3</a><br>
|
||
需求软件: <a href="https://www.packer.io/intro/getting-started/install.html">Packer</a> <a href="https://www.vagrantup.com/docs/installation/">Vagrant</a> <a href="https://github.com/aidanns/vagrant-reload#installation">Vagrant Reload Plugin</a> <a href="https://www.virtualbox.org/wiki/Downloads">VirtualBox</a>, libvirt/qemu-kvm, or vmware (paid license required) 除了Packer,下载完解压后,把Packer.exe放到系统Path里面去,然后在cmd里面测试packer就行了 其他都是软件包安装,很方便<br>
|
||
接下来就是重头戏了 该命令需要在poweshell上执行,不能在cmd中执行<br>
|
||
错误1: 图片:<br>
|
||
<img src="https://f004.backblazeb2.com/file/blog-versun-me/img/a623e534-a780-4dcf-be82-3bfcc249064a.jpg" alt="">
|
||
解决1: 管理员运行PoweShell 执行 Set-ExecutionPolicy RemoteSigned 输入y回车<br>
|
||
错误2: 图片:<br>
|
||
<img src="https://f004.backblazeb2.com/file/blog-versun-me/img/b3cc0b0a-e920-4f77-b79b-45773c864cb0.jpg" alt="">
|
||
解决2: 文本编辑 build.ps1 把: $actualVersion = $actualVersion.split(“.”) 改为已安装的virtualbox的版本号:(需要你自己打开virtualbox查看版本) $actualVersion = “6.0.8” 保存<br>
|
||
最后重新执行命令,等等即可。 完成</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="h-entry">
|
||
|
||
<h1><a href="https://versun.me/2019/04/19/linuxservice.html">Linux添加service服务文件</a></h1>
|
||
|
||
|
||
<a href="https://versun.me/2019/04/19/linuxservice.html" class="u-url"><time class="dt-published" datetime="2019-04-19 08:00:00 +0800">Apr 19, 2019</time></a>
|
||
|
||
<div class="e-content">
|
||
<!-- raw HTML omitted -->
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<div class="h-card" hidden>
|
||
<span class="p-name">Versun Pan</span>
|
||
<span class="p-honorific-prefix">Mr.</span>
|
||
<span class="p-given-name">Versun</span>
|
||
<span class="p-family-name">Pan</span>
|
||
<span class="p-nickname">versun</span>
|
||
<img class="u-photo" src="https://avatars.githubusercontent.com/u/2398708"/>
|
||
<a class="u-url u-uid" href="https://versun.me">Versun's Blog</a>
|
||
<a class="u-url" href="https://versun.me/@versun" rel="me">Matodon</a>
|
||
<a class="u-url" href="https://x.com/versunpan">Twitter</a>
|
||
<a class="u-email" href="mailto:me@versun.me"></a>
|
||
<p class="p-note">INTJ | 伪全栈 | 在前后端反复横跳 | 运维小能手 | InfoSec爱好者 | Pentest菜鸡 </p>
|
||
</div>
|
||
|
||
<script defer src="https://analytics.us.umami.is/script.js" data-website-id="e5343b24-09a2-45ab-a208-0063ee743463"></script>
|
||
|
||
</body>
|
||
|
||
</html>
|