SegmentFault 草根大叔最新的文章
2023-02-23T23:58:37+08:00
https://segmentfault.com/feeds/blogs
https://creativecommons.org/licenses/by-nc-nd/4.0/
为什么选择71NOTE云笔记平台
https://segmentfault.com/a/1190000043465987
2023-02-23T23:58:37+08:00
2023-02-23T23:58:37+08:00
LeeChan
https://segmentfault.com/u/leechan_
0
<p><img src="/img/remote/1460000043465989" alt=" title="71NOTE云笔记平台"" title=" title="71NOTE云笔记平台""></p><h2>为什么有 71NOTE 这个云笔记平台</h2><p>我想很多人应该都会有想过记录下生活中每一份感动的时候,又或者是有过当一个三流作家的梦想。很显然我就是其中一个。常常我在产生这些“写”的想法的时候,我多么渴望有一个平台能满足我一切的幻想,包括无所不能的编辑功能,因为我想写日常的感受,也想分析我的工作技能,所以它必须具备,基本的多样的文字格式,图片,链接,布局以及一些公司,图表流程图等等的功能。</p><p>看到这里会有很多人肯定会第一时间起来说,“你说的这些,市场上到处都有类似的产品,比如有道云笔记,印象笔记,石墨文档,腾讯文档等等产品。” 但是实际上这些并不能满足我,他们或者有空间的限制(需要会员),或者有写作数量的限制,又或者这些产品中很少可以能够跟读者交流的。因为我有时候我希望我写的“作品”能够被看到。</p><p>因此 71NOTE 云笔记平台诞生了,它是一个能满足我一起愿望的新一代把记录、创作、设计、能力变现集于一身的云创作笔记平台。</p><h2>71NOTE 云笔记平台有哪些功能</h2><p>这里只介绍几个笔记重要的功能</p><h4>1. 支持多格式导出</h4><p>支持导入导出文档,方便用过户管理自己的文章已经迁移自己的文章。多格式更加灵活。</p><h4>2. 支持共享</h4><p>我们可以把它当成企业团队的文档管理系统来使用。它支持文件共享。获取链接即可查看。</p><p><img src="/img/remote/1460000043465990" alt=" title="支持共享"" title=" title="支持共享""></p><h4>3. 支持文集</h4><p>文集功能是我们日常创作中一个比较高级的功能。文集功能可以让你发布一个属于自己的博客,他包含所有属于该集合的文章;也可以让你发布一本书,包含该书中的每一个章节。</p><p><img src="/img/remote/1460000043465991" alt=" title="支持文集"" title=" title="支持文集""></p><p><img src="/img/remote/1460000043465992" alt=" title="支持文集"" title=" title="支持文集""></p><h4>4. 能力变现</h4><p>我们可以通过知识付费,让自己的能力变现。</p><p><img src="/img/remote/1460000043465993" alt=" title="能力变现"" title=" title="能力变现""></p><h2>71NOTE 云笔记平台有哪些优势</h2><h4>1. 丰富的格式支持</h4><p>支持图表,公式,流程图,时序图,类图,状态图,关系图,旅程图,甘特图,饼状图等等,比 Word 更加美观,更加容易操作。</p><h4>2. 无限免费空间</h4><p>没有空间限制,也不需要会员,注册登录就可以写,想写多少就写多少。</p><h4>3. 云平台服务</h4><p>随时随地写,登录账号就可以记录/创作,更加安全高效。支持发布单独文章,也可发布成集合。让写作、记录更加得心应手。</p><h4>4. 共享发布作品,知识付费</h4><p>可根据需要发布共享自己的作品到平台,让所有的读者都能发现流程,成为你的伯乐。包括发布共享方式包括,免费,付费,私有等。让自己的能力变现。</p><p><img src="/img/remote/1460000043465994" alt=" title="共享发布作品,知识付费"" title=" title="共享发布作品,知识付费""></p><h2>结束语</h2><p>71NOTE 是我们这5年以来的沉淀作品。虽然还有很多需要改进的地方,但我们从不放弃努力,在努力让自己变得更好也想让所有的用户以及读者变得更好。最后送大家一句话:</p><blockquote>如果不想随波追流就现在开始改变,自律>认真>乐观>坚持,我们要相信我们的日积月累早晚会让别人望尘莫及。</blockquote><p>本文由 @ChenLi 原创发布于71NOTE。转载必须带上本文链接<br><a href="https://link.segmentfault.com/?enc=v9MXQD%2FTEbHYXKBtZfc3kg%3D%3D.dO3pNMB0r%2FzpyJqREqDpQJsB3vvRJ9O78wNshyITogs%3D" rel="nofollow">http://www.71note.com/reader/4</a></p>
使用Beego撸了一个社区
https://segmentfault.com/a/1190000040483034
2021-08-09T18:42:25+08:00
2021-08-09T18:42:25+08:00
LeeChan
https://segmentfault.com/u/leechan_
0
<h3>话不多说直接放链接</h3><p><a href="https://link.segmentfault.com/?enc=ecbFB1alz8WFo8kL2QXpfQ%3D%3D.YvdN6KxKrOje9s1%2B13RfKQ0wKPk2HA9tYxiGv8CFCmIslXSrw%2B0W3GykDOGJsEW8" rel="nofollow">新版本更新了很多内容,点击可看详情</a></p><p><img src="/img/remote/1460000041155482" alt="" title=""></p><p><a href="https://link.segmentfault.com/?enc=3AmxidzRdZxr7N1X0OrtiQ%3D%3D.ILqOLwwDUTBQwP1DxgO4IaM7tbrQhvdwyOeeYHFAck4%3D" rel="nofollow" title="霓虹灯下社区">霓虹灯下社区</a><br><a href="https://link.segmentfault.com/?enc=WeDzLvDPlQoxYvMnSS6Ehg%3D%3D.Pn43qTS1fTKGYnXl4zXFzbIpMXQ%2FdzSTiCtawS8rMgzcvFFlNoQuHyoJSbyCuK6K" rel="nofollow" title="Github">Github</a></p><p><img src="/img/bVcWQzZ" alt="" title=""></p>
一个基于 Beego 开发的社交商城博客系统
https://segmentfault.com/a/1190000040261020
2021-06-29T18:11:58+08:00
2021-06-29T18:11:58+08:00
LeeChan
https://segmentfault.com/u/leechan_
0
<h2>Go Blog</h2><p><a href="https://link.segmentfault.com/?enc=GBIbaR8benLrAMpyFBNOFA%3D%3D.mnFQfg%2B3n33my0EDVRHGN6ht6xwyIgOFMWIUY%2BBM2wwHFhRrW%2BO3UzjL0wkgF2EYfFFDu3iWt0HTA8KTkALtAA%3D%3D" rel="nofollow"><img src="/img/remote/1460000023604788" alt="GitHub stars" title="GitHub stars"></a><br><a href="https://link.segmentfault.com/?enc=lCU3mCTP4sQ18KWVzHYkXw%3D%3D.%2BwoUrHRmUwy1BgEJRtNgdyzEqnkrpgJN4eprIjG9l76ylHJI%2FagAREbDasLSSs7C" rel="nofollow"><img src="/img/remote/1460000023604789" alt="GitHub forks" title="GitHub forks"></a><br><a href="https://link.segmentfault.com/?enc=k8dnijDyiiyAt8e7cGnnMw%3D%3D.MuHJbcN0o6whZXqwWGYtM4zyvXoA0FTql7Uuz3vEilTDSO7ceiWGPOXzTO3etM5KWjyfu2h2X%2FUJg6it%2BWrnPw%3D%3D" rel="nofollow"><img src="/img/remote/1460000023604787" alt="GitHub license" title="GitHub license"></a></p><p>一个基于 Beego 开发的社交商城博客系统</p><h3>包含功能</h3><h4>由于服务器资源限制,demo网站暂时无法访问</h4><blockquote><p>前台演示站点(博客) <a href="https://link.segmentfault.com/?enc=l9LUnjZ0xx2qq08dsFkldA%3D%3D.ZLtw1TGQEvSMPh1EE%2FpZPcg2wlH0X4Ga8FA1wTI4FEk%3D" rel="nofollow">http://47.106.128.78:8080/</a></p><p>前台演示站点(社区) <a href="https://link.segmentfault.com/?enc=koIUl%2FLkcZfiEtfTB1pj9g%3D%3D.3e3gdocF6WcfwWPyLkn0DFqrLi3knYKbUcVlPqVUB9M%3D" rel="nofollow">https://nihongdengxia.com</a></p><p>后台演示站点 <a href="https://link.segmentfault.com/?enc=ciUvfM475pWLcURb9NYTqg%3D%3D.3XpUioCs2KO440HVvqUw4pe2oOVaZoThegzviHsXnR0%3D" rel="nofollow">http://47.106.128.78:8080/admin</a> 账号:user,密码:123456</p></blockquote><p><img src="/img/remote/1460000040260979" alt="功能预览" title="功能预览"></p><h3>更新日志</h3><table><thead><tr><th align="left">时间</th><th align="left">功能</th></tr></thead><tbody><tr><td align="left">2020年1月23日</td><td align="left">新增文章顶置功能</td></tr><tr><td align="left">2020年2月2日</td><td align="left">新增自定义导航功能</td></tr><tr><td align="left">2020年2月4日</td><td align="left">新增站点公告功能</td></tr><tr><td align="left">2020年2月6日</td><td align="left">新增友情链接模块</td></tr><tr><td align="left">2020年2月6日</td><td align="left">新增点赞功能</td></tr><tr><td align="left">2020年2月20日</td><td align="left">新增站点用户管理模块,可新增修改后台用户以及密码</td></tr><tr><td align="left">2020年3月5日</td><td align="left">JS渲染页面改为后端渲染,优化页面SEO</td></tr><tr><td align="left">2020年3月6日</td><td align="left">添加标签云</td></tr><tr><td align="left">2020年3月7日</td><td align="left">XSS攻击过滤</td></tr><tr><td align="left">2020年3月12日</td><td align="left">添加点赞限制</td></tr><tr><td align="left">2020年3月23日</td><td align="left">添加硬盘使用监控</td></tr><tr><td align="left">2020年3月25日</td><td align="left">新增图片放大预览</td></tr><tr><td align="left">2020年9月7日</td><td align="left">新增附件管理功能</td></tr><tr><td align="left">2020年10月1日</td><td align="left">新增文章抓取功能</td></tr><tr><td align="left">2020年10月30日</td><td align="left">leechan模板首页新增导航</td></tr><tr><td align="left">2020年10月30日</td><td align="left">新增站点地图,自动更新站点地图</td></tr></tbody></table><h3>更新 v1.1.0</h3><blockquote>接下来的v1.1.0版本将支持绑定公众号</blockquote><p>新功能:</p><ol><li>素材管理</li><li>自定义菜单</li><li>消息群发</li><li>关键词回复</li></ol><h3>Install</h3><h4>方式1 docker 安装(推荐)</h4><ol><li>先安装<code>docker</code>以及<code>docker-compose</code></li><li>把根目录下的<code>docker-compose.yml</code>赋值到你需要运行的<code>Go Blog</code>项目的目录下,执行<code>docker-compose up -d</code>.(会报找不到数据库的错误,忽略,在步骤3导入数据后就正常了)</li><li>登录<code>docker</code>启动的<code>mysql</code>,新建数据库<code>go-blog</code>,导入<code>go-blog/database/blog-mysql.sql</code>数据。</li><li>访问url<code>http://127.0.0.0:8080</code>,后台url<code>http://127.0.0.0:8080/admin</code>,默认账户:<code>user</code>,密码:<code>123456</code></li></ol><h4>方式二 源码安装</h4><ol><li>把Go Blog项目拉到本地</li></ol><pre><code>https://github.com/1920853199/go-blog.git</code></pre><ol start="2"><li>新建数据库,导入数据库文件,数据库文件/database/blog.sql</li><li>修改项目配置信息</li></ol><pre><code>#conf/app.conf
appname = go-blog
httpport = 8088
runmode = dev
EnableAdmin = false
sessionon = true
url = 127.0.0.1:8088
view = default
limit = 10
title = Go Blog
autograph = 如今的我,谈不上幸福,也谈不上不幸。
[db]
dbType = mysql
dbUser = root
dbPass = root
dbHost = 127.0.0.1
dbPort = 3306
dbName = blog
[redis]
rHost = 127.0.0.1
rPort = 6379
[wechat]
AppID = xxxxxxx
AppSecret = xxxxxxx
Token = xxxxxxx
EncodingAESKey = xxxxxxx
</code></pre><ol start="4"><li>在bo-blog 根目录下执行bee run ,访问 <a href="https://link.segmentfault.com/?enc=tyRikyTRPNhoYkjq66BNag%3D%3D.ceqX4TXiWyBCB8M892tHmjyrLOQA27zNJspg17gRvro%3D" rel="nofollow">http://127.0.0.1:8888</a> 即可</li><li>守护进程模式运行 可以了解PM2的相关信息,配置可查看start.sh 文件</li><li>nginx代理示例</li></ol><pre><code>server {
listen 80;
server_name go-blog.cn;
root /home/data/go-blog;
location ~ \.(txt|xml)$ {
root /home/data/go-blog;
}
location / {
proxy_pass http://127.0.0.1:8889;
#proxy_redirect off;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
access_log /home/wwwlogs/go-blog.access.log;
}
</code></pre><h2>END</h2><p>感谢您关注此项目 : ),如果有好的想法欢迎 Issue or PR。</p>
自荐一个Go 写个人博客,博客将支持公众号一系列功能
https://segmentfault.com/a/1190000021594014
2020-01-15T19:54:44+08:00
2020-01-15T19:54:44+08:00
LeeChan
https://segmentfault.com/u/leechan_
0
<p>官方网站:<a href="https://link.segmentfault.com/?enc=1Fgj%2FQKc2LS6YfT0zolxew%3D%3D.oKGu8AT0WCUOJeLvT2NbDyO3IUcwrDHJOYLEFv3jnOY%3D" rel="nofollow">http://go-blog.cn</a></p>
Beego 中容易被我们忽视的问题之 Memory 缓存篇
https://segmentfault.com/a/1190000020513618
2019-09-27T14:40:23+08:00
2019-09-27T14:40:23+08:00
LeeChan
https://segmentfault.com/u/leechan_
0
<h4>前言</h4>
<p>在我基于 beego 写博客的时候遇到一个很奇怪的问题,那就是在使用 <code>Memory</code> Cache 类型缓存的时候,缓存不生效很是奇怪,但是使用 <code>redis</code> 就没问题。由于时间问题我就没有深究,毕竟那时候实际上也会选用<code>Memory</code>做缓存的。所以就放了下来,直到今天在群里有人问了同样的问题。我决定去研究一下这个坑。</p>
<h4>我们先来看一个例子</h4>
<p>Set Cache 代码:</p>
<pre><code>var (
urlcache cache.Cache
)
func init() {
urlcache, _ = cache.NewCache("memory", `{"interval":10}`)
}
func (this *SetController) Get() {
urlcache.Put("test", "test result sada", 60)
}</code></pre>
<p>Get Cache 代码:</p>
<pre><code>func (this *GetController) Get() {
result := urlcache.Get("test")
this.Data["json"] = result
this.ServeJSON()
}</code></pre>
<p>先卖个关子,先别往下看,思考一下你们觉得输出的结果是什么?</p>
<p>没错,结果是:</p>
<pre><code>null</code></pre>
<h4>那么我们再看一下例子:</h4>
<p>Set Cache 代码:</p>
<pre><code>var (
urlcache cache.Cache
)
func init() {
urlcache, _ = cache.NewCache("memory", `{"interval":10}`)
}
func (this *SetController) Get() {
urlcache.Put("test", "test result sada", 0)
}</code></pre>
<p>Get Cache 代码:</p>
<pre><code>func (this *GetController) Get() {
result := urlcache.Get("test")
this.Data["json"] = result
this.ServeJSON()
}</code></pre>
<p>再来猜一下这回结果是什么?</p>
<p>大家可能都知道了,结果:</p>
<pre><code>test result sada</code></pre>
<h4>那纠究竟是为什么会这样呢?真相只有一个!</h4>
<p>原来这个 <code>Put</code> 的第三个参数,设置内存的 GC 的时间单位是 <code>time.Duration</code> 也就是我们说的纳秒,所以我们在直接设置这个时间的时候经常忽略单位只写了个数字,所以最后我们回头取缓存的时候,缓存早已经过期的了。<br>这个事情告诉我们看文档一定要细心。我贴一下文档以及 <code>Cache</code> 源码:</p>
<p>官方文档给的接口:</p>
<pre><code>type Cache interface {
Get(key string) interface{}
GetMulti(keys []string) []interface{}
Put(key string, val interface{}, timeout time.Duration) error
Delete(key string) error
Incr(key string) error
Decr(key string) error
IsExist(key string) bool
ClearAll() error
StartAndGC(config string) error
}</code></pre>
<p><code>memory.go</code>源码:</p>
<pre><code>// Put cache to memory.
// if lifespan is 0, it will be forever till restart.
func (bc *MemoryCache) Put(name string, value interface{}, lifespan time.Duration) error {
bc.Lock()
defer bc.Unlock()
bc.items[name] = &MemoryItem{
val: value,
createdTime: time.Now(),
lifespan: lifespan,
}
return nil
}</code></pre>
<p><strong>欢迎各位朋友留言评论一起学习交流。</strong></p>
<p><a href="https://link.segmentfault.com/?enc=%2Fmp1e9MSV0jDljchlKMeGg%3D%3D.mcaB06tS7wwg%2Fj0N37EWt80DueOhisT9HSfln6pYF3dGZKbDE6rSsPFGEBHiLTrc" rel="nofollow">点我阅读原文</a></p>
swoft中Crontab定时器的坑
https://segmentfault.com/a/1190000018613885
2019-03-22T11:51:36+08:00
2019-03-22T11:51:36+08:00
LeeChan
https://segmentfault.com/u/leechan_
3
<p>这两天老大给了个需求想把商城热点数据同步到redis缓存。我们项目使用的是swoft框架,所以我就想到用框架的Crontab定时器。但是在测试的时候发现把Table的size设置为1024时(实际上设置为任何大小都一样,贴上swoole的解释)发现内存溢出了</p>
<p><img src="/img/bVbqgiP?w=929&h=251" alt="clipboard.png" title="clipboard.png"></p>
<blockquote>普及一下Table(来自swoole文档):<br>Table底层是建立在共享内存之上的HashTable数据结构。$size最大行数,决定了HashTable的总行数。由于Table是在共享内存之上,所以无法动态扩容。这个$size必须在创建前设置好。<br>$size参数指定表格的最大行数,如果$size不是为2的N次方,如1024、8192,65536等,底层会自动调整为接近的一个数字,如果小于1024则默认成1024,即1024是最小值</blockquote>
<p>先把框架任务投递流程走一下:</p>
<ol>
<li>首先当框架启动一秒后,启动定时器每秒去更新执行一次Task(任务)。更新任务之前先去队列内存表中清理已完成的队列数据(这点很重要)</li>
<li>然后获取出所有的任务中的队列(可以理解为获取所有的Task类中的方法),以任务规则,以及taskClass,分钟,时间戳这些数据以md5方式加密得到每个任务队列的key值,保存在runTimeTable 中。(originTable,以及runTimeTable 的结构)</li>
</ol>
<p><img src="/img/bVbqgiz?w=1051&h=706" alt="clipboard.png" title="clipboard.png"></p>
<blockquote>注:在定时器这块使用到两个Table 一个是originTable用于存储任务的(Task)实例。另一个是runTimeTable 存储任务队列实例,通俗地说就是存需要执行的任务实例</blockquote>
<p>再看看任务执行流程,任务的执行就很简单了</p>
<ol>
<li>首先通过getExecTasks这个方法把所有满足条件的队列任务放在一个数组,然后通过遍历数据把runStatus的值改为self::START</li>
<li>之后执行所有runStatus的值为self::START的队列任务</li>
<li>把执行后的队列任务的runStatus的值改为self::FINISH</li>
<li>最后把runStatus的值改为self::FINISH的剔除掉</li>
</ol>
<p>重新梳理一下我们逻辑<br>当我们新建执行一个任务的时候,系统每秒钟都回去更新执行一个每个任务中的队列数。<br>代码如下:<br><img src="/img/bVbqgnH?w=1609&h=795" alt="clipboard.png" title="clipboard.png"></p>
<p><img src="/img/bVbqgpi?w=1581&h=551" alt="clipboard.png" title="clipboard.png"></p>
<p>通过代码我们能够发现每一分钟他都会往runTimeTable 中添加60个任务队列<br>但是当我们getExecTasks获取将要执行的任务队里的时候是根据当前的时候是否等于执行时间而标志状态的<br>那么现在就会出现一个问题。当前时间往任务队里中添加数据的时候 他把前面执行过的任务队列再次添加进runTimeTable 中<br>举个栗子:<br>假如我有个异步任务Sync,其中有个每秒执行一次的方法cronTask,<br>现在时间是2019-03-22 10:01:20 现在往更新runTimeTable 的时候 他会往里面添加60的任务队列key分别会是<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'00')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'01')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'02')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'03')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'04')<br>...<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'59')</p>
<p>当时间到下一秒(是2019-03-22 10:01:21)的时候后 依然会往更新runTimeTable数据 key值为<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'00')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'01')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'02')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'03')<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'04')<br>...<br>MD5("<em> </em> <em> </em> <em> </em>".'Sync'.'cronTask'.'01'.'59')</p>
<p>那么我们可以很明确地看出来在2019-03-22 10:01:21秒前的数据都是没用的了 。这些数据永远不会被消费,也不会被删除。因此一段时间后会出现内存溢出的情况。<br>所以解决方法是在清理消费数据的时候把过期数据也同时清理<br>把cleanRunTimeTable中的</p>
<pre><code>if ($value['runStatus'] === self::FINISH) {</code></pre>
<p>改为</p>
<pre><code>$currentTime = time();
if ($value['runStatus'] === self::FINISH || $value['sec'] < $currentTime) {</code></pre>
<p><img src="/img/bVbqgtw?w=1634&h=608" alt="clipboard.png" title="clipboard.png"></p>
<blockquote>本文为本人学习过程记录。如果有哪些地方描述不当望各位大佬指出。</blockquote>
<p><a href="https://link.segmentfault.com/?enc=%2BxBKtU4B%2BGv%2BUDMSKbs4GQ%3D%3D.HRIBqL8Y%2Bp8Rsln8LvLI6PUNjeVzsIBJHwOEwYupHmGHtS4LSjkAv6HLMJwrPepb" rel="nofollow">点我阅读原文</a></p>