FooFishhttps://foofish.net/2024-03-04T23:29:01+08:00Python中的 if __name__ == '__main__' 是什么?2024-03-04T23:29:01+08:002024-03-04T23:29:01+08:00刘志军tag:foofish.net,2024-03-04:python-name-main.html<p>新手学Python的时候,一定见过<code>if __name__ == '__main__':</code>这段代码,尤其是在写Python脚本的时候。</p>
<p>这段代码究竟是啥意思,有啥作用?</p>
<p>为了搞懂这行代码,首先要了解Python中的<code>__name__</code>属性和主程序概念。</p>
<p><strong><strong>name</strong> 属性</strong></p>
<p>在Python中,每个Python文件(不管是被执行的脚本还是被导入的模块)都有一个内置的<code>__name__</code>属性。</p>
<p>当文件被直接执行时,<code>__name__</code>的值会被设置为<code>'__main__'</code>,而当文件被导入到其他文件时,<code>__name__</code>的值则会被设置为文件的名字。</p>
<p><strong>主程序和模块</strong></p>
<p>主程序:就是直接被运行的Python文件,程序运行的入口,在这个文件中,<code>__name__</code>的值是<code>'__main__'</code>。</p>
<p>模块:被其他Python文件导入(import)使用的文件。在这个文件中,<code>__name__</code>的值是该文件的名称。</p>
<p><strong>if <strong>name</strong> == '<strong>main</strong>'是什么?</strong></p>
<p>所以,现在你应该明白这行代码的意义了吧?就是让Python判断当前运行的环境是主程序还是被导入的模块 ...</p>用 Python 破解隔壁老王家的 Wi-Fi 密码,刺激!2024-03-04T00:29:01+08:002024-03-04T00:29:01+08:00刘志军tag:foofish.net,2024-03-04:python-crack-wifi.html<p>家里没有怎么办,只要你会Python,办法总比困难多</p>
<p>本文就利用pywifi 这个库实验一下如何破解Wi-Fi 密码,注意,该方法仅可用来研究学习所用,不可以拿去干坏事。</p>
<h3>1. pywifi 简介</h3>
<p>pywifi是一个Python库,它提供了对无线网络接口的控制,允许你扫描周围的无线网络,以及连接到无线网络。但请注意,这个库并不意味着可以绕过网络安全措施来非法连接网络。</p>
<h3>2. 环境配置</h3>
<p>在开始之前,你需要确保Python已经安装在你的计算机上,并且安装了pywifi库。你可以使用pip命令来安装pywifi:</p>
<div class="highlight"><pre><span></span>pip install pywifi
pip install comtypes
</pre></div>
<h3>3. 扫描周围的Wi-Fi网络</h3>
<p>接下来,我们将展示如何使用pywifi来扫描周围的Wi-Fi网络。</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">pywifi</span> <span class="kn">import</span> <span class="n">PyWiFi</span><span class="p">,</span> <span class="n">const</span><span class="p">,</span> <span class="n">Profile</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="k">def</span> <span class="nf">scan_wifi</span><span class="p">():</span>
<span class="n">wifi</span> <span class="o">=</span> <span class="n">PyWiFi</span><span class="p">()</span>
<span class="n">ifaces</span> <span class="o">=</span> <span class="n">wifi</span><span class="o">.</span><span class="n">interfaces</span><span class="p">()[</span><span class="mi">0 ...</span></pre></div>公众号自媒体赚钱手册2024-03-03T00:29:01+08:002024-03-03T00:29:01+08:00刘志军tag:foofish.net,2024-03-03:gongzhonghao-make-money-cookbook.html<h3>自我介绍</h3>
<p>你好,我是刘志军, 前程序员,现在自由职业,知乎优秀答主,全网粉丝30万,目前专注于AI+自媒体领域。</p>
<ul>
<li>16年开始写公众号,名字是Python之禅</li>
<li>17年公众号粉丝突破2万</li>
<li>18年粉丝突破10万,并赚到副业的第一个100w</li>
<li>19年开发了公众号数据分析平台次幂数据</li>
<li>23年成为自由职业,专注于AI和自媒体领域</li>
<li>24年持续成长中</li>
</ul>
<p>作为一名从大山里走出来农村娃,我学计算机就是因为程序员薪资高,希望靠互联网实现屌丝逆袭,所以毕业后理所当然的选择了程序员这个行业,作为一名程序员我是如何通过技术写作赚到百万的呢?</p>
<p>我注册公众号还是13年的事情,那时候我并不知道公众号怎么赚钱,所以注册了并没有去运营它,所以错过了公众号最佳红利期</p>
<p><strong>所以说你只能赚到认知范围以内的钱,你所赚到的钱都是对认知的变现</strong></p>
<p>因为我平时喜欢钻研技术并喜欢做些笔记当做技术博客来发,刚开始只知道把内容发在自己的个人博客上。和大家一样,我也非常渴望写出来的东西有人看,有人点赞有人评论,但是现实很残酷,写出来的东西除了自己没有第二个读者</p>
<p>不过我并没有因此放弃,我很清楚没人看是常态,我的目标不是为了流量,而是为了提高技术能力坚持让自己写,每写完一篇文章就很有成就感,因为我的博客又多了一篇。</p>
<p>所以,<strong>早期我的写作经历纯粹是怼量,通过量变产生质变</strong></p>
<p>直到2016年,从一家公司离职后,中间大概有一个多月的空窗期,闲来无事之后重新打开我的公众号,开始在公众号发文章 ...</p>公众号爆文获得百万级的流量密码是什么?做到这4点你也能写出10w+2024-02-05T11:47:06+08:002024-02-05T11:47:06+08:00刘志军tag:foofish.net,2024-02-05:baowen-sucaiku.html<p>公众号平台迎来王炸级更新,流量分发机制调整,把订阅制改成<strong>算法推荐机制</strong>,让普通人有了入局公众号变现的机会,而公众号爆文写作流量主变现无疑是门槛最低的变现方法。</p>解决GitHub代码push失败,提示 connect to host github.com port 222024-01-23T18:29:01+08:002024-01-23T18:29:01+08:00刘志军tag:foofish.net,2024-01-23:solve-github-spush-failed.html<p>发现本地一个托管在GitHub的项目突然没法push代码了,提示: Connection timed out</p>
<div class="highlight"><pre><span></span>ssh: connect to host github.com port 22: Connection timed out
</pre></div>
<p>问题出在22端口上,可能是网络环境或者端口问题,可以通过改用443端口来解决</p>
<p>修改文件 <code>~/.ssh/config</code> ,添加以下内容:</p>
<div class="highlight"><pre><span></span>Host github.com
Hostname ssh.github.com
Port 443
</pre></div>
<p>这样 SSH 连接时就会通过 443 端口与 <code>ssh.github.com</code> 进行通信,而不是默认的 22 端口。</p>
<p>保存文件重新push代码验证OK</p>我的20232024-01-01T09:18:01+08:002024-01-01T09:18:01+08:00刘志军tag:foofish.net,2024-01-01:my-2023.html<p>在2023年的尾巴,发生一个搞笑的故事</p>
<p>晚饭做饭,准备切胡萝卜丝炒鸡蛋,儿子跑过来说,爸爸我想吃西红柿炒鸡蛋。 我说家里没有西红柿,要不你下楼去买下,我给你炒。然后他自己就去了,出门前我还特意叮嘱买两个哈。 我满怀期待着他的西红柿,打开门当我看他到手里提着两鸡蛋时,我想到程序员买西瓜的段子。</p>
<div class="highlight"><pre><span></span>老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?”老公答曰:“因为看到了卖西瓜的。”
</pre></div>
<p>如果这是个程序,大概率是哪里出bug了,但是我没法复现出来。我问他你在路上想什么,他说只想快点买回来就有美味吃了。</p>
<hr />
<p>2023年是我的本命年,回过来头来看这一年比预想的要好</p>
<p>2月份公司裁员,随后我正式开启了自由职业。随之而来的是重新计划生活,一到选择题摆在我们面前,继续留深圳还是回湖南</p>
<p>3-4月主要在看房,因为要赶在5月份前买好小孩才有学校读,这是一个很尴尬的时间段,最后也没买成,好处就是又给我们省了几十个w,因为新政出来后房价跌得更猛了。</p>
<p>最后我们选择暂时离开了深圳,没有太多伤感,因为只要家人在一起,去哪里都行。</p>
<p>留在老家先苟住,生活成本极低,最大的一项开支是水果零食,至于工作 ...</p>2024年版ChatGPT最新注册教程2023-12-03T12:59:01+08:002023-12-03T12:59:01+08:00刘志军tag:foofish.net,2023-12-03:how-to-registe-chatGPT-new.html<p>如何才能体验ChatGPT呢?很多人卡在账号注册这一步,现在就来手把手教你如何成功注册ChatGPT,亲测有效。 如果不想自己折腾直接加入我们社群【ChatGPT研究社】,里面提供了关于ChatGPT的各种教程和工具,让你快速上手,现在加入还可免费获取一个独立的ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="images/image-20230330011719223-1701583447111-29.png" /></p>
<p>ChatGPT3.5版本是免费,使用起来没有时间限制;ChatGPT4.0,需要20美金/月的订阅费用,且3小时只能使用50次。现在ChatGPT不再需要国外手机号就可以直接注册。</p>
<p>首先打开魔法,访问链接:https://chat.openai.com/auth/login</p>
<p><img alt="img" src="images/1701582366498-c4e739ad-aa02-49dd-b649-d60437491597.png" /></p>
<p>点击 “Sign up”注册账号</p>
<p><img alt="img" src="images/1701582426948-d7a6820d-c96e-4ed9-92c3-0aa3d3cbc174.png" /></p>
<p>选择微软账号注册</p>
<p><img alt="img" src="images/1701582510703-e0717810-ec19-46bf-aff2-ac6de8c7d36d.png" /></p>
<p>如果你有微软账号,就直接登录,没有就选择“create one” 创建一个新账号。</p>
<p><img alt="img" src="images/1701582602560-7fdedbc7-5bfc-437c-bc2b-1a48b1cac9df.png" /></p>
<p>设置账号名</p>
<p><img alt="img" src="images/1701582621051-18a1a94c-b85f-417d-946a-24b1af985dca.png" /></p>
<p>设置密码</p>
<p><img alt="img" src="images/1701582682926-529f5228-fab9-4d0d-8a9a-bbe56248e763.png" /></p>
<p>地区选择美国(United States)</p>
<p><img alt="img" src="images/1701583004551-de237823-41a7-4d4a-827f-78910e680930.png" /></p>
<p>微软账号注册成功后,选择“Accept”</p>
<p><img alt="img" src="images/1701583084556-a0ff3f83-bdb0-430a-b214-060f5a8278c4.png" /></p>
<p>设置ChatGPT名字和生日</p>
<p><img alt="img" src="images/1701583151287-3857bebf-ae96-4c89-b368-1026b1729292.png" /></p>
<p>搞定!</p>ChatGPT can make mistakes. Consider checking important informations 错误2023-11-16T10:00:01+08:002023-11-16T10:00:01+08:00刘志军tag:foofish.net,2023-11-16:chatgpt-can-make-mistakes.html<p>ChatGPT 出现错误 ChatGPT can make mistakes. Consider checking important informations。 有两种解决办法</p>
<p>1、 开全局代理 </p>
<p>2、新增两个规则:将DOMAIN-SUFFIX,oaistatic.com DOMAIN-SUFFIX,oaiusercontent.com 加到指向可以使用gpt的代理中</p>
<p><img alt="img" src="images/1&e=1704038399&s=ttmytyyymy&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD-n2epZR7HhkEY8ZwKeUS9BmaLUY=.jpeg" /></p>我的第一个GPTs2023-11-14T10:00:01+08:002023-11-14T10:00:01+08:00刘志军tag:foofish.net,2023-11-14:how-to-create-gpts.html<h3>GPTs是什么?</h3>
<p>简单来说,GPTs 类似于苹果应用商店的App,用户可以通过ChatGPT提供的能力创建属于自己的GPT,用来某些特定的应用场景, 例如我就有个需求,每天写公众号需要一张封面图,每天需要浪费大量时间去找合适的图片,如果有一个程序能直接帮我生成就好,自己实现至少得几百上千行代码。这时候完全可以用ChatGPT帮我实现。</p>
<p>我只要描述我的需求即可。</p>
<h3>怎么创建GPTs</h3>
<p>首先确保你的ChatGPT账号已经升级到GPT4(<a href="https://foofish.net/how-to-charge-gpt4-with-wechat.html">推荐一个GPT4升级方法</a>),登录账号后,点击左侧“Explore”,进入GPTs商店。</p>
<p><img alt="image-20231112003821019" src="images/image-20231112003821019.png" /></p>
<p>这里有你自己创建的GPTs,最近使用过的GPTs和官方预设置的GPTs。</p>
<p><img alt="image-20231112004013539" src="images/image-20231112004013539.png" /></p>
<p>点击 “Create a GPT",你只需要描述自己的需求即可,不需要你写任何代码,通过文字描述得方式直接向ChatGPT提需求</p>
<p><img alt="image-20231114104540768" src="images/image-20231114104540768.png" /></p>
<p>最后,他会给你生成一个头像,如果你还有要补充的内容,可以继续向ChatGPT说,直到你满意为止。</p>
<p>我直接上传了一张图让他来作为我这个GPTs的头像,同时限制了一下图片尺寸要求。</p>
<p><img alt="image-20231114104640334" src="images/image-20231114104640334.png" /></p>
<p>到这里,你的程序就开发完了,创建完成后,记得将你的GPTs保存,同时你还可以将这个机器人发布到应用上商店供大家一起使用。</p>
<p><img alt="image-20231114104827709" src="images/image-20231114104827709.png" /></p>
<p>最后就可以使用这个专属的GPT了。相比那个通用的GPT,这个专属GPT专用图生成公众号图片</p>
<p><img alt="image-20231114104953643" src="images/image-20231114104953643.png" /></p>
<p>看看效果</p>
<p><img alt="image-20231114105617663" src="images/image-20231114105617663.png" /></p>
<p>这个GPTs的链接:https://chat.openai.com ...</p>公众号AI爆款写作课发售2023-11-05T10:00:01+08:002023-11-05T10:00:01+08:00刘志军tag:foofish.net,2023-11-05:course-for-gongzhonghao-ai-writing.html<p>大家好,我是刘志军</p>
<p>公众号自媒体这个副业我做了有7年多,累计粉丝超过50万,大号垂直领域粉丝超过12万。累计流量主收入18万多,广子收入超过百万。</p>
<p>目前运营着8个矩阵号,纯靠流量主收入每日平均能做到500以上,单日最高收入超过3000。</p>
<p><img alt="4d62e3cfe049142cc9031c87182647b" src="images/4d62e3cfe049142cc9031c87182647b.jpg" /></p>
<p>我的公众号经历</p>
<p>当我还在职场时,作为一名程序员经常写博客,虽然没多少阅读,但是写博客的习惯曾让我拿到支付宝等大厂投来的面试邀请。</p>
<p>机缘巧合之下,开通了公众号,平时把文章同步在公众号,一开始并不知道写公众号还能挣钱,直到第一次接到一个500块钱的广告时,才发现,写公众号是一个非常挣钱的副业,况且当时我的阅读量才两三百。同时期,咪蒙这样的号一条广告40万。</p>
<p>这个广告给了我很大的信心,一开始写文章写得很烂,没人看, 但还是坚持日更、熬夜到一两点是家常便饭。 </p>
<p>各种渠道引流,知乎,CSDN、简书、掘金等平台都有我的身影,给大号投稿,学习同行的爆款文章</p>
<p>就这样2年多时间把一个垂直领域的技术公众号做到了10万粉丝, 阅读量从几百涨到了五六千,一条广告单价报到了5000。</p>
<p>而流量主收入完全就是睡后收入,只要每天发文就有收入。</p>
<p>因为持续深耕,在知乎也成为了优秀回答者,最重要的是踏入这个领域后还认识了一批会搞钱的高手。</p>
<p>而现在公众号的改版,从订阅机制改成算法推荐机制,迎来了第二春,哪怕你没粉丝,人人都有机会写出10万 ...</p>怎么查询公众号低粉爆款文章2023-11-03T10:00:01+08:002023-11-03T10:00:01+08:00刘志军tag:foofish.net,2023-11-03:gongzhonghao-difenbaokuan-article.html<p>写公众号有一条定律,就是火的内容在一段时间内还会持续火。所以新手快速写出10万+爆款的捷径是借鉴已经有10万+的<strong>低粉爆款</strong>文章,按照10万+的爆款文章的风格去模仿,模仿标题、模仿内容,这是最快写出10万+文章的最佳方法之一。</p>
<h3>什么是低粉爆款</h3>
<p>所谓低粉爆款就是指粉丝数很少,阅读量却极高的文章,爆款不一定非要10w以上,几万阅读量的文章也值得参考。但是最核心的一点是这个号必须是小号或者新号,因为小号的阅读量都是靠推荐算法带来的。</p>
<p>阅读量下限由公众号粉丝量决定,上限由微信推荐算法决定</p>
<p>我们找低粉爆款的流程分两步走,第一步找到阅读量高的爆款文章,从10万+、5万+开始找, 第二:分析是否为低粉小号。</p>
<h3>怎么找爆款文章</h3>
<p>两种方法找爆款文章,一是直接在微信里面找,可以通过搜一搜功能搜索关键字,假如现在想写一篇关于”许家印“的文章,可以直接搜”许家印“,依次选择“文章”,“最热”,然后自己逐条筛选哪些是低粉账号(关于怎么知道是低粉账号后面有详细介绍)</p>
<p><img alt="image-20231103125928040" src="images/image-20231103125928040.png" /></p>
<p>这种方法需要你耐心花时间去不停地找,如果不知道搜什么关键字,也可以去微信的”看一看“盲刷,所以这里还要推荐第二种方法。</p>
<p>用 ...</p>如何用微信、支付宝充值GPT42023-11-01T10:00:01+08:002023-11-01T10:00:01+08:00刘志军tag:foofish.net,2023-11-01:how-to-charge-gpt4-with-wechat.html<p>在我们<a href="https://xiaobot.net/p/playchatgpt">《公众号AI爆文写作变现》</a>的交流群,大家遇到最多的一个问题怎样才能使用上GPT4,因为体验了很多大模型都很拉垮</p>
<p>GPT4开放的功能越来越强大,包括</p>
<ol>
<li>实时联网</li>
<li>语音对话</li>
<li>海量插件</li>
<li>图片识别</li>
<li>文件上传</li>
<li>数据分析能力</li>
<li>绘图功能</li>
<li>代码解析功能</li>
<li>自定义指令</li>
</ol>
<p>各个都是王炸级功能,AI写作更不是话下,能吊打国内外一众大模型,很多人想付费体验却因为没有国外信用卡,网上购买的GPT4帐号又容易被封,何不自己动手呢注册呢?</p>
<p><img alt="image-20231101101934962" src="images/image-20231101101934962.png" /></p>
<p>我发现的这个宝藏网站可以畅通无忧的解决你的充值问题,从6月份开始使用几个月下来没有任何问题,推荐给朋友圈几百个人从未反馈过封号的问题。</p>
<p>我觉得体验比较好的地方</p>
<p>1、充值方便,开卡充值支持支付宝和微信两种方式,不需要像其它平台一样要先去换U</p>
<p>2、系统稳定,随时都支持充值,之前用的depay时常系统维护,影响我充值,太糟心</p>
<p>3、提供贴心服务,担心你的网络环境不行,他们还专门帮你搞了个远程环境用于GPT4的升级,因为我们自己用的网络一般都是多人共享IP的,被污染导致充值被拒。</p>
<p>4、客服很nice,别以为他们的客服是机器人,其实背后是真人,遇到任何问题都能给你提供帮助的。</p>
<p><img alt="image-20231101105352786" src="images/image-20231101105352786.png" /></p>
<p>具体怎么充值,怎么升级GPT4这些在他们网站都有保姆级教程,比我还写得细 ...</p>公众号爆款AI写作指令2023-11-01T10:00:01+08:002023-11-01T10:00:01+08:00刘志军tag:foofish.net,2023-11-01:writing-prompt.html<p>这是我们专栏<a href="https://xiaobot.net/p/playchatgpt">《公众号爆款AI写作》</a>专属的写作指令,请配合专栏课程一起使用。 用的AI工具是ChatGPT4,怎么充值GPT4可以参考这篇文章<a href="https://foofish.net/how-to-charge-gpt4-with-wechat.html">如何用微信、支付宝充值GPT4</a></p>
<h3>标题</h3>
<div class="highlight"><pre><span></span>背景:我是一名公众号自媒体运营,现在需要你扮演一个通用的标题党生成器,用于生成吸引人的文章标题。我们希望通过引人注意的标题来吸引读者的兴趣和好奇心,激发用户的点击欲望
角色:请你扮演一个资深文案专家,精通编写爆款标题。
任务:根据我提供的文章或者主题,生成5个合适的公众号爆款标题,并说明理由,最大程度激发用户点击欲望。
要求:
1、遵信爆款标题万能公式:爆款标题=直击人性+吸睛词汇+顺口句式
2、采用提问、金钱、数字、性暗示、暴力、死亡、捷径、异常、悬念、利用损失心里、反常识等你认为能煽动用户情绪的手法
3、多使用情况强烈的词汇或流行词汇,吸引用户眼球。
4、保证标题字数不超过50字
你理解任务后只需要回复明白,等待我给你发送文章。
</pre></div>
<h3>大纲提取 ...</h3>公众号低粉爆款案例(二):职场、体制领域多个10w+2023-10-21T10:00:01+08:002023-10-21T10:00:01+08:00刘志军tag:foofish.net,2023-10-21:gongzhonghao-case-2.html<p>上一篇分析过关于热点事件产生的多个爆款文章,今天分析另一个领域的低粉爆款---职场、体制内话题,这个领域已经有多个账号拿到微信的推荐流量。</p>
<p>这个号的起号事件是9月27日,连头像还没来及设置(默认头像)</p>
<p><img alt="img" src="../../images/FrPZHyAu5YeF6HAHWssM03QXhsws.png" /></p>
<p>短短不到20天时间就拿到10w+阅读量,还有多篇一万以上阅读的文章</p>
<p><img alt="img" src="../../images/FnXJmIxezgdcBr5wdt8u6_QfKl1s.png" /></p>
<p>文章主要以职场、体制内相关的话题为主,从标题来看,作为一个普通用户,不管你是不是体制内从业者,或多或少都有想点击的欲望。</p>
<p>另外一点是这些文章都是有标记为原创,从经验来看,毫无疑问平台鼓励原创打击抄袭。细心的你可以去看看这个号的文章内容,其实排版很一般,内容在网上随便搜都能搜到很多类似的文章。如果你要写原创,很简单就是借助ChatGPT,让ChatGPT帮你进行伪原创,你只要把大纲写好,让他来帮你填充内容,一篇10w+的文章半小时就能搞定。</p>
<p>职场号拿到10w+的低粉账号远不止一个号,比如下面这几个平台给的流量非常猛</p>
<p><img alt="img" src="../../images/FkQpd7PhO5YRGT4rkjgFdPpbd9j9-1697854466254-47.png" /></p>
<p><img alt="img" src="../../images/FrW64YAfZIemsyOonwftsYSnRWdc-1697854462901-45.png" /></p>
<p><img alt="img" src="../../images/FkQ0SEit5KYIcO1ue8s_DFauLPlZ.png" /></p>
<p>更多低粉爆款文章看访问次幂数据网站查看 https://www.cimidata.com/articles/hot/10w</p>被偷的自行车2023-10-19T10:00:01+08:002023-10-19T10:00:01+08:00刘志军tag:foofish.net,2023-10-19:the-lost-bicycle.html<p>今年回十八线开启自由职业后,会经常带娃去当地一个大学里打篮球。故事还要回到十一假期说起,那天和往常一样骑自行车去的篮球场。</p>
<p>自行车是口罩时期买的</p>
<p><img alt="img" src="../../images/641.png" /></p>
<p>因为是户外,自行车直接放在场边没落锁,我在隔壁场玩,直线距离不到5米,全程没留意自行车,根本没想过会有人在你眼皮底下把自行车骑走,准备回家才发现自行车不翼而飞,一度怀疑自己是不是没有骑自行车。</p>
<p>随后立即报警,警察不到十分钟到现场询问了基本情况,带我去了学校监控室,关键时候监控一般都是坏的,这个理论大部分时候都适用。监控室大叔折腾半天没发现任何线索,警察因为另外一起案例临时离开。最后我跟大叔说我来帮你找,然后我盯着学校的两个出口,从监控中发现了小偷骑着我的自行车大摇大摆从西门扬长而去,监控清晰拍到了小偷的正脸。</p>
<p>这里就不放视频了。</p>
<p>后来去派出所做了笔录。然后就是漫长等待,因为正逢假期,警察告知一些些侦察工作需要等工作日后才能开展,我这边就隔三岔五催民警进度,与此同时,我每天也在附近找这个人。</p>
<p>之所以有信念找回是因为有监控。</p>
<p>皇天不负有心人,离丢自行车第10天在学校路上偶遇一个与监控中极为相似的嫌疑人,于是果断进行跟踪,一边与警察联系,可笑的是,电话那边说,我的自行车已经帮我找到,嫌疑人也已锁定,先不要打草惊蛇,于是我放弃了跟踪。</p>
<p>和民警约好三天后去领自行车,离奇的是自行车在学校保卫处,我顺便问了下人抓到没有,搞笑的一幕出现。到了现场,并没有看到小偷,然后学校保卫处处长过来跟我解释 ...</p>ChatGPT Plus GPT4 功能汇总2023-10-18T13:00:01+08:002023-10-18T13:00:01+08:00刘志军tag:foofish.net,2023-10-18:chatgpt4-features-summary.html<p><img alt="img" src="../../images/v2-3eeaaa8ea0ed33b90280d075c2792fb6_1440w.jpg" /></p>
<p>目前GPT4(ChatGPT Plus)账号支持的功能包括</p>
<ol>
<li>GPTs</li>
<li>GPT4</li>
<li>海量插件</li>
<li>实时联网</li>
<li>语音对话</li>
<li>图片识别</li>
<li>文件上传</li>
<li>数据分析能力</li>
<li>绘图功能</li>
<li>代码解析功能</li>
<li>自定义指令</li>
</ol>
<p>以前只能在PPT上面能看到的效果现在都落地了,现在你只要有个Plus账号就能体验以上全部功能。</p>
<h3>GPTs</h3>
<p>简单来说,GPTs 类似于苹果应用商店的App,用户可以通过ChatGPT提供的能力创建属于自己的GPT,用来某些特定的应用场景, 例如我就有个需求,每天写公众号需要一张封面图,每天需要浪费大量时间去找合适的图片,如果有一个程序能直接帮我生成就好,自己实现至少得几百上千行代码。这时候完全可以用ChatGPT帮我实现。</p>
<p><img alt="image-20231112004013539" src="images/image-20231112004013539.png" /></p>
<h3>GPT4 VS GPT3.5</h3>
<p>GPT4对比GPT3.5,参数规模是是指数级提升,GPT4超过100万亿个参数,而GPT3.5只有不到1750亿个参数。意味着GPT4能处理的数据更多,更连贯、精准。</p>
<p>GPT3.5单词请求支持的最大token是16k,而GPT4最大支持32k,GPT4能处理的信息量更大。</p>
<p>GPT4是一个多模态(multimodal)模型,既可以支持图像和文本作为输入 ...</p>ChatGPT新特性:支持语音、图像,终于可以用它来练口语了!2023-09-27T14:00:01+08:002023-09-27T14:00:01+08:00刘志军tag:foofish.net,2023-09-27:chatgpt-new-features-for-voices.html<p>ChatGPT 这两天发布了一个激动人心的新功能,App端(包括iOS和Android)开始支持语音对话以及图片识别功能。</p>
<p>这两个功能一如既往的优先开放给Plus用户使用,现在将App更新到最新版本,就能体验。</p>
<p>为什么说激动人心?之前虽然支持语音输入,但本质上还是文本对话,你录入的声音会先转换成文本,然后发送给ChatGPT,ChatGPT再通过文字形式将答案发送给你,现在无需这样操作,就跟对方语音通话一样,不需要一直盯着屏幕。</p>
<p>我能想到的一种最佳应用场景就是用来练习英语口语和听力,刚好最近我在提升这两块的知识能力,所以对我来说,有这个功能非常实用,之前在Web端,我们还需要通过安装第三方插件的方式来试先音频的转换。现在直接支持了。</p>
<p>3步开启语音功能</p>
<p><img alt="chatgpt-voice.png" src="../../images/chatgpt-voice.png" /></p>
<p>最后来体验一下效果怎么样 <a href="https://v.douyin.com/iev1oWHS">https://v.douyin.com/iev1oWHS/</a> (声音有点小,将音量调大点)</p>
<p>官方提到的图片功能,我在这个版本并没有找到入口,可能还是内测中或者是分批开放给用户。图片场景的应用就更多了,例如你在家里,往冰箱里拍一张图片问问ChatGPT今晚做啥好吃的、怎么做。也可以用来辅导小孩写作业,遇到不会的题目直接拍照问ChatGPT。不过这些功能现在没法体验,真实效果怎样还有待验证。</p>Linux 磁盘空间不够用,这几个命令帮你提升磁盘空间2023-08-03T09:00:01+08:002023-08-03T09:00:01+08:00刘志军tag:foofish.net,2023-08-03:linux-disk-capacity.html<p>首先使用 <code>df</code> 命令查看磁盘剩余空间有多少</p>
<div class="highlight"><pre><span></span>df -h
</pre></div>
<p><img alt="image-20230803083805153" src="images/image-20230803083805153.png" /></p>
<p>比如我这个挂载在根目录的分区已经占用了78%的空间,进入根目录后,使用 <code>du</code> 命令找出大文件</p>
<div class="highlight"><pre><span></span>cd /
# 查看大于1G的文件并排序
du -h --max-depth=1 |grep 'G' |sort
</pre></div>
<p>通过迭代执行以上操作,找到占用空间最大的文件,比如使用命令找出来有两个文件占用大量空间,一个是 nginx的 access.log 日志文件,另一个是mysql 的 slow.log 日志文件, 占用了将近100个G。</p>
<p>我们直接使用下面的命令将该文件内容置空即可。</p>
<div class="highlight"><pre><span></span>> access.log
> slow.log
</pre></div>
<p>最后再来看磁盘空间</p>
<p><img alt="image-20230803113818325" src="images/image-20230803113818325.png" /></p>
<p>一下多出了几十个G</p>ChatGPT 安卓包下载2023-07-26T09:00:01+08:002023-07-26T09:00:01+08:00刘志军tag:foofish.net,2023-07-26:chatgpt-android.html<p>ChatGPT Android 版即将上线,现在可以在 Google play 商店进行预注册,一旦正式上线可选择自动安装应用。国内应用市场因为政策问题不太可能提供下载,所以你的手机前提条件是必须安装了 Google Play 商店才能下载 </p>
<p><img alt="image-20230726150546191" src="images/image-20230726150546191.png" /></p>
<ul>
<li>Google Play 应用商店下载版:<a href="https://play.google.com/store/apps/details?id=com.openai.chatgpt&hl=en_US">https://play.google.com/store/apps/details?id=com.openai.chatgpt&hl=en_US</a></li>
<li>离线安装包下载:链接: https://pan.baidu.com/s/1FyM-JwrOv0_zq6UNnU4lqQ?pwd=tmfz 提取码: tmfz </li>
</ul>ChatGPT 新功能“自定义指令” Custom Instructions 怎么使用?2023-07-22T09:00:01+08:002023-07-22T09:00:01+08:00刘志军tag:foofish.net,2023-07-22:chatgpt-custom-instraction.html<p>ChatGPT 又推出了一个新功能叫“Cumstom Instructions”,中文叫”自定义指令“,这个功能的一个用途是在与ChatGPT交互时帮助用户预先设置一些背景信息方便ChatGPT更好地理解用户的意图,减少用户每次对话前重复介绍背景信息,另外还可以对ChatGPT的输出内容做预设要求。</p>
<p>不过这个功能目前仅对Plus用户开放</p>
<p>开启方法:</p>
<p>点开首页左下角-Setttings&Beta->Beta Features-> Custom instructions</p>
<p><img alt="img" src="../../images/FgQM8n1rvaiJ3zdibqIpbotEePEd" /></p>
<p>开启后,点开左下角弹出的菜单,多了一个菜单项 Custom Instruction</p>
<p><img alt="img" src="../../images/FpkcsAExCDJ6pWmresUnWBh_PRs-" /></p>
<p>进入后设置</p>
<p><img alt="img" src="../../images/Fr1pVjtO4yV1KLoBNG5USYV9JaqM" /></p>
<p>这里我告诉ChatGPT,我是Java初学者,我希望通过ChatGPT辅助学习编程,然后希望它每次给我的回答是中文。</p>
<p>现在我们就来测试以下</p>
<p><img alt="img" src="../../images/Fp7ySQC4jeXAmzCH7GuQ9Nd7RH3l" /></p>
<p>我用英语问了一个面向对象中关于“重载和重写的概念“的问题,这时候它会基于Java语言来作答,并且回答的内容是中文,而且他会给我举例子说明,完全符和我在自定义指令中预设的要求。</p>
<p>这样我们在写prompt时,只需要把最关键的指令信息写上就行。</p>
<p>最后推荐加入我的知识星球【ChatGPT研究社】,里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程,现在加入即可获取的一个ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="images/image-20230330011719223-1689989949522-67.png" /></p>申请创业补贴2023-07-14T11:00:01+08:002023-07-14T11:00:01+08:00刘志军tag:foofish.net,2023-07-14:apply-start-ups-allowance.html<p>如果你正准备或者已经自己创业开公司,可以关注下当地人社局的一些福利政策,特别是一二线城市都有相应的补贴补助。 </p>
<p>比如深圳这边,针对符和条件的创业人员有初创补贴,场地租金补贴,社保补贴、带动就业补贴,一个股东最高可以拿到8.9万的申请补贴。</p>
<ol>
<li>社保一档补贴:870/人/月(公司部分补贴) 补贴3年,符合条件的股东:31320/人 每季度打款一次 </li>
<li>场地租金补贴:深户在普通办公场地满足条件的,补贴500/月(补贴3年,共计:18000每季度打款一次</li>
<li>初创补贴:符合条件股东10000/人(社保交满6个月,一次性补贴) </li>
<li>带动就业补贴:最多11人次,补贴最高30000封顶,可以在3年内领取完(员工在公司缴纳五险连续交满6个月,不看户籍、学历、不看缴纳几档 </li>
</ol>
<p>如有其它股东符合申请条件的,多一位股东多2项补贴(社保补贴,初创补贴一共4.1W)</p>
<p>一个股东申请四项补贴可以拿到8.9万,每增加一个符合条件的股东补贴会多4.1万/人 ...</p>如何通过一篇文章20天内赚到200美金2023-07-11T11:00:01+08:002023-07-11T11:00:01+08:00刘志军tag:foofish.net,2023-07-11:how-to-make-money-by-a-article.html<blockquote>
<p>你好,我是刘志军,以前是程序员,靠副业实现睡后收入7位数,现在是一名自由职业者,公众号Python之禅作者,全网超过20万粉丝。</p>
</blockquote>
<p>今天跟大家分享的赚钱案例:<strong>如何通过一篇文章在20天内挣到200美金</strong></p>
<p>可复制性: 100%</p>
<p>可行性:100%</p>
<p>技能:初中写作水平 </p>
<p>准备:独立博客(可选)</p>
<p>以下为正文:</p>
<p>先上图,这是我在wildcard的邀请奖金截图</p>
<p><img alt="img" src="images/FjRXm0e3Vl3IXgIndlLIbCBeFs_6.png" /></p>
<h4><strong>背景</strong></h4>
<p>ChatGPT 账号充值Plus要国外信用卡,所以有好几家平台提供虚拟信用卡服务,做的比较大的有<a href="https://www.dupay.one/web-app/register-h5?invitCode=712088&lang=zh-cn">Dupay</a>, <a href="https://card.onekey.so/?i=UFFH44">OneKey</a>, 这些平台的一个特点是充值只支持USDT(虚拟币),这对普通人来说是一道极高的门槛,大部分人最后不得不放弃自己申请信用卡转而找人代充(代充也是一个赚钱生意,以后再说)。 有一个哥们为了解决信用卡充值难问题,他们做了一个平台叫 <a href="https://bewildcard.com/i/ZHIJUN">wildcard</a>,直接可以用支付宝充值,充值难度直接从99降到0,毕竟谁没个支付宝呢。他们平台注册采用邀请制,每邀请一个新用户你可以获得2美元奖励。</p>
<h4><strong>我是怎么知道这个平台的?</strong></h4>
<p>我在逛<a href="https://okjk.co/FXt1UH">即刻</a>时,分享了一篇如果通过onekey订阅Plus时,有个粉丝在评论里推荐了WildCard这个平台,我立刻去网上搜到这个平台,然后自己体验去网站的整个流程 ...</p>ChatGPT Code Interpreter 能做哪些事?2023-07-08T12:00:01+08:002023-07-08T12:00:01+08:00刘志军tag:foofish.net,2023-07-08:chatgpt-code-interpreter.html<p>ChatGPT Code Interpreter 插件已经对Plus用户正式开放,今天登录ChatGPT发现有了Code interpreter 的开关 。</p>
<p><img alt="img" src="images/Fukz4VmnG6dgFndBE2KxyRhX9O7U.png" /></p>
<p>开关开启后,在GPT4模型下面就可以选择这个插件了。</p>
<p><img alt="img" src="images/FigpRXzMMwa-Z2sXT8VGDDTODft3.png" /></p>
<p>Code Interpreter 的中文意思是“代码解释器”,不过它并不是用来解释代码的,而是用来执行代码。熟悉编程的都知道,Python解释器就是用来执行Python代码的。</p>
<p>在该模式下用户可以上传文件,Code Interpreter能根据用户的提示自己编写代码自己执行并输出结果。例如:</p>
<p><strong>生成二维码</strong></p>
<p><img alt="img" src="images/FhZRWPZIYH8hd-hFWf774DW-hu2i.png" /></p>
<p>你还可以看到具体的代码,点开“show work”就可以看到</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">qrcode</span>
<span class="c1"># Generate QR code</span>
<span class="n">url</span> <span class="o">=</span> <span class="s2">"http://foofish.net"</span>
<span class="n">qr</span> <span class="o">=</span> <span class="n">qrcode</span><span class="o">.</span><span class="n">QRCode</span><span class="p">(</span>
<span class="n">version</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">error_correction</span><span class="o">=</span><span class="n">qrcode</span><span class="o">.</span><span class="n">constants</span><span class="o">.</span><span class="n">ERROR_CORRECT_L</span><span class="p">,</span>
<span class="n">box_size</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
<span class="n">border</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">qr ...</span></pre></div>官方gpt3.5, gpt4.0、github copilot chat、gpt3.5 api、gpt4 api 对比,谁更牛?2023-06-29T12:00:01+08:002023-06-29T12:00:01+08:00刘志军tag:foofish.net,2023-06-29:llm-model-compare.html<p>gpt4的智能程度大于gpt3.5,毫无争议,但是 OpenAI提供的GPT3.5 API 能力是否和官方的GPT3.5相当? 对应的GPT4.0是否也一样? 另外, Github 的 copilot chat 能力又怎样?</p>
<p>我试着用一个编程问题分别用不同的模型去测试看看效果如何。</p>
<p><strong>问题:请帮我实现一个Python函数,根据指定时间计算当月最后一天, 传入的参数值为datetime类型,返回的结果也为datetime</strong></p>
<p>我把AI返回给我的所有内容直接贴出来</p>
<p>GPT3.5 API 的回答</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="k">def</span> <span class="nf">get_last_day_of_month</span><span class="p">(</span><span class="n">date</span><span class="p">):</span>
<span class="c1"># 获取下个月的第一天</span>
<span class="n">next_month</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">day</span><span class="o">=</span><span class="mi">28</span><span class="p">)</span> <span class="o">+</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
<span class="c1"># 往前推一天,即为当月的最后一天</span>
<span class="n">last_day</span> <span class="o">=</span> <span class="n">next_month</span> <span class="o">-</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days ...</span></pre></div>零成本部署一个ChatGPT应用2023-06-28T23:00:01+08:002023-06-28T23:00:01+08:00刘志军tag:foofish.net,2023-06-28:deploy-chatgpt-app-free.html<p>用传统方法我们部署一个ChatGPT应用你要自己购买海外服务器,购买域名,自己去部署应用。硬性成本按照服务器500一年,域名100一年,ChatGPT的API费用除外,一年真金白银投入至少600以上。</p>
<p>今天推荐个0成本搭建自己的chatgpt网站方案,用的是Vercel这个平台</p>
<h3>vercel 是什么?</h3>
<p>Vercel 是一个免费的网站托管平台,可以部署静态网站,也可以部署动态网站,主要优点:</p>
<ul>
<li>可关联 github,只需要往 github 提交代码,它会自动获取最新的提交,然后自动部署</li>
<li>提供免费域名,如果有自己的域名,你可以将域名解析到这个平台</li>
<li>提供免费的 HTTPS 证书</li>
<li>傻瓜式部署方式,支持命令行部署和管理后台部署</li>
</ul>
<p>我们直接用Github上开源的ChatGPT项目来部署,<strong><a href="https://github.com/Yidadaa/ChatGPT-Next-Web">ChatGPT-Next-Web</a></strong> 这个项目Star 有3万多,很受欢迎。界面是长这样的:</p>
<p><img alt="image-20230627121850836" src="../../images/image-20230627121850836.png" /></p>
<p>交互和官网的ChatGPT差不多,但提供了大量的预设角色。</p>
<p>第一步:直接fork<strong><a href="https://github.com/Yidadaa/ChatGPT-Next-Web">ChatGPT-Next-Web</a></strong> 项目到自己的github账号中</p>
<p><img alt="image-20230627122206897" src="../../images/image-20230627122206897.png" /></p>
<p>第二步:注册<a href="https://vercel.com/login">Vercel</a>账号,这里建议直接用Github授权登录即可。</p>
<p><img alt="image-20230627122507285" src="../../images/image-20230627122507285.png" /></p>
<p>第三步:新建项目 ...</p>如何获取OpenAI ChatGPT的 API key?2023-06-27T12:00:01+08:002023-06-27T12:00:01+08:00刘志军tag:foofish.net,2023-06-27:how-to-get-openai-key.html<p>用你的ChatGPT账号密码登录网站:<a href="https://platform.openai.com/overview">https://platform.openai.com/overview</a></p>
<p><img alt="image-20230627124104964" src="../../images/image-20230627124104964.png" /></p>
<p>1、点击右上角“Personal“</p>
<p>2、点击 Vist API keys</p>
<p><img alt="image-20230627124207403" src="../../images/image-20230627124207403.png" /></p>
<p>点击 “Create enw secret key” 创建一个新的key</p>
<p><img alt="image-20230627124301461" src="../../images/image-20230627124301461.png" /></p>
<p>名字随便填或者不填,点击“”Create secret key“”,会给你生成一串很长的字符串,以sk-开头, 复制后保存到本地,如果这个key弄丢了是找不回的,只能重新生成新的,所以要妥善保管。</p>
<p>如果该key泄露出去了,请及时删除否则将消耗你的费用。</p>用 WildCard 充值ChatGPT Plus 会员2023-06-19T12:00:01+08:002023-06-19T12:00:01+08:00刘志军tag:foofish.net,2023-06-19:chatgpt-plus-upgrade-with-wildcard.html<p>安利一下充值ChatGPT Plus 会员的新渠道 WildCard , 优势在于它注册方便, 开卡速度快, 最重要的是它支持支付宝付款, 其它平台都需要先去购买稳定币来兑换, 这对普通用户来说门槛太高. 还有高昂的手续费. WildCard的开卡费是9.9美元, 没有后续的月费用.</p>
<h3>注册</h3>
<p><a href="https://bewildcard.com/i/ZHIJUN">https://bewildcard.com/i/ZHIJUN</a> 目前是邀请制注册, 可输入我的邀请码 <strong>ZHIJUN</strong> , 注册成功后上传身份信息可以. 首次开卡金额是9.9美元, 直接用支付宝就可以付款.</p>
<p>第一次充值最低要充值25美元, 为什么要充这么多呢, 因为OpenAI 会在绑卡的时候进行5美元的预扣款,如果在这之后订阅 $20 的Plus 会余额不够,所以限定最低充值额度在25美元。 卡里面的余额可以随时提现, 会自动返回到支付宝账号中. 速度很快.</p>
<p><img alt="image-20230619125219583" src="images/image-20230619125219583.png" /></p>
<p>卡里面还有一个对应的账单地址,在升级ChatGPT Plus 会员时可以直接使用该地址.</p>
<h3>升级 ChatGPT Plus</h3>
<p>充值ChatGPT Plus 时, 需要确保自己的网络环境是美国IP,而且要开启全局代理 ...</p>如何获得纯净IP来充值ChatGPT2023-06-18T15:00:01+08:002023-06-18T15:00:01+08:00刘志军tag:foofish.net,2023-06-18:build-a-static-public-ip-with-google-cloud-shell.html<h3>背景</h3>
<p>ChatGPT升级Plus经常会遇到支付被拒的问题,有一种情况是因为你的代理IP被污染导致的,因为该IP被很多人共用导致风控触发从而禁止支付,一种可能的办法是找一个纯净的IP,比如美国住宅IP,这种比较难弄到,还有一个办法是买一台带固定IP的虚拟主机。</p>
<p>还有一种可以白嫖又超级简单的方式使用谷歌云的Cloud Shell 快速创建一个云桌面。</p>
<h3>步骤</h3>
<p>登录谷歌云 https://cloud.google.com/?hl=zh-cn , 进入控制台后,激活 Cloud Shell</p>
<p><img alt="image-20230618144349159" src="../../images/image-20230618144349159.png" /></p>
<p>Cloud Shell 其实就是一个在线的命令行终端,通过该Shell,我们用Docker来启动一个Linux的云桌面</p>
<div class="highlight"><pre><span></span>docker run -p 8080:80 dorowu/ubuntu-desktop-lxde-vnc
</pre></div>
<p>点”在网页预览“</p>
<p><img alt="image-20230618150459359" src="../../images/image-20230618150459359.png" /></p>
<p>进入新网页后,你看到的就是一个Ubuntu的云桌面系统,是FireFox浏览器验证一下IP</p>
<p><img alt="image-20230618144532696" src="../../images/image-20230618144532696.png" /></p>
<p>现在如果你要充值ChatGPT Plus,就可以考虑将账号登录到该云桌面进行绑卡操作了,应为这个IP是固定的,而且不会有人和你共用,相当于是纯净IP,通过的概率非常高,亲测可用。</p>利用ChatGPT的函数调用功能实现:实时查询天气2023-06-15T20:00:01+08:002023-06-15T20:00:01+08:00刘志军tag:foofish.net,2023-06-15:chatgpt-function-calling.html<p><img alt="image-20230614223818614" src="../../images/image-20230614223818614.png" /></p>
<p>OpenAI 今天发布几个重磅更新 </p>
<p>1、 开放 16k 上下文的 GPT-3.5-Turbo 模型(gpt-3.5-turbo-16k),是目前的4倍
2、 新的 GPT-4 和 3.5 Turbo 模型
3、Chat Completions API 中的新增加函数调用功能 (实时获取网络数据成为可能)
4、embeddings模型的成本降低75%
5、gpt-3.5-turbo的输入token成本降低了25% (开发者的福音)</p>
<p>其中最令人兴奋的功能应该当属<strong>函数调用</strong>功能,我们都知道ChatGPT训练的数据是基于2021年之前的,你要问一些实时性相关的问题就没法回答你了,而函数调用让实时获取网络数据成为可能,比如查询天气预报、查股票、推荐个近期的电影之类的。</p>
<p>哪些模型支持函数调用?</p>
<p><code>gpt-3.5-turbo-0613</code> 和 <code>gpt-4-0613</code> 这两个模型都支持函数调用。</p>
<p>函数调用的流程是什么?</p>
<p>1、用户发起提问时 ...</p>Python3.12新特性2023-06-12T15:25:23+08:002023-06-12T15:25:23+08:00刘志军tag:foofish.net,2023-06-12:python3.12-new-features.html<p>6月11,Python发布了3.12的beta版本3.12.0b2,预计在7月31日发布RC版。语法层面上新增了一些特性,整体的性能也得到了一定的提升,这里介绍几个使用的语法特性。</p>
<h3>1、提供了错误消息的可读性</h3>
<p>在3.11及以前版本,如果模块没有导入时的错误提示时,只告诉你报错原因</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">"<stdin>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
<span class="ne">NameError</span><span class="p">:</span> <span class="n">name</span> <span class="s1">'sys'</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">defined</span>
</pre></div>
<p>现在,它还会告诉你修改建议</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">"<stdin>"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">1</span><span class="p">,</span> <span class="ow">in</span> <span class="o"><</span><span class="n">module</span><span class="o">></span>
<span class="ne">NameError ...</span></pre></div>如何无限制使用GPT4模型?2023-06-09T20:00:01+08:002023-06-09T20:00:01+08:00刘志军tag:foofish.net,2023-06-09:use-gpt4-without-limit.html<p>我们知道Plus用户使用GPT4是有限制的,就是每3小时内最多25次提问,一旦超出这个数量就只能使用默认的GPT3模型或者等3小时过后重新使用GPT4,有没有办法突破这种限制呢?</p>
<p>答案是肯定的</p>
<p>因为在iOS端ChatGPT的GPT4是不受次数限制的,所以我们可以通过插件配合脚本在浏览器里面也能模拟APP的环境,最终达到无限制使用GPT4的功能。</p>
<h3>安装Tampermonkey(油猴)插件</h3>
<p>首先安装<code>Tampermonkey</code>浏览器扩展插件,地址:https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo</p>
<p><img alt="image-20230427001814511" src="../../images/image-20230427001814511.png" /></p>
<p>插件安装成功后,再安装<code>ChatGPT开启不限次数的GPT4-Mobile</code> 脚本,下载链接:<a href="https://hd.nowcoder.com/link.html?target=https://greasyfork.org/en/scripts/467317-chatgpt开启不限次数的gpt4-mobile">https://greasyfork.org/en/scripts/467317-chatgpt开启不限次数的gpt4-mobile</a> 。打开链接点“安装此脚本”按钮。</p>
<p><img alt="image-20230609195240591" src="../../images/image-20230609195240591.png" /></p>
<p>现在回到ChatGPT网站,你会发现主页多了一种模型:GPT4-Mobile</p>
<p><img alt="image-20230609194330019" src="../../images/image-20230609194330019.png" /></p>
<p>最后来检测一下到底是不是真正的GPT4。我们不能直接问它是哪个模型,不管是GPT4还是GPT3,它都会回答是GPT3,因为它训练的数据截止是2021年,而GPT4今年才出。</p>
<p>我们可以换其它问题来问,比如问它:</p>
<div class="highlight"><pre><span></span>鲁迅为什么暴打周树人
</pre></div>
<p>GPT3 ...</p>极简创业2023-06-09T00:24:01+08:002023-06-09T00:24:01+08:00刘志军tag:foofish.net,2023-06-09:simple-and-beautiful-startup.html<p>在读《小而美-持续盈利的经营法则》这本书,记录一下</p>
<p>现在我也算是一个小创业者,读这本书有太多感同身受的地方。所以非常推荐这本书给那些正在做副业或者已经把副业当作主业来做的初创者。</p>
<p>这本书提到一个观点,互联网1%的人创作内容,9%的人贡献内容,90%的人消费内容,所谓贡献内容通常指贡献评论、点赞、收藏等,通过创作建立自己的影响力,随着时间的推移,它会产生飞轮效应,这个观点放在我身上就特别贴切。</p>
<p>我创业的种子应该是从知乎开始萌芽的,因为本身是程序员,所以经常会在知乎做内容分享,回答问题,有些回答几千赞,都是正儿八经的干货内容。虽然知乎变现不怎么样,但是公众号变现能力非常强,通过知乎导流给公众号,积累了第一批忠实粉丝,两年多时间公众号就积累了十几万粉丝,靠广告推广就变了7位数以上。</p>
<p>对于如何找到创业点子这个问题时,书上告诉我们可以从社区着手,那里有兴趣、价值观、技能相同但又有所不同的个体组成。除了社区,也可以去尝试解决你自己的问题,如果你有一个问题,其他人可能也有。 比如我开发的次幂数据平台就是在这样的背景下诞生的,因为自己有运营公众号,同时我加入了一些公众号运营群,长期观察下来公众号运营有个问题就是他们每天都要去找文章素材,另外公众号为了涨粉他们经常会和别的公众号进行互推,而互推可能有人会刷阅读量,为了解决公众号运营者们的这些问题,我就开发了这样一个数据平台 ...</p>GitHub Copilot Chat 使用教程2023-06-01T13:24:01+08:002023-06-01T13:24:01+08:00刘志军tag:foofish.net,2023-06-01:github-copilot-chat.html<p>GitHub Copilot Chat 目前开始陆续开放白名单资格,还没申请的可以先申请,申请入口: https://github.com/features/preview/copilot-x , copilot 的好处是在一个编辑器完成所有的AI辅助功能,简直不要太方便。</p>
<p>安装 VSCode Insiders 版本,下载地址:https://code.visualstudio.com/insiders/,该版本与VSCode的区别在于前者是预览版本,后者为稳定版本,功能几乎一致。</p>
<p>下载 Github Copilot Nightly 插件</p>
<p><img alt="image-20230527085312698" src="../../images/image-20230527085312698.png" /></p>
<p>安装完成后登录Github后,左侧会多一个Chat的图标</p>
<p><img alt="image-20230528172359642" src="../../images/image-20230528172359642.png" /></p>
<p>你可以对下面的对话框将ChatGPT一样问任何关于编程的问题,你的提问质量决定了Copilot的答案质量。例如:</p>
<blockquote>
<p>提问:用python写一个邮箱校验的正则表达式,并封装成一个函数</p>
</blockquote>
<p><img alt="image-20230528175248864" src="../../images/image-20230528175248864.png" /></p>
<p>因为我不知道这个正则表达式具体的含义,我可以接着继续问</p>
<blockquote>
<p>解锁函数中正则表达式的意思</p>
</blockquote>
<p><img alt="image-20230528183714228" src="../../images/image-20230528183714228.png" /></p>
<p>除了像ChatGPT一样提问之外,我们还可以让他解释代码</p>
<h3>explain 指令</h3>
<p><code>/explain</code> 指令用于解释代码 ...</p>苹果用户如何购买 ChatGPT Plus2023-05-26T15:24:01+08:002023-05-26T15:24:01+08:00刘志军tag:foofish.net,2023-05-26:how-to-upgrade-chatgpt-plus-with-ios.html<p>提前准备: </p>
<ol>
<li>苹果手机</li>
<li>美区Apple ID</li>
<li>ChatGPT账号</li>
<li>魔法工具</li>
<li>支付宝账号</li>
</ol>
<h3>第一步:在支付宝购买AppStore礼品卡</h3>
<ol>
<li>打开支付宝、左上角将支付宝的定位改为米国旧金山</li>
<li>首页往下滑找到【大牌礼卡】</li>
<li>在新的页面滑动到最下面的【更多大牌折扣礼卡】</li>
<li>在新的页面搜索AppStore,点第一个搜索结果</li>
<li>输入金额(单位是美金),最低$2,如果是购买Plus账号,最好是大于20</li>
<li>点击【立即购买】 </li>
<li>进入订单列表</li>
<li>如果订单状态为订单完成,说明礼品卡购买成功</li>
<li>进入订单详情,复制礼品卡号码</li>
</ol>
<p><img alt="" src="../../images/zhifubaolipinka.png" /></p>
<p>立即购买</p>
<p><img alt="" src="../../images/zhifubaolipindingdan.png" /></p>
<h3>第二步:在App Store中兑换礼品卡</h3>
<ol>
<li>进入AppStore,点击右上角小人头</li>
<li>点击兑换充值卡或代码</li>
<li>手动输入兑换码,输入刚刚购买的礼品卡号码充值</li>
</ol>
<p><img alt="dinghuanlipinka.png" src="../../images/dinghuanlipinka.png" /></p>
<h3>第三步:升级Plus</h3>
<p>这一步需要魔法网络,首先在设备上登录ChatGPT账号,点右上角的...->Settings->Upgrade To ChatGPT Plus</p>
<p><img alt="" src="../../images/upgradechatgpt.png" /></p>
<p>如果出现如下界面说明订阅成功 ...</p>如何注册一个美国苹果账号 Apple ID2023-05-26T13:24:01+08:002023-05-26T13:24:01+08:00刘志军tag:foofish.net,2023-05-26:how-to-register-an-apple-id.html<h3>第一步:注册账号</h3>
<p>登录苹果官网网址:<a href="https://appleid.apple.com/account">https://appleid.apple.com/account</a> 填写注册信息, 需要注意点地方:</p>
<ol>
<li>不需要魔法网络,能打开链接就行</li>
<li>名字随便填</li>
<li>国家选“美国”</li>
<li>邮箱填一个没来没有注册过Apple ID的邮箱,国内国外邮箱都没问题,但必须是没注册过苹果账号的</li>
<li>手机号可以用国内的也可以用国外的(不能用临时的,后续登录需要接收验证码二次验证)</li>
</ol>
<p><img alt="image-20230526123705016" src="../../images/image-20230526123705016.png" /></p>
<p>提交表单后,会给你的邮箱和手机号发送验证码,填写完验证码后,账号就注册成功了。</p>
<h3>第二步:将付款信息修改为“无”</h3>
<p><img alt="image-20230526124543048" src="../../images/image-20230526124543048.png" /></p>
<p>点击“个人信息”,选择“国家或地区”,更改国家或地区,将付款信息修改为“无”,不然后续无法通过礼品卡购买APP。</p>
<p><img alt="image-20230526124733374" src="../../images/image-20230526124733374.png" /></p>
<h3>第三步:填写账单地址</h3>
<p>账单地址选一个免税州,我们选择Oregon(俄勒冈州)就行,里面的内容照着输入就行。</p>
<p><img alt="image-20230526125246796" src="../../images/image-20230526125246796.png" /></p>
<p>配送地址不需要自己填,直线选中“拷贝账单地址”即可自动填入。</p>
<h3>第四步:在 ...</h3>苹果手机如何安装官方版ChatGPT2023-05-19T13:24:01+08:002023-05-19T13:24:01+08:00刘志军tag:foofish.net,2023-05-19:chatgpt-ios-app.html<p>今天,OpenAI正式推出iOS版本的ChatGPT APP程序,我第一时间下载体验了,UI简洁,响应速度贼快,此外,它集成了OpenAI 的开源语音识别系统 Whisper,使用户能够进行语音输入,这些功能完全免费,强烈推荐给大家。</p>
<p>苹果用户可以直接在AppStore搜索“OpenAI ChatGPT“下载使用,注意,App仅支持美国的苹果账号下载。如果你没有美国苹果账号,3种途径获取:1、自己注册,2、找渠道购买,3、使用星球提供的共享账号</p>
<p>假设你现在有一个美国地区的苹果账号,可按照以下步骤来安装。</p>
<p>1、首先退出您设置里原有的Apple ID,一定要完全退出</p>
<p><img alt="image-20230519132425431" src="../../images/image-20230519132425431.png" /></p>
<p>2、然后直接打开AppStore苹果商店,点击右上角人头登陆美国账号(注意如果用的是共享账号,不要去“设置”里登录,仅在此处登录,防止数据泄露)</p>
<p><img alt="image-20230519132044324" src="../../images/image-20230519132044324.png" /></p>
<p>登录后搜索”OpenAI ChatGPT",注意ChatGPT的logo是白底黑色线条,名字是 OpenAI ChatGPT,因为商店很多第三方的APP和它长得很像 ...</p>又阳了2023-05-16T01:24:01+08:002023-05-16T01:24:01+08:00刘志军tag:foofish.net,2023-05-16:covid-19-again.html<p>最近在朋友圈刷到不少二次阳的,我也不幸再次中招。 </p>
<p>最开始感觉有症状是上周三,嗓子有点痒,没有其它症状,当时没太在意,以为是晚上着凉了,该吃啥吃啥,胃口还是一样。到了晚上症状更明显,嗓子开始痛,赶紧冲了杯感冒灵压压惊。</p>
<p>第二天,周四,开始头痛,喉咙明显不舒服,没有食欲,浑身没力气,腰背酸痛。这时候我还是不太相信是新冠,因为症状跟第一次比起来轻很多,甚至这次连发烧的症状都没有。</p>
<p>然后我去问ChatGPT新冠有哪些症状。除了第一条对不上之外,其它全中,心想大概率是中了。</p>
<p><img alt="image-20230515211826332" src="../../images/image-20230515211826332.png" /></p>
<p>第三天,星期五,还是同样的症状,没有好转,也没有更差,家里刚好还剩了一根上次留下来的抗原试纸,一测发现两条明显的杠。真阳了,喝了两杯大白开水压压惊,反正也没啥特效药,全靠自愈。</p>
<p><img alt="image-20230515212356027" src="../../images/image-20230515212356027.png" /></p>
<p>第四天,星期六,症状都还在,体温37.5,一天都在休息没干活,睡了很久。</p>
<p>第五天,星期天,也就是昨天,睡觉起来感觉明显好转,除了咳嗽,其它症状都差不多消失了 ...</p>用 ChatGPT 搭建一个 Telegram 机器人2023-05-10T18:24:01+08:002023-05-10T18:24:01+08:00刘志军tag:foofish.net,2023-05-10:chatgpt-telegram-bot.html<p>相比微信,Telegram更适合用来做一些扩展功能,不像封闭的微信生态,Telegram官方开放了接口给开发者。在Telegram上搭建一个机器人很方便。</p>
<p>这里假设你已经安装了Telegram,有ChatGPT账号,且有Python3.9以上环境</p>
<h3>第一步:申请机器人</h3>
<p>在Telegram上搜索”BotFather“,然后发送一条消息 <code>/newbot</code>,并给机器人设置昵称和唯一用户名,注意用户名必须以<code>_bot</code>结尾,不能和别人的同名。</p>
<p><img alt="image-20230510144422991" src="../../images/image-20230510144422991.png" /></p>
<h3>安装</h3>
<p>将项目下载到本地</p>
<div class="highlight"><pre><span></span>git clone https://github.com/lzjun567/chatgpt-telegram-bot.git
cd chatgpt-telegram-bot
</pre></div>
<p>创建python虚拟环境</p>
<div class="highlight"><pre><span></span>python -m venv venv
</pre></div>
<p>激活环境</p>
<div class="highlight"><pre><span></span># Linux or macOS执行:
source venv/bin/activate
# Windows执行:
venv\Scripts\activate
</pre></div>
<p>安装依赖包 ...</p>Windows平台 ffmpeg 安装教程2023-05-10T01:24:01+08:002023-05-10T01:24:01+08:00刘志军tag:foofish.net,2023-05-10:ffmpeg-install.html<h3>下载</h3>
<p>进入ffmpeg官网,http://ffmpeg.org/download.html#build-windows</p>
<p>点击Windows builds from gyan.dev</p>
<p><img alt="image-20230510161543079" src="../../images/image-20230510161543079.png" /></p>
<p>跳转链接后,点击<a href="https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-essentials.7z">ffmpeg-git-essentials.7z</a></p>
<p><img alt="image-20230510161717194" src="../../images/image-20230510161717194.png" /></p>
<p>下载并解压文件</p>
<p><img alt="image-20230510161834381" src="../../images/image-20230510161834381.png" /></p>
<p>设置环境变量</p>
<p><img alt="image-20230510161913462" src="../../images/image-20230510161913462.png" /></p>
<p>将ffmpeg的完整路径复制后,添加到Path环境变量中,具体步骤:</p>
<p>计算机-属性-高级系统设置-环境变量-系统变量-Path-编辑</p>
<p><img alt="image-20230510162211546" src="../../images/image-20230510162211546.png" /></p>
<p>新建</p>
<p><img alt="image-20230510162245305" src="../../images/image-20230510162245305.png" /></p>
<p>将ffmge的路径添加到Path。</p>
<h3>测试是否添加成功</h3>
<p>命令行(Win+R)输入</p>
<div class="highlight"><pre><span></span>fmpeg -version
</pre></div>OpenAI接口介绍- ChatCompletion2023-05-10T00:24:01+08:002023-05-10T00:24:01+08:00刘志军tag:foofish.net,2023-05-10:openai-chat-completion.html<p>ChatCompletion是OpenAI中最核心的一个接口,顾名思义,你可以利用该接口构建自己的应用,用在与AI有交互的场景,例如聊天机器人、智能客服等,该接口具有连续对话的能力,因为它可以携带上下文信息。</p>
<h3>接口</h3>
<div class="highlight"><pre><span></span>https://api.openai.com/v1/chat/completions
</pre></div>
<h3>请求参数</h3>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">model</td>
<td align="left">是</td>
<td align="left">string</td>
<td>支持的模型为:gpt-4, gpt-3.5-turbo, gpt-3.5-turbo-0301</td>
</tr>
<tr>
<td align="left">messages</td>
<td align="left">是</td>
<td align="left">array</td>
<td>字典组成的列表对象</td>
</tr>
<tr>
<td align="left">temperature</td>
<td align="left">否</td>
<td align="left">float</td>
<td>采样温度,随机因子,控制输出结果的随机性,介于0到2之间,值越大随机性越高,默认为1</td>
</tr>
<tr>
<td align="left">max_tokens</td>
<td align="left">否</td>
<td align="left">integer</td>
<td>指定返回结果的token最大长度,默认是最大值,不同模型的最大token数不一样,例如gpt-3 ...</td></tr></tbody></table>如何导出ChatGPT聊天记录2023-05-08T01:24:01+08:002023-05-08T01:24:01+08:00刘志军tag:foofish.net,2023-05-08:export-chatgpt-data.html<p>为防止ChatGPT账号突然被封,数据全没的问题,建议你每隔断时间将聊天数据导出来。OpenAI官网提供了数据导出的服务。具体操作流程</p>
<p>打开左下角三个点后,选择【Settings】 </p>
<p><img alt="image-20230508005758263" src="../../images/image-20230508005758263.png" /></p>
<p>选择 【Data controls】,直接点【Export】</p>
<p><img alt="image-20230508005830087" src="../../images/image-20230508005830087.png" /></p>
<p>确认后,数据将压缩后以邮件形式发送到邮箱账号中, 下载打开zip压缩文件后,就是一个HTML文件。 </p>
<p><img alt="image-20230508005936585" src="../../images/image-20230508005936585.png" /></p>
<p>直接用浏览器打开chat.html文件,就能看到导出的聊天数据</p>
<p><img alt="image-20230508010708111" src="../../images/image-20230508010708111.png" /></p>
<p>最后推荐加入我的知识星球【ChatGPT研究社】,里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程,现在加入即可获取的一个ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>免费使用GPT3、GPT4、Claude的平台:Poe2023-05-04T18:24:01+08:002023-05-04T18:24:01+08:00刘志军tag:foofish.net,2023-05-04:Poe.html<p>Poe 是由 Quora(与知乎类似的一个国外问答社区)开发的一款AI工具,它的核心功能是聚合了ChatGPT和Claude这两款产品,用户可以在上面任意切换聊天机器人进行提问。</p>
<p><img alt="image-20230504152944743" src="../../images/image-20230504152944743.png" /></p>
<p>注册Poe账号很简单,用邮箱或者手机号就可以完成注册,或者使用Google账号授权登录,能访问外网就行,对网络节点没有太多要求,大大降低了使用ChatGPT的门槛。毕竟一个普通GPT账号市面上购买也得三四十。</p>
<p>目前Poe聚合了多款AI聊天机器人,有Sage、 ChatGPT、Claude+、Claude-instant、NeevaAI、Dragonfly,Sage和ChatGPT使用gpt-3.5-turbo模型,Dragonfly使用 text-davinci-003,无限制免费试用 。GPT-4和Claude+是付费功能。GPT-4每天可免费试用一次,Claude+每天可免费试用3次。 </p>
<p>不同机器人有不同的特点</p>
<ul>
<li>Sage和ChatGPT在英语以外的语言方面表现更好,而且在与编程相关的任务上更出色。</li>
<li>GPT-4是目前世界上最强大的语言模型。它特别擅长创意写作、问题解决(例如数学和物理)和指令遵循。</li>
<li>
<p>Claude-instant 在许多创意写作任务上表现更好,往往会给出更长、更深入的答案。与Claude相比,Claude-instant更快,而且在非英语语言方面显著更出色。</p>
</li>
<li>
<p>Claude+在复杂和困难的任务上比Claude-instant要好得多。与Claude-Instant类似,它在创意写作和提供详细回答方面特别强 ...</p></li></ul>推荐一个ChatGPT桌面客户端:Chatbox2023-05-04T14:24:01+08:002023-05-04T14:24:01+08:00刘志军tag:foofish.net,2023-05-04:chatbox.html<p>网页版ChatGPT是不是经常遇到无法登录,或者好不容易登上去了却收不到回答,哪怕你是尊贵的Plus用户也会有报错的情况。</p>
<p><img alt="image-20230423155634946" src="../../images/image-20230423155634946.png" /></p>
<p>一般来说,通过调API出现这类问题概率低很多,刚好发现了一个免费开源的ChatGPT桌面客户端Chatbox,支持Windows、Mac和Linux多平台,用起来很丝滑</p>
<p><img alt="image-20230423155215248" src="../../images/image-20230423155215248.png" /></p>
<p>只需要配置Key就可以使用</p>
<p><img alt="image-20230423160146324" src="../../images/image-20230423160146324.png" /></p>
<p>特点:</p>
<ul>
<li>更自由、更强大的 Prompt 能力</li>
<li>数据存储在本地,不会丢失</li>
<li>支持 GPT-4 和其他模型</li>
<li>支持自定义域名代理</li>
<li>更多功能:Markdown、消息引用、字数与token估算、夜间模式……</li>
<li>符合人体工程学的 UI 设计</li>
<li>提供安装包,无需部署</li>
<li>免费,开源</li>
</ul>
<p>不过需要注意的几点:</p>
<ul>
<li>
<p>客户端依然要具备科学上网的环境,因为他是直接调chatgpt官方API。</p>
</li>
<li>
<p>没次问答会消耗API额度,因为需要自己指定key</p>
</li>
<li>
<p>虽然支持GPT-4模型,但是否可用取决于你的GPT账号是否拿到了GPT4的API能力</p>
</li>
<li>
<p>可配置代理域名,这个功能估计用处不大,普通人也用不上,懂开发的可以配置代理域名来做转发,这样就不需要魔法工具也能用了。</p>
</li>
<li>所有数据保存在本地不丢失,这比用其他第三方工具好,起码数据保存在自己电脑上,不担心数据丢失也不担心数据隐私问题。</li>
</ul>
<p>作者未来还规划了很多功能 ...</p>如何不提供账号密码找人代充ChatGPT Plus2023-04-29T09:24:01+08:002023-04-29T09:24:01+08:00刘志军tag:foofish.net,2023-04-29:chatgpt-upgrade-plus-without-passwd.html<p>自己升级Plus巨麻烦,没有国外信用卡,不想购买成品号,我只想用自己的账号升级Plus,而且不想把账号密码透露给别人?该怎么做?</p>
<p>简单,你只要把支付链接发给代充的人就可以。</p>
<p>登录ChatGPT账号后,点击左侧 Upgrade to Plus</p>
<p><img alt="image-20230428095104377" src="../../images/image-20230428095104377.png" /></p>
<p>点击绿色按钮 Upgrade plan</p>
<p><img alt="image-20230428095135411" src="../../images/image-20230428095135411.png" /></p>
<p>跳转到支付页面</p>
<p><img alt="image-20230428101214935" src="../../images/image-20230428101214935.png" /></p>
<p>复制新打开的页面链接地址,将该链接发送给帮你代充的人即可。 如果你有代充需求可加我微信(go2071)</p>
<p>最后推荐加入我的知识星球【ChatGPT研究社】,里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程,现在加入即可获取的一个ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>如何解决ChatGPT 的 Something went wrong 错误2023-04-27T00:24:01+08:002023-04-27T00:24:01+08:00刘志军tag:foofish.net,2023-04-27:chatgpt-something-went-wrong.html<p>ChatGPT经常用着用着就出现 Something went wrong 错误,不管是普通账号还是Plus账号,不管是切换到哪个节点,没聊两次就报这个错,或者隔断时间没用重新回来也报这个错。</p>
<p><img alt="image-20230427003249548" src="../../images/image-20230427003249548.png" /></p>
<blockquote>
<p>Something went wrong. If this issue persists please contact us through our help center at help.openai.com.</p>
</blockquote>
<p><img alt="image-20230427000529472" src="../../images/image-20230427000529472.png" /></p>
<h4>解决方案</h4>
<p>可以用一个浏览器插件来解决这个问题,这个插件叫KeepChatGPT,它可以让你畅聊无阻,不刷新网页解决网络报错问题。</p>
<p>它的实现原理是这样的,ChatGPT使用Cloudflare提供的服务做了一些反爬虫机制,而这个插件就是利用Headless技术绕开Cloudflare的爬虫验证,利用non-click绕过Cloudflare的机器人验证。</p>
<h4>安装</h4>
<p>1、安装<code>Tampermonkey</code>浏览器扩展插件,地址:https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo ...</p>如何获取chatgpt的key?2023-04-26T14:24:01+08:002023-04-26T14:24:01+08:00刘志军tag:foofish.net,2023-04-26:create-chatgpt-key.html<p>这个问题最近被多次问到,写个教程</p>
<p>什么是ChatGPT API key?</p>
<p>API Key 是OpenAI提供给开发者用来创建第三方工具的,比如之前在星球分享过几个非官方的ChatGPT工具,都需要用到自己的key。 要想拥有自己的key,收需要你需要一个chatgpt的账号,不知道怎么获取的可以参考<a href="https://foofish.net/how-to-registe-chatGPT.html">这篇文章</a></p>
<p>登录网站:https://platform.openai.com/</p>
<p>点击右上角账号名字,弹出菜单后点击「View API keys」</p>
<p><img alt="img" src="../../images/FtpGaKL4oSzyifHuHHnJ1CXAEjL0.png" /></p>
<p>点击「Create new secret key」创建一个新key</p>
<p><img alt="img" src="../../images/FsgwnWLmF7a1eWn88f_gGndI1zKP.png" /></p>
<p>可以给这个key设置一个名字方便后面查阅,也可以不设</p>
<p><img alt="img" src="../../images/FkdTXrGJU_V5o4-iJm1S97js0rnN.png" /></p>
<p>点击「Create secret key」 </p>
<p><img alt="img" src="../../images/FgiLh0IxHYH1okQ8KW8yskJES2hh.png" /></p>
<p>创建成功后,一定要及时把key保存到本地,因为当前页面关闭后就无法完整的查询到该key的内容,否则你只能创建一个新的key。</p>
<p>有了这个key,你就可以使用 https://articles.zsxq.com/id_ka5lrlb6plom.html 中介绍的第三方chatgpt桌面客户端,没必要每次登录ChatGPT网站了 ...</p>如何修改chatgpt头像?2023-04-21T15:44:01+08:002023-04-21T15:44:01+08:00刘志军tag:foofish.net,2023-04-21:change-chatgpt-avatar.html<p>你们发现了吗? </p>
<p>我们跟ChatGPT聊天时,用户头像都是邮箱账号的前两个字母,而有些人的头像却是他自己的头像,这是怎么做到的呢? </p>
<p>其实,这是ChatGPT网站用了一个叫Gravatar的第三方的服务 , Gravatar 可以为每个邮箱地址生成一个唯一的默认头像,默认是邮箱的前面几个字母,ChatGPT就用该图像作为用户的默认头像来显示。</p>
<p>如何设置自己的头像?</p>
<p>打开 Gravatar网站: https://en.gravatar.com/</p>
<p><img alt="image-20230421155758143" src="../../images/image-20230421155758143.png" /></p>
<p>使用 WordPress.com 帐户注册 Gravatar</p>
<p><img alt="image-20230421160058703" src="../../images/image-20230421160058703.png" /></p>
<p>创建后,你的邮箱账号会收到一封账号激活邮件,激活成功后就可以开始设置头像了。</p>
<p><img alt="image-20230421160811627" src="../../images/image-20230421160811627.png" /></p>
<p>上传头像</p>
<p><img alt="image-20230421152454805" src="../../images/image-20230421152454805.png" /></p>
<p>本地选择你要上传的头像即可。</p>
<p>设置头像后并不会在ChatGPT的网站立即生效,这是因为有缓存问题,你可以将退出ChatGPT再重新登录后就能看到你自己的头像了。</p>
<p><img alt="image-20230421161321133" src="../../images/image-20230421161321133.png" /></p>
<p>如果你的产品也想接入Gravatar,其实也很简单,几行代码就能搞定,例如我使用Python可以这样:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">urllib</span><span class="o">,</span> <span class="nn">hashlib</span>
<span class="n">email</span> <span class="o">=</span> <span class="s2">"xxxx@xxxxx.com"</span> <span class="c1"># 你的邮箱</span>
<span class="n">default</span> <span class="o">=</span> <span class="s2">"https://www.foofish.net/default.jpg ...</span></pre></div>开发者关心的ChatGPT API额度、Token、价格2023-04-19T19:44:01+08:002023-04-19T19:44:01+08:00刘志军tag:foofish.net,2023-04-19:chatgpt-api-price-and-token.html<p>ChatGPT官网提供了Web端 https://ai.com 是给普通大众使用,此外他们还给开发者开放了API接口,方便开发者利用ChatGPT
的API能力实现更多个性化需求。 比如国内绝大部分不需要梯子访问的AI聊天机器人都是开发者利用它的API实现的。</p>
<p>ChatGPT账号里默认有一个API调用余额,默认是5美元或者18美元(新号一般都是5美元),对于普通用户来说,这个额度没什么用,因为你在官网使用ChatGPT完全免费,不会消耗任何额度。</p>
<p>如果你也想利用ChatGPT的API实现自己的个性化需求,例如我想把它集成在公众号或者集成在自己的某个产品中,我们就要关注一下这个额度。</p>
<p>登录OpenAI账号<a href="https://platform.openai.com/account/usage">platform.openai.com</a>可查看到账号的余额还剩多少。</p>
<p><img alt="image-20230419103026890" src="../../images/image-20230419103026890.png" /></p>
<p>点击左侧的Usage,能详细看到每天消耗的费用和总使用量,注意这个赠送额度是有期限的,例如我账号里面的余额6月1日到期,过期后会自动清零。如后续还需继续使用API服务,就需要另外购买。</p>
<h3>申请API额度</h3>
<p>申请更多的额度不需要升级Plus,普通账号就可以操作,你只要绑以上一张国外信用卡(如何申请信用卡参考<a href="https://foofish.net/apply-a-depay-credit-card.html">Depay信用卡申请保姆级教程</a>),确保卡里面已经有余额(几美元就行)。</p>
<p><img alt="image-20230419111332138" src="../../images/image-20230419111332138.png" /></p>
<p>根据自己需求选择个人或者企业</p>
<p><img alt="image-20230419111932747" src="../../images/image-20230419111932747.png" /></p>
<p>绑信用卡有一定概率拒卡,如果被拒请多尝试几次或者换IP,换IP也没用可能需要换卡,地址可以根据IP所在地在网上找生成器弄一个,甚至随便填一个也没问题(有运气成分)</p>
<p><img alt="image-20230419112408148" src="../../images/image-20230419112408148.png" /></p>
<p>绑卡成功后,信用卡会有5美元预扣款,同时在你的GPT账号中会多出120美刀的使用额度,注意这个不是赠送给你的余额 ...</p>如何正确地向ChatGPT提问2023-04-18T19:44:01+08:002023-04-18T19:44:01+08:00刘志军tag:foofish.net,2023-04-18:how-to-ask-a-good-question-with-chatgpt.html<p>要想得到一个好的回答,你要把ChatGPT当做一个正常的“人”来使用(别指望让它来猜你的心思),空泛的问题得到的结果也是泛泛而谈,问题描述越具体,给你的答案通常也更具价值, 一个好答案通常来自于一个好问题。</p>
<p>提问的几个关键要素</p>
<p>1、设定角色</p>
<p>2、提出你的需求/目标</p>
<p>3、希望ChatGPT干什么</p>
<p>4、补充信息</p>
<p>例如:</p>
<p>差问题:如何减肥</p>
<p><img alt="image-20230418223119445" src="../../images/image-20230418223119445.png" /></p>
<p>与之对应的好问题是:你现在是健身教练,我要减肥,目标是1个月减10斤,帮我制定一个详细计划,我的身高是170cm,体重80kg</p>
<p><img alt="image-20230418225348692" src="../../images/image-20230418225348692.png" /></p>
<p><img alt="image-20230418230532417" src="../../images/image-20230418230532417.png" /></p>
<p>最后推荐加入我的知识星球【ChatGPT研究社】,里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程,现在加入即可获取的一个ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>Claude保姆级注册教程2023-04-18T19:44:01+08:002023-04-18T19:44:01+08:00刘志军tag:foofish.net,2023-04-18:how-to-use-claude.html<h3>0:前言</h3>
<p>Claude 是Anthropic公司开发的AI聊天机器人,与ChatGPT类似,由OpenAI(ChatGPT所在的公司)的前副总裁创办。和ChatGPT-3.5相当,但比不上GPT4,拥有连续对话能力,在撰写小说、编写代码、解释概念等方面表现出色</p>
<p>Claude 目前还处于免费使用阶段,只需注册一个Slack账号即可以,无需梯子也可以使用。</p>
<h3>一:注册Slack账号</h3>
<p>打开Slack网站:<a href="https://slack.com/get-started#/createnew">slack</a></p>
<p><img alt="image-20230418002222142" src="../../images/image-20230418002222142.png" /></p>
<p>可以直接使用Gmail邮箱注册(QQ邮箱不支持),或者直接Google、Apple账号授权登录,这里我用Gmail邮箱注册。</p>
<p>填上验证码</p>
<p><img alt="image-20230418002527452" src="../../images/image-20230418002527452.png" /></p>
<p>创建工作区</p>
<p><img alt="image-20230418002638333" src="../../images/image-20230418002638333.png" /></p>
<p>创建工作区后填上自己姓名,跳过邀请</p>
<p><img alt="image-20230418002858548" src="../../images/image-20230418002858548.png" /></p>
<h3>二:Slack中添加Claude</h3>
<p>打开网站 <a href="https://www.anthropic.com/claude-in-slack">www.anthropic.com</a> ,点击 Add to Slack</p>
<p><img alt="image-20230417182727173" src="../../images/image-20230417182727173.png" /></p>
<p>允许授权</p>
<p><img alt="image-20230418003247515" src="../../images/image-20230418003247515.png" /></p>
<p>授权成功,如果出现403等错误,可多次重试。 也可以微信上(go2071)告诉我你的邮箱,我可以拉你加入到我的频道 ...</p>Python虚拟环境使用2023-04-17T19:44:01+08:002023-04-17T19:44:01+08:00刘志军tag:foofish.net,2023-04-17:python-venv-usage.html<p>有粉丝读者来问,python包管理工具用哪个好?pipenv、pyenv、Poetry 、conda各种工具琳琅满目。说实话,初学者真没必要花这个时间去折腾这些玩意,因为这些工具我用下来各有各的毛病,不用也完全不影响你做项目。</p>
<p>作为初学者,python自带的pip命令管理安装包, venv工具管理虚拟环境足够了。别去瞎折腾那些工具,他们不但不能给你节省时间,还会经常给你带来很多麻烦。</p>
<p>先说说为什么Python自带的这两个工具足够呢?</p>
<p>写了十几年代码,我很少会遇到一个电脑要安装多个不同的Python版本,除非你是老鸟,想安装更高的内测版本来尝鲜体验新功能,否则用一个稳定的版本就行,特别是Python3.7以后,Python的向后兼容已经非常完善了,不会存在低版本代码无法在高版本运行不了的情况。</p>
<p>安装第三方工具直接使用pip命令,例如:</p>
<div class="highlight"><pre><span></span>pip install flask-siwadoc
</pre></div>
<p>如果你电脑里有好几个Python项目,我还是强烈建议你使用虚拟环境来管理,所谓虚拟环境就是每个项目用自己独立的Python运行环境,项目之间的包不会相互起冲突。</p>
<p>在Python2时代,虚拟环境需要用到第三方工具 virtualenv,而Python3直接将该功能加入到了标准库,说明这个功能是高频刚需。</p>
<p>创建虚拟环境</p>
<p>在<code>~/venv</code>目录下创建虚拟环境:</p>
<div class="highlight"><pre><span></span>python -m venv venv
</pre></div>
<p>这里有两个venv,第一个是 ...</p>文心一言 VS ChatGPT 测评2023-04-15T19:44:01+08:002023-04-15T19:44:01+08:00刘志军tag:foofish.net,2023-04-15:chatgpt-vs-yiyan.html<p>今天收到文心一言的内测邀请,第一时间体验了代表国内最先进水平的AIGC产品,李彦宏说他们的技术只落后ChatGPT大概2个月时间,所以我想拿两者来做个对比测试。</p>
<p>我用的测评方法是用它来给我写一段代码,需求是用python实现一个猜数字的游戏,最多3次机会</p>
<p>提问:</p>
<div class="highlight"><pre><span></span>用python实现一个猜数字的游戏,最多3次机会
</pre></div>
<p>回答:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">random</span>
<span class="c1"># 生成一个1到100之间的随机整数 </span>
<span class="n">number</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="c1"># 初始化猜测次数 </span>
<span class="n">guesses</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"我想了一个1到100之间的数字,请你猜猜看。"</span><span class="p">)</span>
<span class="k">while</span> <span class="n">guesses</span> <span class="o"><</span> <span class="mi">3</span><span class="p">:</span>
<span class="n">guess</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">"你猜是多少?"</span><span class="p">))</span>
<span class="n">guesses</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">guess</span> <span class="o"><</span> <span class="n">number</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"你猜的数字太小了。"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">guess</span> <span class="o">></span> <span class="n">number</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"你猜的数字太大了。"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s2">"恭喜你,你猜对了!我想的数字是 ...</span></pre></div>如何删除macOS系统默认的Python2.7并替换成最新版python3.112023-04-15T19:44:01+08:002023-04-15T19:44:01+08:00刘志军tag:foofish.net,2023-04-15:replace-python2_7-with-python3_11-on-macos.html<p>MacBook 自带的Python版本是Python2.7,可这个版本早就被淘汰了。我想彻底删除它</p>
<div class="highlight"><pre><span></span>~ python
Python 2.7.15 (default, Nov 27 2018, 21:24:58)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
</pre></div>
<p>在终端输入python,显示版本是Python 2.7.15</p>
<p>再看python命令在什么位置 </p>
<div class="highlight"><pre><span></span>~ where python ...</pre></div>ChatGPT星球要涨价啦!2023-04-14T19:44:01+08:002023-04-14T19:44:01+08:00刘志军tag:foofish.net,2023-04-14:chatgpt-community-is-comming.html<p>大家好</p>
<p>我们社群「ChatGPT研究社」目前已经聚集了400多位ChatGPTer啦,他们对新事物非常敏锐,也是最先抓住ChatGPT红利的人。 </p>
<p>我们没有像其它社群那样做大规模推广,因为我知道如果短时间大量的人涌入,体验做不好就是砸口碑,所以我几乎只在自己的公众号推荐一下。稳打稳扎持续提供服务,做好交付,和大家一起成长,问题都可以在星球或者微信上联系我们得到解答。</p>
<p>如果你对ChatGPT感兴趣又苦于找不到门道,我推荐你一定要先走出第一步,至少要知道ChatGPT是个什么东西、怎么用,而不是整天听别人怎么说。</p>
<p>目前星球除了最新行业信息、GPT技巧等日常内容更新外,我们还在持续输出专栏课程,光是一个专栏在外面就是好几百,现在你只需要加入星球都能免费学习。</p>
<p><img alt="image-20230414143645416" src="../../images/image-20230414143645416.png" /></p>
<p>除了专栏课,我们星球还提供了多种无需使用魔法工具就能体验ChatGPT的工具。</p>
<p>1、Web版ChatGPT(仅限星球球友免费体验),加入星球会免费赠送GPT账号,这个账号你不仅可以在ChatGPT官网使用,也可以在我们的自己网站使用。</p>
<p><img alt="image-20230414145212942" src="../../images/image-20230414145212942.png" /></p>
<p>2、微信群体验ChatGPT(目前这种方式使用最方便)</p>
<p><img alt="image-20230414145701386" src="../../images/image-20230414145701386.png" /></p>
<p>3、公众号体验 ChatGPT(你只要加入星球就可以不限制体验)</p>
<p><img alt="image-20230414150637629" src="../../images/image-20230414150637629.png" /></p>
<p>我们星球一直保持非常低的退费率,目前退费率不超过5%。 就目前的价格,相比市面上动不动就是199、299、599甚至上千的入圈费,我们的价格算是非常良心了,关键是不满意3天内可无条件退款。</p>
<p>最后送你一张30元的优惠券,仅限前50名,先到先得。</p>
<p><img alt="image-20230414152118609" src="../../images/image-20230414152118609.png" /></p>pyenv使用教程2023-04-14T13:47:06+08:002023-04-14T13:47:06+08:00刘志军tag:foofish.net,2023-04-14:how-to-use-pyenv.html用ChatGPT来画UML图2023-04-13T19:44:01+08:002023-04-13T19:44:01+08:00刘志军tag:foofish.net,2023-04-13:chatgpt-draw-uml-graph.html<p>我们平时写一些技术说明类的文档时,一般离不开UML图,毕竟一图胜千言。平常用的UML工具以拖拉拽居多,你要对整个流程图的每一个元素都搞清楚了才能动手。</p>
<p>举例来说,我要写一篇关于“一次完整的HTTP请求”有哪几个步骤,我想用UML图来作示例时,我们脑海里首先就要对整个过程完全了解你才知道怎么画,当然,你也可以先上网搜索下流程。</p>
<p>现在如果我要借用ChatGPT来做的话,我只要给它一个指令</p>
<p>因为ChatGPT现在还没发直接生成图,我们这里配合PlatUML实现,PlantUML 是一款能用简单文字秒速就可以画UML图的开源工具。</p>
<div class="highlight"><pre><span></span>一次完整的HTTP请求过程是什么样的?请配合plantuml描述
</pre></div>
<p>第一次我给的prompt指令很简单,给我的回答是</p>
<div class="highlight"><pre><span></span><span class="p">@</span><span class="n">startuml</span>
<span class="o">!</span><span class="n">define</span> <span class="n">AWSPUML</span> <span class="nl">https</span><span class="p">:</span><span class="c1">//raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v14.0</span>
<span class="o">!</span><span class="n">includeurl</span> <span class="n">AWSPUML</span><span class="o">/</span><span class="n">AWSCommon</span><span class="p">.</span><span class="n">puml</span>
<span class="o">!</span><span class="n">includeurl</span> <span class="n">AWSPUML</span><span class="o">/</span><span class="n">Client</span><span class="p">.</span><span class="n">puml</span>
<span class="o">!</span><span class="n">includeurl</span> <span class="n">AWSPUML</span><span class="o">/</span><span class="n">Server</span><span class="p">.</span><span class="n">puml</span>
<span class="n">actor</span> <span class="n">Client</span>
<span class="n">participant</span> <span class="s">"HTTP ...</span></pre></div>为什么ChatGPT 使用 Python实现?2023-04-11T19:44:01+08:002023-04-11T19:44:01+08:00刘志军tag:foofish.net,2023-04-11:chatgpt-implement-by-python.html<p>可能你不知道, ChatGPT这个网站的后端是用Python实现的。</p>
<p>在一些人眼里,Python只能用来写写脚本、搞搞爬虫、做些小项目之类的,其实这是对Python的最大偏见。</p>
<p>因为Python早就被证明可以应用在大型项目中,特别是国外很多大产品,比如 YouTube、Instagram、Quera、Dropbox。在国内,豆瓣、知乎、早期的字节跳动Python都是第一语言,当然还有很多大厂都有Python的应用场景,我们自己的项目「次幂数据」也是用的Python</p>
<p>所以不要说Python不适合搞大型项目了。</p>
<p>为什么这次ChatGPT也用Python来提供他们的Web服务呢?先问问ChatGPT自己怎么回答的。</p>
<p><img alt="image-20230411221923330" src="../../images/image-20230411221923330.png" /></p>
<p>首先,chatGPT的业务模型非常简单,就是一个聊天服务,理论上来说,随便用哪种语言都能hold住,即便是PHP、Node 也行。为什么非要选Python呢?</p>
<p>其实也很容易理解,首先GPT模型本身就是基于PyTorch和TensorFlow这两个AI框架实现的,而他们本身就是Python开发的(内核不是),Web后端这块用Python完全可以无缝对接,整个技术团队一种技术栈就搞定了,但凡是多引入一种技术就多些成本。</p>
<p>其次,Python真正的优势在于它易学易用、开发效率高,还记得Instgram十几个工程师搞定一个用户量上亿的产品么? 现在ChatGPT的用户量也已经过亿了,Python很适合小团队做大项目。</p>
<p>因为这种产品真正的性能瓶颈还是在于网络、磁盘IO身上,语言运行效率上的劣势可以忽略不计 ...</p>ChatGPT基础用法2023-04-10T19:44:01+08:002023-04-10T19:44:01+08:00刘志军tag:foofish.net,2023-04-10:chatgpt-toturial-basic.html<p>1、用账号登录 ChatGPT 后,在输入框内输入问题,或者指令即可。AI 会根据你的指令,返回相应的内容。</p>
<p><img alt="image-20230411151226509" src="../../images/image-20230411151226509.png" /></p>
<p>2、相比传统的智能聊天机器人,ChatGPT支持追问,他能根据上下文信息进行回答。例如:你问中国首都在哪里时,接着问第二个问题“有多少人”时,不需要指定“北京”。</p>
<p><img alt="image-20230411150629258" src="../../images/image-20230411150629258.png" /></p>
<p>3、回答显示不完整,使用”继续“指令获取完整内容。 当回答内容过长或者意外中断时,可以输入“继续”来获取剩下的内容。</p>
<p><img alt="image-20230411153344811" src="../../images/image-20230411153344811.png" /></p>
<p>4、把左侧的每一个会话当做一个角色(工具),下次提问时就不需要再提供角色预设等背景信息的设置。例如我创建一个“翻译工具”的会话,以后每次有翻译需求时,我只要直接把英文内容贴到对话框就行,不再需要提供额外指令。</p>
<p><img alt="image-20230411181720264" src="../../images/image-20230411181720264.png" /></p>
<p>5、设置快捷键</p>
<p>对于需要继续完成回答的内容,还可以设置快捷键来实现。</p>
<p><img alt="image-20230411193041742" src="../../images/image-20230411193041742.png" /></p>
<p>推荐加入我的知识星球【ChatGPT研究社】,里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享,现在加入即可获取的一个ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>如何用ChatGPT快速制作PPT2023-04-10T19:44:01+08:002023-04-10T19:44:01+08:00刘志军tag:foofish.net,2023-04-10:how-to-use-chatgpt-generate-ppt.html<p>我们自己动手做PPT通常流程是这样的</p>
<ol>
<li>确定主题</li>
<li>拟定大纲目录</li>
<li>补充内容</li>
<li>美化页面</li>
</ol>
<p>现在用ChatGPT来制作PPT,我们脑海里也要有这个概念,不然ChatGPT也帮不了你。主题肯定是我们自己来确定,比如我现在要做一个针对小白如何快速入门Python的PPT。</p>
<p>用ChatGPT做PPT,我们还需要用到另一个小技巧,就是希望它用 Markdown 语法来展示内容。后面再借用另一个工具MindShow把Markdown内容转换为精美的PPT。</p>
<h3>什么是Markdown</h3>
<p>Markdown是一种轻量级的标记语言,它被广泛应用于写作、网页排版等领域。Markdown语法简单,易于学习和使用。大约花30分钟就可以完全掌握了,如果你还不知道怎么用可以参考教程<a href="https://markdown.com.cn/basic-syntax/">markdown语法教程</a></p>
<p>开始让ChatGPT给我打工</p>
<p>先跟它交代好,让他回答的内容全部放在markdown语法的代码框中,后面我们就可以直接把内容粘贴到MinShow工具中。</p>
<p><img alt="image-20230408094609040" src="../../images/image-20230408094609040.png" /></p>
<p>毕竟ChatGPT还只是3岁的神童宝宝,你要明确告诉它指令才能为你更好的给你打工</p>
<p><img alt="image-20230408100328724" src="../../images/image-20230408100328724.png" /></p>
<p>非常nice,大纲1秒生成,换作之前,你没个半天功夫不一定把大纲拟好。</p>
<div class="highlight"><pre><span></span># 小白如何快速入门Python
## 目录
1. **Python简介**
- Python的发展历史
- Python的特点与优势
- Python的应用领域
2. **安装与环境配置**
- Python安装教程
- 配置环境变量
- 安装和使用IDE(如PyCharm, VSCode)
3 ...</pre></div>MidJourney保姆级注册教程2023-04-07T19:44:01+08:002023-04-07T19:44:01+08:00刘志军tag:foofish.net,2023-04-07:how-to-use-midjourney.html<h4>MidJourney 是什么?</h4>
<p>MidJourney是一款AI画图工具,用户只需要输入描述文字,Midjourney就可以自动生成图。目前MidJourney 必须在Discord平台使用。</p>
<p><img alt="image-20230407143154975" src="../../images/image-20230407143154975.png" /></p>
<h4>Discord 是什么?</h4>
<p>Discord 是一款社交工具,有点类似微信,Discord 里面有一个MidJourney的机器人,我们只要在Discord平台订阅MidJourney bot 就可以用来AI绘画了。</p>
<h4>准备工具</h4>
<p>1、科学上网工具</p>
<p>2、虚拟信用卡</p>
<p>3、Discord账号</p>
<h3>一:注册账号</h3>
<p>打开 <a href="https://www.midjourney.com/home/?callbackUrl=%2Fapp%2F">midjourney官方</a>,点击Join the Beta,自动跳转到Discord网站</p>
<p><img alt="image-20230407104806743" src="../../images/image-20230407104806743.png" /></p>
<p>如果提示邀请无效忽略不管,直接点解继续使用Discord</p>
<p><img alt="image-20230407104945047" src="../../images/image-20230407104945047.png" /></p>
<p>注册或者直接登录Discord账号,支持国内邮箱</p>
<p><img alt="image-20230407105103871" src="../../images/image-20230407105103871.png" /></p>
<p>登录成功后先建立一个属于自己的Discord服务器(可以认为是一个聊天房间);依次选择:亲自创建——仅供我和我的朋友使用——输入服务器名称——点击创建</p>
<p><img alt="image-20230407110937298" src="../../images/image-20230407110937298.png" /></p>
<p>创建完成后,点击左侧「下载APP」按钮,安装 Discord 客户端 ...</p>如何用chatgpt练习英语口语2023-04-06T19:44:01+08:002023-04-06T19:44:01+08:00刘志军tag:foofish.net,2023-04-06:how-to-use-chatgpt-learning-english.html<p>下载插件 Voice Control for ChatGPT </p>
<p>打开Chrome浏览器应用商店:https://chrome.google.com/webstore/category/extensions , 搜索Voice Control for ChatGPT ,这个插件用于文本和语音之间的转换, 它可以将你说的内容转化为文本,发送给chatgpt,然后将chagpt生成的文字内容转为成语音播放出来。</p>
<p><img alt="image-20230405223449282" src="../../images/image-20230405223449282.png" /></p>
<p>安装成功后,在ChatGPT网页上多了一个语音输入的功能,鼠标点击后即可以录音,再次点击后将自动识别语音转换成文字发送到chatgpt。当然,这个插件不仅可以练习英语还支持多国语言。</p>
<p><img alt="image-20230405224835888" src="../../images/image-20230405224835888.png" /></p>
<h3>快捷键</h3>
<p>1、按住空格键(文本输入框以外)进行录音,松开键盘即可提交。 </p>
<p>2、按ESC或Q键可取消录音。</p>
<p>3、按E键可停止录音并将文本转录复制到ChatGPT输入框中,但不提交。</p>
<p>现在就可以开始向chatgpt发起指令:</p>
<p>首先将AI拟定一个角色,我们把它成为陪练口语的雅思专家,另外还要明确告诉她每次只提一个问题,然后用英文来提问。 当然,你也可以直接用应用跟她交流,就不要强调用英语回答了。</p>
<p><img alt="image-20230405230339489" src="../../images/image-20230405230339489.png" /></p>
<p>这时候刚刚安装的Voice Control 插件会自动把机器人发的内容转换成语音。</p>
<p>你只要摁住空格或者鼠标点击录音按钮就可以回答她的问题 ...</p>如何在Pcharm中使用Copilot写代码?2023-04-06T07:44:01+08:002023-04-06T07:44:01+08:00刘志军tag:foofish.net,2023-04-06:how-to-use-github-copilot-in-pycharm.html<h3>GitHub Copilot 是什么</h3>
<p>GitHub Copilot 是由 Github 和 OpenAI 打造的 AI 编程工具。该工具可以通过自动代码补全帮助程序员编写代码、修复Bug、写单元测试、生成文档等。VSCode、和 JetBrains 旗下产品 Pycharm 工具都可以通过插件将Copilot集成进来。支持的语言包括 Python、JavaScript、TypeScript、Ruby、Java 和 Golang等语言。</p>
<p><img alt="img" src="../../images/Fg7OOR2poxhi6sMOPQKXxRgOGH8O.png" /></p>
<h3>如何注册Copilot</h3>
<p>Copilot 需要付费使用,普通用户有30天试用期,但针对开源作者、学生、老师免费开放使用,比如我的GitHub账号就有免费使用资格,因为我属于开源作者这一类,当然你也可以通过某些渠道注册一个学生账号免费使用。</p>
<p><img alt="image-20230406155152790" src="../../images/image-20230406155152790.png" /></p>
<p>登录Github账号后,申请注册Copilot: https://github.com/github-copilot/free_signup ,如果满足免费使用条件,就是下面这个页面,否则就是上面的页面 ...</p>ChatGPT账号被封,如何申诉找回2023-04-03T07:44:01+08:002023-04-03T07:44:01+08:00刘志军tag:foofish.net,2023-04-03:how-to-restore-chatgpt-account.html<p>昨天还传言<a href="http://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&mid=2650379251&idx=1&sn=c7efbfa24064cb3eb88d869e21ecc4ba&chksm=be9c28a789eba1b1fd0efa7fec7dcfb0c063d9fa145766dcfa6e7dbd386bc81caca04971ea77&scene=21#wechat_redirect">ChatGPT暂停注册</a>,今天ChatGPT就大面积封号,哀鸿遍野,不管你是不是亚洲地区,不管你是普号还是Plus号,都有被封号的案例。目前还没有一个绝对封号的参考标准</p>
<p>大家不要随意切IP,据说亚洲区是封号重区,不要多个地方同时登,很容易被判一号多用,不要滥用API KEY,影响平台稳定性。</p>
<p>另外请遵守平台规范,确保自己发布的内容合规,避免涉及政治、暴力、色情等敏感话题,降低被封禁的风险。</p>
<p>如果你的号确实非常重要,里面有很重要的信息和数据,而且你认为账号是误封,你可以向平台发起申诉</p>
<p>申诉的途径是向OpenAI官方发送邮件,邮件地址是 support@openai.com</p>
<p>申诉的内容主要是表明你这个号非常珍贵,里面有很多数据对你很重要,账号可能被盗用,然后说明你没有干什么坏事,以后也不会干,希望给予解封,以后一定会遵守平台规则... 具体详细内容就看个人发挥了。</p>
<p>记得一定要用英文来描述,如果发中文可能他们的支持团队压根就不看,因为本来就没对国内开放。</p>
<p>这里我直接给个英文的参考模板,请不要千篇一律地直接复制</p>
<p><em>Subject: Urgent Appeal for Account Unban: Unauthorized ...</em></p>5个ChatGPT Chrome 插件,让聊天更爽2023-03-31T20:44:01+08:002023-03-31T20:44:01+08:00刘志军tag:foofish.net,2023-03-31:chatgpt-chrome-plugins.html<p>在ChatGPT的官方插件还没正式推出时,市面上已经有诸多的Chrome插件,主要是体验上的增强,来看看有哪些是你喜欢的。</p>
<h3>1、ChatGPT for Google</h3>
<p><img alt="image-20230330221918536" src="../../images/image-20230330221918536.png" /></p>
<p>这是一个在搜索引擎结果中同时显示ChatGPT的回答,平常我们搜索时需要自己一条条自己判断哪条结果是我们想要的,这个插件直接给我们回答。</p>
<p>例如在Google搜索如何实现”快速排序“,左侧是Google的搜索结果,右侧是插件给我们的答案</p>
<p><img alt="image-20230330224400193" src="../../images/image-20230330224400193.png" /></p>
<h4>2、ChatGPT Writer</h4>
<p><img alt="image-20230330222242903" src="../../images/image-20230330222242903.png" /></p>
<p>ChatGPT Writer 是一个辅助写作工具,比如回复邮件、回复消息,你把别人发你的邮件内容粘贴到输入框,Writer 会让你写一句总结的话,剩下的内容就可以交给Writer去润色打磨,生成完整的回复内容。</p>
<p><img alt="image-20230330230000149" src="../../images/image-20230330230000149.png" /></p>
<h3>3、YouTube 视频总结</h3>
<p><img alt="image-20230330222325210" src="../../images/image-20230330222325210.png" /></p>
<p>当你在看YouTube上的视频时,可以用这个插件查看视频每小段的内容终结,提前知道视频里面会讲什么内容。还支持文本内容的复制。</p>
<p><img alt="image-20230330230512193" src="../../images/image-20230330230512193.png" /></p>
<h3>4、WebChatGPT</h3>
<p><img alt="image-20230330222538007" src="../../images/image-20230330222538007.png" /></p>
<p>WebChatGPT 是一个可以访问互联网聊天插件,例如我在ChatGPT问今天星期几,ChatGPT其实是不知道的,因为它训练的数据还是2021年的。WebChatGPT可以进行联网查询。 不过等ChatGPT官方插件出来后,这款插件估计不好过。</p>
<p><img alt="image-20230330231802756" src="../../images/image-20230330231802756.png" /></p>
<h3>5、chatgpt-gzh</h3>
<p>严格来说,这不是一个浏览器插件,而是一个基于公众号的chatgpt聊天工具 ...</p>如何将ChatGPT接入到微信保姆级教程2023-03-30T00:44:01+08:002023-03-30T00:44:01+08:00刘志军tag:foofish.net,2023-03-30:how-to-integrate-chatgpt-to-wechat.html<p>将chatgpt接入微信,首先你需要准备的东西</p>
<ul>
<li>一个微信小号(别用自己大号,没玩好就没了)</li>
<li>一台Linux服务器</li>
<li>一个ChatGPT账号</li>
</ul>
<p>前两个可自备,应该能轻松搞到,ChatGPT账号可参考我之前的教程,如果不想折腾可私信我或者加入我们星球【ChatGPT研究社】,可免费获取一个独立的ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>
<p>拿到ChatGPT账号后,去OPENAI官网升级一个KEY。打开地址:https://platform.openai.com/ ,登录账号点击右上角头像的View API keys,创建 secret key</p>
<p><img alt="image-20230329234548964" src="../../images/image-20230329234548964.png" /></p>
<p>拿到一台服务器后,先确定服务器的Python版本是3.7以上,然后把项目克隆下来</p>
<div class="highlight"><pre><span></span>git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/
pip3 install -r requirements.txt # 安装依赖
</pre></div>
<h3>配置</h3>
<p>配置文件的模板在根目录的<code>config-template.json</code>中 ...</p>只需要一个HTML文件,就可以快速开启ChatGPT聊天2023-03-29T17:00:01+08:002023-03-29T17:00:01+08:00刘志军tag:foofish.net,2023-03-29:chatgpt-one-page-html.html<p>今天发现一个史上最简单的自建ChatGPT部署方案,只需要一个HTML文件,把它配置到Nginx就能跑起来。</p>
<p>效果如下:</p>
<p><img alt="image-20230328211704590" src="../../images/image-20230328211704590.png" /></p>
<p>他能做什么用?</p>
<p>平常我们使用chatgpt需要配魔法上网才能登上官方网站,对于很多人来说这是个很棘手的问题,如果你有个海外云服务器,就可以通过这种方式部署一个自己专有的chatgpt,只要指定key,就可以愉快的用上chatgpt了。</p>
<p>你需要准备啥?</p>
<ul>
<li>一个能正常访问 api.openai.com 的海外服务器</li>
<li>一个chatgpt key</li>
<li>没有了</li>
</ul>
<p>只要在界面右侧配置好你的chatgpt key 就可以连上chatgpt与机器人聊天,这个key 是怎么来的呢?</p>
<p>在openai官方登录后访问 https://platform.openai.com/account/api-keys,可以申请key,以sk开头。如果你的账号是从别的渠道购买的,通常也会带一个key</p>
<p><img alt="image-20230216160339632" src="../../images/c3ac9cdc6b73414da537d5da662804d6tplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp" /></p>
<p>申请完key之后,我们唯一要做的一件事就是配置Nginx,不知道Nginx是什么的同学可自行搜下,简单来讲就是一个提供Web服务的服务器以及反向代理工具,我们只需要把那个html文件配置在nginx,程序就能跑起来了。</p>
<p>nginx配置</p>
<div class="highlight"><pre><span></span><span class="c1"># 把这段代码配置到server 模块中</span>
<span class="k">gzip</span> <span class="no">on</span><span class="p">;</span>
<span class="k">gzip_min_length</span> <span class="mi">1k</span><span class="p">;</span>
<span class="k">gzip_types ...</span></pre></div>如何修改ChatGPT的密码2023-03-29T08:44:01+08:002023-03-29T08:44:01+08:00刘志军tag:foofish.net,2023-03-29:how-to-reset-chatgpt-password.html<p>本教程教大家如何修改ChatGPT的密码,如果你的账号是直接登录OpenAI网站的,请按照本指引进行操作,如果你是通过第三方平台(Goole或者Microsoft)账号授权登录的,请参考文章末尾的常见问题说明。</p>
<p>第一步:打开ChatGPT的官方网址: <a href="https://chat.openai.com/auth/login">https://chat.openai.com/auth/login</a>,点击 Login 按钮</p>
<p><img alt="image-20230329084649457" src="../../images/image-20230329084649457.png" /></p>
<p>第二步:输入邮箱账号后,点击 Continue</p>
<p><img alt="image-20230329084724704" src="../../images/image-20230329084724704.png" /></p>
<p>第三步:点击 Forget Password(确认账号是否正确,如不正确请点击 Edit)</p>
<p><img alt="image-20230329094618432" src="../../images/image-20230329094618432.png" /></p>
<p>第四步:点击 Continue,系统会给你的邮箱发送一个修改密码的链接</p>
<p><img alt="image-20230329084922842" src="../../images/image-20230329084922842.png" /></p>
<p>第五步:登录你的邮箱,具体是什么邮箱,取决于你的邮箱账号地址是什么,比如我是用的QQ邮箱,我直接登录QQ邮箱后台,会收到一封OpenAI发给我的重置密码消息。</p>
<p>点击 Reset password</p>
<p><img alt="image-20230329085227250" src="../../images/image-20230329085227250.png" /></p>
<p>第六步:设置新密码,两次密码保持一致。点击 Reset password 重置密码 ...</p>ChatGPT常见问题汇总(最全)2023-03-29T00:44:01+08:002023-03-29T00:44:01+08:00刘志军tag:foofish.net,2023-03-29:chatgpt-common-questions.html<p><strong>0、什么是ChatGPT</strong></p>
<p>ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序,于2022年11月推出。它能用中、英文回答你的各种问题,还能帮你翻译、算数学、甚至写代码检查日志。 </p>
<p><strong>1、问:ChatGPT不fa墙可以使用吗?</strong></p>
<p>不可以,需要科学上网</p>
<p><strong>2、问:ChatGPT手机、电脑都能使用吗?</strong></p>
<p>可以,ChatGPT是网页端程序,通过浏览器访问,所以手机电脑都可以使用,提前是你的设备支持科学上网</p>
<p><strong>3、问:普通账号可以使用GPT-4吗?</strong></p>
<p>不可以,目前GPT-4需要升级Plus才可以使用,Plus会员按月订阅,官方价格是20美元/月。</p>
<p><strong>4、问:我用outlook邮箱登录时显式改账号已锁定怎么办?</strong></p>
<p>如果邮箱显示锁定,用自己手机号自己解锁就好。邮箱是提前注册的,gpt是当天注册的,邮箱长时间不登录会锁定,是正常现象。</p>
<p><strong>5、问:ChatGPT支持中文吗?</strong></p>
<p>支持,直接用中文提问,他就能用中文回答问题</p>
<p><strong>6、问:ChatGPT有流量或者使用次数限制吗?</strong></p>
<p>网页端的聊天没有流量和次数限制 ...</p>Depay信用卡申请保姆级教程2023-03-26T14:44:01+08:002023-03-26T14:44:01+08:00刘志军tag:foofish.net,2023-03-26:apply-a-depay-credit-card.html<h3>什么是 Depay</h3>
<p>Depay 是一款虚拟货币钱包,它可以管理你的比特币,以太币、USDT等数字货币。在Depay上还可以申请虚拟VISA和Master信用卡,在Depay上支持USDT直接充值到信用卡,这张信用卡可以绑定微信、支付宝、美团直接在国内消费,当然还有现在最火的ChatGPT,也可以用Depay信用卡来绑定,这就实现了使用虚拟货币进行日常消费的可能,避免OTC(场外交易)风险。</p>
<p><img alt="image-20230326015020563" src="../../images/image-20230326015020563.png" /></p>
<h3>为什么要用Depay</h3>
<ol>
<li>开卡无费用</li>
<li>月费低</li>
<li>卡片额度高</li>
<li>可以绑定微信、支付宝、美团等直接消费</li>
<li>开通ChatGPT Plus</li>
<li>订阅MidJourney会员</li>
<li>可以在aws、azure、googlepay、applepay等消费(薅羊毛必备)</li>
<li>官方客服基本全天在线</li>
</ol>
<h3>注册Depay账号</h3>
<p>申请Depay的信用卡前,首选要在他们官网注册一个账号,<a href="https://depay.depay.one/web-app/register-h5?invitCode=712088&lang=zh-cn">点击->链接直接注册</a>,可使用手机号或者邮箱注册。注册成功后会让你下载他们家APP,因为信用卡需要用APP才能申请。Android手机可以直接下载APK包,苹果手机需要海外苹果账号才能下载。APP安装完成后,用刚才的账号密码登录,登录后可以将APP设置为中文界面。</p>
<h3>申请信用卡</h3>
<p>登录APP后直接申请信用卡,VISA和Mastercard两者都可以申请 ...</p>王炸!ChatGPT 开放插件,新时代的操作系统2023-03-24T08:49:01+08:002023-03-24T08:49:01+08:00刘志军tag:foofish.net,2023-03-24:chatgpt-plugins.html<p>一个好消息,ChatGPT正式开放插件了。 插件的开放,使得ChatGPT有了联网、运行代码的能力</p>
<p><img alt="图片" src="../../images/640.gif" /></p>
<p>过去ChatGPT在遇到一些问题时它会提醒你它的训练数据并不包括这一内容,例如你问它今天星期几这样的简单问题时,它无法给你回答。因为它没有联网的能力。</p>
<p><img alt="image-20230324083038361" src="../../images/image-20230324083038361.png" /></p>
<p>但是在添加了浏览器插件后,它就可以自主判断什么时间应该从互联网获得更多信息以及如何获取筛选和解读这些数据。将ChatGPT联网后具备的能力包括:</p>
<ul>
<li>访问最新信息,比如体育比分、股票价格、最新消息;</li>
<li>检索知识库信息,比如公司文件、个人笔记、运行计算;</li>
<li>代表用户执行操作,比如订机票、订餐。</li>
</ul>
<p>以前的ChatGPT需要通过指令“模拟”成一个命令行界面运行代码,例如我让它扮演一个解释器,我可以这样跟它说:</p>
<blockquote>
<p>我想让你像一个Python解释器一样行事</p>
</blockquote>
<p>他就可以帮你执行代码了。</p>
<p><img alt="image-20230324083853101" src="../../images/image-20230324083853101.png" /></p>
<p>现在使用Code Interpreter插件后就可以在对话中直接进行Python代码运作。这不是仅仅允许使用者运行python代码那么简单,而是意味着一些复杂问题ChatGPT会自己撰写代码,运行后辅助分析。AI真正会使用代码就像当初动物学会使用工具一样。 </p>
<p>除了之外,能够通过ChatGPT对话直接通过买菜、预定旅行交通和住宿,自动回复邮件、撰写新闻稿、进行代码Review都不需要人工介入。几乎你在互联网上能做的一切事情ChatGPT都可以去替你做。 </p>
<p>这一波ChatGPT技术热潮,大势不可挡,但是漩涡里也能涌现更多弄潮儿。</p>
<p>ChatGPT将颠覆很多行业,程序员、自媒体、记者 ...</p>一个集成了GPT-4的免费编辑器 Cursor2023-03-19T08:49:01+08:002023-03-19T08:49:01+08:00刘志军tag:foofish.net,2023-03-19:cursor-editor.html<p>每天都被openai震撼到, 他们家被广为人知的产品是chatgpt,就是那个聊天工具。现在已经开始有越来越多的产品集成openai,比如微软的office,bing。</p>
<p>现在又一个工具出现,一个叫Cursor的编辑器已经集成了openai的GPT-4,而且还是免费的,它将彻底改变我们写代码的方式。 以前不会写代码先去百度google一下。Ctrl+c,Ctrl+v搞定,我们调侃我们都是CV工程师。</p>
<p>以后我们恐怕要成为“KL"工程师,为什么叫”KL“工程师呢, 因为只要K和L两个指令就可以直接生成代码、修改代码,哪行代码不会点哪里,他都给你解释得明明白白。</p>
<p><img alt="image-20230319003903733" src="../../images/image-20230319003903733.png" /></p>
<h3>下载安装</h3>
<p>Cursor编辑器提供了Windows、MacOS、Linux 三个平台的安装包,安装包下载链接: <a href="https://pan.baidu.com/s/1Jh3gIrnjvYTY4QpmXqdD6Q">https://pan.baidu.com/s/1Jh3gIrnjvYTY4QpmXqdD6Q</a> 提取码: dt7m </p>
<p><img alt="image-20230319004116280" src="../../images/image-20230319004116280.png" /></p>
<p>下载安装完成后,会引导你进行初始化设置,你即可以选择VIM或者Emacs的操作习惯,也可以保持默认设置,另外它还支持绑定Copilot。</p>
<p>我们可以直接用Ctrl+K,输入一个指令:”用Python实现一个猜数字游戏,每次最多3次机会 ...</p>伪装成小白,让ChatGPT教我写代码2023-03-17T17:59:01+08:002023-03-17T17:59:01+08:00刘志军tag:foofish.net,2023-03-17:use-chatGPT-write-code.html<p>今天我伪装成一个编程小白,让chatgpt帮我实现一个功能</p>
<p>需求如下:</p>
<p>有一个txt文本,文本的格式是 xxx----xxx----xxx,我想把这个txt文件转换为3列的excel表格。如图所示。</p>
<p><img alt="image-20230317190327953" src="../../images/image-20230317190327953.png" /></p>
<p>我希望他能用python代码帮我实现,来看看怎么向他提问吧</p>
<p><img alt="image-20230317190439927" src="../../images/image-20230317190439927.png" /></p>
<p>提问是门学问,你描述得越具体它给出的答案就更准确,就跟你向活人提问一样。从结果上看,他给出的答案很哇塞,你只需要把文件名修改成真实的文件名字就能跑起来,最后它还不忘了提醒你要安装pandas。</p>
<p>然后,我接着问题,如果不用第三方库,是否能实现?</p>
<p><img alt="image-20230317190840824" src="../../images/image-20230317190840824.png" /></p>
<p>嗯,非常不错,它推荐我使用openpyxl实现,代码差不多,还贴心的在关键代码处给了注释。但是我不知道openpyxl 是个什么库,我接着问题它</p>
<p><img alt="image-20230317191050048" src="../../images/image-20230317191050048.png" /></p>
<p>最后我把代码复制到编辑器,安装好openpyxl,修改了文件名,程序没有报错和预期的一样得到了正确结果</p>
<p><img alt="image-20230317190327953" src="../../images/image-20230317190327953.png" /></p>
<p>这些代码对一个老程序员来说,如果你对pandas和openpyxl这两个库都不熟悉,你一定还是要先百度Google一下来筛选内容。而chatgpt直接给了你一个确定的答案。</p>
<p>不过,话说回来,如果你真的是一个一行代码都不懂的小白,遇到报错没法定位或者debug时,还是有点难。这就好比一个开手动挡的老司机去开自动挡会非常轻松,如果你驾照都没有就想直接上手自动挡还是非常危险的。</p>
<p>chatgpt并不会取代你的工作,而是在你的工作扮演助理帮你提高生产力。你不用chatgpt对你影响似乎也不大,你拥抱chatgpt会让为之震撼。未来已经只是分布不均匀。</p>ChatGPT Plus 会员保姆级注册教程(亲测有效)2023-03-16T07:59:01+08:002023-03-16T07:59:01+08:00刘志军tag:foofish.net,2023-03-16:how-to-registe-chatGPT-plus.html<p>2023年8月15更新,本教程是基于depay信用卡进行plus会员订阅,拒卡概率高,最新方法:<a href="https://foofish.net/chatgpt-plus-upgrade-with-wildcard.html">用 WildCard 充值ChatGPT Plus 会员</a>,支持支付宝支付快捷方便。</p>
<p>之前写过一个<a href="https://foofish.net/how-to-registe-chatGPT.html">ChatGPT的保姆级注册教程</a>, 随着GPT-4的发布,其功能之强大令人震撼,以前GPT只能理解文本内容,现在可以文本加图片了,理解能力大幅度提升,在一个模拟律师考试中,它的分数在应试者的前 10% ;相比GPT-3.5 的得分在倒数 10% 左右,其智力水平让教育行业陷入沉思。 不过这些功能需要购买 ChatGPT Plus 才能体验到。</p>
<h3>ChatGPT Plus是什么?</h3>
<p>平时我们注册的ChatGPT账号是普通账号,而 Plus 属于ChatGPT的升级版,好处非常多,比如系统更稳定、无字数限制,优先体验新特性等等。</p>
<p>升级Plus付费版流程比较繁琐,因为它不支持国内信用卡,你必须使用国外的虚拟信用卡进行充值。总体步骤是:欧易平台购买USDT->提现到Depay钱包-> 兑换成美元充值到Depay信用卡-购买ChatGPT Plus会员。</p>
<p><img alt="image-20230316075946959" src="../../images/image-20230316075946959.png" /></p>
<p>欧易是虚拟货币交易平台,港股上市公司 ...</p>通过 ChatGPT 进行副业赚钱的10小技巧2023-02-25T16:48:01+08:002023-02-25T16:48:01+08:00刘志军tag:foofish.net,2023-02-25:make-money-with-chatgpt.html<h3>1、代替问</h3>
<p>代替问一般通过直播引流,通过直播间打赏给观众回答问题,因为关注对新东西都有猎奇心理,普通大众现在也无法访问chatgpt,所以待提问能解决一部分的需求。</p>
<p><img alt="image-20230325140935140" src="../../images/image-20230325140935140.png" /></p>
<h3>2、技术支持</h3>
<p>chatgpt出来后,我第一时间把功能部署到了微信公号,通过公众号实现与chatgpt的对话,因为这个功能我挣了第一桶金,我帮好几个客户部署一套项目收费1000元。说实话,在公众号上面对话更方便也不需要科学上网。有兴趣的可以去体验的,我把源代码放在GitHub <a href="https://github.com/lzjun567/chatgpt-gzh">https://github.com/lzjun567/chatgpt-gzh</a></p>
<h3>3、代注册</h3>
<p>很多人在注册过程中卡壳了,特别是对于很多不是搞技术的人来说,就是个大难题,靠不容易上了梯子,注册验证码也没那么容易,如果你自己走过一遍流程,注册起来很快,成本几块钱就可以搞定,你帮你代注册一个号可以收费30、50,很多人也愿意付这个费用,因为你付出了时间,也帮别人节省了时间。 注册完之后,别忘了提醒修改密码。</p>
<h3>4、卖账号</h3>
<p>如果你能找代理商拿到低价的账号货源,不管是普通号还是Plus账号都有需求,你可以高价卖给别人,这其中挣的是信息差,前提条件是你既要找到买家也要找到卖家,中间商挣个差价。</p>
<h3>5、做导航站 ...</h3>Python都30岁了2023-02-21T12:59:01+08:002023-02-21T12:59:01+08:00刘志军tag:foofish.net,2023-02-21:pythondu-30sui-liao.html<p>Slug:python-is-30-years-old</p>
<p><img alt="image-20230220231723386" src="../../images/image-20230220231723386.png" /></p>
<p>可能很多人认为Python是一门最近几年才冒出来的语言,其实它比Java的诞生还早。翻日历发现2月20(昨天)刚好是Python这门语言诞生的第30个年头。30而立,Python在TIOBE排行榜上位居第一。</p>
<p><img alt="image-20230220232145396" src="../../images/image-20230220232145396.png" /></p>
<p>我第一次接触Python是2012年,彼时我还是一名刚入行不久的Java程序员,闲暇之余,想找一门新语言学学,最好是一门动态语言,尽管在国外Python已经是一门主流语言,Google的三大语言之一,很多网站都是基于Python构建,如Instagram、Quora、Reddit、Disqus等等。但当时在国内Ruby的流行度要超过Python。</p>
<p>当时没想那么多,被一篇关于Python的帖子吸引后,就开始上手学习了。</p>
<p>接触Python后的第一感觉就是它的语法简洁、上手简单,接近自然语言,拿来和Java做对比时常感叹为啥Java如此啰嗦。后来就彻底爱上了这门语言,闲暇之余用Python写脚本、写网站效率出奇地高。</p>
<p>再后来准备换工作时,尝试做了份Python简历,想试试Python行情怎么样,结果一不小心就面上了,成了一名全职的Python程序员,一直到今天。</p>
<p>在整个职业过程中用python搞过云计算的openstack、网络爬虫、Web开发、后端API开发。这些都是Python优势所以,因为在很多领域都有完善的框架和库的支持。</p>
<p>再后来我就创建了这个和Python相关的公众号,也正因为【Python之禅】这个公众号改变了我的生活,开启了我的副业之道。十多年的积累在这个地方可以发挥它的作用 ...</p>python实现公众号版chatgpt开发教程:私人AI助理2023-02-19T12:59:01+08:002023-02-19T12:59:01+08:00刘志军tag:foofish.net,2023-02-19:wechat-chatGPT.html<p>chatgpt 网页版不稳定,必须配合梯子使用,用起来体验很不好。我在想能不能做个微信版chatgpt来打造一个私人AI助理,考虑到有封号的风险这个方案放弃了。最终使用公众号来实现。</p>
<p>因为公众号本身就提供了开放接口,即便是个人号也支持一些简单的对话功能,用来做基于聊天的场景非常适合。</p>
<p>开发前的准备</p>
<ol>
<li>openai账号</li>
<li>微信公众号</li>
<li>域名</li>
<li>服务器</li>
</ol>
<p>申请 OpenAI KEY</p>
<p>首先你要有个chatgpt(OpenAI)的账号,才能接入chatgpt,还不知道怎么注册的请参考文章<a href="https://foofish.net/how-to-registe-chatGPT.html">ChatGPT保姆级注册教程</a>。注册成功后,申请一个API KEY,地址:https://platform.openai.com/account/api-keys。</p>
<p><img alt="image-20230216160339632" src="../../images/image-20230216160339632.png" /></p>
<p>注册微信公众号</p>
<p>打开网址 https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token=, 直接选订阅号,如果你是企业 ...</p>ChatGPT Plus 会员保姆级升级教程(亲测有效)2023-02-16T07:59:01+08:002023-02-16T07:59:01+08:00刘志军tag:foofish.net,2023-02-16:chatgpt-plus-hui-yuan-bao-mu-ji-zhu-ce-jiao-cheng.html<p>之前写过一个<a href="https://foofish.net/how-to-registe-chatGPT.html">ChatGPT的保姆级注册教程</a>, 随着GPT-4的发布,其功能之强大令人震撼,以前GPT只能理解文本内容,现在可以文本加图片了,理解能力大幅度提升,在一个模拟律师考试中,它的分数在应试者的前 10% ;相比GPT-3.5 的得分在倒数 10% 左右,其智力水平让教育行业陷入沉思。 不过这些功能需要购买 ChatGPT Plus 才能体验到。</p>
<h3>ChatGPT Plus是什么?</h3>
<p>平时我们注册的ChatGPT账号是普通账号,而 Plus 属于ChatGPT的升级版,好处非常多,比如系统更稳定、无字数限制,优先体验新特性等等。</p>
<p>升级Plus付费版流程比较繁琐,因为它不支持国内信用卡,你必须使用国外的虚拟信用卡进行充值。总体步骤是:欧易平台购买USDT->提现到Depay钱包-> 兑换成美元充值到Depay信用卡-购买ChatGPT Plus会员。</p>
<p><img alt="image-20230316075946959" src="../../images/image-20230316075946959.png" /></p>
<p>欧易是虚拟货币交易平台,港股上市公司,Depay是美国最大的虚拟信用卡公司。</p>
<p>ChatGPT Plus 升级准备</p>
<ol>
<li>1个可正常使用的ChatGPT账号</li>
<li>欧易平台账号</li>
<li>1账虚拟信用卡(Depay)</li>
<li>能访问ChatGPT(科学上网 ...</li></ol>公众号一年发布篇数怎么查2023-02-13T12:59:01+08:002023-02-13T12:59:01+08:00刘志军tag:foofish.net,2023-02-13:query-article-count.html<p>作为公众号运营者,你是否对你的公众号数据有过全面的了解呢?比如你是否知道公众号一年共发布了多少篇文章,哪些文章的阅读量最高,传播得最广。哪些文章得互动评论最多,点赞数据有多少。</p>
<p>如果只有一两篇文章我们还可以在后台通过手工方式一篇一篇去统计,但是当一年的数据有几百上千篇时就显得有点举步维艰。特别是每到年底要盘点数据时,如何快速导出数据显得尤为重要。</p>
<p>今天推荐一个公众号数据导出工具------<strong>次幂数据</strong>(体验地址:https://www.cimidata.com/data/export),它能一键导出任意公众号下的任意发布时间段内文章的阅读数、点赞数、在看数以及是否标记为原创等维度的数据。导出来直接是excel格式,方便我们做数据分析。</p>
<p><img alt="img" src="../../images/1669967524068_20221202155324235598.png" /></p>
<p>操作流程很简单</p>
<p>第1步:确定公众号。进入工作台页面后,在左侧找到【数据回采】的功能,输入我们将要导出的公众号昵称</p>
<p><img alt="img" src="../../images/image-20221201215644393_20221201215848272463.png" /></p>
<p>第2步:确定时间范围,你可以选择任意时间段内发布的文章进行导出,导出的数据都是最新的数据。确定导出后,只需等到一段时间,采集任务将根据任务大小完成采集。</p>
<p><img alt="img" src="../../images/公众号搜索_20221127232750825889.gif" /></p>
<p>采集完成后你将收到通知提醒,从历史记录中即可下载回采数据<img alt="img" src="../../images/image-20221127223117471_20221127232808016391.png" /></p>
<p>体验地址:https://www.cimidata.com/data/export</p>ChatGPT保姆级注册教程2023-02-10T12:59:01+08:002023-02-10T12:59:01+08:00刘志军tag:foofish.net,2023-02-10:how-to-registe-chatGPT.html<p>ChatGPT去年已经在互联网技术圈里已经火了一把,现在似乎已经出圈,各行各业都在讨论,可以预见,ChatGPT是继互联网后的又一大技术革命。</p>
<p>如何才能体验ChatGPT呢?很多人卡在账号注册这一步,现在就来手把手教你如何成功注册ChatGPT,亲测有效。 如果不想自己折腾直接加入我们社群【ChatGPT研究社】,里面提供了关于ChatGPT的各种教程和工具,让你快速上手,现在加入还可免费获取一个独立的ChatGPT账号。</p>
<p><img alt="image-20230330011719223" src="../../images/image-20230330011719223.png" /></p>
<h3>ChatGPT是什么?</h3>
<p>ChatGPT的自我介绍</p>
<blockquote>
<p>我是 Assistant,一个由 OpenAI 训练的大型语言模型。我可以回答您的问题,并帮助您了解更多关于特定主题的信息。我并不具备自己的意识,只能通过我所学到的知识来回答问题。如果您有任何其他问题,请随时问我。我很乐意帮助您。</p>
</blockquote>
<p>ChatGPT 注册准备</p>
<ol>
<li>代理(推荐台湾或者日本节点)</li>
<li>邮箱</li>
<li>国外手机号(可临时购买)</li>
</ol>
<p>因为ChatGPT的网站无法在国内正常访问,所以我们必须使用梯子绕一圈才能完成注册,同时因为需要绑定国外手机号才能完成注册,所以你还需要准备一个能接收验证码的号码。</p>
<p>第一步:开启全局代理,这一步无法具体介绍,不开就会出现访问拒绝的提示</p>
<p><img alt="image-20230210083452855" src="../../images/image-20230210083452855.png" /></p>
<p>第二步:打开chatgpt注册网站: https://chat.openai.com/auth ...</p>关于付费咨询2023-02-01T20:59:01+08:002023-02-01T20:59:01+08:00刘志军tag:foofish.net,2023-02-01:pay_for_consulting_service.html<p>经常会有读者粉丝朋友加微信过来咨询一些技术相关的问题, 一般情况下我都是免费回答,后来咨询的人越来越多了,我的个人时间明显不够用了。对于一两句话能说清楚的问题能直接解答。</p>
<p>但是有些问题一两句话就没法讲清楚,你跟他说A的时候,要先跟他解释B是什么,前前后后要花费大半个小时。有些甚至问题都没法描述清楚</p>
<p>后来就推了一个付费咨询的业务,具体内容是这样的</p>
<blockquote>
<p>如果你的技术问题占用我的时间比较长,请使用付费咨询,以获得更好体验。</p>
<p>一是对我时间的尊重</p>
<p>二是咱们可以交个朋友,后续有问题可以获得更好帮助</p>
<p>单次 50 起。</p>
</blockquote>
<p>然后附上收款码,发现这种效果非常好,对于愿意付费的读者,二话不说非常爽快,我也能给他们提供超预期的体验,往往后面他们继续问的时候,我都会耐心给他们解答。</p>
<p>大部分读者都愿意支付这个费用,因为有些问题自己琢磨真的能困扰你很久很久,这是能用一杯咖啡的钱就能解决的事,关键是一次付费,还增加了我们之间的信任值,后续我也更愿意继续提供帮助。</p>
<p>微信好友里很多通过付费产生链接后面真的成了朋友,我也愿意给他们推荐资源,像一个私活、工作机会之类的。</p>
<p>而对于少数只想白嫖的读者,见到我把这个咨询业务发给他时就不好意思再继续追问问题了,也算是节约我时间的一种办法吧。</p>
<p>付费就是捡便宜,我们最宝贵的资源是自己的注意力,比时间和钱都更加珍贵。如果我们能花钱买到注意力或者时间,我们就赚了,反而免费是最贵的东西。</p>记一次QQ找回经历2022-12-21T10:35:00+08:002022-12-21T10:35:00+08:00刘志军tag:foofish.net,2022-12-21:find-qq.html<p>腾讯的风控策略让普通用户抓狂</p>
<p>经历是这样的,昨天有事要临时登录下QQ号,因为很久没用过QQ号的缘故,现在是在一个新设备上登录,提示我需要扫码才能登录,就是说让我拿以前登录过该QQ号的那台设备扫码才能登,如果你的旧手机不在了这条逻辑就走不通。</p>
<p>尝试第二种方法,辅助登录,就是让QQ上的一个好友给这个QQ号发送验证码,这个和微信有点类似,微信上只要能联系到两个好友给你发验证码基本上就可以正常登录。 尝试多次最后收到的反馈还是未通过,也不告诉你不通过的原因是啥。</p>
<p><img alt="1671613265012" src="../../images/1671613265012.png" /></p>
<p>自己的QQ号有密码还不让我正常使用么?不甘心</p>
<p>然后去找腾讯客服进行申诉,提交了自己的身份信息和人脸识别最后得到的结果也是失败。</p>
<p><img alt="1671605677066" src="../../images/1671605677066.png" /></p>
<p>你必须用上面的5点来进行自证,第1点我几乎就没用过QQ了,哪来的长期使用。第2点,该QQ号没绑定过微信号,怎么用本人微信号提交呢。第3点,我特么就是本人啊,只是你觉得我不是本人而已。第4点同理。第5点你让我去那找常用设备去。</p>
<p>早期的QQ号注册没什么限制,不需要实名也不需要绑手机号,直接注册就行了。现在可好,我有密码还不能证明这个号是我自己的,唉,,,我当然知道这是为了风控,防止盗号搞出来的一堆繁琐的体验流程。这不是折腾普通用户吗。</p>
<p>在微信上“腾讯客服”公众号上不断询问,每次都是一个冷冰冰的机器人回答你。</p>
<p><img alt="1671605945068" src="../../images/1671605945068.png" /></p>
<p>最后,我尝试去找他们的人工客服电话,好在,官网确实有提供人工客服的电话渠道。</p>
<p><img alt="1671606026021" src="../../images/1671606026021.png" /></p>
<p>我前后打了两次,每次差不多等了10多分钟,最后终于有个客服接电话了 ...</p>python 中return和yield有什么区别2022-12-09T16:25:23+08:002022-12-09T16:25:23+08:00刘志军tag:foofish.net,2022-12-09:return-vs-yield.html如何注册OpenAI&ChatGPT2022-12-05T10:35:00+08:002022-12-05T10:35:00+08:00刘志军tag:foofish.net,2022-12-05:how-to-register-openai.html<p>ChatGPT 是OpenAI 发布的一个全新的聊天机器人模型。它到底有多厉害呢?我注册后体验了一下,你会感觉背后有个真人跟你在聊天。例如: </p>
<p><img alt="1670220840079" src="../../images/1670220840079.png" /></p>
<p>代码不仅可以运行,还特么有每行带有中文注释,这完全是降维打击StackOverflow。</p>
<p>再比如我要他帮我写个todolist。他还真能写,代码好像也没发现什么bug。</p>
<p><img alt="1670221071398" src="../../images/1670221071398.png" /></p>
<p>那么问题来了,AI到底能不能替代程序员写代码?我感觉短时间不可能,如果把时间拉长到20年以后,谁又知道呢?你在20年前也很难预测到今天的变化。 但是,可以肯定的是,某些程度上会对程序员的效率提升会有非常大的帮助。</p>
<p>比如我想临时写在一段演示代码,只需要一条指令就可以写出来。我感觉,只要是和具体业务无关的代码,都有可能通过AI辅助完成,就不需要我们再去GitHub或者StackOverflow到处找答案了。</p>
<p>使用ChatGPT需要先注册一个OpenAI的帐号。如果你在中国大陆,有两个前置条件:</p>
<ol>
<li>梯子</li>
<li>能接收验证码的国外手机号</li>
</ol>
<p>首选浏览器开启无痕浏览模式并访问地址:<a href="https://t.co/v7xJuYmf7Q">https://openai.com</a> , 开启全局梯子(港澳台的不行)模式登录注册</p>
<p><img alt="1670222666570" src="../../images/1670222666570.png" /></p>
<p>使用邮箱或者google、Microsoft帐号登录都可以。</p>
<p>注册成功后需要绑定手机号才能使用。注意,手机号不能是国内的手机号。可以使用国外的一些短信码如5sim这种平台,不知道怎么弄的加我微信(lzjun567)。手机号可以选择美国、印度或者巴西等地区的号 ...</p>如何导出公众号后台每篇文章的总阅读量、点赞、评论的数据2022-11-29T08:06:06+08:002022-11-29T08:06:06+08:00刘志军tag:foofish.net,2022-11-29:gongzonghaodaochu.html<p>年终总结、科研数据分析、公众号运营总离不开数据,如何导出公众号每篇文章的阅读量、点赞、评论数据呢?公众号后台一篇篇手动统计耗费大量人力和时间。如果想统计别人公众号文章数据更是难上加难。</p>纳瓦尔宝典2022-11-12T23:59:01+08:002022-11-12T23:59:01+08:00刘志军tag:foofish.net,2022-11-12:nawaerbaodian.html<p>最近读了一本叫《纳瓦尔宝典》的书,有几点比较认同的观点。推荐给大家</p>
<h4>1、利用杠杆</h4>
<p>仅仅靠出租自己的时间不可能让你变得富有,作为天选打工人,没有一个人是靠打工实现财富自由的,除非能获得公司股票,让公司帮你赚钱。</p>
<p>程序员最有可能的杠杆是去复制边际成本为零的产品。开发软件、做自媒体、公众号、拍短视频、做付费教程、写书,它能将你的时间重复出租n次,做到边际成本为零,同时给你带来真正的睡后收入。</p>
<h4>2、找到你的专长</h4>
<p>在互联网上,每个人都可以找到自己的受众。互联网本身就是一个巨大的杠杆,在互联网运用你的专长就发挥杠杆效应。就拿打游戏来说,以前你打得再好,也就一个寝室的人围观你,现在一个直播间可以涌进几十万人同时看你的表演。</p>
<p>专长需要练习,需要积累,比如我的专长就是写代码,我练习了十几年。获得专长需要有正确的方法、持续刻意练习、大量的实践机会,当然如果你热爱你就会持续投入。</p>
<h4>3、成为领域头部</h4>
<p>找到你擅长或者感兴趣的领域后努力成为这个领域的头部选手,有个帕累托法则,就是我们熟知的二八定律,在互联网甚至有一九原则,90%的关注度、财富都集中在这个领域的头部,根本没人能和头部竞争 ...</p>公众号最新文章获取API2022-11-06T18:57:59+08:002022-11-06T18:57:59+08:00刘志军tag:foofish.net,2022-11-06:gongzhonghaocaiji.html<p>我们可以根据客户需求定制获取用户指定公众号的数据</p>Windows 10 蓝牙耳机连接正常,但是没声音的解决办法2022-10-29T23:59:01+08:002022-10-29T23:59:01+08:00刘志军tag:foofish.net,2022-10-29:windows-audio-problem.html<p>遇到个怪问题,家里一台Windows能正常连上蓝牙耳机,播放音视频时死活听不到声音,调试时提示无法播放测试音调。把蓝牙设备删除重试几次依旧没有解决。</p>
<p><img alt="image-20221029233753514" src="../../images/image-20221029233753514.png" /></p>
<p>因为设备连接是正常,排除了驱动问题,只可能是某些服务没有启动或者启动出错了,费了一番时间找到一个靠谱的方案。</p>
<p>原来负责音频输出有两个服务,分别是 Windows Audio 和 Windows Audio Endpoint Builder。</p>
<ul>
<li>
<p>Windows Audio 负责管理音频程序的服务</p>
</li>
<li>
<p>Windows Audio Endpoint Builder 负责管理音频设备的服务</p>
</li>
</ul>
<p>使用快捷键 <code>Win+R</code> 运行 <code>services.msc</code> 进入系统服务操作界面</p>
<p><img alt="image-20221029234447440" src="../../images/image-20221029234447440.png" /></p>
<p>先确认这两个服务是否正常运行</p>
<p><img alt="image-20221029234613547" src="../../images/image-20221029234613547.png" /></p>
<p>如果都正常运行的话,试着重启一下两个服务</p>
<p><img alt="image-20221029234756085" src="../../images/image-20221029234756085.png" /></p>
<p>这时候发现耳机里神奇的有声音了</p>
<p>但凡是计算机遇到无法解释的诡异问题,99%都可以用重启大法解决,剩下一的1%重启一次不行就重启两次。</p>公众号文章评论2022-10-29T00:52:42+08:002022-10-29T00:52:42+08:00刘志军tag:foofish.net,2022-10-29:gongzhonghao-article-comments.html<p><strong>简要描述:</strong> </p>
<ul>
<li>公众号文章精选的评论</li>
</ul>
<p><strong>请求URL:</strong>
- <code>/api/v2/article/{article_id}/comments</code></p>
<p><strong>请求方式:</strong>
- GET</p>
<p><strong>查询参数:</strong> </p>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">access_token</td>
<td align="left">是</td>
<td align="left">string</td>
<td>请求凭证</td>
</tr>
<tr>
<td align="left">article_id</td>
<td align="left">是</td>
<td align="left">string</td>
<td>文章ID</td>
</tr>
</tbody>
</table>
<p><strong>返回示例</strong></p>
<div class="highlight"><pre><span></span>{
"code": 200,
"data": [
{
"content": "永远相信祖国[强][强][强]",
"content_id": "7036699775806210147",
"create_time": "2022-08-07T13:05:57",
"like_num": 1930,
"nick_name": "我",
"reply": []
},
{
"content": "解放军说到做到!(◦˙▽˙◦)\n什么叫专业,这就叫专业",
"content_id": "2551836487997980681",
"create_time ...</pre></div>公众号文章详情2022-10-29T00:52:42+08:002022-10-29T00:52:42+08:00刘志军tag:foofish.net,2022-10-29:gongzhonghao-article-detail.html<p><strong>简要描述:</strong> </p>
<ul>
<li>公众号文章详情</li>
</ul>
<p><strong>请求URL:</strong>
- <code>/api/v2/articles/{article_id}</code></p>
<p><strong>请求方式:</strong>
- GET</p>
<p><strong>查询参数:</strong> </p>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">access_token</td>
<td align="left">是</td>
<td align="left">string</td>
<td>请求凭证</td>
</tr>
</tbody>
</table>
<p><strong>注</strong>:此接口的请求频率1分钟不超过20次</p>
<p><strong>返回示例</strong></p>
<p>返回数据的是包含html标签的富文本数据。</p>
<div class="highlight"><pre><span></span>{
"code": 200,
"data": {
"body": "<span class="nt"><div</span> <span class="na">class=</span><span class="s">\"rich_media_content\"</span> <span class="na">id=</span><span class="s">\"js_content\"</span> <span class="na">style=</span><span class="s">\"visibility:</span> <span class="err">visible;\"</span><span class="nt">><p</span> <span class="na">style=</span><span class="s">\"margin-left:</span> <span class="err">16px;margin-right:</span> <span class="err">16px;line-height:</span> <span class="err">1.75em;text-align:</span> <span class="err">center;\"</span> <span class="na">data-mpa-powered-by=</span><span class="s">\"yiban.io\"</span><span class="nt">></span>☀️<span class="nt"></p><p ...</span></pre></div>获取公众号历史文章列表2022-10-29T00:52:42+08:002022-10-29T00:52:42+08:00刘志军tag:foofish.net,2022-10-29:gongzhonghao-collection-history.html<p><strong>简要描述:</strong> </p>
<ul>
<li>公众号文章聚合列表接口,包含已订阅的所有公众号历史文章,按文章发布时间升序排列</li>
</ul>
<p><strong>请求URL:</strong>
- <code>/api/v2/articles</code></p>
<p><strong>请求方式:</strong>
- GET</p>
<p><strong>查询参数:</strong> </p>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">access_token</td>
<td align="left">是</td>
<td align="left">string</td>
<td>请求凭证</td>
</tr>
<tr>
<td align="left">last_id</td>
<td align="left">否</td>
<td align="left">integer</td>
<td>分页参数,第一次请求可为空,第二次请求取上次返回结果中的最后一条记录中的id进行分页查询,默认每次返回20条数据</td>
</tr>
<tr>
<td align="left">idx</td>
<td align="left">否</td>
<td align="left">inteter</td>
<td>文章位置,可选值1~8</td>
</tr>
<tr>
<td align="left">t</td>
<td align="left">否</td>
<td align="left">integer</td>
<td>时间戳,单位:秒,筛选出发文时间大于该时间戳的文章</td>
</tr>
</tbody>
</table>
<p><strong>返回示例</strong></p>
<div class="highlight"><pre><span></span>{
"code": 200,
"data": {
"items": [
{
"account": {
"avatar": "http://wx.qlogo.cn ...</pre></div>获取公众号历史文章列表2022-10-29T00:52:42+08:002022-10-29T00:52:42+08:00刘志军tag:foofish.net,2022-10-29:gongzhonghao-history.html<p><strong>简要描述:</strong> </p>
<ul>
<li>获取公众号历史文章列表,包含阅读量、点赞数、在看数数据</li>
</ul>
<p><strong>请求URL:</strong> </p>
<ul>
<li><code>/api/v2/account/{username}/articles</code></li>
</ul>
<p><strong>请求方式:</strong></p>
<ul>
<li>GET</li>
</ul>
<p><strong>路径参数</strong></p>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">username</td>
<td align="left">否</td>
<td align="left">string</td>
<td>公众号唯一账号,例如人民日报公众号的账号是:rmrbwx</td>
</tr>
</tbody>
</table>
<p><strong>查询参数:</strong> </p>
<table>
<thead>
<tr>
<th align="left">参数名</th>
<th align="left">必选</th>
<th align="left">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">access_token</td>
<td align="left">是</td>
<td align="left">string</td>
<td>请求凭证</td>
</tr>
<tr>
<td align="left">idx</td>
<td align="left">否</td>
<td align="left">inteter</td>
<td>文章位置,可选值1~8</td>
</tr>
<tr>
<td align="left">last_id</td>
<td align="left">否</td>
<td align="left">integer</td>
<td>上次请求返回的分页参数</td>
</tr>
</tbody>
</table>
<p><strong> 注:文件按发布时间降序排列 </strong></p>
<p><strong>返回示例</strong></p>
<div class="highlight"><pre><span></span>{
"code": 200,
"data": {
"items ...</pre></div>微信公众号文章数据采集API2022-10-29T00:52:42+08:002022-10-29T00:52:42+08:00刘志军tag:foofish.net,2022-10-29:gongzhonghaoAPI.html<p>本文档是公众号文章数据采集API文档</p>
<p><strong>HOST:</strong> </p>
<ul>
<li><code>http://api.cimidata.com</code></li>
</ul>
<p><strong>如果POST请求注意</strong></p>
<ul>
<li>body 参数必须是<code>json</code>格式</li>
<li>请求头必须指定<code>Content-Type</code> 为 <code>application/json</code></li>
</ul>
<p><strong>接口列表</strong></p>
<ul>
<li><a href="https://www.showdoc.com.cn/lzjun567/4068434629227166">认证接口</a></li>
<li><a href="https://www.showdoc.com.cn/lzjun567/4056522640929069">文章聚合列表</a></li>
<li><a href="https://www.showdoc.com.cn/lzjun567/7381252300211739">公众号历史文章列表</a></li>
<li><a href="https://www.showdoc.com.cn/lzjun567/9274882194186112">文章详情</a></li>
<li><a href="https://www.showdoc.com.cn/lzjun567/7922970782308699">文章评论</a></li>
</ul>
<p>所有接口均提供试用时间,如有其它接口需求,可定制开发。 微信联系:yueryounali,备注:api</p>程序员副业搞钱的几种路子2022-10-26T10:12:01+08:002022-10-26T10:12:01+08:00刘志军tag:foofish.net,2022-10-26:sideproject-for-programmer.html<p>互联网大环境今年似乎进入到了冰点,直观感受是身边一些朋友、前同事被裁一波接着一波。最郁闷的是还不好找下一家,整个行业都在勒紧裤腰带过日子。作为程序员,如果有副业多少还能抵抗一部分风险。</p>
<p>总体来说,程序员副业可以朝两个方向去做,一个是把更多的时间卖出去,比如接外包项目,当骑手、开滴滴,弊端明显,你去做就有收入不做就没收入,但每个人一天总时长都是固定的,没法形成规模化。另一个是将一份时间卖给更多人,靠规模降低边际成本,最终实现睡后收入,这里主要讨论的也是后者。</p>
<p>做产品</p>
<p>从自身着手,看每天在用的东西哪些用起来不爽,如果遇到一些痛点需求,对你来说或许就是一个很好的机会。拿我自己举例,我做次幂数据就是觉得那时候写公众号缺少一个公众号数据分析工具,大部分做公众号的人都有类似的痛点,当我做出一个最小可用的版本时很快得到了第一批种子用户,经过多个版本迭代优化最后形成了能带来稳定收入的副产品。</p>
<p>做产品需要多尝试,从最小产品验证,发现不对时立即止损,我看到社群一哥们产品做了4年没有任何收入还是坚持,有时候方向错了,再多的努力也是徒劳。</p>
<p>做课程</p>
<p>从自己最擅长的技能入手,选择一个适合你的方向去做。比如我擅长Python,那我可以针对特定人群开发相关的课程,找好定位后,花时间把课程质量打磨好。</p>
<p>至于怎么把课程卖出,你可以选择与平台合作,这样运营推广都可以交给平台帮你去做,如果你自己有流量有粉丝完全可以自己卖。不管是做产品还是做课程,先把同类产品最优秀的前几个找出来多研究研究 ...</p>理解 flask.request中form、data、json属性的区别2022-08-23T09:12:01+08:002022-08-23T09:12:01+08:00刘志军tag:foofish.net,2022-08-23:flask_requset_form_data_json.html<p>flask的request对象中关于请求参数的获取有几个不同的属性,例如 args、form、data、json。估计大部分人一开始也分不清什么情况下哪个属性有值,哪个属性没值,这篇文章全面整理了这几个属性之间的区别和使用场景。</p>
<p>flask.request对象其实是对HTTP请求的一种封装,我们知道HTTP 请求由请求行、请求头、请求体三部分组成</p>
<p><img alt="image-20220806100926271" src="../../images/image-20220806100926271.png" /></p>
<ul>
<li>
<p>请求行指定了请求方法,请求路径以及HTTP版本号</p>
</li>
<li>
<p>请求头是浏览器向服务器发送请求的补充说明,比如content-type 告诉服务器这次请求发送的数据类型是什么</p>
</li>
<li>
<p>请求体是浏览器向服务器提交的数据,请求头与请求体之间用空行隔开。一般在POST或者PUT方法中带有请求体数据</p>
</li>
</ul>
<p>而flask中request对象中的form、data、json这三个属性其实是flask根据不同的content-type类型将HTTP请求体进行转换而来的数据,这几个属性的类型一般都是字典或者是字典的子类。</p>
<p>先简单介绍下args</p>
<h3>args</h3>
<p>args属性是请求路径中的查询参数,例如:<code>/hello?name=zs</code>, args 解析出来的数据是一个类似字典的对象,它的值是:</p>
<div class="highlight"><pre><span></span><span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"name"</span><span class="p">:</span> <span class="s1">'zx'</span><span class="p">}</span>
</pre></div>
<h3>form</h3>
<p>form 顾名思义是表单数据,当请求头content-type 是 application/x-www-form-urlencoded 或者是 multipart/form-data ...</p>如何利用多态干掉 if else 语句2022-08-17T09:12:01+08:002022-08-17T09:12:01+08:00刘志军tag:foofish.net,2022-08-17:replace-ifelse-with-polymorphism.html<p>这篇文章本来是上周要写的,结果一拖再拖就拖到了今天。</p>
<p>最近在给系统做一些重构工作,至于为什么要重构其实可以另开一个话题来展开,简单来说,如果系统能正常跑就没必要为了重构而重构,重构真正目的,主要是为了适应产品的迭代,让系统保持良好的扩展性。</p>
<p>我在重构过程中,发现支付逻辑充斥着坏味道,主要代码是下面这样的,我把实现的细节都省略了,当然实际代码比这个要长很多。</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">pay</span><span class="p">(</span><span class="n">pay_type</span><span class="p">):</span>
<span class="k">if</span> <span class="n">pay_type</span> <span class="o">==</span><span class="s1">'alipay'</span><span class="p">:</span>
<span class="n">alipay</span><span class="o">.</span><span class="n">pay</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">pay_type</span> <span class="o">==</span> <span class="s1">'wechat'</span><span class="p">:</span>
<span class="n">wechat</span><span class="o">.</span><span class="n">pay</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">pay_type</span> <span class="o">==</span> <span class="s1">'unionpay'</span><span class="p">:</span>
<span class="n">unionpay</span><span class="o">.</span><span class="n">pay</span><span class="p">()</span>
</pre></div>
<p>这段代码的使用场景是满足用户可以选择不同的支付方式完成付款操作,对应后端的代码,你肯定能想到最简单的实现方式就是上面的if ... else 语句。</p>
<p><img alt="1660700721927" src="../../images/1660700721927.png" /></p>
<p>随着你的业务不断扩大,产品经理跑过来跟你说,还需要接入多种支付方式,你的if else 代码也跟着越来越长了。这带来的一个问题就是系统的可扩展性差,后续的维护会变得举步维艰。</p>
<p>在《重构》这本书,讲到一个重构的原则,面对冗长的if ...</p>滑动验证码破解2022-08-04T13:47:06+08:002022-08-04T13:47:06+08:00刘志军tag:foofish.net,2022-08-04:opencv.html<p>做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈,今天分享个如何简单处理滑动图片的验证码的案例。 </p>
<p><img alt="微信截图_20210324163532.png" src="https://foofish.net/images/微信截图_20210324163532.png" /></p>
<p>类似这种拖动滑块移动到与目标图片中缺口位置与之重合的登录验证在很多网站或者APP都比较常见,他的好处是对真实用户体验友好,容易识别。同时也能拦截掉大部分初级爬虫。</p>
<p>作为一只python爬虫,如何正确地自动完成这个验证过程呢?</p>
<p>先来分析下,核心问题其实是要怎么样找到目标缺口的的位置,一旦知道了位置,我们就可以借用selenium等工具完成拖动的操作。</p>
<p>我们可以借用opencv来解决我们的问题,主要步骤:</p>
<p><img alt="微信截图_20210324174645.png" src="https://foofish.net/images/微信截图_20210324174645.png" /></p>
<p>opencv 是什么?</p>
<p>OpenCV(Open Source Computer Vision Library)是开放源代码计算机视觉库,主要算法涉及图像处理、计算机视觉和机器学习相关方法,可用于开发实时的图像处理、计算机视觉以及模式识别程序。</p>
<p>直接安装</p>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">opencv</span><span class="o">-</span><span class="n">python</span>
</pre></div>
<h3>高斯模糊处理</h3>
<p>首先将图片进行高斯模糊处理,高斯模糊的主要作用是减少图像的噪声,用于预处理阶段。</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cv2</span> <span class="kn">as</span> <span class="nn">cv</span>
<span class="n">image</span> <span class="o">=</span> <span class="n">cv</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="n">image_path</span><span class="p">)</span>
<span class="n">blurred</span> <span class="o">=</span> <span class="n">cv ...</span></pre></div>10个python初学者常犯的错误2022-07-22T15:52:42+08:002022-07-22T15:52:42+08:00刘志军tag:foofish.net,2022-07-22:10-common-python-error.html<p>下面10个python初学者常犯的错误,他们并不是真正的代码错误,代码照样可以运行,但是不够pythonic,因为python有自己的语言哲学,在代码的处理上与其他传统语言无法比拟的简洁性和便捷性。</p>flask-siwadoc 支持openapi 分组功能2022-06-10T16:05:00+08:002022-06-10T16:05:00+08:00刘志军tag:foofish.net,2022-06-10:flask-siwadoc-group.html<p>但实际应用场景中,会遇到这种情况,一份API文档中接口数非常多,同时分为不同业务场景的接口,例如面向终端用户的接口和针对管理后台的接口。</p>在Python应用中Telegram 机器人搭建消息提醒2022-06-10T16:05:00+08:002022-06-10T16:05:00+08:00刘志军tag:foofish.net,2022-06-10:telegram-bot-send-message.html<p>对开发者来说,Telgram最吸引人的地方估计是 Telgram bot,你可以建个机器人玩。不过目前对我来说,最有用的一个功能是通过机器人来做消息提醒。作为开发者,我想实时知道网站的运行情况,系统报错时能即时提醒是一个痛点问题。</p>flask-siwadoc:一个自动生成openapi接口文档的库2022-06-06T16:47:06+08:002022-06-06T16:47:06+08:00刘志军tag:foofish.net,2022-06-06:flask-siwadoc.html<p>在前后端分离变得越来越流行的今天,大家的职责也更加明确与专注,后端负责提供API接口,前端负责UI与交互。前后端基于接口文档进行沟通。</p>如何将python开源项目打包发布到pypi2022-06-05T10:25:23+08:002022-06-05T10:25:23+08:00刘志军tag:foofish.net,2022-06-05:python-packaging.html<p>这里我以我发布过的一个项目 <a href="https://github.com/lzjun567/flask-siwadoc">flask-siwadoc</a> 为例</p>
<h3>编写 setup.py</h3>
<div class="highlight"><pre><span></span><span class="c1"># -*- encoding: UTF-8 -*-</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">setuptools</span> <span class="kn">import</span> <span class="n">setup</span><span class="p">,</span> <span class="n">find_packages</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">distutils.core</span> <span class="kn">import</span> <span class="n">setup</span>
<span class="kn">import</span> <span class="nn">io</span>
<span class="n">VERSION</span> <span class="o">=</span> <span class="s1">'0.0.1'</span>
<span class="k">with</span> <span class="n">io</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"README.md"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">long_description</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">install_requires</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"requirements.txt"</span><span class="p">)</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">setup</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s2">"flask-siwadoc"</span><span class="p">,</span>
<span class="n">version</span><span class="o">=</span><span class="n">VERSION</span><span class="p">,</span>
<span class="n">author ...</span></pre></div>github push 代码 Connection refused 解决办法2022-05-25T07:52:42+08:002022-05-25T07:52:42+08:00刘志军tag:foofish.net,2022-05-25:github-push-connection-refused.html<p>前段时间gitee将所有开源的仓库改成需要审核才能重新开源这个事在国内程序员圈子内还引起来不小的动静,不过对我来说倒没什么影响,开源的项目基本都放在GitHub,gitee就挂了几个私有仓库。</p>
<p>尽管GitHub访问不方便,但依然阻挡不了大家对GitHub的热爱,毕竟这里是全球程序员的智慧结晶。</p>
<p>对于GitHub经常被墙的事,我发现有时候即时用科学上网还是会出现 Connection refused 的错误,特别是在push代码的时候会出现,这就很影响写代码的心情。</p>
<div class="highlight"><pre><span></span>>git push origin main
ssh: connect to host ssh.github.com port 443: Connection refused
fatal: Could not read from remote repository.
</pre></div>
<p>然后浏览器访问 GitHub.com 网站又是正常的,我估计是域名解析被污染了。 于是我想到的一个办法是,先查看ssh.github.com 这个域名对应的ip是哪个?</p>
<p>这个可以直接在 https://ipaddress.com ...</p>为啥用 PIP 安装库也会提示UnicodeDecodeError?2022-05-21T09:52:42+08:002022-05-21T09:52:42+08:00刘志军tag:foofish.net,2022-05-21:python-pip-unicodedecoderrror.html写给Python程序员的PHP快速入门教程2022-04-11T11:47:06+08:002022-04-11T11:47:06+08:00刘志军tag:foofish.net,2022-04-11:php-tutorial.html<p>因为某些原因需要临时接手一个PHP项目,所以决定花点时间学习下PHP,对有其它语言编程经验的人来说来,上手还是很顺的。如果你也刚好在学PHP,希望本文对你有帮助。</p>
<h3>安装Laragon</h3>
<p>如果你是Windows系统,推荐用Laragon来搭建PHP开发环境。它集成了 Nginx/Apache、MySQL、Redis、Putty 等工具, 下载地址:https://laragon.org/download/ ,直接用laragon,会省去很多麻烦。</p>
<h3>安装 PHPStorm</h3>
<p>PHPStorm是Jetebrain旗下的IDE,与Pycharm类似,但没有社区版,不过可免费试用一个月。 下载地址:https://www.jetbrains.com/zh-cn/phpstorm/ </p>
<h3>hello world</h3>
<div class="highlight"><pre><span></span><span class="x">//hello.php</span>
<span class="cp"><?php</span>
<span class="k">echo</span> <span class="s2">"hello world"</span><span class="p">;</span>
</pre></div>
<p>php 文件第一行都是以 <code><?php</code> 开头,估计是想告诉编译器,这是一个php文件 ...</p>ubuntu 默认使用 python32022-03-21T08:12:01+08:002022-03-21T08:12:01+08:00刘志军tag:foofish.net,2022-03-21:python3-ubuntu.html<p>执行以下命令就可以将python3当作默认python</p>
<p>pip 也需要重新安装</p>
<div class="highlight"><pre><span></span><span class="n">update</span><span class="o">-</span><span class="n">alternatives</span> <span class="o">--</span><span class="n">install</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">python</span> <span class="n">python</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">python3</span> <span class="mi">1</span>
<span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">python3</span><span class="o">-</span><span class="n">pip</span>
</pre></div>
<p>其它操作</p>
<div class="highlight"><pre><span></span>apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev
apt-get install python3-dev default-libmysqlclient-dev build-essential
</pre></div>flask 项目密码存储使用 bcrypt2022-03-19T15:52:42+08:002022-03-19T15:52:42+08:00刘志军tag:foofish.net,2022-03-19:flask-bcrypt.html<p>md5早在2010年,美国软件工程学会(SEI)就认为MD5算法已被破解,黑客可以使用彩虹表、暴力穷举进行hash碰撞就能轻易破解。因为md5,sha这样的算法速度过于太快,对于一个长度6位的密码在一台普通电脑上不到1分钟就能穷举出来。</p>用python-dotenv解决代码与敏感信息的分离2022-03-19T15:52:42+08:002022-03-19T15:52:42+08:00刘志军tag:foofish.net,2022-03-19:python-dotenv.html<p>写了几年的python web,却还不知道WSGI是什么东西,是不是大有人在。 说来也正常,因为作为开发者很少需要去了解wsgi是什么,也能把网站做出来。</p>Flask 中最受欢迎的扩展插件2022-03-19T15:52:42+08:002022-03-19T15:52:42+08:00刘志军tag:foofish.net,2022-03-19:python-extensions.html居家办公第一天2022-03-14T15:52:42+08:002022-03-14T15:52:42+08:00刘志军tag:foofish.net,2022-03-14:work_at_home.html<p>昨天深圳政府发布一项史无前例的政策,公交地铁从今天开始全市停运,除了涉及民生相关的企事业单位正常运转外,其他全部居家办公,对于一个2000万人口,视时间就是金钱,效率就是生命的超一线城市,做这个决策得有多大勇气。</p>从一段小代码开始学习如何重构2022-03-13T15:52:42+08:002022-03-13T15:52:42+08:00刘志军tag:foofish.net,2022-03-13:python-refactor.html<p>这篇文章告诉你如何将一个可读性很差的代码最后重构到只有一行代码的全过程,希望可以给你带来启发</p>flask 计算接口请求时长2022-03-12T09:12:01+08:002022-03-12T09:12:01+08:00刘志军tag:foofish.net,2022-03-12:flask_request_time.html<p>flask 中获取请求的总时长</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">create_app</span><span class="p">(</span><span class="n">config_name</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">app_name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">app_name</span><span class="p">:</span>
<span class="n">app_name</span> <span class="o">=</span> <span class="n">__name__</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">app_name</span><span class="p">)</span>
<span class="n">configure_app</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">config_name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">configure_hook</span><span class="p">(</span><span class="n">app</span><span class="p">):</span>
<span class="nd">@app.before_request</span>
<span class="k">def</span> <span class="nf">before_request</span><span class="p">():</span>
<span class="n">g</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="nd">@app.after_request</span>
<span class="k">def</span> <span class="nf">log_response</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
<span class="c1"># 接口请求耗时(毫秒)</span>
<span class="n">diff</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">g</span><span class="o">.</span><span class="n">start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">diff</span><span class="p">)</span>
<span class="k">return</span> <span class="n">response</span>
</pre></div>荐书:《Python工匠》2022-03-08T22:25:13+08:002022-03-08T22:25:13+08:00刘志军tag:foofish.net,2022-03-08:python-craftman.html<p>上周收到了图灵新书《<a href="https://u.jd.com/pMwAe7J">Python工匠</a>》</p>
<p>花了几天的时间读完了,即便对我这种还在写代码的”老人"来说,收获依然不少。例如 “仅限关键字参数”的几个用法就是从这本书上学到的</p>
<p><img alt="微信图片_20220308001820.png" src="../../images/微信图片_20220308001820.png" /></p>
<p>如果你是一个久经沙场的“老”程序员,你一定没少写过烂代码,也见过很多烂代码。烂代码各有各的烂</p>
<p>有的是代码结构混乱,有的是随意的变量名、函数名, 有的甚至是技术架构烂。</p>
<p>面对陈年老旧代码,只要系统还能运行,就不要去动它,因为你一旦触动了某些历史遗留代码,后果可能会很严重。</p>
<p><img alt="18bf8aa8-23d0-11eb-9451-d6a043673cc5.gif" src="../../images/18bf8aa8-23d0-11eb-9451-d6a043673cc5.gif" /></p>
<p>虽然有玩笑的成分,但也的确说明了当下很多软件项目的一个现状。</p>
<p>究其原因,可能跟中国的互联网软件还处于高速发展阶段有关,从业人员水平参差不齐</p>
<p>而大部分富有经验的老程序员逐渐离开了编码一线转做了管理</p>
<p>前段时间一个朋友把他的项目发给我,整个项目其实就一两千行代码,我发现代码全部集中在一个文件中,而且里面充斥着大量重复代码,你根本没法通过代码来理解产品的需求是什么。</p>
<p>面对这种情况,你能怎么办?肯定是完全重写一份,也远比在原来的基础上修修补补好。</p>
<p>那么在编码过程中我们究竟怎么写代码才能避免陷入到烂代码的泥潭中?有哪些编码的原则可以遵循?</p>
<p>本书作者结合了他多年的一线编程经验,给我们展示了大量实用的最佳实践编程技巧。只为解决一个问题----怎么把代码写好,怎么让代码变得可维护。</p>
<p>里面既有和具体语言无关的通用知识,比如如何取一个见名知义的变量名,如何写好一段注释,面向对象编程设计原则 ...</p>python logging 日志模块续2022-01-07T16:25:23+08:002022-01-07T16:25:23+08:00刘志军tag:foofish.net,2022-01-07:logging2.html<p>在上一篇文章<a href="https://foofish.net/logging.html">1万字详解 python logging日志模块</a> 中,深入浅出的讲解了日志的基本原理与用法。但还有一些内容并没有涉及到,所以这篇文章作为上一篇文章的补充。希望这两篇文章能帮助你完全理解日志模块的使用,在项目中的运用能够游刃有余。</p>1万字详解 python logging日志模块2021-12-23T05:25:23+08:002021-12-23T05:25:23+08:00刘志军tag:foofish.net,2021-12-23:logging.html<p>记录日志最简单的方法就是在你想要记录的地方加上一句 print , 我相信无论是新手还是老鸟都经常这么干。在简单的代码中或者小型项目中这么干一点问题都没有。但是在一些稍大一点的项目,有时候定位一个问题,需要查看历史日志定位问题,用print就不合时宜了。</p>阿里云点播服务报错InvalidStorage.NotFound The storageLocation does not exit解决方案2021-11-25T18:12:01+08:002021-11-25T18:12:01+08:00刘志军tag:foofish.net,2021-11-25:aliyun-vod-InvalidStorage.html<p>最近业务系统需要用到阿里云的视频点播服务,视频由前端上传,上传前需要业务服务器通过阿里云获取上传地址和上传凭证来保证安全性。</p>
<p><img alt="p183800.png" src="../../images/p183800.png" /></p>
<p>我们使用的RAM子账号来访问视频点播服务。 按照官方文档把代码撸出来,权限配置都确认没问题,程序始终跑不通,报一个错误 InvalidStorage.NotFound The storageLocation does not exit。</p>
<p><img alt="微信截图_20211125182052.png" src="../../images/微信截图_20211125182052.png" /></p>
<p>根据文档说明,StorageLocation参数是非必填的,即使我强行设置还是一样报错</p>
<div class="highlight"><pre><span></span><span class="n">request</span><span class="o">.</span><span class="n">set_StorageLocation</span><span class="p">(</span><span class="n">xxxxx</span><span class="p">)</span>
</pre></div>
<p>最后找到他们客服,给了我一个重要的线索,发现他们的功能是可以在线调试,还能生成代码。在线一调,找到了问题,比对他们的代码,发现少了一行重要的代码</p>
<div class="highlight"><pre><span></span><span class="n">request</span><span class="o">.</span><span class="n">set_endpoint</span><span class="p">(</span><span class="s2">"vod.cn-shenzhen.aliyuncs.com"</span><span class="p">)</span> <span class="c1"># 这个值取决于你的存在放在哪个区域。我的是华南深圳区</span>
</pre></div>
<p>就是这个endpoint参数其实是必填的,然而在文档里并没有对这个参数做任何说明,被他们坑死, 最后加上这行代码后终于跑通了。</p>
<p>完整代码:</p>
<div class="highlight"><pre><span></span><span class="sd">"""</span>
<span class="sd">阿里云点播服务</span>
<span class="sd">参考文档:</span>
<span class="sd">上传地址和凭证:https://help.aliyun.com/document_detail ...</span></pre></div>Javascript 原型与原型链2021-11-12T20:05:00+08:002021-11-12T20:05:00+08:00刘志军tag:foofish.net,2021-11-12:JavaScript-prototype.html<p>讲原型和原型链前,先介绍下构造函数这个前置知识。</p>
<h3>1、 构造函数</h3>
<p>前面讲过创建对象的几种方法,其中一种方式是通过 <code>new</code> 一个函数来创建对象。这个函数其实就是构造函数。注意,只有当该函数与<code>new</code>关键字一起使用,才能被叫做构造函数,否则也只能称之为普通函数。对于构造函数,通常我们会将函数名首字母大写。</p>
<div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">Person</span><span class="p">(){</span>
<span class="p">}</span>
<span class="kd">let</span> <span class="nx">person</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">()</span> <span class="c1">// 调用构造函数,返回实例对象</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">person</span><span class="p">)</span> <span class="c1">// //Person {}</span>
</pre></div>
<p>在javascript中,每个构造函数都有一个属性叫prototype(原型),那么 prototype 到底是什么呢?</p>
<div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">Person</span><span class="p">(){</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">Person</span><span class="p">.</span><span class="nx">prototype</span><span class="p">)</span>
</pre></div>
<h3>2、原型是什么</h3>
<p>每个实例对象有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层构成一个原型链 (prototype ...</p>javascript对象的3个属性特征2021-11-09T20:05:00+08:002021-11-09T20:05:00+08:00刘志军tag:foofish.net,2021-11-09:object-property-feature.html<p><img alt="对象属性特征.png" src="../../images/对象属性特征.png" /></p>
<h3>1、writable:可写</h3>
<p>writable表示是否可以设置属性的值</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span><span class="nx">age</span><span class="o">:</span><span class="mi">10</span><span class="p">}</span>
<span class="nx">obj</span><span class="p">.</span><span class="nx">age</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1">// 给属性重新赋值</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">obj</span><span class="p">.</span><span class="nx">age</span><span class="p">)</span> <span class="c1">//1</span>
</pre></div>
<h3>2、enumerable:可枚举</h3>
<p>enumerable特性指是否可以在<code>for/in</code>循环中返回属性名字,默认自有属性和继承属性都可以枚举</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span><span class="nx">name</span><span class="o">:</span><span class="s2">"zhang"</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span><span class="mi">20</span><span class="p">,</span> <span class="nx">sex</span><span class="o">:</span><span class="s2">"男"</span><span class="p">}</span>
<span class="kd">let</span> <span class="nx">newObj</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span>
<span class="nx">newObj</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">200</span>
<span class="k">for</span><span class="p">(</span><span class="nx">p</span> <span class="k">in</span> <span class="nx">newObj</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">p</span><span class="p">,</span><span class="s2">"->"</span><span class="p">,</span> <span class="nx">newObj</span><span class="p">[</span><span class="nx">p ...</span></pre></div>Javascript 解构赋值2021-10-30T20:05:00+08:002021-10-30T20:05:00+08:00刘志军tag:foofish.net,2021-10-30:JavaScript-destructuring-assignment.html<p>解构赋值是ES6中的特性,可以将对象或数组中的值同时赋值给多个变量。</p>
<h3>1、数组解构</h3>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="p">[</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">)</span> <span class="c1">// 1 2 3</span>
</pre></div>
<p>除了数组,任何可迭代的对象都支持被解构, 例如字符串</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="p">[</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"he"</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">first</span><span class="p">,</span> <span class="nx">second</span><span class="p">)</span> <span class="c1">// h e</span>
</pre></div>
<h3>2、对象解构</h3>
<p>赋值右侧是对象,左侧是包含在花括号内逗号隔开的变量名</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="p">{</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="nx">a</span><span class="o">:</span><span class="mi">1</span><span class="p">,</span> <span class="nx">b</span><span class="o">:</span><span class="mi">2</span><span class="p">,</span> <span class="nx">c</span><span class="o">:</span><span class="mi">3</span><span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="nx">b ...</span></pre></div>isNaN 与 Number.isNaN 的区别2021-10-29T00:05:00+08:002021-10-29T00:05:00+08:00刘志军tag:foofish.net,2021-10-29:JavaScript-isNaN-vs-Number.isNaN.html<h3>1、NaN 是什么</h3>
<p><code>NaN</code> 是一个数值类型,与普通数值如1,2,3 都属于同一类型,但它是一个特殊的数值叫“非数值”,Not a Number。</p>
<div class="highlight"><pre><span></span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="kc">NaN</span><span class="p">))</span> <span class="c1">// 'number'</span>
</pre></div>
<p>什么情况下会得到这个值呢? 有以下几种情况</p>
<p>1、 0/0 会得到 NaN<br />
2、 Infinity/Infinity<br />
3、 无法转换为数值的操作数,例如:parseInt('a') </p>
<p><code>NaN</code> 与任何值相比较都不相等, 包括NaN与NaN比较两者也不相等。</p>
<div class="highlight"><pre><span></span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="kc">NaN</span><span class="o">===</span><span class="kc">NaN</span><span class="p">)</span> <span class="c1">//false</span>
</pre></div>
<p>那如何判断某个变量的值是否为为NaN呢? 答案是使用全局函数 <code>isNaN</code> 或者 <code>Number.isNaN</code> 方法</p>
<h3>2 ...</h3>javascript 面试题:["1", "2", "3", "4"].map(parseInt) 结果是多少2021-10-23T17:05:00+08:002021-10-23T17:05:00+08:00刘志军tag:foofish.net,2021-10-23:JavaScript-interview-array-map-parseint.html<p>直接看题,下面输出结果是多少</p>
<div class="highlight"><pre><span></span><span class="kr">const</span> <span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"1"</span><span class="p">,</span> <span class="s2">"2"</span><span class="p">,</span> <span class="s2">"3"</span><span class="p">,</span> <span class="s2">"4"</span><span class="p">]</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nb">parseInt</span><span class="p">))</span>
</pre></div>
<p><code>parseInt</code>函数可以将字符串数字转换成整数类型,咋一看你以为结果是:</p>
<div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</pre></div>
<p>然而,实际结果却超乎你想象</p>
<div class="highlight"><pre><span></span><span class="p">[</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">NaN</span><span class="p">,</span> <span class="kc">NaN</span><span class="p">,</span> <span class="kc">NaN</span> <span class="p">]</span>
</pre></div>
<p>为什么会出现这种情况? 还是从官方文档去找问题的根源</p>
<h3>map 定义</h3>
<blockquote>
<p>map方法创建一个新数组,其结果是该数组中的每个元素调用一次提供的函数后的返回值。</p>
</blockquote>
<div class="highlight"><pre><span></span><span class="kd">var</span> <span class="nx">new_array</span> <span class="o">=</span> <span class="nx">arr</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">currentValue</span><span class="p">[,</span> <span class="nx">index</span><span class="p">[,</span> <span class="nx">array</span><span class="p">]])</span> <span class="p">{</span>
<span class="c1">// Return element for new_array </span>
<span class="p">})</span>
</pre></div>
<p>map 接收的 <code>callback</code>函数默认接收3个参数。 </p>
<ol>
<li><code>currentValue ...</code></li></ol>如何解决阿里云访问Github.com慢的问题2021-10-22T10:35:00+08:002021-10-22T10:35:00+08:00刘志军tag:foofish.net,2021-10-22:aliyun_access_github_slowlyu.html<p>最近在折腾remark42开源评论系统,帐号登录授权是基于GitHub,用户通过OAuth方式授权获取GitHub的信息时,我的服务器需要访问github的服务,由于我的服务器是国内的阿里云服务器。所以经常会出现访问github.com 超时的问题,最后就导致用户无法完成GitHub授权登录。</p>
<p>网上找到一个方法,通过修改服务器hosts文件来解决</p>
<p>首先在 https://www.ipaddress.com 找到 github.com和github.global.ssl.fastly.net对应的IP地址</p>
<p><img alt="微信截图_20211022225902.png" src="../../images/微信截图_20211022225902.png" /></p>
<div class="highlight"><pre><span></span>vim /etc/hosts
添加如下内容
140.82.114.4 github.com
199.232.5.194 github.global.ssl.fastly.net
</pre></div>
<p>最后重新 ping github.com 得到了响应。</p>
<p><img alt="微信截图_20211022225629.png" src="../../images/微信截图_20211022225629.png" /></p>
<p>其它网站如果遇到类似访问超时都可以用该方法来解决</p>javascript 字符串长度2021-10-19T08:35:00+08:002021-10-19T08:35:00+08:00刘志军tag:foofish.net,2021-10-19:JavaScript-string-unicode.html<p>Javascript中,字符串使用Unicode字符集的UTF-16编码, 通常用2个字节16位来表示一个字符。不过也有某些特字符是2个字节都没法装下的,这时候可能会用更多的字节来表示。字符串的长度 <code>length</code>属性是按照16位一个值来表示一个长度单位。所以对于超过两个字节的单字符,它的length就会大于1。</p>
<p>例如下面表情符号的长度length就是2</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">s2</span> <span class="o">=</span> <span class="s2">"😔"</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">s2</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="c1">// 2</span>
</pre></div>
<p>使用普通 for 循环遍历的时,按照16位值进行迭代。所以你会看到它输出了两个乱码字符</p>
<div class="highlight"><pre><span></span>for(let i=0;i<s2.length;i++){
console.log(s2[i])
}
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span><span class="err">�</span>
<span class="err">�</span>
</pre></div>
<p>而使用 <code>for ... of</code> 语法进行遍历时, 是按字符进行迭代</p>
<div class="highlight"><pre><span></span><span class="k">for</span><span class="p">(</span><span class="kr">const</span> <span class="nx">c</span> <span class="k">of</span> <span class="nx">s2</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span><span class="err">😔</span>
</pre></div>Javascript中Math对象介绍2021-10-17T20:05:00+08:002021-10-17T20:05:00+08:00刘志军tag:foofish.net,2021-10-17:JavaScript-math.html<p>Math对象是Javascript的全局对象,提供了很多数学操作的方法</p>
<h4>max:获取最大值</h4>
<p>返回一组数据中的最大值</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">max</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">max</span><span class="p">)</span> <span class="c1">//4</span>
</pre></div>
<h4>min:获取最小值</h4>
<p>返回一组数据中的最小值</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">min</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">min</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">min</span><span class="p">)</span> <span class="c1">//1</span>
</pre></div>
<p>如果查找数组中的最大值与最小值,可以使用扩展操作符<code>...</code> 将数组解构成多个参数值</p>
<div class="highlight"><pre><span></span><span class="nb">Math</span><span class="p">.</span><span class="nx">max</span><span class="p">(...[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span> <span class="c1">//4</span>
</pre></div>
<h4>ceil:向上取整</h4>
<div class="highlight"><pre><span></span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">ceil</span><span class="p">(</span><span class="mf">2.3 ...</span></pre></div>javascript 中 Number 介绍2021-10-17T08:35:00+08:002021-10-17T08:35:00+08:00刘志军tag:foofish.net,2021-10-17:JavaScript-number.html<p>javascript 中,数值类型属于原始类型。 除了我们所知道的以十进制表示的普通数值外,还可以用 <code>0x</code> 表示 十六进制整数, <code>0b</code>表示二进制整数, <code>0O</code>表示八进制整数</p>
<div class="highlight"><pre><span></span><span class="mh">0xa</span> <span class="c1">//对应十进制 10</span>
<span class="mb">0b101</span> <span class="c1">//对应十进制 5</span>
<span class="mo">0o22</span> <span class="c1">//对应十进制 18</span>
</pre></div>
<p>在javascript,0可以当作除数,返回值是无穷大。这点和其它语言有很大的区别。例如python中0是不可以作为除数的。</p>
<div class="highlight"><pre><span></span><span class="mi">1</span><span class="o">/</span><span class="mi">0</span> <span class="c1">// Infinity</span>
</pre></div>
<p><code>Infinity</code> 表示无穷大数值</p>
<p>但是 0/0 得到的结果是 <code>NaN</code>, <code>NaN</code> 也是一个数值类型,它是一个特数的数值,表示它不是一个“数值”的数值。</p>
<p>将一个非数字字符串转换为数值类型时,返回的也是<code>NaN</code>, 例如 <code>praseInt('a')</code></p>
<p>可以用<code>Number ...</code></p>javascript 箭头函数介绍2021-10-15T08:35:00+08:002021-10-15T08:35:00+08:00刘志军tag:foofish.net,2021-10-15:JavaScript-arrow-function.html<p>箭头函数是ES6中出现的一种定义函数的简写方法, 用<code>=></code>分隔参数列表和函数体。</p>
<p>例子:</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">square</span> <span class="o">=</span> <span class="nx">x</span><span class="o">=></span><span class="nx">x</span><span class="o">**</span><span class="mi">2</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">square</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span>9
</pre></div>
<p>这个函数的定义等价于传统函数</p>
<div class="highlight"><pre><span></span><span class="kd">function</span> <span class="nx">square</span><span class="p">(</span><span class="nx">x</span><span class="p">){</span>
<span class="k">return</span> <span class="nx">x</span><span class="o">**</span><span class="mi">2</span>
<span class="p">}</span>
</pre></div>
<p>箭头函数通常用于把一个未命名函数作为参数传给另一个函数。</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">].</span><span class="nx">map</span><span class="p">(</span><span class="nx">x</span><span class="o">=></span><span class="nx">x</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">)</span>
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span><span class="p">[</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">8</span> <span class="p">]</span>
</pre></div>
<p>箭头函数让代码看起来更简洁了。</p>
<p>如果使用传统的function关键字来定义函数,看起来就显得有点啰嗦</p>
<div class="highlight"><pre><span></span><span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">].</span><span class="nx">map ...</span></pre></div>javascript条件式访问属性2021-10-15T07:35:00+08:002021-10-15T07:35:00+08:00刘志军tag:foofish.net,2021-10-15:JavaScript-condition-property.html<p><code>?.</code> 是ES2020引入的新特性,是一个条件式属性访问操作符,当你访问值为<code>undefined</code>变量的某个属性值时,如果使用<code>.</code>操作符会直接报错,如果使用条件式属性访问操作符来访问会返回<code>undefined</code>。</p>
<p>看例子:</p>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">book</span> <span class="o">=</span> <span class="p">{</span><span class="nx">price</span><span class="o">:</span><span class="mi">10</span><span class="p">,</span>
<span class="nx">edition</span><span class="o">:</span><span class="mi">10</span><span class="p">,</span>
<span class="nx">name</span><span class="o">:</span><span class="s2">"javascirpt"</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">book</span><span class="p">.</span><span class="nx">page</span><span class="p">.</span><span class="nx">num</span><span class="p">)</span>
</pre></div>
<p>直接报错</p>
<div class="highlight"><pre><span></span><span class="n">TypeError</span><span class="o">:</span> <span class="n">Cannot</span> <span class="n">read</span> <span class="n">property</span> <span class="s1">'num'</span> <span class="n">of</span> <span class="kc">undefined</span>
</pre></div>
<p>因为book.page 的值 undefined, <code>undefined</code>是没有任何属性值的,所以会报错。</p>
<p>如果你无法确定某个值是undefined还是对象,除了可以用 if 语句来判断之外,还可以直接用条件式访问操作符来访问某个属性, 就算被访问的对象是undefined,也不会报错。而是返回 <code>undefined</code></p>
<div class="highlight"><pre><span></span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">book ...</span></pre></div>WebSocket 是什么2021-10-14T14:08:33+08:002021-10-14T14:08:33+08:00刘志军tag:foofish.net,2021-10-14:what-is_websocket.html<p>传统的HTTP连接是这样的</p>
<h3>HTTP1.0</h3>
<p>每发一个请求都要先建立一个TCP连接,客户端收到响应后连接断开,发起第二次请求时重新建立新的TCP连接。这就好比你和女朋友打电话,拨通电话后,你说一句,女朋友回复完后双方就自动挂机了。你要讲第二句,不好意思,你得重新拨号,如此往复,最后你可能疯掉了。</p>
<p>但早期HTTP1.0就是这样,打开一个网页如果有100个请求,那就要建立100次连接,这种方式对资源是一种严重的浪费。</p>
<p><img alt="network_1.png" src="../../images/network_1.png" /></p>
<h3>HTTP1.1</h3>
<p>到了HTTP1.1 有了一定改善,出了一个叫长连接的模型(Keepalive),也叫持久连接。发送请求前,先建立TCP连接,不过,连接后,你可以多次发送请求和接受响应了,效率大幅提升。</p>
<p>但是,HTTP 请求是按顺序发出的,第二次请求必须在第一个响应达到后才能发起。就好比,你和女朋友打电话时,拨通后,你说一句,等她回复后才能接着说第二句,如果她还没回你,那对不起,你只能等。 这样处理也是有好处的,我明确知道你回复我的是哪句话。</p>
<p><img alt="network_2.jpg" src="../../images/network_2.jpg" /></p>
<p>HTTP1.1已经比HTTP1 ...</p>JavaScript 对象创建的3种方法2021-10-11T13:05:00+08:002021-10-11T13:05:00+08:00刘志军tag:foofish.net,2021-10-11:JavaScript-object-create.html<p>在 JavaScript中,对象是一组属性和方法组成的无序集合</p>
<ul>
<li>属性是对象的某些特性,例如"刘德华"这个人的身高、体重、性别,这些都属于他的属性</li>
<li>方法是对象的行为,比如”刘德华”唱歌是一种行为,“刘德华”睡觉也是一种行为</li>
</ul>
<h4>对象创建</h4>
<p>对象的创建可以通过对象字面量、new Object、构造函数这3种方法来创建。</p>
<blockquote>
<p>1、对象字面量</p>
</blockquote>
<div class="highlight"><pre><span></span><span class="kd">let</span> <span class="nx">liudehua</span> <span class="o">=</span> <span class="p">{</span>
<span class="c1">// 属性</span>
<span class="nx">name</span><span class="o">:</span><span class="s1">'刘德华'</span><span class="p">,</span>
<span class="nx">age</span><span class="o">:</span> <span class="mi">60</span><span class="p">,</span>
<span class="nx">gender</span><span class="o">:</span><span class="s1">'男'</span><span class="p">,</span>
<span class="c1">// 方法</span>
<span class="nx">sayHello</span><span class="o">:</span> <span class="kd">function</span><span class="p">(){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"Hi..."</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<ul>
<li>属性和方法使用键值对方式表示, <code>属性名:属性值</code>, <code>方法名:匿名函数</code></li>
<li>属性与属性(方法)之间用逗号分隔</li>
<li>获取属性值使用 <code>对象名.属性名</code> 或者 ...</li></ul>李诞:Be fucking professional2021-10-03T21:20:25+08:002021-10-03T21:20:25+08:00刘志军tag:foofish.net,2021-10-03:Be-fucking-professional.html<p>这两天看了李诞的新书《李诞脱口秀工作手册》,一本薄薄的手册。虽然讲的是脱口秀行业,其实里面的内容适合绝大部分创意工作者,包括程序员、自媒体从业者。</p>
<p>『人间不值得』是他的至理名言。</p>
<p>他以一种"积极废人"的状态存在,嘴上说很丧很懒什么都不想要,行动却很积极,非常清楚自己想要的,并付诸现实。</p>
<p>看完这本书,我信了。</p>
<p>1、Be fucking professional</p>
<p>这句话一直贴在他的办公室,以此来要求自己。如果直译成中文可能没那么雅。保持专业,时时刻刻都做到专业,这样跟你接触的人才不会轻看你,才愿意信任你,才能获得更多机会。小白经常过来问我问题时,就特别显得不专业。比如 "学python要多长时间"</p>
<p>2、不能实践,就等于没有学。最好的学习,就在实践中学。</p>
<p>学编程就是这个道理,编程是个手艺活,不去实践就等于没学,写作也一样。</p>
<p>3、完成比完美更重要</p>
<p>写不好还写不坏吗,我很早建议过身边一些朋友来写公众号,写公众号不仅可以让别人觉得你是专业的,而且还能获得一份不错的收入,不过绝大多数人都没坚持下来 ...</p>公众号数据采集解决方案2021-09-29T18:57:59+08:002021-09-29T18:57:59+08:00刘志军tag:foofish.net,2021-09-29:cimidata-crawler.html<p>微信公众号数据采集解决方案</p>保姆级教程,3行代码制作国旗头像2021-09-28T18:57:59+08:002021-09-28T18:57:59+08:00刘志军tag:foofish.net,2021-09-28:avatar-flag.html<p>如何用python制作国旗头像</p>简单介绍 os.path 模块常用方法2021-09-22T16:05:00+08:002021-09-22T16:05:00+08:00刘志军tag:foofish.net,2021-09-22:python-os-path.html<p><code>os.path</code> 也算是一个比较常用的模块,特别是和文件系统打交道时,涉及到文件、目录的操作经常会用到,你去看一些框架的源代码的时候也经常会使用到这些方法</p>JavaScript for/of, for/in 介绍2021-09-22T13:05:00+08:002021-09-22T13:05:00+08:00刘志军tag:foofish.net,2021-09-22:JavaScript-for-of-for-in.html<p>在 JavaScript中,for 循环有几种常见的写法</p>
<h3>第一种:常规写法</h3>
<div class="highlight"><pre><span></span><span class="nx">nums</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o"><</span><span class="nx">nums</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">nums</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
<span class="p">}</span>
</pre></div>
<h3>第二种: for/of</h3>
<p>for/of是ES6开始有的语法, 可以直接迭代出数组中的每个元素,无需通过下标索引位置来获取元素,其实只要是可迭代对象,都可以使用 for/of 。</p>
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">item</span> <span class="k">of</span> <span class="nx">nums</span><span class="p">){</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<h3>第三种: for/in</h3>
<p>for/in写法 不像for/of 必须是可迭代对象 ...</p>Javascript 中,相等操作符两等号“==”与三个等号 “===” 有什么区别?2021-09-21T20:05:00+08:002021-09-21T20:05:00+08:00刘志军tag:foofish.net,2021-09-21:JavaScript-equals.html<p>Javascript 中,相等操作符两等号“==”与三等号 “===” 有什么区别? 先看个例子:</p>
<div class="highlight"><pre><span></span><span class="mi">1</span><span class="o">==</span><span class="s2">"1"</span>
<span class="kc">true</span>
<span class="mi">1</span><span class="o">===</span><span class="s2">"1"</span>
<span class="kc">false</span>
</pre></div>
<h3>1、== 基于类型转换的相等</h3>
<p><code>==</code> 是一种基于类型转换的相等,如果两个操作数的类型不同,它会尝试先做类型转换再比较</p>
<p>1、null 与 undefined 相等 </p>
<div class="highlight"><pre><span></span><span class="kc">null</span> <span class="o">==</span> <span class="kc">undefined</span> <span class="c1">//true</span>
</pre></div>
<p>2、如果一个值是数值,另一个值是字符串,则先把字符串转换为数值再比较</p>
<div class="highlight"><pre><span></span><span class="mi">1</span><span class="o">==</span><span class="s2">"1"</span> <span class="c1">// true</span>
</pre></div>
<p>3、 如果一个值为true,则转换为1, 如果为false, 则转换为0再比较</p>
<div class="highlight"><pre><span></span><span class="kc">true</span> <span class="o">==</span> <span class="mi">1</span> <span class="c1">//true</span>
<span class="kc">true</span> <span class="o">==</span> <span class="s1">'1'</span> <span class="c1">// true true 转换为1 , "1" 转换为 1</span>
<span class="kc">false</span> <span class="o">==</span> <span class="s1">'0 ...</span></pre></div>10个你必须知道的Python内置函数2021-09-13T15:52:42+08:002021-09-13T15:52:42+08:00刘志军tag:foofish.net,2021-09-13:10-functions-methods-you-should-know.html运营工具大全2021-07-30T14:08:33+08:002021-07-30T14:08:33+08:00刘志军tag:foofish.net,2021-07-30:operation-tools.html<p>推荐一波每天都在用的实用网站</p>被V友教训了2021-07-30T14:08:33+08:002021-07-30T14:08:33+08:00刘志军tag:foofish.net,2021-07-30:被V友教训了.html微信为什么不做公众号分组功能2021-07-27T09:12:01+08:002021-07-27T09:12:01+08:00刘志军tag:foofish.net,2021-07-27:why-wechat-no-group.html<p>众所周知,我们关注微信公众号是没有分组概念的,现在没有,以后大概率也不会有。不是微信做不出来,也不是微信不想做,而是微信觉得没这个必要。</p>
<p>作为产品经理,不做什么往往比做什么更重要,而且更难。</p>
<p>你说公众号分组功能有存在的必要吗? 回答这个问题,不同的人肯定有不同的答案。</p>
<p>于我这种关注超过1000个号的人来说,我倒是非常希望有一种更高效的方式来组织公众号,但是又有多少人能关注1000个人号呢?除了做自媒体的需要大量获取素材外,对于普通老百姓来说,你真的需要关注那么多号吗?</p>
<p>其实没必要</p>
<p>网上有个研究报告数据,用户每天在微信上阅读文章的平均数量是5.68篇,其中80%来自朋友圈分享,20%来自公众号。而公众号的打开率更是低得可怕,普遍不足5%。</p>
<p>如果引入分组,无论是系统设计还是用户操作,都将带来更多的复杂性,相信微信不做分组还有更多的数据来做支撑。</p>
<p>但是</p>
<p>在次幂数据这个产品中,我把分组功能引入进来了。做这个功能前,其实我也思考过,为什么微信不做,难到我要做吗?</p>
<p>答案是,要做。因为两个产品目标人群不一样,微信是一个基础设施,必须考虑通用性,不能因为一小撮人有这个需求就去满足。而我做的这个次幂数据,其实面向的是公众号运营、投放人员的一个很细分领域的产品,这群人每天要筛选大量的文章素材 ...</p>推广次幂数据可获得返现佣金了2021-07-26T11:47:06+08:002021-07-26T11:47:06+08:00刘志军tag:foofish.net,2021-07-26:cimi-yongjin.html<p>推广次幂数据现在有佣金啦,如果你有流量, 比如有新媒体导航网站、博客、或者身边有公众号主或者广告主资源,推荐次幂数据最高可获取30%的佣金返现,只需两步即可开始赚佣金。</p>Windows10任务栏点击无效怎么解决2021-07-19T13:47:06+08:002021-07-19T13:47:06+08:00刘志军tag:foofish.net,2021-07-19:window10-status-bar-died.html<p>我的windows10电脑,每隔几天状态栏就会假死,无法点击,甚至鼠标右键也没法使用,找到一种方法亲测可用。</p>这个月骑了200公里2021-07-01T10:12:01+08:002021-07-01T10:12:01+08:00刘志军tag:foofish.net,2021-07-01:bicycle.html<p>今天是上半年的最后一天,一年已经过了1/2,看看你的flag还差多少</p>
<p>希望每天尝试记录一些东西下来。</p>
<p>太久没有正儿八经的写过文字了,早期写技术文完全是 all in 的状态。</p>
<p>我本身并不是一个技术型程序员,我给自己的定位更偏向于产品型程序员。技术型程序员对技术如痴如醉,从底层细节到架构能如数家珍。</p>
<p>如果你还是学生或者刚入职场不久,不管你以后是走技术路线还是管理路线,只要你现在是做技术,建议你前5年一定要 all in 到技术里去,后面才有你的第二增长曲线。</p>
<p>虽然我也热爱技术,但我认为我的技术天赋很有限,无法达到大神级别的那种。 我这里说的“大神”不是粉丝眼中所说的大神,虽然总有很多小白称呼我为大神。但我自己几斤几两还是有自知之明。技术不咋地,但还是靠勤能补拙取得了一些小成就。</p>
<p>最近在研究SEO相关的技术,昨天想到给网站去和别人做友链交换。加了第一个人就吃了闭门羹。原因就是我是拿着自己刚使用不久的新域名去做交换,后来想想如果这也行就见鬼了。</p>
<p>于是放弃这条路</p>
<p>记住,和别人做交换一定是价值对等的,别想着去白嫖人家。</p>
<p>所以转变思路,先去做内容。把内容更新频率提上来,告诉搜索引擎,网站每天有更新,你每天来我这收录,剩下就交给时间</p>
<p>对于SEO,我现在也只是懂点皮毛 ...</p>清华pip镜像地址2021-06-30T16:12:01+08:002021-06-30T16:12:01+08:00刘志军tag:foofish.net,2021-06-30:tsinghua-pypi.html<p>豆瓣的pypi地址最近很不稳定,很多都库都无法下载,推荐大家用清华大学的镜像站。 pypi镜像是每5分钟同步一次。</p>
<p>如果是安装包的时候临时使用,可以使用<code>-i</code>参数</p>
<div class="highlight"><pre><span></span>pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl flask
</pre></div>
<p>也可以通过下面的命令行修改使其成为默认的镜像源</p>
<div class="highlight"><pre><span></span>pip config <span class="nb">set</span> global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
</pre></div>理解border-box2021-06-12T09:12:01+08:002021-06-12T09:12:01+08:00刘志军tag:foofish.net,2021-06-12:border-box.html<p><code>box-sizing</code> 可以控制盒模型的行为,默认值是<code>content-box</code>, 另一个属性值是 <code>border-box</code>。在理解 border-box 的作用前,先来看一个例子。</p>
<div class="highlight"><pre><span></span> <span class="nt">div</span> <span class="p">{</span>
<span class="nb">width</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span>
<span class="nb">height</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span>
<span class="nb">background-color</span><span class="o">:</span> <span class="nb">lightgreen</span><span class="p">;</span>
<span class="nb">border</span><span class="o">:</span> <span class="m">10px</span> <span class="nb">solid</span> <span class="nb">lightcoral</span><span class="p">;</span>
<span class="nb">padding</span><span class="o">:</span> <span class="m">50px</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>我给div指定了100px的宽度,同时设置了border和padding,最后你会发现盒子的宽度最后变成了220px。</p>
<p>原因是div的<code>box-sizing</code>默认属性值是 <code>content-box</code>, 它的特点是,你设置的<code>width</code>仅仅是实际内容区域的宽度,而元素的实际宽度是 width+padding+border 。</p>
<p>如果要让实际宽度为100px,同时保留padding和border值,就必须调整<code>width</code>属性的值。</p>
<p>当然,还有另一种办法就是使用box-sizing的另一个属性:<code>border-box</code>该属性的行为表现为:当你设置width:200px, 这个元素的实际宽度就是200px ...</p>设计个logo多少钱?2021-06-12T09:12:01+08:002021-06-12T09:12:01+08:00刘志军tag:foofish.net,2021-06-12:design-logo.html<p>突然意识到次幂数据这个网站上线两年竟然连个像样的logo都没有,昨天我给网站换了个新logo。</p>
<p>说起logo,重要性不言而喻,如果初期还只是个MVP产品,logo随便搞个都行,但后面总得有个正经的logo,这样才显专业嘛</p>
<p>毕竟大部分人都是第一次访问你的网站。新用户判断一个网站靠不靠谱,对他们来说往往就那么几秒钟思考时间。</p>
<p>之前如果遇到是自己不擅长的事情,就从身边熟人开始找</p>
<p>人有个找很熟的人帮忙问题有个问题,碍于面子可能面临两种情况,一是不好谈价格,低了人家不愿做。毕竟不同的设计师价格自然不一样,你看人家小米一个logo200万,花20块也能设计出来,二是不愿收钱,这样我心里过不去。</p>
<p>还是先去帅张的星球问了一圈,结果帖子没过多久貌似被删除了,作罢。</p>
<p>然后就去找logo设计网站,这类网站一般都是付费的,你只要输入名字就能秒出logo</p>
<p>我随便挑了一个logo,找人工修改的话,还得另外加200,对接起来麻烦,最后放弃了。</p>
<p><img alt="微信截图_20210606184749.png" src="../../images/微信截图_20210606184749.png" /></p>
<p>然后又去万能的淘宝逛了一圈</p>
<p><img alt="微信图片_20210606185102.jpg" src="../../images/微信图片_20210606185102.jpg" /></p>
<p>价格从30到3000都有</p>
<p>找了一个销量靠前,价格60的商家。</p>
<p>问客服logo大概要两天时间设计好。</p>
<p>我在想,一个60的logo要设计两天?不应该是两个小时的事吗</p>
<p>我还是等了一天,第二天再去问,还没设计好,不知道他们背后的运作原理是怎样的。生意真有这么好的话,可以都请几个设计师嘛。</p>
<p>这边在等,那边继续找新的方案。 </p>
<p>在微信搜了一圈设计相关的公众号 ...</p>Linux du 命令查看磁盘空间使用情况2021-06-01T23:12:01+08:002021-06-01T23:12:01+08:00刘志军tag:foofish.net,2021-06-01:du.html<p><code>du</code>的全称为disk usage,意为磁盘空间使用情况,du素有磁盘管理三剑客之一的称号,它的功能是统计目录和文件所占磁盘空间大小</p>
<p>下面分享几个关于du命令常用的例子</p>
<p>1、统计 log 目录下所有子目录的大小</p>
<div class="highlight"><pre><span></span>du log -h
</pre></div>
<div class="highlight"><pre><span></span>4.0K log/ppp
1.8G log/journal/7d26c16f128042a684ea474c9e2c240f
1.8G log/journal
4.0K log/anaconda
4.0K log/ntpstats
30M log/audit
1.5M log/redis
235M log/nginx
41M log/letsencrypt
8.0K ...</pre></div>理解CSS行高line-height2021-06-01T16:12:01+08:002021-06-01T16:12:01+08:00刘志军tag:foofish.net,2021-06-01:line-height.html<p><img alt="微信截图_20210523171829.png" src="../../images/微信截图_20210523171829.png" /></p>
<p>先看上面这张图</p>
<p>我记得刚学英语的时候,英语作业本都是这种每行有4条线的格式,不过那时候老师并没有讲过这4条线代表什么。现在学CSS时候知道他们叫做顶线,中线,基线,底线。</p>
<p>另外这张图里有行高,行距,半行距,字号(font-size)等概念。你最熟悉的莫过于font-size了,就是字的大小。</p>
<p><strong>基线(base line)</strong>一般是英文字母“x”的下端沿</p>
<p><img alt="微信截图_20210523173412.png" src="../../images/微信截图_20210523173412.png" /></p>
<p><strong>行高(line-height)</strong> 属性用于设置文本行之间的间距,行高越大,行与行之间的垂直间距就越大。不仅如此,行高也可以用来实现文本垂直居中的效果</p>
<p>我们知道对于非替换的内联元素,例如span标签是没法直接设置高度和宽度以及上下外边距这些属性的,怎样让他们也有高度呢? 答案是给他设置行高。</p>
<p>来看个例子</p>
<div class="highlight"><pre><span></span>.main{
background-color: #ccc;
max-width: 1200px;
margin: 100px auto;
}
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"main"</span><span class="p">></span>
<span class="p"><</span><span class="nt">span</span><span class="p">></span>Python之禅<span class="p"></</span><span class="nt">span</span><span class="p">></span>
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
</pre></div>
<p>父元素 ...</p>MySQL8.0关闭bin-log2021-06-01T09:12:01+08:002021-06-01T09:12:01+08:00刘志军tag:foofish.net,2021-06-01:close-bin-log.html<p>今天查日志,发现MySQL目录占用的空间巨大,细查发现几十个1G多大的binlog文件。</p>
<p><img alt="微信截图_20210601223104.png" src="../../images/微信截图_20210601223104.png" /></p>
<p>binlog 日志记录了数据库中的数据变动情况,包括增删查改。如果你开启了主从服务,或者开启了log-bin日志服务,就会有该日志的产生。</p>
<p>如果数据库没有使用主从服务的话,binlog没必要开启</p>
<div class="highlight"><pre><span></span>mysql> show variables like <span class="s1">'log_bin'</span><span class="p">;</span>
+---------------+-------+
<span class="p">|</span> Variable_name <span class="p">|</span> Value <span class="p">|</span>
+---------------+-------+
<span class="p">|</span> log_bin <span class="p">|</span> ON <span class="p">|</span>
+---------------+-------+
<span class="m">1</span> row in <span class="nb">set</span> <span class="o">(</span>0.00 sec<span class="o">)</span>
————————————————
</pre></div>
<p>但是在 MySQL8.0 中,binlog开关默认已开启,所以你在 <code>my.conf</code> 文件中是找不到该配置项的。禁用 bin-log 功能在 my.conf 中添加</p>
<div class="highlight"><pre><span></span>disable-log-bin
<span class="c1"># 5.x 版本使用下面配置</span>
log-bin<span class="o">=</span>Off
</pre></div>理解 focus-within 伪类2021-05-26T16:03:00+08:002021-05-26T16:03:00+08:00刘志军tag:foofish.net,2021-05-26:focus-within.html<p><code>focus-within</code>是css中的一个伪类,与 <code>focus</code> 类似,说到focus-within,你一定会想它与focus有什么区别?</p>
<p>focus 表示一个元素获得焦点, 你可以对该元素进行操作。而 focus-within 是表示一个元素或者它的子元素获取焦点时,你可以对该元素进行的操作。</p>
<p>例如,当输入框元素获取焦点时,父元素form可以使用focus-within伪类设置边框属性。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">style</span><span class="p">></span>
<span class="nt">form</span><span class="p">{</span>
<span class="nb">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
<span class="nb">margin</span><span class="o">:</span> <span class="m">20px</span> <span class="nb">auto</span><span class="p">;</span>
<span class="nb">background-color</span><span class="o">:</span> <span class="m">#ccc</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">form</span><span class="nd">:focus-within</span><span class="p">{</span>
<span class="nb">border</span><span class="o">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="nb">blue</span><span class="p">;</span>
<span class="p">}</span>
<span class="p"></</span><span class="nt">style</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">form</span><span class="p">></span>
<span class="p"><</span><span class="nt">label</span><span class="p">></span>name<span class="p"></</span><span class="nt">label</span><span class="p">></span>
<span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"text"</span> <span class="na">name</span><span class="o">=</span><span class="s">"name"</span><span class="p">></span>
<span class="p"><</span><span class="nt">br</span><span class="p">></span>
<span class="p"><</span><span class="nt">label</span><span class="p">></span>age<span class="p"></</span><span class="nt">label ...</span></pre></div>CSS元素遮挡问题与z-index属性2021-05-20T16:12:01+08:002021-05-20T16:12:01+08:00刘志军tag:foofish.net,2021-05-20:z-index.html<p>在使用定位布局时,可能会出现盒子重叠的问题,所谓元素层叠,就是多个元素都在同一个位置相互重叠了。原本你希望A元素出现在外层,结果却被B元素遮挡了。怎么解决这个问题?</p>
<p>解决这个问题前,先要搞清楚浏览器渲染元素的规则</p>
<ol>
<li>默认情况元素按书写的先后顺序渲染</li>
<li>先渲染非定位元素,再渲染定位元素</li>
<li>z-index 值越大越后渲染</li>
</ol>
<p>默认情况下,渲染元素时,浏览器按照元素的先后顺序进行渲染。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"box"</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"d1"</span><span class="p">></span>1<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"d2"</span><span class="p">></span>2<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"d3"</span><span class="p">></span>3<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
</pre></div>
<p>上面3个div按照先后顺序渲染,div1最先渲染,出现在最后面。</p>
<p><img alt="微信截图_20210520153150.png" src="../../images/微信截图_20210520153150.png" /></p>
<div class="highlight"><pre><span></span><span class="nc">.box</span> <span class="p">{</span>
<span class="nb">width</span><span class="o">:</span> <span class="m">300px</span><span class="p">;</span>
<span class="nb">margin</span><span class="o">:</span> <span class="m">0</span> <span class="nb">auto</span><span class="p">;</span>
<span class="nb">display</span><span class="o">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.box</span> <span class="nt">div</span> <span class="p">{</span>
<span class="nb">height ...</span></pre></div>CSS 媒体查询2021-05-20T09:12:01+08:002021-05-20T09:12:01+08:00刘志军tag:foofish.net,2021-05-20:css_media_query.html<p>媒体查询可根据不同设备设置不同的样式,以此达到真正的响应式布局。</p>
<p>例如下面的媒体查询告诉浏览器,默认情况使用14px字体,如果是最大宽度为480px的移动设备,就使用16px字体。</p>
<div class="highlight"><pre><span></span><span class="nc">.text</span> <span class="p">{</span>
<span class="nb">font-size</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">@media</span> <span class="o">(</span><span class="nt">max-width</span><span class="o">:</span> <span class="nt">480px</span><span class="o">)</span> <span class="p">{</span>
<span class="nc">.text</span> <span class="p">{</span>
<span class="nb">font-size</span><span class="o">:</span> <span class="m">16px</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<h3>语法</h3>
<div class="highlight"><pre><span></span><span class="k">@media</span> <span class="o">[</span><span class="err">媒体类型</span><span class="o">]</span> <span class="nt">and</span> <span class="o">(</span><span class="nt">condition</span><span class="o">:</span> <span class="nt">breakpoint</span><span class="o">)</span> <span class="p">{</span>
<span class="o">//</span> <span class="nt">CSS</span> <span class="nt">rules</span>
<span class="p">}</span>
</pre></div>
<p>媒体类型可以省略,有以下常用值</p>
<ul>
<li>all——用于所有媒体类型</li>
<li>print——用于打印机</li>
<li>screen——用于计算机屏幕,平板电脑和智能手机</li>
<li>voice——用于大声“阅读”页面的屏幕阅读器</li>
</ul>
<p>当只想选择屏幕时,将在 @ media 规则之后设置 screen 关键字。我还必须使用 “and” 关键字将规则连接起来:</p>
<div class="highlight"><pre><span></span><span class="k">@media</span> <span class="nt">screen</span> <span class="nt">and</span> <span class="o">(</span><span class="nt">max-width</span><span class="o">:</span> <span class="nt">480px ...</span></pre></div>python和javascript中的round函数区别2021-05-13T09:12:01+08:002021-05-13T09:12:01+08:00刘志军tag:foofish.net,2021-05-13:python_javascirpt_round.html<p>python 和 javascript 中都有 <code>round</code> 函数,作用都是四舍五入取整, python的round其实不仅仅取整,还支持保持任意为小数点,而javascript中的round似乎更加纯粹,就是取整用的。</p>
<p>先看python的例子</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">round</span><span class="p">(</span><span class="mf">3.478</span><span class="p">)</span>
<span class="mi">3</span>
<span class="o">>>></span> <span class="nb">round</span><span class="p">(</span><span class="mf">3.478</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="mf">3.5</span>
<span class="o">>>></span> <span class="nb">round</span><span class="p">(</span><span class="mf">3.478</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
<span class="mf">3.48</span>
</pre></div>
<p>python的 round 函数可以接收一个可选参数,表示保留n位小数,如果n大于1,返回的其实就不是整数,而是浮点数了。</p>
<p>再看 javascript的 round 例子</p>
<div class="highlight"><pre><span></span><span class="nx">num</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">round</span><span class="p">(</span><span class="mf">3.478</span><span class="p">,</span><span class="mi">4</span><span class="p">)</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">num</span><span class="p">)</span> <span class="c1">//3</span>
</pre></div>
<p>那如果要实现python中的四舍五入 ...</p>用 pyppeteer 制作 PDF文件2021-03-08T15:52:42+08:002021-03-08T15:52:42+08:00刘志军tag:foofish.net,2021-03-08:python-pyppeteer-pdf.html<p>之前介绍过一些将html转换为PDF文件的库,比如 wkhtmltopdf、WeasyPrint,今天再介绍另一个神器Pyppeteer可将html页面转换为PDF。</p>Microsoft Visual C++ Build Tools 安装2021-03-05T09:12:01+08:002021-03-05T09:12:01+08:00刘志军tag:foofish.net,2021-03-05:cpp_build_tools.html<p>项目中用到wechatpy这个库,用pip安装完成后,启动报错 Exception: You must install either cryptography or pycryptodome! ,看错误应该是依赖的加密库 pycryptodome 没有安装。</p>
<p>于是单独安装pycryptodome,毫无意外的安装失败,不支持Windows,需要 C++编译环境 distutils.errors.DistutilsPlatformError: Microsoft Visual C++ 14.0 is required.</p>
<p><img alt="微信截图_20210305154011.png" src="https://foofish.net/images/微信截图_20210305154011.png" /></p>
<p>然后又跑到 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 这个站点看有没有直接可以用的whl包,这个站点暂时也没有提供该库的whl包。</p>
<p>最后只能老老实实根据文档要求安装C++ Build Tools来编译该库。</p>
<p>直接从百度网盘下载安装C++构建工具</p>
<p>https://pan.baidu.com ...</p>python csv 导出数字字符串时格式错误,避免转换为科学计数2021-02-21T09:12:01+08:002021-02-21T09:12:01+08:00刘志军tag:foofish.net,2021-02-21:python-csv-digital-str.html<p>默认情况下导出的字符串全是数字时,在excel中打开时会被自动转换成科学计数格式</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">csv</span>
<span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"会诊单号"</span><span class="p">]</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"导出.csv"</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf8"</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
<span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">field_order</span><span class="p">)</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">({</span><span class="s2">"会诊单号"</span><span class="p">:</span> <span class="s2">"20210217162737860175"</span><span class="p">})</span>
</pre></div>
<p><img alt="微信截图_20210221095931.png" src="https://foofish.net/images/微信截图_20210221095931.png" /></p>
<p>只需要在字符串后面加转义字符'\t'即可变成字符串</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">csv</span>
<span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"会诊单号"</span><span class="p">]</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"导出.csv"</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf8"</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
<span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">field_order</span><span class="p">)</span>
<span class="n">writer ...</span></pre></div>安卓投屏神器:scrcpy2021-02-01T13:47:06+08:002021-02-01T13:47:06+08:00刘志军tag:foofish.net,2021-02-01:scrcpy.html<p>手机投屏之前我用的是 vysor,因为付费版必须通过 google play 进行支付,麻烦的一批所以我一直用它的基础免费版。而且它需要在手机和电脑端同时都装有软件才能投屏到电脑桌面,但坑爹的是隔段时间就要升级,就会导致升级过程中会自动断开投屏,不得不人工干预才能恢复。</p>新媒体管家不能用了? 最新方法亲测可用2020-12-27T15:52:42+08:002020-12-27T15:52:42+08:00刘志军tag:foofish.net,2020-12-27:xinmeitiguanjia.html<p>新媒体管家这个自媒体工具因为某些原因导致最新版本无法继续使用,一时也找不到合适的替代方案幸运的是,新媒体管家的低版本还能继续使用。</p>PDF转换库 WeasyPrint 使用指南2020-12-25T15:52:42+08:002020-12-25T15:52:42+08:00刘志军tag:foofish.net,2020-12-25:python-weasyprint.html<p>最近发现一个新的库 WeasyPrint , 经过一番测试效果非常不错,无论是从官方网站的介绍还是提供的文档,看得出作者应该是花了不少心思来做这件事。</p>Base64编码详解2020-12-21T00:52:42+08:002020-12-21T00:52:42+08:00刘志军tag:foofish.net,2020-12-21:base64.html<h3>base64 是什么?</h3>
<p>Base64,顾名思义,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号"+"、"/"一共64个字符的字符集,(另加一个“=”,实际是65个字符,至于为什么还会有一个“=",这个后面再说)。任何符号都可以转换成这个字符集中的字符,这个转换过程就叫做base64编码。</p>
<h3>base64怎么转换</h3>
<p>首先将字符串(图片等)转换成二进制序列,然后按每6个二进制位为一组,分成若干组,如果不足6位,则低位补0。每6位组成一个新的字节,高位补00,构成一个新的二进制序列,最后根据base64索引表中的值找到对应的字符。</p>
<p><img alt="timg.jpg" src="https://foofish.net/images/timg.jpg" /></p>
<p>我们举个例子, 假设有字符串“abc", 我们要对其进行base64编码,最后结果会是什么呢?</p>
<p><img alt="微信截图_20201220153059.png" src="https://foofish.net/images/微信截图_20201220153059.png" /></p>
<p>字符串abc对应3个字节,一共24位,按6位为一组可分为4组,在每组的高位补上00,经过转换,abc 的 base64 编码是 YWJj, 由原来的3个字母变成了4个,所以base64会比原字符串更长。</p>
<p>那问题来了,假设原始字符串不够3个字节,只有一个字节或者两个字节怎么办?</p>
<p>以两个字节为例, 按照上面的转换逻辑,经过编码转换 ...</p>JavaScript高级程序设计读书笔记三:基本引用类型2020-12-08T20:05:00+08:002020-12-08T20:05:00+08:00刘志军tag:foofish.net,2020-12-08:JavaScript-note-p3.htmlJavaScript高级程序设计读书笔记二:变量与作用域2020-12-08T08:05:00+08:002020-12-08T08:05:00+08:00刘志军tag:foofish.net,2020-12-08:JavaScript-note-p2.htmlJavaScript 高级程序设计笔记:基础语法2020-12-07T23:05:00+08:002020-12-07T23:05:00+08:00刘志军tag:foofish.net,2020-12-07:JavaScript-note-p1.html<p>这本书一共有900多页,可以直接从第3章46页开始看,这章主要介绍JS的语法基础知识</p>WSGI 是什么,看完一定懂2020-10-30T15:52:42+08:002020-10-30T15:52:42+08:00刘志军tag:foofish.net,2020-10-30:python-wsgi.html<p>写了几年的python web,却还不知道WSGI是什么东西,是不是大有人在。 说来也正常,因为作为开发者很少需要去了解wsgi是什么,也能把网站做出来。</p>python内置模块urllib介绍2020-09-06T09:12:01+08:002020-09-06T09:12:01+08:00刘志军tag:foofish.net,2020-09-06:python-urllib.html<p>urllib 是 python 的内置模块, 主要用于处理url相关的一些操作,例如访问url、解析url等操作。</p>
<p><img alt="python3-urllib.png" src="https://foofish.net/images/python3-urllib.png" /></p>
<p>urllib 包下面的 <code>request</code> 模块主要用于访问url,但是用得太多,因为它的光芒全都被 requests 这个第三方库覆盖了,最常用的还是 <code>parse</code> 模块。 写爬虫过程中,经常要对url进行参数的拼接、编码、解码,域名、资源路径提取等操作,这时 <code>parse</code> 模块就可以排上用场。</p>
<h3>一、urlparse</h3>
<p><code>urlparse</code> 方法是把一个完整的URL拆分成不同的组成部分,你可以根据自己的需求提取其中的某部分内容。 返回结果 ParseResult 是 namedtuple 的子类,由以下10部分组成,每部分既可以通过名字获取也可以通过下表索引得到。</p>
<p><img alt="微信截图_20200908184624.png" src="https://foofish.net/images/微信截图_20200908184624.png" /></p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">urllib</span> <span class="kn">import</span> <span class="n">parse</span>
<span class="o">>>></span> <span class="n">url</span> <span class="o">=</span> <span class="s1">'https://mp.weixin.qq.com/s ...</span></pre></div>公众号如何靠互推涨粉2020-08-28T09:12:01+08:002020-08-28T09:12:01+08:00刘志军tag:foofish.net,2020-08-28:hutuizhangfen.html<p>公众号互推是低成本涨粉最快的方式之一。</p>安利下这个库,PyAUtoGUI,自动化控制鼠标键盘2020-08-16T09:12:01+08:002020-08-16T09:12:01+08:00刘志军tag:foofish.net,2020-08-16:python-pyautogui.html<p>PyAutoGUI 不知道你有没有用过,它是一款用Python自动化控制键盘、鼠标的库。但凡是你不想手动重复操作的工作都可以用这个库来解决。</p>
<p>比如,我想半夜时候定时给发个微信,或者每天自动刷页面等操作,它能完全模拟手动操作,而你可以安心的刷剧了。</p>
<p>嗯,懒惰是程序员的美德。</p>
<h3>安装pyautogui</h3>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">pyautogui</span>
</pre></div>
<h3>键盘鼠标控制</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">pyautogui</span>
<span class="o">>>></span> <span class="n">screenWidth</span><span class="p">,</span> <span class="n">screenHeight</span> <span class="o">=</span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">size</span><span class="p">()</span> <span class="c1"># 返回屏幕分辨率</span>
<span class="o">>>></span> <span class="n">currentMouseX</span><span class="p">,</span> <span class="n">currentMouseY</span> <span class="o">=</span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">position</span><span class="p">()</span> <span class="c1"># 返回鼠标的所在位置</span>
<span class="o">>>></span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">moveTo</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">150</span><span class="p">)</span> <span class="c1">#移动鼠标到指定位置</span>
<span class="o">>>></span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">click</span><span class="p">()</span> <span class="c1"># 单击</span>
<span class="o">>>></span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">click</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">220</span><span class="p">)</span> <span class="c1"># 单击指定位置</span>
<span class="o">>>></span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="c1"># 移动鼠标10个像素</span>
<span class="o">>>></span> <span class="n">pyautogui</span><span class="o">.</span><span class="n">doubleClick</span><span class="p">()</span> <span class="c1"># 双击鼠标 ...</span></pre></div>python中文件复制2020-06-14T11:12:01+08:002020-06-14T11:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-copy-file.html<p>python 复制文件的方法有如下几种方式</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">shutil</span> <span class="kn">import</span> <span class="n">copyfile</span>
<span class="o">>>></span> <span class="n">copyfile</span><span class="p">(</span><span class="s2">"1.txt"</span><span class="p">,</span> <span class="s2">"2.txt"</span><span class="p">)</span>
</pre></div>
<p>将 "1.txt" 文件中的内容复制到 "2.txt"文件中。 如果 2.txt 已经存在,那么内容将被覆盖。</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">shutil</span> <span class="kn">import</span> <span class="n">copy</span>
<span class="o">>>></span> <span class="n">copy</span><span class="p">(</span><span class="s2">"1.txt"</span><span class="p">,</span> <span class="s2">"2.txt"</span><span class="p">)</span>
</pre></div>
<p>copy 与 copyfile 区别是 copyfile 只能复制文件, copy 可以复制文件夹。</p>python删除文件2020-06-14T10:12:01+08:002020-06-14T10:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-delete-file.html<p>删除文件</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">"1.txt"</span><span class="p">)</span>
</pre></div>
<p>如果文件不存在会报错,所有最好是先判断问价是否存在</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="s2">"1.txt"</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">"1.txt"</span><span class="p">)</span>
</pre></div>
<p>或者使用pathlib模块中的方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="o">>>></span> <span class="n">f</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s2">"2.txt"</span><span class="p">)</span>
<span class="o">>>></span> <span class="k">if</span> <span class="n">f</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="o">...</span> <span class="n">f</span><span class="o">.</span><span class="n">unlink</span><span class="p">()</span>
</pre></div>python判断字典是否存在key2020-06-14T10:12:01+08:002020-06-14T10:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-key-in-dict.html<p>python 判断字典中是否存在某个key的方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span><span class="mi">2</span><span class="p">}</span>
<span class="o">>>></span> <span class="s2">"c"</span> <span class="ow">in</span> <span class="n">d</span>
<span class="bp">False</span>
<span class="o">>>></span> <span class="s2">"d"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">d</span>
<span class="bp">True</span>
</pre></div>python合并两个列表2020-06-14T10:12:01+08:002020-06-14T10:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-merge-two-list.html<p>python 合并两个列表的两种方式</p>
<p>使用”+“操作符</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">list1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">list2</span> <span class="o">=</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">list1</span><span class="o">+</span><span class="n">list2</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
</pre></div>
<p>原来的两个列表对象不会改变</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">list1</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">list2</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">list2</span>
<span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">list1</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
</pre></div>
<p>extend 会修改原来的列表</p>python中如何将字符串转换为整数2020-06-14T10:12:01+08:002020-06-14T10:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-str-to-int.html<p>字符串转换为整数</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">int</span><span class="p">(</span><span class="s2">"123"</span><span class="p">)</span> <span class="c1"># 转换为整数</span>
<span class="mi">123</span>
<span class="o">>>></span> <span class="nb">float</span><span class="p">(</span><span class="s2">"123.2"</span><span class="p">)</span> <span class="c1"># 转换为浮点数</span>
<span class="mf">123.2</span>
</pre></div>python 获取当前时间2020-06-14T09:12:01+08:002020-06-14T09:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-get-current-time.html<p>python中获取当前时间的几种方式</p>
<p>当前时间</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">datetime</span>
<span class="o">>>></span> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">now</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2020</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">57</span><span class="p">,</span> <span class="mi">780083</span><span class="p">)</span>
<span class="c1"># 转换为字符串格式</span>
<span class="o">>>></span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
<span class="s1">'2020-06-14 10:14:57'</span>
<span class="o">>>></span>
</pre></div>
<p>获取UTC时间</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2020</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">38</span><span class="p">,</span> <span class="mi">484115</span><span class="p">)</span>
</pre></div>
<p>获取某个时区的时间</p>
<p>需要先安装 pytz 库</p>
<div class="highlight"><pre><span></span>pip install ...</pre></div>python 遍历字典2020-06-14T08:12:01+08:002020-06-14T08:12:01+08:00刘志军tag:foofish.net,2020-06-14:python-iterator.html<p>python中遍历字典有如下两种方式</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">:</span><span class="mi">3</span><span class="p">}</span>
<span class="o">>>></span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
<span class="o">...</span> <span class="k">print</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
<span class="o">...</span>
<span class="n">a</span> <span class="mi">1</span>
<span class="n">b</span> <span class="mi">2</span>
<span class="n">c</span> <span class="mi">3</span>
<span class="o">>>></span>
<span class="o">>>></span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">d</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="o">...</span> <span class="k">print</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="o">...</span>
<span class="n">a</span> <span class="mi">1</span>
<span class="n">b</span> <span class="mi">2</span>
<span class="n">c</span> <span class="mi">3</span>
</pre></div>统计字符串中出现字符的次数2020-06-13T15:12:01+08:002020-06-13T15:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-count-number.html<p>统计字符串中出现某个字符串的次数</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="s2">"abc33aef"</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">"a"</span><span class="p">)</span>
<span class="mi">2</span>
<span class="o">>>></span>
</pre></div>
<p>统计所有字符分别出现的次数</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">Counter</span>
<span class="o">>>></span> <span class="n">Counter</span><span class="p">(</span><span class="s2">"abc33aef"</span><span class="p">)</span>
<span class="n">Counter</span><span class="p">({</span><span class="s1">'a'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'3'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'e'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'f'</span><span class="p">:</span> <span class="mi">1</span><span class="p">})</span>
</pre></div>
<p>Counter 是字典的子类,可以像字典一样使用</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">c</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="s2">"abc33aef"</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">c</span><span class="p">[</span><span class="s1">'a'</span><span class="p">]</span>
<span class="mi">2</span>
<span class="o">>>></span> <span class="n">c</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]</span>
<span class="mi">1</span>
</pre></div>检查对象中是否存在某个属性2020-06-13T14:12:01+08:002020-06-13T14:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-check-attribute.html<p>检查某个对象是否有某个属性可以使用 hasattr 方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="p">[]</span>
<span class="o">>>></span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="s2">"__len__"</span><span class="p">)</span>
<span class="bp">True</span>
</pre></div>
<p>检查本地环境是否有某个变量</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="s2">"name"</span> <span class="ow">in</span> <span class="nb">locals</span><span class="p">()</span>
<span class="bp">False</span>
</pre></div>
<p>检查全局环境是否有某个变量</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="s2">"name"</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">()</span>
<span class="bp">False</span>
</pre></div>python 中 删除列表元素2020-06-13T14:12:01+08:002020-06-13T14:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-delete-list-element.html<p>python 删除列表元素使用remove方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"a"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">s</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s2">"a"</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">s</span>
<span class="p">[</span><span class="s1">'b'</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">]</span>
<span class="o">>>></span>
</pre></div>
<p>remove 方法只会删除列表中第一次出现的元素,如果要删除所有的a元素,则可以使用:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">,</span> <span class="s2">"a"</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">]</span>
<span class="o">>>></span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">((</span><span class="s1">'a'</span><span class="p">)</span><span class="o">.</span><span class="n">__ne__</span><span class="p">,</span> <span class="n">s</span><span class="p">))</span>
<span class="p">[</span><span class="s1">'b'</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">]</span>
<span class="o">>>></span>
</pre></div>python 中 xml 转换为 json2020-06-13T14:12:01+08:002020-06-13T14:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-xml-convert-json.html<p>python 中 xml 转换为 json 数据需要依赖第三方库, 你可以下载一个叫 xmltodict 的库</p>
<div class="highlight"><pre><span></span><span class="err">$</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">xmltodict</span>
</pre></div>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmltodict</span><span class="o">,</span> <span class="nn">json</span>
<span class="n">xml</span> <span class="o">=</span> <span class="s1">'''</span>
<span class="s1"><e> </span>
<span class="s1"> <a>text</a> </span>
<span class="s1"> <a>text</a></span>
<span class="s1"></e></span>
<span class="s1">'''</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">xmltodict</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">xml</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="o">>>></span><span class="n">OrderedDict</span><span class="p">([(</span><span class="s1">'e'</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">([(</span><span class="s1">'a'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'text'</span><span class="p">,</span> <span class="s1">'text'</span><span class="p">])]))])</span>
<span class="k">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="o">>>></span><span class="p">{</span><span class="s2">"e"</span><span class="p">:</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"text"</span><span class="p">,</span> <span class="s2">"text"</span><span class="p">]}}</span>
</pre></div>如何获取一个字符的ascii值2020-06-13T13:12:01+08:002020-06-13T13:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-get-ascii-value.html<p>字符对应的ascii 码值是一个数字</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">ord</span><span class="p">(</span><span class="s2">"a"</span><span class="p">)</span>
<span class="mi">97</span>
</pre></div>
<p>反过来ascii值对应的字母通过 chr 获取</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">chr</span><span class="p">(</span><span class="mi">97</span><span class="p">)</span>
<span class="s1">'a'</span>
</pre></div>如何反转一个列表2020-06-13T13:12:01+08:002020-06-13T13:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-reversed-list.html<p>反转一个列表可以使用 <code>reversed</code> 方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
<span class="o">>>></span> <span class="nb">reversed</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="o"><</span><span class="n">list_reverseiterator</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x00333770</span><span class="o">></span>
<span class="o">>>></span> <span class="nb">list</span><span class="p">(</span><span class="nb">reversed</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
<span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</pre></div>
<p>reversed 方法返回是一个迭代器对象,然后你还要转换为list对象</p>
<p>第二种反转方法</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">data</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
</pre></div>如何查找某个目录下所有txt文件2020-06-13T12:12:01+08:002020-06-13T12:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-find-txt-file.html<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">glob</span><span class="o">,</span> <span class="nn">os</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="s2">"/Users/lzjun/workspace"</span><span class="p">)</span> <span class="c1"># 切换到指定目录</span>
<span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">"*.txt"</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span>
</pre></div>
<p>这种方式无法找出子目录下的txt文件,要找出所有子目录下的txt文件,需要使用 os.walk 方法</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="s2">"/Users/lzjun/workspace"</span><span class="p">):</span>
<span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">file</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">".txt"</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="nb">file</span><span class="p">))</span>
</pre></div>如何判断一个对象是否为可迭代对象(isiterable)2020-06-13T09:12:01+08:002020-06-13T09:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-check-isiterable.html<p>判断是一个对象是否为可迭代对象,我们只要判断该对象下面是否有 <code>__getitem__</code> 或者 <code>__iter__</code> 方法即可。 </p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">is_iterable</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">except</span> <span class="ne">TypeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">False</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">is_iterable</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span> <span class="c1"># False</span>
<span class="k">print</span><span class="p">(</span><span class="n">is_iterable</span><span class="p">([]))</span> <span class="c1"># True</span>
</pre></div>python中如何将json数据写入文件2020-06-13T09:12:01+08:002020-06-13T09:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-json-write.html<p>一个json数据如何写入文件中保存</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">json</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Larry'</span><span class="p">,</span>
<span class="s1">'website'</span><span class="p">:</span> <span class="s1">'google.com'</span><span class="p">,</span>
<span class="s1">'from'</span><span class="p">:</span> <span class="s1">'Michigan'</span>
<span class="p">}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data.json"</span><span class="p">,</span> <span class="s2">"w"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
</pre></div>
<p>从文件中读取json数据</p>
<div class="highlight"><pre><span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"data.json"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</pre></div>python如何去掉字符串前后空格2020-06-13T09:12:01+08:002020-06-13T09:12:01+08:00刘志军tag:foofish.net,2020-06-13:python-strip-string.html<p>去掉字符串空格可以使用strip等方法</p>
<p>去掉字符串首尾空格</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="s2">" xiao fang "</span>
<span class="o">>>></span> <span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="s1">'xiao fang'</span>
</pre></div>
<p>去掉左侧空格</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span>
<span class="s1">'xiao fang '</span>
</pre></div>
<p>去掉右侧空格</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
<span class="s1">' xiao fang'</span>
<span class="o">>>></span>
</pre></div>
<p>去掉所有空格</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">re</span>
<span class="o">>>></span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">"[\s+]"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
<span class="s1">'xiaofang'</span>
</pre></div>微信公众号历史文章倒序查看2020-06-12T00:52:42+08:002020-06-12T00:52:42+08:00刘志军tag:foofish.net,2020-06-12:weixin-article-history.html<p>众所周知,在微信上查看公众号历史文章很不方便,因为它只能从最近的文章开始查看,想要看公众号的第一篇文章你要翻很多页才能看到。如果退出了当前页面,你不得不重新操作。</p>
<p>所以在微信倒序查看公众号历史文章体验很不友好。现在这个问题可以在“二十次幂”这个工具中得到解决。</p>
<p>具体使用操作:</p>
<h3>第1步:打开网站注册账号</h3>
<p><a href="https://www.ershicimi.com/signup">https://www.ershicimi.com/</a></p>
<p>因为搜索时需要登录,所以我们先完成注册。</p>
<p><img alt="微信截图_20200612105504.png" src="https://foofish.net/images/微信截图_20200612105504.png" /></p>
<p>验证码的获取可直接通过扫描关注下面二维码就可以获取</p>
<p><img alt="微信截图_20200612111642.png" src="https://foofish.net/images/微信截图_20200612111642.png" /></p>
<h3>第2步:搜索指定公众号</h3>
<p>注册完成登录成功后,就可以通过搜索找到指定的公众号</p>
<p><img alt="微信截图_20200612111852.png" src="https://foofish.net/images/微信截图_20200612111852.png" /></p>
<p>点击头像或公众号名字,跳转到公众号主页,如果没有找到该公众号,可以微信联系 yueryounali,快速帮你完成收录。</p>
<h3>第3步:选择公众号倒序查看</h3>
<p>点击右侧的排序按钮,可正序或倒序公众号的全部历史文章
<img alt="微信截图_20200612124140.png" src="https://foofish.net/images/微信截图_20200612124140.png" /></p>
<p>这样你就能看到最早发的文章了。同时你还可以通过搜索关键字进行过滤。</p>
<p>如果使用正序查看发现第一篇文章不是最早的文章怎么办? 那是因为系统没有完整地采集数据,添加微信 yueryounali ,找他帮你处理。</p>
<p>网站地址:<a href="https://www.ershicimi.com/">https://www.ershicimi.com/</a></p>python去除列表中重复元素2020-06-07T23:12:01+08:002020-06-07T23:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-remove-dumplicate-element.html<p>python 去除列表中重复元素有2种方式</p>
<h3>第一种方法是先将列表转换为集合set对象,因为集合中的元素是不重复的。</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">t</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span>
<span class="o">>>></span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">t</span><span class="p">))</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span>
</pre></div>
<p>这种方式无法保证列表的顺序,因为set是无序的。</p>
<h3>第二种方法是使用字典的有序性以及字典的key的不重复性</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">fromkeys</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d</span>
<span class="p">{</span><span class="mi">1</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="mi">5</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="mi">3</span><span class="p">:</span> <span class="bp">None</span><span class="p">,</span> <span class="mi">4</span><span class="p">:</span> <span class="bp">None</span><span class="p">}</span>
<span class="o">>>></span> <span class="nb">list</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</pre></div>python遍历目录下所有文件2020-06-07T11:12:01+08:002020-06-07T11:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-iterator-dir.html<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="n">files</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">Users"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
<span class="o">>>></span>
<span class="p">[</span><span class="s1">'All Users'</span><span class="p">,</span> <span class="s1">'Default'</span><span class="p">,</span> <span class="s1">'Default User'</span><span class="p">,</span> <span class="s1">'desktop.ini'</span><span class="p">,</span> <span class="s1">'lzjun'</span><span class="p">,</span> <span class="s1">'Public'</span><span class="p">,</span> <span class="s1">'__SUNLOGIN_USER__'</span><span class="p">]</span>
</pre></div>
<p>listdir 会返回该目录下所有子目录和文件,如果只想找文件,可以用 <code>os.path</code> 模块<code>isfile</code> 进行过滤</p>
<div class="highlight"><pre><span></span><span class="n">files</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">files</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">"C:</span><span class="se">\\</span><span class="s2">Users"</span><span class="p">,</span> <span class="n">f</span><span class="p">))]</span>
<span class="k">print</span><span class="p">(</span><span class="n">files</span><span class="p">)</span>
<span class="o">>>></span>
<span class="p">[</span><span class="s1">'desktop.ini'</span><span class="p">]</span>
</pre></div>
<p>第二种方式是使用 <code>os ...</code></p>python for 循环获取index索引2020-06-07T10:12:01+08:002020-06-07T10:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-for-index.html<p>python for 循环中获取 index 索引的方式有2种</p>
<h3>1、自定义索引</h3>
<div class="highlight"><pre><span></span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="s2">"thezenofpython"</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
<span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="o">>>></span>
<span class="mi">0</span> <span class="n">t</span>
<span class="mi">1</span> <span class="n">h</span>
<span class="mi">2</span> <span class="n">e</span>
<span class="mi">3</span> <span class="n">z</span>
<span class="mi">4</span> <span class="n">e</span>
<span class="mi">5</span> <span class="n">n</span>
<span class="o">...</span>
</pre></div>
<h3>2、 使用 enumerate 函数</h3>
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="s2">"thezenofpython"</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
<span class="o">>>></span>
<span class="mi">0</span> <span class="n">t</span>
<span class="mi">1</span> <span class="n">h</span>
<span class="mi">2</span> <span class="n">e</span>
<span class="mi">3 ...</span></pre></div>python 判断字符串是否包含某个子字符串2020-06-07T10:12:01+08:002020-06-07T10:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-string-in.html<p>判断字符串是否包含某个子字符串,我们可以使用 <code>in</code> 或者 <code>not in</code> 操作符判断子字符串是否包含在字符串里面。</p>
<div class="highlight"><pre><span></span><span class="k">if</span> <span class="s2">"abc"</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="s2">"abc"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
<span class="k">pass</span>
</pre></div>Python中append和extend的区别2020-06-07T09:12:01+08:002020-06-07T09:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-append-vs-extend.html<h3>append</h3>
<p>append 是在列表末尾追加一个新的元素,这个元素可以是任何类型的对象。</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"jack"</span><span class="p">,</span> <span class="s2">"ma"</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"pony"</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">names</span>
<span class="p">[</span><span class="s1">'jack'</span><span class="p">,</span> <span class="s1">'ma'</span><span class="p">,</span> <span class="s1">'pony'</span><span class="p">]</span>
</pre></div>
<h3>extend</h3>
<p>extend 是扩展列表,将另一个列表加到当前这个列表后面。注意 extend 接受的参数必须是列表或其它可迭代对象。</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"jack"</span><span class="p">,</span> <span class="s2">"ma"</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">names</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">"pony"</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">names</span>
<span class="p">[</span><span class="s1">'jack'</span><span class="p">,</span> <span class="s1">'ma'</span><span class="p">,</span> <span class="s1">'pony'</span><span class="p">]</span>
</pre></div>
<p>注意上面的“pony”是作为列表参数使用的,如果把"pony"作为字符串传递的话,extend 方法会把 <code>pony</code> 先转换为列表</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"jack"</span><span class="p">,</span> <span class="s2">"ma"</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">names</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="s2">"pony"</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">names</span>
<span class="p">[</span><span class="s1">'jack'</span><span class="p">,</span> <span class="s1">'ma ...</span></pre></div>求求你,别再手工造假数据了,fake了解一下2020-06-07T09:12:01+08:002020-06-07T09:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-fake-data.html<p>项目开发初期,为了测试方便,我们总要造不少假数据到系统中,尽量模拟真实环境。</p>
<p>比如要创建一批用户,创建一段文本,或者是电话号码,抑或着是街道地址或者IP地址等等。</p>
<p>以前要么就是键盘一顿乱敲,随便造个什么字符串出来,当然最后谁也不认识谁。</p>
<p>现在你不要这样做了。</p>
<p>用faker就能满足你的一切需求。</p>
<p>先安装faker</p>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">Faker</span>
</pre></div>
<p>创建faker对象</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">faker</span> <span class="kn">import</span> <span class="n">Faker</span>
<span class="n">fake</span> <span class="o">=</span> <span class="n">Faker</span><span class="p">()</span>
</pre></div>
<p>fake 一个名字</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">fake</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
<span class="s1">'Joshua Reed'</span>
</pre></div>
<p>fake 一个地址</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">fake</span><span class="o">.</span><span class="n">address</span><span class="p">()</span>
<span class="s1">'554 Hoffman Locks Suite 216</span><span class="se">\n</span><span class="s1">Elizabethstad, RI 23081'</span>
</pre></div>
<p>fake 一个浏览器UA</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">fake</span><span class="o">.</span><span class="n">chrome</span><span class="p">()</span>
<span class="s1">'Mozilla/5.0 ...</span></pre></div>python判断文件是否存在2020-06-07T09:12:01+08:002020-06-07T09:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-file-exist.html<p>判断文件或目录是否存在</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">"/path/to/file"</span><span class="p">)</span><span class="err">:</span>
<span class="c1"># 存在</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># 不存在</span>
<span class="k">pass</span>
</pre></div>
<p>判断目录是否存在</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="s2">"/path"</span><span class="p">):</span>
<span class="c1"># 存在</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># 不存在</span>
<span class="k">pass</span>
</pre></div>
<p>判断文件是否存在</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="s2">"/path"</span><span class="p">):</span>
<span class="c1"># 存在</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># 不存在</span>
<span class="k">pass</span>
</pre></div>
<p>如果使用 python3, 还可以使用 <code>pathlib</code> 模块</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path ...</span></pre></div>python合并两个字典2020-06-07T09:12:01+08:002020-06-07T09:12:01+08:00刘志军tag:foofish.net,2020-06-07:python-merge-dicts.html<p>python 中合并两个字典有3种方式</p>
<h3>1、使用update方法</h3>
<p>先用copy方法拷贝一个新对象,然后使用update方法合并另外一个字典</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">x</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span><span class="mi">2</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">y</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"c"</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="s2">"d"</span><span class="p">:</span><span class="mi">4</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">z2</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="o">>>></span> <span class="n">z2</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">z2</span>
<span class="p">{</span><span class="s1">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'d'</span><span class="p">:</span> <span class="mi">4</span><span class="p">}</span>
</pre></div>
<h3>2、使用**</h3>
<p>python3.5以上版本,可使用 **</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">x</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span><span class="mi">2</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">y</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"c"</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="s2">"d"</span><span class="p">:</span><span class="mi">4</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">z</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">x</span><span class="p">,</span> <span class="o">**</span><span class="n">y</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">z ...</span></pre></div>Python如何复制列表2020-06-04T09:12:01+08:002020-06-04T09:12:01+08:00刘志军tag:foofish.net,2020-06-04:python-copy-list.html<p>python中复制一个列表有多种方法</p>
<h3>第1种:使用切片</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">list1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">list2</span> <span class="o">=</span> <span class="n">list1</span><span class="p">[::]</span>
<span class="o">>>></span> <span class="n">list2</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
<h3>第2种:使用list构造函数</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">list3</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">list1</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">list3</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
<h3>第3种:使用copy方法</h3>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">copy</span>
<span class="o">>>></span> <span class="n">list4</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">list1</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">list4</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
<h3>第4种:使用deepcopy方法</h3>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">copy</span>
<span class="o">>>></span> <span class="n">list5</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">list1</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">list5</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>如何对python字典进行排序2020-06-04T09:12:01+08:002020-06-04T09:12:01+08:00刘志军tag:foofish.net,2020-06-04:python-dict-sort.html<p>字典早期是没有顺序的,后来得到了改进,默认按照键值对添加的先后顺序排序。</p>
<p>如果我们要按照字典的值来排序的话,我们可以先将它转换成有序的列表,然后再换转成字典</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"c"</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s2">"d"</span><span class="p">:</span> <span class="mi">6</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">data</span>
<span class="p">{</span><span class="s1">'a'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">'d'</span><span class="p">:</span> <span class="mi">6</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">d2</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d2</span>
<span class="p">[(</span><span class="s1">'d'</span><span class="p">,</span> <span class="mi">6</span><span class="p">),</span> <span class="p">(</span><span class="s1">'c'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="p">(</span><span class="s1">'a'</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="s1">'b'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)]</span>
<span class="o">>>></span> <span class="n">d3</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d3</span>
<span class="p">{</span><span class="s1">'d'</span><span class="p">:</span> <span class="mi">6 ...</span></pre></div>Python中global的用法2020-06-04T09:12:01+08:002020-06-04T09:12:01+08:00刘志军tag:foofish.net,2020-06-04:python-global.html<p>global 是python中的一个关键字,作用在变量上,该关键字通常放在函数块中,用来声明该变量为全局变量。</p>
<p>例如下面变量a,定义在函数外面的是全局变量a,定义在fun函数里面的a是另一个a,是局部变量a,两者没有任何关系。好比这个地区有个叫张三的人,公办室里有个另一个叫张三的人。他们是两个不同的人。</p>
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">fun</span><span class="p">():</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">fun</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># 输出 10</span>
</pre></div>
<p>如果想要函数里面的那个a就代表外面的全局变量a,那么就要将函数里面的a 用关键字 global 声明为全局变量</p>
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">fun</span><span class="p">():</span>
<span class="k">global</span> <span class="n">a</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">fun</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># 输出 2</span>
</pre></div>object is not subscriptable 是什么错误2020-06-04T09:12:01+08:002020-06-04T09:12:01+08:00刘志军tag:foofish.net,2020-06-04:python-object-is-not-subscriptable.html<p>第一次看到这个错误是不是很懵逼</p>
<p>这种错误一般出现在你使用了某个不可迭代的容器对象来获取其中的元素导致的。例如:</p>
<p>```python</p>
<blockquote>
<blockquote>
<blockquote>
<p>a = 3
a[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not subscriptable
````</p>
</blockquote>
</blockquote>
</blockquote>
<p>因为a是int类型,你要把它当list来用的话,就会出现 'int' object is not subscriptable。</p>
<p>所以,当你看到这个错误的时候,检查下当前对象是不是可迭代的类型(比如:字符串,列表、字典之类的)。</p>如何用Python执行linux命令2020-06-04T09:12:01+08:002020-06-04T09:12:01+08:00刘志军tag:foofish.net,2020-06-04:python-run-shell.html<h3>方法1: 使用 subprocess.call</h3>
<p>如果你在Linux中执行的命令是:</p>
<div class="highlight"><pre><span></span>ls -l
</pre></div>
<p>那么你只要将命令按空格分隔,转换成列表,作为参数传给 subprocess.call 即可。</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">subprocess</span>
<span class="o">>>></span> <span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s2">"ls"</span><span class="p">,</span> <span class="s2">"-l"</span><span class="p">])</span>
<span class="n">total</span> <span class="mi">72</span>
<span class="n">lrwxrwxrwx</span> <span class="mi">1</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">7</span> <span class="n">Jul</span> <span class="mi">19</span> <span class="mi">2018</span> <span class="nb">bin</span> <span class="o">-></span> <span class="n">usr</span><span class="o">/</span><span class="nb">bin</span>
<span class="n">dr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">5</span> <span class="n">root</span> <span class="n">root</span> <span class="mi">4096</span> <span class="n">Dec</span> <span class="mi">1</span> <span class="mi">2018</span> <span class="n">boot</span>
<span class="n">drwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span> <span class="mi">3</span> <span class="n">root</span> <span class="n">root ...</span></pre></div>用python创建csv表格文件2020-06-02T09:12:01+08:002020-06-02T09:12:01+08:00刘志军tag:foofish.net,2020-06-02:python-csv.html<p>python内置了csv模块,无需第三方依赖包,直接生成csv表格文件。</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">csv</span>
<span class="c1"># 表头</span>
<span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"姓名"</span><span class="p">,</span> <span class="s1">'年龄'</span><span class="p">,</span> <span class="s1">'性别'</span><span class="p">]</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"test.csv"</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span> <span class="k">as</span> <span class="n">csvfile</span><span class="p">:</span>
<span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">csvfile</span><span class="p">,</span> <span class="n">field_order</span><span class="p">)</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">field_order</span><span class="p">,</span> <span class="p">[</span><span class="s2">"张三"</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="s2">"男"</span><span class="p">])))</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">field_order</span><span class="p">,</span> <span class="p">[</span><span class="s2">"李四"</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="s2">"男"</span><span class="p">])))</span>
<span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">field_order</span><span class="p">,</span> <span class="p">[</span><span class="s2">"王五"</span><span class="p">,</span> <span class="mi">30 ...</span></pre></div>requests怎么获取重定向url地址2020-06-02T09:12:01+08:002020-06-02T09:12:01+08:00刘志军tag:foofish.net,2020-06-02:requests-redirect-url.html<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">requests</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'http://www.github.com'</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
</pre></div>
<p>输出:</p>
<div class="highlight"><pre><span></span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span>
</pre></div>Linux 清空大文件命令2020-06-01T16:03:00+08:002020-06-01T16:03:00+08:00刘志军tag:foofish.net,2020-06-01:linux-clean-file.html<p>系统磁盘占用空间越来越大,需要把一些没那么重要占用空间又大的文件清空掉,腾出更多空间出来。 以 access.log 为例,可以用下面4条命令中的任意一条都能达到清空数据的目的。</p>
<div class="highlight"><pre><span></span>> access.log
cat /dev/null > access.log
cp /dev/null access.log
<span class="nb">echo</span> > access.log
</pre></div>最新抖音去水印解析2020-06-01T15:52:42+08:002020-06-01T15:52:42+08:00刘志军tag:foofish.net,2020-06-01:python-douyin-remove-water-mask.html<p>今天跟大家聊一个价值百万的思路</p>django charfield 字段在 admin 中使用 textarea2020-05-21T20:52:42+08:002020-05-21T20:52:42+08:00刘志军tag:foofish.net,2020-05-21:django-charfield-textarea.html<p>如下代码,Account 模型中有个CharField类型的字段,对应在Admin中的是input输入框。如果我们想在admin中希望它是textarea输入框,那么需要自定义一个form表单对象</p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Account</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="n">c_remark</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="s2">"备注"</span><span class="p">)</span>
</pre></div>
<p>首先,创建自定义Form 对象 AccountModelForm, 指定 c_remark 字段的 widget 属性为forms.Textarea</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Account</span>
<span class="k">class</span> <span class="nc">AccountModelForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
<span class="n">c_remark</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">widget</span><span class="o">=</span><span class="n">forms</span><span class="o">.</span><span class="n">Textarea</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">"备注 ...</span></pre></div>Django 集成阿里云OSS2020-05-21T20:52:42+08:002020-05-21T20:52:42+08:00刘志军tag:foofish.net,2020-05-21:django-oss2.html<p>在django项目中,如果希望静态资源存储到阿里云的OSS中,不需要写一行代码,因为别人已经造好了轮子,你就不要重复造了。记录下配置过程。</p>
<h3>第一步: 安装依赖包</h3>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">oss2</span>
<span class="n">pip</span> <span class="n">install</span> <span class="n">django</span><span class="o">-</span><span class="n">oss</span><span class="o">-</span><span class="n">storage</span>
</pre></div>
<h3>第二步: setting.py配置OSS参数</h3>
<p>如果你使用过阿里云的OSS的话,下面这些参数都能在控制台找到</p>
<div class="highlight"><pre><span></span><span class="n">OSS_ACCESS_KEY_ID</span> <span class="o">=</span> <span class="s2">"xxxxx"</span>
<span class="n">OSS_ACCESS_KEY_SECRET</span> <span class="o">=</span> <span class="s2">"xxxxx"</span>
<span class="n">OSS_ENDPOINT</span> <span class="o">=</span> <span class="s2">"xxxxx"</span>
<span class="n">OSS_BUCKET_NAME</span> <span class="o">=</span> <span class="s2">"xxxxx"</span>
<span class="c1"># mediafile自动上传</span>
<span class="n">DEFAULT_FILE_STORAGE</span> <span class="o">=</span> <span class="s1">'django_oss_storage.backends.OssMediaStorage'</span>
<span class="n">MEDIA_URL</span> <span class="o">=</span> <span class="s1">'/media/'</span>
</pre></div>
<p>配置完成后,所有FileField类型的字段将自动上传到阿里云。</p>
<div class="highlight"><pre><span></span><span class="n">qrcode</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">FileField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">verbose_name</span><span class="o">=</span><span class="s2">"二维码"</span><span class="p">)</span>
</pre></div>
<p>数据库表中存储的是上传文件的名称 ...</p>反爬之ID 混淆 hashids 了解下2020-05-07T20:52:42+08:002020-05-07T20:52:42+08:00刘志军tag:foofish.net,2020-05-07:hashids.html<p>爬虫与反爬是一对相生相克的死对头,道高一丈魔高一尺。作为爬虫的一方,如果知道了某个站点的数据自增ID,那么就能轻而易举把整个站点都爬下来。是不是有点耸人听闻,你去看很多大站例如油管、P站等,他们都不会轻易把业务的自增ID暴露出来,而是用一种可逆的hash字符串替代。</p>
<p><img alt="微信截图_20200422204432.png" src="https://foofish.net/images/微信截图_20200422204432.png" /></p>
<p>最常用的ID混淆就是Hashids。Hashids是一个小型的开放源代码库,可以将数字生成很短的、唯一的、非顺序的字符ID。</p>
<p>例如可以数字<code>347</code>转换为 “yr8” 字符串,你还可以将字符串ID进行解码恢复成数字。</p>
<p><img alt="微信截图_20200422193518.png" src="https://foofish.net/images/微信截图_20200422193518.png" /></p>
<p>下面就来看看咋使用的</p>
<h3>安装</h3>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">hashids</span>
</pre></div>
<h3>怎么使用</h3>
<p>首选初始化一个 hashids 实例</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">hashids</span> <span class="kn">import</span> <span class="n">Hashids</span>
<span class="n">hashids</span> <span class="o">=</span> <span class="n">Hashids</span><span class="p">()</span>
</pre></div>
<h3>编码(加密)</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">id</span> <span class="o">=</span> <span class="n">hashids</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="o">>>></span> <span class="nb">id</span>
<span class="s1">'jR'</span>
<span class="o">>>></span> <span class="n">hashids</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mi">123</span><span class="p">)</span>
<span class="s1">'Mj3'</span>
<span class="o">>>></span> <span class="n">hashids</span><span class="o">.</span><span class="n">encode ...</span></pre></div>Python自制PornHub风格的LOGO2020-05-07T20:52:42+08:002020-05-07T20:52:42+08:00刘志军tag:foofish.net,2020-05-07:python-pornhub.html<p>PornHub又名P站,网站的流量在全球也是TOP10级别,和淘宝、百度等站点同一个level,他们家网站的LOGO也显得个性鲜明。</p>
<p><img alt="PornHub.png" src="https://foofish.net/images/PornHub.png" /></p>
<p>如何用Python画一个呢?</p>
<p>画图需要用到一个库叫Pillow,它是专门用来出来图像的,功能非常强大,修图功能能做的事,都可以用Pillow来实现。</p>
<p>分析下这张图的结构</p>
<p>它有左右两部分组成,左边是黑底白字,右边是黄底黑字。这两部分包裹在一个黑色矩形框中。</p>
<p>思路清楚了后,就可以动手实现</p>
<p>先实现左图</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">left_img</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="c1"># 指定字体和字体大小</span>
<span class="n">font</span> <span class="o">=</span> <span class="n">ImageFont</span><span class="o">.</span><span class="n">truetype</span><span class="p">(</span><span class="s1">'ArialEnUnicodeBold.ttf'</span><span class="p">,</span> <span class="n">FONT_SIZE</span><span class="p">)</span>
<span class="n">font_width</span><span class="p">,</span> <span class="n">font_height</span> <span class="o">=</span> <span class="n">font</span><span class="o">.</span><span class="n">getsize</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">offset_y</span> <span class="o">=</span> <span class="n">font</span><span class="o">.</span><span class="n">font</span><span class="o">.</span><span class="n">getsize</span><span class="p">(</span><span class="n">text</span><span class="p">)[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
<span class="n">blank_height</span> <span class="o">=</span> <span class="n">font_height</span> <span class="o">*</span> <span class="mi">2</span>
<span class="n">right_blank</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">font_width</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="n">text</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0 ...</span></pre></div>Python3.9要来了2020-05-07T20:52:42+08:002020-05-07T20:52:42+08:00刘志军tag:foofish.net,2020-05-07:python3.9.html<p>Python3.9 的发布流程大概是这样</p>
<p>Python3.9 刚发布a4 版本,a4 就是 Alpha 的第四个版本,Alpha 阶段还会添加其它新功能,直到发布 Beta 版本,Beta大概在5月份发布,之后才是候选版本,大概在8月份发布,最后才是release版本,就是我们说的正式版,在今年10月份发布。</p>
<p><img alt="微信截图_20200302214532.png" src="https://foofish.net/images/微信截图_20200302214532.png" /></p>
<p>语法层面上,最大的新特性就是新增了字典对象的合并、更新操作符。</p>
<p>以前我们合并字典有两种方式:</p>
<h3>方法一:使用update方法</h3>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d1</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"a"</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span><span class="mi">2</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">d2</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"c"</span><span class="p">:</span><span class="mi">3</span><span class="p">,</span> <span class="s2">"d"</span><span class="p">:</span><span class="mi">4</span><span class="p">}</span>
<span class="o">>>></span> <span class="n">d1</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d2</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d1</span>
<span class="p">{</span><span class="s1">'a'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">'c'</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="s1">'d'</span><span class="p">:</span> <span class="mi">4 ...</span></pre></div>Python挑战题2020-05-07T20:52:42+08:002020-05-07T20:52:42+08:00刘志军tag:foofish.net,2020-05-07:pythonchallenges.html<p>网址:http://www.pythonchallenge.com/</p>
<p>这个网站提供了33道智力题,需要用Python里面的一些知识去解决,当然你也可以使用其他语言,每道题都有解题线索,你要根据提示获取答案后才能进入下一题。截至目前,已经有3369095位用户试图发起挑战。</p>
<p><img alt="微信截图_20200424150613.png" src="https://foofish.net/images/微信截图_20200424150613.png" /></p>
<h3>第一题</h3>
<p>第一题是热身题,你要计算2的38次幂,计算结果就是第二题的入口链接</p>
<p><img alt="微信截图_20200424153058.png" src="https://foofish.net/images/微信截图_20200424153058.png" /></p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="mi">2</span><span class="o">**</span><span class="mi">38</span>
<span class="mi">274877906944</span>
</pre></div>
<h3>第二题</h3>
<p>第二题的入口链接是 http://www.pythonchallenge.com/pc/def/274877906944.html ,如果你懂凯撒密码的话,你就知道怎么解这道题了。凯撒密码就是将字符移动固定位数得到一个新的字符。</p>
<p><img alt="微信截图_20200424154545.png" src="https://foofish.net/images/微信截图_20200424154545.png" /></p>
<p>通过图中提示,我们发现字符向右移动了两位,K变成了M,O 变成了Q</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="s1">'K'</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span>
<span class="s1">'M'</span>
<span class="o">>>></span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="s1">'O'</span><span class="p">)</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span>
<span class="s1">'Q'</span>
<span class="o">>>></span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="s1">'E ...</span></pre></div>重学前端:相对定位VS绝对定位VS固定定位2020-04-15T16:03:00+08:002020-04-15T16:03:00+08:00刘志军tag:foofish.net,2020-04-15:relative-absolute-fixed-position.html<p>对于前端知识我一直没有体系化的掌握,所了解的都是一些零星散散的知识点,遇到问题半天才能解决,所以打算进行系统的学习一遍,基础的东西都是一劳永逸,这是重学前端系列的第一篇文章。</p>4步爬取微博评论数据,会写 helloworld 就能学会2020-03-01T19:52:42+08:002020-03-01T19:52:42+08:00刘志军tag:foofish.net,2020-03-01:weibo-comment.html<p>想去微博爬下微博评论拿来做数据分析,拿以前写的代码用发现跑不起来了</p>
<p>然后用浏览器登录微博看了下请求过程,发现规则确实变了。以前可以直接看到数据接口,现在变复杂了。</p>
<p>咋办呢?</p>
<p>吭呲吭呲从0开始分析? 那样太低效了。你遇到的坑肯定很多人都遇到过,这个时候我们就没必要自己重新去踩了。直接从他们填好的坑上走过去就好了,过蜀道如平川。</p>
<p>这里教你一个方法,叫做5步法爬取微博评论。</p>
<h3>第一步:百度/Google</h3>
<p>用搜素引擎搜关键字“微博评论爬虫 python”, 基本上第一页的结果都是最近一年写的文章,有一定时效性,太早的文章就直接忽略。随便打开两篇你能看懂的文章,记住,看不懂不是你的问题,是作者没写明白。</p>
<p>我搜到简书上的一篇文章,地址:https://www.jianshu.com/p/8dc04794e35f , 不过按照她的方式操作已经不起效了,因为微博的评论数据获取方式改了,但是发现了一个很重要的线索。</p>
<h3>第二步:分析验证</h3>
<p>虽然数据不再是通过接口的方法返回的,但是老接口还能用 https://m.weibo.cn/api/comments/show ...</p>转化最高16%,首批微信付费阅读公众号分析2020-01-27T09:12:01+08:002020-01-27T09:12:01+08:00刘志军tag:foofish.net,2020-01-27:weixin_pay_read.html<p>早在三年前微信内部就在测试付费阅读,但是一直没有对外发布。最大的阻力来自于苹果。按照苹果的规定,虚拟支付需要抽取30%的提成,谁也没法绕过,要么妥协,要么放弃。但是微信最开始没有妥协,一直拖着。</p>
<p>微信选择这个时间点发布付费阅读功能,我猜测原因是公众号打开率不断下滑求变的结果。有个数据统计,一篇10w+的文章一年前最快10分钟就可以达到,而现在要1个小时,行业打开率3%左右(参考数据)。</p>
<p>打开率下降的外因有来自短视频的冲击,内因就是好内容越来越少,你可以看看你关注的公众号每周还在更新的还有多少。</p>
<p>每天坚持日更的号一种是机构媒体,一种是把公众号作为收入来源的个人号,个人号持续输出内容,很难保证质量。开通付费阅读也是为了吸引更多优质内容进来,进一步唤醒公众号的活跃度。</p>
<p>公众号付费阅读,对公众号创作者来说是利好,又多了一个收入渠道,对灰产从业者是利好,商业嗅觉敏锐的人估计已经开始在布局。对读者来说也是利好,后面可能会看到更多高质量的内容出现。而对于知识星球等泛内容社区是利空消息。</p>
<p>那么在公众号做付费阅读是不是一门好生意?</p>
<p>我还是蛮期待这个功能的,对写作者来说,如果想去专业的内容平台写作,门槛太高,而微信让人人可以通过内容变现成为可能。</p>
<p>但是也别太乐观,个人认为付费阅读是对赞赏的一种延伸,如果价格门槛设置太高,愿意付费的少,另一方面版权得到不保护,假如一篇价值100元的文章,很容易被搞灰产的人利用 ...</p>Django入门与实践-第0章:前言2020-01-07T10:11:01+08:002020-01-07T10:11:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-00.html<p>Django 入门与实践教程是由咱公众号「Python之禅」 发起的 <a href="https://simpleisbetterthancomplex.com/series/beginners-guide/1.11/">A Complete Beginner's Guide to Django</a>翻译计划,这是一个浅显易懂的 Django 入门教程。</p>
<p>如果你看了 Django 官方文档还是不知道如何做一个项目,那么这个教程将指引你从 0 到 1 完成一个贴近生产环境的真实项目,适合新手作为练手项目来学习。同时,它也是我们知识星球中实战项目的参考教程,中文翻译由咱们的球友协同完成。</p>
<p>教程从最基础的软件安装、环境搭建开始介绍,基于测试驱动开发,涉及到Django的各个方面,除了代码,还手把手教你如果购买云主机、域名、项目部署等。就算你没有任何实践经验,只要有基本的 Python 语法知识,你就可以跟着教程一步一步搭建出一个完整的论坛网站出来。</p>
<p>教程总共有7个大章节,我们把它拆分为 20 多个小节,这样更有利于读者循序渐进地学习。所有章节我校稿过一次,但难免还是有疏忽之处,如有错误欢迎指出。</p>
<p>参与翻译的成员如下,感谢他们的付出 ...</p>Django入门与实践-第1章:环境搭建2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-01.html<h3>前言</h3>
<p><img alt="" src="https://foofish.net/images/1-2.jpg" /></p>
<p>今天我将开始一个关于 Django 基础知识的全新系列教程。这是一个开始学习 Django 的完整入门指南。教程材料一共会被分为七个部分(译注:被我们拆分为27个小章节)。我们将从安装,开发环境的准备、模型、视图、模板、URL到更高级的主题(如迁移、测试和部署)中详细探讨所有基本概念。</p>
<p>我想做一些不一样的事情。一个容易学习,内容丰富且不失趣味的教程。我的想法是在文章中穿插一些漫画的方式来演示说明相应的概念和场景。我希望大家能够享受这种阅读!</p>
<p>但是在我们开始之前...</p>
<p>当年我在一所大学担任代课教授时,我曾经在计算机科学专业给新来的学生讲授网络开发学科。那时我总是会用下面这个孔夫子的名言开始新的课程:</p>
<p><img alt="" src="https://foofish.net/images/1-3.jpg" /></p>
<p><em>(译者注:不确定是孔子讲的,但这句话早在中国古代就有所提到,出自荀子《儒效篇》“不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之;学至于行之而止矣”)</em></p>
<p>所以,请动起手来!不要只是阅读教程。我们一起来练习!通过实践和练习你会收获的更多。</p>
<hr />
<h3>为什么要学习Django?</h3>
<p>Django是一个用python编写的Web框架。Web框架是一种软件,基于web框架可以开发动态网站,各种应用程序以及服务。它提供了一系列工具和功能,可以解决许多与Web开发相关的常见问题 ...</p>Django入门与实践-第2章:创建项目2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-02.html<h3>启动一个新项目</h3>
<p>执行下面的命令来创建一个新的 Django 项目:</p>
<div class="highlight"><pre><span></span>django-admin startproject myproject
</pre></div>
<p>命令行工具<strong>django-admin</strong>会在安装Django的时候一起自动安装好。</p>
<p>执行了上面的命令以后,系统会为Django项目生成基础文件夹结构。</p>
<p>现在,我们的<strong>myproject</strong>目录结构如下所示:</p>
<div class="highlight"><pre><span></span>myproject/ <-- 高级别的文件夹
|-- myproject/ <-- Django项目文件夹
| |-- myproject/
| | |-- __init__.py
| | |-- settings.py
| | |-- urls.py
| | |-- wsgi.py
| +-- manage.py
+-- venv/ <-- 虚拟环境文件夹
</pre></div>
<p>我们最初的项目结构由五个文件组成:</p>
<ul>
<li><strong>manage.py</strong>:使用<strong>django-admin</strong>命令行工具的快捷方式。它用于运行与我们项目相关的管理命令。我们将使用它来运行开发服务器,运行测试,创建迁移等等。</li>
<li><strong>__init.py</strong>:这个空文件告诉python这个文件夹是一个python包。</li>
<li><strong>settings.py</strong>:这个文件包含了所有的项目配置。将来我们会一直提到这个文件 ...</li></ul>Django入门与实践-第3章:Hello World2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-03.html<p>现在来写我们的第一个<strong>视图(view)</strong>。我们将在下一篇教程中详细探讨它。但现在,让我们试试看看如何用Django创建一个新页面。</p>
<p>打开<strong>boards</strong>应用程序中的<strong>views.py</strong>文件,并添加以下代码:</p>
<p><strong>views.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>
<span class="k">def</span> <span class="nf">home</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s1">'Hello, World!'</span><span class="p">)</span>
</pre></div>
<p>视图是接收<code>httprequest</code>对象并返回一个<code>httpresponse</code>对象的Python函数。接收 <em>request</em> 作为参数并返回 <em>response</em> 作为结果。这个流程你必须记住!</p>
<p>我们在这里定义了一个简单的视图,命名为<strong>home</strong>,它只是简单地返回一个信息,一个字符串<strong>hello,world!</strong>。</p>
<p>现在我们必须告诉Django什么时候会调用这个view。这需要在urls.py文件中完成:</p>
<p><strong>urls.py ...</strong></p>Django入门与实践-第4章:系统设计2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-04.html<h3>前言</h3>
<p>欢迎来到 Django 教程的第二节,在第一节中,我们安装了项目所需要的一切,希望你安装的是 Python3.6,并且在虚拟环境中运行 Django1.11,这节课我们继续在这个项目上编写代码。</p>
<p>咱们先讨论一些项目的背景知识,然后再学习 Django 的基础,包括:模型(models),管理后台(admin),视图(views),模板(templates),和路由(URLs)</p>
<p>动手吧!</p>
<h3>论坛项目</h3>
<p>我不知道你是怎样认为的,个人觉得,通过看实际例子和代码片段可以学到东西,但就我个人而言,当你在例子中读到诸如 <code>class A</code> 和 <code>class B</code> 这样的代码,或者看到诸如 <code>foo(bar)</code> 这样的例子时,是很难解释清楚这些概念的,所以,我不想让你这样做。(译注:作者要表达的意思是光写些demo例子意义并不大 ...</p>Django入门与实践-第5章:模型设计2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-05.html<p><img alt="featured" src="https://foofish.net/images/2-1.jpg" /></p>
<h3>模型</h3>
<p>这些模型基本上代表了应用程序的数据库设计。我们在本节中要做的是创建 Django 所表示的类,这些类就是在上一节中建模的类:Board,Topic和Post。User 模型被命名为内置应用叫 <strong>auth</strong>,它以命名空间 django.contrib.auth 的形式出现在 <code>INSTALLED_APPS</code> 配置中。</p>
<p>我们要做的工作都在 boards/models.py 文件中。以下是我们在Django应用程序中如何表示类图的代码:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.models</span> <span class="kn">import</span> <span class="n">User</span>
<span class="k">class</span> <span class="nc">Board</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">unique</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField ...</span></pre></div>Django入门与实践-第6章:第一个视图函数2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-06.html<p>目前我们已经有一个视图函数叫<code>home</code>,这个视图在我们的应用程序主页上显示为“Hello,World!” </p>
<p><strong>myproject/urls.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">url</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">boards</span> <span class="kn">import</span> <span class="n">views</span>
<span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^$'</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">home</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'home'</span><span class="p">),</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^admin/'</span><span class="p">,</span> <span class="n">admin</span><span class="o">.</span><span class="n">site</span><span class="o">.</span><span class="n">urls</span><span class="p">),</span>
<span class="p">]</span>
</pre></div>
<p><strong>boards/views.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.http</span> <span class="kn">import</span> <span class="n">HttpResponse</span>
<span class="k">def</span> <span class="nf">home</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="k">return</span> <span class="n">HttpResponse</span><span class="p">(</span><span class="s1">'Hello ...</span></pre></div>Django入门与实践-第7章:模板引擎设置2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-07.html<p>在manage.py所在的目录创建一个名为 <strong>templates</strong>的新文件夹:</p>
<div class="highlight"><pre><span></span>myproject/
<span class="p">|</span>-- myproject/
<span class="p">|</span> <span class="p">|</span>-- boards/
<span class="p">|</span> <span class="p">|</span>-- myproject/
<span class="p">|</span> <span class="p">|</span>-- templates/ <-- 这里
<span class="p">|</span> +-- manage.py
+-- venv/
</pre></div>
<p>在templates文件夹中,创建一个名为home.html的HTML文件:</p>
<p><strong>templates/home.html</strong></p>
<div class="highlight"><pre><span></span><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>Boards<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>Boards<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
{% for board in boards %}
{{ board.name }} <span class="p"><</span><span class="nt">br</span><span class="p">></span>
{% endfor %}
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</pre></div>
<p>在上面的例子中,我们混入了原始HTML和一些特殊标签 <code>{% for ... in ... %}</code> 和 <code>{{ variable ...</code></p>Django入门与实践-第8章:第一个测试用例2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-08.html<h3>测试主页</h3>
<p><img alt="2-5" src="https://foofish.net/images/2-5.jpg" /></p>
<p>测试将是一个反复出现的主题,我们将在整个教程系列中一起探讨不同的概念和策略。</p>
<p>我们来开始写第一个测试。现在,我们将在<strong>boards</strong>应用程序内的<strong>tests.py</strong>文件中操作</p>
<p><strong>boards/tests.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.core.urlresolvers</span> <span class="kn">import</span> <span class="n">reverse</span>
<span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
<span class="k">class</span> <span class="nc">HomeTests</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">test_home_view_status_code</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="s1">'home'</span><span class="p">)</span>
<span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">assertEquals</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="mi">200</span><span class="p">)</span>
</pre></div>
<p>这是一个非常简单但非常有用的测试用例,我们测试的是请求该URL后返回的响应状态码。状态码200意味着成功。</p>
<p>请求一下主页后,我们可以在控制台中看到响应的状态代码:</p>
<p><img alt="2-2-7.png" src="https://foofish.net/images/2-2-7.png" /></p>
<p>如果出现未捕获的异常 ...</p>Django入门与实践-第9章:静态文件设置2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-09.html<p>静态文件是指 CSS,JavaScript,字体,图片或者是用来组成用户界面的任何其他资源。</p>
<p>实际上,Django 本身是不负责处理这些文件的,但是为了让我们的开发过程更轻松,Django 提供了一些功能来帮助我们管理静态文件。这些功能可在 <code>INSTALLED_APPS</code> 的 <strong>django.contrib.staticfiles</strong> 应用程序中找到(译者:Django为了使得开发方便,也可以处理静态文件,而在生产环境下,静态文件一般直接由 Nginx 等反向代理服务器处理,而应用工服务器专心负责处理它擅长的业务逻辑)。</p>
<p>市面上很多优秀前端组件框架,我们没有理由继续用简陋的HTML文档来渲染】。我们可以轻松地将Bootstrap 4添加到我们的项目中。Bootstrap是一个用HTML,CSS和JavaScript开发的前端开源工具包。</p>
<p>在项目根目录中,除了 boards, templates 和myproject文件夹外,再创建一个名为static的新文件夹,并在static文件夹内创建另一个名为css的文件夹:</p>
<div class="highlight"><pre><span></span>myproject/
<span class="p">|</span>-- myproject/
<span class="p">|</span> <span class="p">|</span>-- boards/
<span class="p">|</span> <span class="p">|</span>-- myproject/
<span class="p">|</span> <span class="p">|</span>-- templates/
<span class="p">|</span> <span class="p">|</span>-- static/ <-- here
<span class="p">|</span> <span class="p">|</span> +-- css/ <-- and here
<span class="p">|</span> +-- manage ...</pre></div>Django入门与实践-第10章:Django Admin 介绍2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-10.html<p><img alt="featured" src="https://foofish.net/images/2-1.jpg" /></p>
<p>到目前为止,我们使用交互式控制台(python manage.py shell)添加新的版块。但我们需要一个更好的方式来实现。在这一节中,我们将为网站管理员实现一个管理界面来管理这些数据。</p>
<h3>Django Admin 简介</h3>
<p>当我们开始一个新项目时,Django已经配置了Django Admin,这个应用程序列出的INSTALLED_APPS。</p>
<p><img alt="2-5" src="https://foofish.net/images/2-6.jpg" /></p>
<p>使用 Django Admin的一个很好的例子就是用在博客中; 它可以被作者用来编写和发布文章。另一个例子是电子商务网站,工作人员可以创建,编辑,删除产品。</p>
<p>现在,我们将配置 Django Admin 来维护我们应用程序的版块。</p>
<p>我们首先创建一个管理员帐户:</p>
<div class="highlight"><pre><span></span>python manage.py createsuperuser
</pre></div>
<p>按照说明操作:</p>
<div class="highlight"><pre><span></span>Username <span class="o">(</span>leave blank to use <span class="s1">'vitorfs'</span><span class="o">)</span>: admin
Email address: admin@example.com
Password:
Password ...</pre></div>Django入门与实践-第11章:URL 分发2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-11.html<h3>前言</h3>
<p>在本节课中,我们将深入理解两个基本概念: URLs 和 Forms。在这个过程中,我们还将学习其它很多概念,如创建可重用模板和安装第三方库。同时我们还将编写大量单元测试。</p>
<p>如果你是从这个系列教程的 part 1 跟着这个教程一步步地编写项目,你可能需要在开始之前更新 <strong>models.py</strong>:</p>
<p><strong>boards/models.py</strong></p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Topic</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="c1"># other fields...</span>
<span class="c1"># Add `auto_now_add=True` to the `last_updated` field</span>
<span class="n">last_updated</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Post</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="c1"># other fields...</span>
<span class="c1"># Add `null=True` to the `updated_by ...</span></pre></div>Django入门与实践-第12章:复用模板2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-12.html<p>到目前为止,我们一直在复制和粘贴 HTML 文档的多个部分。从长远来看是不可行的。这也是一个坏的做法。</p>
<p>在这一节我们将重写 HTML 模板,创建一个 <strong>master page(母版页)</strong>,其他模板添加它所独特的部分。</p>
<p _="%" raw="raw">在 <strong>templates</strong> 文件夹中创建一个名为 <strong>base.html</strong> 的文件:</p>
<p><strong>templates/base.html</strong></p>
<div class="highlight"><pre><span></span>{% load static %}<span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></span>{% block title %}Django Boards{% endblock %}<span class="p"></</span><span class="nt">title</span><span class="p">></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span> <span class="na">href</span><span class="o">=</span><span class="s">"{% static 'css/bootstrap.min.css' %}"</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body ...</span></pre></div>Django入门与实践-第13章:表单处理2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-13.html<p>Forms(表单) 用来处理我们的输入。这在任何 web 应用或者网站中都是很常见的任务。标准的做法是通过 HTML 表单实现,用户输入一些数据,将其提交给服务器,然后服务器处理它。</p>
<p><img alt="3-15.png" src="https://foofish.net/images/3-15.png" /></p>
<p>{% raw %}
表单处理是一项非常复杂的任务,因为它涉及到与应用多个层面的交互。有很多需要关心的问题。例如,提交给服务器的所有数据都是字符串的形式,所以在我们使用它之前需要将其转换为需要的数据类型(整形,浮点型,日期等)。我们必须验证有关应用程序业务逻辑的数据。我们还需要妥善地清理和审查数据,以避免一些诸如 SQL 注入和 XSS 攻击等安全问题。</p>
<p>好消息是,Django Forms API 使整个过程变的更加简单,从而实现了大量工作的自动化。而且,最终的结果比大多数程序员自己去实现的代码更加安全。所以,不管 HTML 的表单多么简单,总是使用Form API。</p>
<h3>自己实现表单</h3>
<p>起初,我想直接跳到表单 API。但是我觉得花点时间去了解一下表单处理的基本细节是一个不错的主意。否则,这玩意儿将会看起来像魔术一样 ...</p>Django入门与实践-第14章:用户注册2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-14.html<p><img alt="" src="https://foofish.net/images/4-1.jpg" /></p>
<h3>前言</h3>
<p>这一章节将会全面介绍 Django 的身份认证系统,我们将实现注册、登录、注销、密码重置和密码修改的整套流程。</p>
<p _="%" raw="raw">同时你还会了解到如何保护某些试图以防未授权的用户访问,以及如何访问已登录用户的个人信息。</p>
<p>在接下来的部分,你会看到一些和身份验证有关线框图,将在本教程中实现。之后是一个全新Django 应用的初始化设置。至今为止我们一直在一个名叫 boards 的应用中开发。不过,所有身份认证相关的内容都将在另一个应用中,这样能更良好的组织代码。
<img alt="" src="https://foofish.net/images/4-2.jpg" /></p>
<h3>线框图</h3>
<p>我们必须更新一下应用的线框图。首先,我们需要在顶部菜单添加一些新选项,如果用户未通过身份验证,应该有两个按钮:分别是注册和登录按钮。</p>
<p><img alt="Wireframe Top Menu" src="https://foofish.net/images/4-3.png" /></p>
<p>图1: 未认证用户的菜单顶部</p>
<p>如果用户已经通过身份认证,我们应该显示他们的名字,和带有“我的账户”,“修改密码”,“登出”这三个选项的下拉框</p>
<p><img alt="Wireframe Top Menu" src="https://foofish.net/images/4-4.png" /></p>
<p>图2: 认证用户的顶部菜单</p>
<p>在登录页面,我们需要一个带有<strong>username</strong>和<strong>password</strong>的表单, 一个登录的按钮和可跳转到注册页面和密码重置页面的链接。</p>
<p><img alt="Wireframe log in page" src="https://foofish.net/images/4-5.png" /></p>
<p>图3:登录页面</p>
<p>在注册页面,我们应该有包含四个字段的表单 ...</p>Django入门与实践-第15章:用户注销2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-15.html<p>为了在实现过程保持完整自然流畅的功能,我们还添加注销视图,编辑<strong>urls.py</strong>以添加新的路由:</p>
<p><strong>myproject/urls.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">url</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="kn">import</span> <span class="n">views</span> <span class="k">as</span> <span class="n">auth_views</span>
<span class="kn">from</span> <span class="nn">accounts</span> <span class="kn">import</span> <span class="n">views</span> <span class="k">as</span> <span class="n">accounts_views</span>
<span class="kn">from</span> <span class="nn">boards</span> <span class="kn">import</span> <span class="n">views</span>
<span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^$'</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">home</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'home'</span><span class="p">),</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^signup/$'</span><span class="p">,</span> <span class="n">accounts_views</span><span class="o">.</span><span class="n">signup ...</span></pre></div>Django入门与实践-第16章:用户登录2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-16.html<p>首先,添加一个新的URL路径:</p>
<p><strong>myproject/urls.py</strong></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.conf.urls</span> <span class="kn">import</span> <span class="n">url</span>
<span class="kn">from</span> <span class="nn">django.contrib</span> <span class="kn">import</span> <span class="n">admin</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth</span> <span class="kn">import</span> <span class="n">views</span> <span class="k">as</span> <span class="n">auth_views</span>
<span class="kn">from</span> <span class="nn">accounts</span> <span class="kn">import</span> <span class="n">views</span> <span class="k">as</span> <span class="n">accounts_views</span>
<span class="kn">from</span> <span class="nn">boards</span> <span class="kn">import</span> <span class="n">views</span>
<span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^$'</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">home</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'home'</span><span class="p">),</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r'^signup/$'</span><span class="p">,</span> <span class="n">accounts_views</span><span class="o">.</span><span class="n">signup</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'signup'</span><span class="p">),</span>
<span class="n">url</span><span class="p">(</span><span class="s1">r ...</span></pre></div>Django入门与实践-第17章:保护视图2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-17.html<p><img alt="5-1.jpg" src="https://foofish.net/images/5-1.jpg" /></p>
<h3>前言</h3>
<p>欢迎来到本系列教程的第5部分,在这节课,我们将学习如何保护视图防止未登录的用户访问,以及在视图和表单中访问已经登录的用户,我们还将实现主题列表和回复列表视图,最后,将探索 Django ORM 的一些特性和数据迁移的简单介绍。</p>
<h3>保护视图</h3>
<p>我们必须保护视图防止那些未认证(登录)的用户访问,下面是发起一个新话题的页面</p>
<p><img alt="5-2.png" src="https://foofish.net/images/5-2.png" /></p>
<p>在上图中,用户还没有登录,尽管他们可以看到页面和表单。Django 有一个内置的 <em>视图装饰器</em> 来避免它被未登录的用户访问:</p>
<p><strong>boards/views.py</strong>(<a href="https://gist.github.com/vitorfs/4d3334a0daa9e7a872653a22ff39320a#file-models-py-L19">完整代码</a>)</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.contrib.auth.decorators</span> <span class="kn">import</span> <span class="n">login_required</span>
<span class="nd">@login_required</span>
<span class="k">def</span> <span class="nf">new_topic</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">pk</span><span class="p">):</span>
<span class="c1"># ...</span>
</pre></div>
<p>现在如果用户没有登录,将被重定向到登录页面:</p>
<p><img alt="5-3.png" src="https://foofish.net/images/5-3.png" /></p>
<p>注意查询字符串 <strong>?next=/boards/1/new/</strong> ,我们可以改进登录模板以便利用 <strong>next</strong> 变量来改进我们的用户体验,(译注 ...</p>Django入门与实践-第18章:访问已登录用户2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-18.html<p>现在我么可以改进 <strong>new_topic</strong> 视图,将发布主题的用户设置当前登录的用户,取代之前直接从数据库查询出来的第一个用户,之前这份代码是临时的,因为那时候还没有方法去获取登录用户,但是现在可以了:</p>
<p><strong>boards/views.py</strong> (<a href="https://gist.github.com/vitorfs/483936caca4618dc275545ad2dfbef24#file-views-py-L19">完整代码</a>)</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.contrib.auth.decorators</span> <span class="kn">import</span> <span class="n">login_required</span>
<span class="kn">from</span> <span class="nn">django.shortcuts</span> <span class="kn">import</span> <span class="n">get_object_or_404</span><span class="p">,</span> <span class="n">redirect</span><span class="p">,</span> <span class="n">render</span>
<span class="kn">from</span> <span class="nn">.forms</span> <span class="kn">import</span> <span class="n">NewTopicForm</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Board</span><span class="p">,</span> <span class="n">Post</span>
<span class="nd">@login_required</span>
<span class="k">def</span> <span class="nf">new_topic</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">pk</span><span class="p">):</span>
<span class="n">board</span> <span class="o">=</span> <span class="n">get_object_or_404</span><span class="p">(</span><span class="n">Board</span><span class="p">,</span> <span class="n">pk</span><span class="o">=</span><span class="n">pk</span><span class="p">)</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span>
<span class="n">form ...</span></pre></div>Django入门与实践-第19章:主题回复2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-19.html<p>现在让我们来实现回复帖子的功能,以便我们可以添加更多的数据和改进功能实现与单元测试。</p>
<p><img alt="5-9.png" src="https://foofish.net/images/5-9.png" /></p>
<p>添加新的URL路由:</p>
<p><strong>myproject/urls.py</strong>(<a href="https://gist.github.com/vitorfs/71a5f9f39202edfbab9bacf11844548b#file-urls-py-L39">完整代码</a>)</p>
<div class="highlight"><pre><span></span><span class="n">url</span><span class="p">(</span><span class="s1">r'^boards/(?P<pk>\d+)/topics/(?P<topic_pk>\d+)/reply/$'</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">reply_topic</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'reply_topic'</span><span class="p">),</span>
</pre></div>
<p>给回帖创建一个新的表单:</p>
<p><strong>boards/forms.py</strong> (<a href="https://gist.github.com/vitorfs/3dd5ed2b3e27b4c12886e9426acf8fda#file-forms-py-L20">完整代码</a>)</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
<span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Post</span>
<span class="k">class</span> <span class="nc">PostForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">ModelForm</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Post</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'message'</span><span class="p">,</span> <span class="p">]</span>
</pre></div>
<p>一个新的受<code>@login_required</code>保护的视图,以及简单的表单处理逻辑</p>
<p><strong>boards ...</strong></p>Django入门与实践-第20章:QuerySets(查询结果集)2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-20.html<p>现在我们花点时间来探索关于模型的 API。首先,我们来改进主页:</p>
<p><img alt="5-13.png" src="https://foofish.net/images/5-13.png" /></p>
<p>有3个任务:</p>
<ul>
<li>显示每个板块的总主题数</li>
<li>显示每个板块的总回复数</li>
<li>显示每个板块的最后发布者和日期</li>
</ul>
<p>在实现这些功能前,我们先使用Python终端</p>
<p>因为我们要在Python终端尝试,所以,把所有的 models 定义一个 <code>__str__</code> 方法是个好主意</p>
<p><strong>boards/models.py</strong>(<a href="https://gist.github.com/vitorfs/9524eb42005697fbb79836285b50b1f4">完整代码</a>)</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.utils.text</span> <span class="kn">import</span> <span class="n">Truncator</span>
<span class="k">class</span> <span class="nc">Board</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="c1"># ...</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<span class="k">class</span> <span class="nc">Topic</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="c1"># ...</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return ...</span></pre></div>Django入门与实践-第21章:迁移2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-21.html<p>迁移(Migration)是Django做Web开发的基本组成部分,它使得我们在演进应用的models时,它能使得models文件与数据库保持同步</p>
<p>当我们第一次运行命令 <code>python manage.py migrate</code>的时候,Django 会抓取所有迁移文件然后生成数据库 schema。</p>
<p>当Django应用了迁移之后,有一个特殊的表叫做<strong>django_migrations</strong>,在这个表中,Django注册了所有已经的迁移记录。</p>
<p>所以,如果我们重新运行命令:</p>
<div class="highlight"><pre><span></span>python manage.py migrate
</pre></div>
<div class="highlight"><pre><span></span>Operations to perform:
Apply all migrations: admin, auth, boards, contenttypes, sessions
Running migrations:
No migrations to apply.
</pre></div>
<p>Django 知道没什么事可做了。</p>
<p>现在我们添加在 Topic 模型中添加一个新的字段:</p>
<p><strong>boards/models.py ...</strong></p>Django入门与实践-第22章:基于类的视图2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-22.html<p><img alt="" src="https://simpleisbetterthancomplex.com/media/series/beginners-guide/1.11/part-6/featured.jpg" /></p>
<h3>前言</h3>
<p>欢迎来到系列教程的第六部分!在这篇教程中,我们将详细探讨基于类的视图(简称CBV)。我们也将重构一些现有的视图,以便利用内置的<strong>基于类的通用视图</strong>(Generic Class-Based Views)。</p>
<p>这篇教程我们还将讨论许多其他主题,例如如何使用分页,如何使用markdown以及如何添加简单的编辑器。我们还将探索一个名为 <strong>Humanize</strong> 的内置软件包,用于对数据进行“人为操作”。</p>
<p>好了,伙计们!让我们来实现一些代码。今天我们还有很多工作要做!</p>
<h3>视图策略</h3>
<p>到头来,所有的Django视图其实都是<em>函数</em>。即便是CBV。在类的底层,它完成了所有的功能并最终返回一个视图函数。</p>
<p>引入了基于类的视图,使开发人员可以更轻松地重新使用和扩展视图。使用它们有很多好处,例如可扩展性,多重继承之类的面向对象技术的运用,HTTP 方法的处理是在单独的方法中完成的,而不是使用条件分支,并且还有通用的基于类的视图(简称GCBV)。</p>
<p>在我们继续教程之前,让我们清楚这三个术语的含义:</p>
<ul>
<li>基于函数的视图(FBV)</li>
<li>基于类的视图(CBV)</li>
<li>基于类的通用视图(GCBV)</li>
</ul>
<p>FBV是Django视图中最简单的表示:它就是一个接收 ...</p>Django入门与实践-第23章:分页实现2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-23.html<p>我们可以非常容易地使用 CBV 来实现分页功能。但首先我想手工分页,这样就更有助于我们理解背后的机制,这样它就不那么神秘了。</p>
<p>实际上对 boards 列表视图分页并没有意义,因为我们不期望有很多 boards。但无疑对于主题列表和帖子列表来说是需要一些分页的。</p>
<p>从现在起,我们将在 <strong>board_topics</strong> 这个视图中来操作。</p>
<p>首先,我们添加一些帖子。我们可以直接使用应用程序的用户界面来添加几个帖子,或者打开 python shell 编写一个小脚本来为我们完成:</p>
<div class="highlight"><pre><span></span>python manage.py shell
</pre></div>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.contrib.auth.models</span> <span class="kn">import</span> <span class="n">User</span>
<span class="kn">from</span> <span class="nn">boards.models</span> <span class="kn">import</span> <span class="n">Board</span><span class="p">,</span> <span class="n">Topic</span><span class="p">,</span> <span class="n">Post</span>
<span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
<span class="n">board</span> <span class="o">=</span> <span class="n">Board</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name ...</span></pre></div>Django入门与实践-第24章:我的账户视图2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-24.html<p>好的,那么,这部分将是我们最后的一个视图。之后,我们将专心来改进现有功能。</p>
<p><strong>accounts/views.py</strong> <a href="https://gist.github.com/vitorfs/ea62417b7a450050f2feeeb69b775996">查看完整文件</a></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.contrib.auth.decorators</span> <span class="kn">import</span> <span class="n">login_required</span>
<span class="kn">from</span> <span class="nn">django.contrib.auth.models</span> <span class="kn">import</span> <span class="n">User</span>
<span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">reverse_lazy</span>
<span class="kn">from</span> <span class="nn">django.utils.decorators</span> <span class="kn">import</span> <span class="n">method_decorator</span>
<span class="kn">from</span> <span class="nn">django.views.generic</span> <span class="kn">import</span> <span class="n">UpdateView</span>
<span class="nd">@method_decorator</span><span class="p">(</span><span class="n">login_required</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'dispatch'</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">UserUpdateView</span><span class="p">(</span><span class="n">UpdateView</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">User</span>
<span class="n">fields ...</span></pre></div>Django入门与实践-第25章:Markdown 支持2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-25.html<p>让我们在文本区域添加 Markdown 支持来改善用户体验。你会看到要实现这个功能非常简单。</p>
<p>首先,我们安装一个名为 <strong>Python-Markdown</strong> 的库:</p>
<div class="highlight"><pre><span></span>pip install markdown
</pre></div>
<p>我们可以在 <strong>Post</strong> 视图的 model 中添加一个新的方法:</p>
<p><strong>boards/models.py</strong> <a href="https://gist.github.com/vitorfs/caa24fcf2b66903617ebbb41337d3d3d#file-models-py-L46">查看完整文件</a></p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">django.utils.html</span> <span class="kn">import</span> <span class="n">mark_safe</span>
<span class="kn">from</span> <span class="nn">markdown</span> <span class="kn">import</span> <span class="n">markdown</span>
<span class="k">class</span> <span class="nc">Post</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="c1"># ...</span>
<span class="k">def</span> <span class="nf">get_message_as_markdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">mark_safe</span><span class="p">(</span><span class="n">markdown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="n">safe_mode</span><span class="o">=</span><span class="s1">'escape'</span><span class="p">))</span>
</pre></div>
<p>这里我们正在处理用户的输入 ...</p>Django入门与实践-第26章:个性化工具2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-26.html<p>我觉得只添加内置的人性化(<strong>humanize</strong>)包就会很不错。它包含一组为数据添加“人性化(human touch)”的工具集。</p>
<p>例如,我们可以使用它来更自然地显示日期和时间字段。我们可以简单地显示:“2分钟前”,而不是显示整个日期。</p>
<p>我们来实践一下!首先,添加 <code>django.contrib.humanize</code> 到配置文件的 <code>INSTALLED_APPS</code> 中。</p>
<p><strong>myproject/settings.py</strong></p>
<div class="highlight"><pre><span></span><span class="n">INSTALLED_APPS</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">'django.contrib.admin'</span><span class="p">,</span>
<span class="s1">'django.contrib.auth'</span><span class="p">,</span>
<span class="s1">'django.contrib.contenttypes'</span><span class="p">,</span>
<span class="s1">'django.contrib.sessions'</span><span class="p">,</span>
<span class="s1">'django.contrib.messages'</span><span class="p">,</span>
<span class="s1">'django.contrib.staticfiles'</span><span class="p">,</span>
<span class="s1">'django.contrib.humanize'</span><span class="p">,</span> <span class="c1"># <- 这里</span>
<span class="s1">'widget_tweaks'</span><span class="p">,</span>
<span class="s1">'accounts ...</span></pre></div>Django入门与实践-第27章:项目部署2020-01-07T09:12:01+08:002020-01-07T09:12:01+08:00刘志军tag:foofish.net,2020-01-07:django-tutorial-27.html<h3>简介(Introduction)</h3>
<p><img alt="7-A-Complete-Beginner's-Guide-to-Django-Part7.jpg" src="https://foofish.net/images/7-A-Complete-Beginner's-Guide-to-Django-Part7.jpg" /></p>
<p>欢迎来到我们教程系列的最后一部分!这篇文章,我们将把Django应用程序部署到生产服务器。我们还将为我们的服务器配置Email服务和HTTPS证书。</p>
<p>首先,我想到了给一个使用虚拟专用服务器(VPS)的例子,它更通用,然后使用一个平台比如 Heroku 服务。但它我写得太详细了,所以本教程我最终偏向关于VPS的内容。</p>
<p>我们的项目已经上线啦!您可以在阅读本文之前点击在线查看,这是我们本文要部署的应用程序:<a href="https://www.djangoboards.com">www.djangoboards.com</a>。</p>
<h3>版本控制(Version Control)</h3>
<p>版本控制是软件开发中非常重要的话题。特别是在团队开发中同时开发多个功能,并一起维护项目代码时。无论是一个开发人员项目还是多个开发人员项目,每个项目都应该使用版本控制。</p>
<p>版本控制系统有几种选择。也许是因为GitHub的流行,Git 成为版本控制的实际标准。所以如果你不熟悉版本控制,Git是一个很好的入门起点。一般有很多相关的教程,课程和资源,因此遇到问题很容易找到帮助。</p>
<p>GitHub和Code School有一个<a href="https://try.github.io/">关于Git的很棒的互动教程</a>,这是一个非常好的介绍Git的网站。几年前我就开始从SVN转到Git。</p>
<p>这是一个非常重要的话题,我其实应该从第一个教程开始讲Git。但事实是我希望本教程系列的重点放在Django上。如果Git这东西对您来说都是新的,请不要担心。一步一步入门是很重要的 ...</p>5个顶级异步Python框架2020-01-03T15:52:42+08:002020-01-03T15:52:42+08:00刘志军tag:foofish.net,2020-01-03:python-async-web-framework.html<p>Python在3.4引入了 asyncio 库,3.6新增了关键字 <code>async</code>和<code>await</code>,此后,异步框架迅速发展了起来,性能上能和Node.js比肩,除非是CPU密集型任务,否则没有理由不适用异步框架。</p>Python2.7: 2020年4月还会发布一个版本2020-01-01T09:12:01+08:002020-01-01T09:12:01+08:00刘志军tag:foofish.net,2020-01-01:python2.7-retired.html<p>昨天好几个公众号推送关于Python2.7正式“退休”的消息,有个网站专门做了一个python2.7退休的倒计时。</p>
<p><img alt="Snipaste_2020-01-02_10-39-23.png" src="https://foofish.net/images/Snipaste_2020-01-02_10-39-23.png" /></p>
<p>不过Python官方博客的说法是,2020的4月还会发布python2.7的最后一个版本,然后才正式终止维护。</p>
<p><img alt="Snipaste_2020-01-02_10-43-14.png" src="https://foofish.net/images/Snipaste_2020-01-02_10-43-14.png" /></p>
<p>我发了个朋友圈对前面这种说法提出了质疑。不过认真的猫哥(公众号:Python猫)给了个更合理的解释。</p>
<p>本真死磕的精神,我又去搜集了一些资料。</p>
<p>PEP 373 是专门用来记录Python2.7 发布日程的提案,所有关于Python2.7的历史版本都能查到</p>
<p><img alt="微信截图_20200102125332.png" src="https://foofish.net/images/微信截图_20200102125332.png" /></p>
<p>我们先来回顾下Python2.7的历史</p>
<p>Python2.7的第一个版本是2010-07-03发布的,通常核心版本维护五年官方就不再管了,但Python2.7超过10年,这在软件开发领域实属罕见。</p>
<p>原因也很简单,Python3不兼容Python2,导致大家都不愿意升级,所以这个版本一拖就是10年。</p>
<p>最新的发布计划是这样的,2020年还会发布python2.7的最后一个版本:2.7.18。 1月份将进行 code freeze。 code freeze 的意思是除非有重大bug,如果是新的feature、小bug都不再处理了 ...</p>一行代码搞定各种头像,Flask Avatars 了解一下2019-12-28T20:52:42+08:002019-12-28T20:52:42+08:00刘志军tag:foofish.net,2019-12-28:flask-avatars.html<p>原谅我这个标题党,内容是纯正干货,就是希望你们能打开学习了解一下。</p>
<p>二十次幂网站的用户注册,当时并没有要求上传头像,所有人使用的是一个默认头像。</p>
<p>这几天花时间把这块优化了,现在每个人都有唯一的头像了。使用的模块就是 Flask-Avatars 提供的功能。</p>
<p>发现这个库非常强大,集成了很多功能在里面,各种各样的头像生成方案,有Identicon、 monsterid、Robohash 甚至是社交平台的头像,另外还支持裁减,这篇文章就来详细具体介绍一下。</p>
<h3>安装</h3>
<div class="highlight"><pre><span></span><span class="err">$</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">flask</span><span class="o">-</span><span class="n">avatars</span>
</pre></div>
<h3>初始化</h3>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
<span class="kn">from</span> <span class="nn">flask_avatars</span> <span class="kn">import</span> <span class="n">Avatars</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<span class="n">avatars</span> <span class="o">=</span> <span class="n">Avatars</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</pre></div>
<h3>生成 Gravatar 头像</h3>
<p>Gravatar是 Globally Recognized Avatar的缩写,是 gravatar 网站推出的一项服务 ...</p>微信圈子创建攻略2019-12-28T20:52:42+08:002019-12-28T20:52:42+08:00刘志军tag:foofish.net,2019-12-28:weixin-group.html<p>微信圈子是依附于微信体系内,基于兴趣分类的内容社区。类似百度贴吧,小红书、知识星球等产品。微信圈子目前还只在小范围人群里被大家所知,但是对于商业嗅觉敏感的人早就开始布局了,因为早就是优势。</p>
<p>这篇文章告诉大家如何快速拥有自己的圈子。</p>
<h3>圈子入口</h3>
<p>将微信升级到最新版本(当前7.0.10),点击【发现】进入【搜一搜】页面就有圈子入口。不排除以后版本圈子的入口路径会缩短的可能性。</p>
<p><img alt="微信图片编辑_20191228212717.jpg" src="https://foofish.net/images/微信图片编辑_20191228212717.jpg" /></p>
<p>目前创建圈子有门槛,只有积分达到10以上的“一星作者”才有资格申请创建圈子,或者积分达到100分后也可以自己直接创建。</p>
<p>所以创建圈子前要<strong>攒积分</strong>,攒积分的方式就是在去其它圈子投稿,投稿前可以先加入一些感兴趣的圈子。</p>
<p>投稿的内容尽量契合圈子的定位,内容质量越高越有可能被圈主收录。因为只有被收录的内容才能拿到积分。每被收录一条帖子奖励一个积分。</p>
<p>每天最多可以奖励5个积分,只要你勤快,两天就可以拿到申请资格。</p>
<p>投稿内容不限视频、照片和文字。视频和照片更容易得到平台的推荐。</p>
<p><img alt="微信图片_20191228214520.jpg" src="https://foofish.net/images/微信图片_20191228214520.jpg" /></p>
<p>累计积分达到10分后,系统会提示你可以申请创建圈子了。</p>
<p><img alt="圈子申请.png" src="https://foofish.net/images/圈子申请.png" /></p>
<h3>申请圈子</h3>
<p>申请圈子时,申请理由怎么填写很关键,如果是随意写很大概率被拒,拒了两次就没法再次申请,只能等到积分达到100分创建,所有要先想好创建什么圈子,目标人群是什么?怎么运营圈子 ...</p>SQLAlchemy 中 flush 与 commit 方法的区别以及用途2019-12-25T11:47:06+08:002019-12-25T11:47:06+08:00刘志军tag:foofish.net,2019-12-25:sqlalchemy-flush-vs-commit.html如何正序查看微信公众号历史文章2019-12-20T00:52:42+08:002019-12-20T00:52:42+08:00刘志军tag:foofish.net,2019-12-20:gongzhonghao.html<p>由于公众号历史消息是倒序展示的,最近发的文章展示在前面,这样导致想要查看某个公众号早期发的文章你需要不断地往后翻,如果想翻到第一篇文章,简直比登天还难。而且,你好不容易翻到了第一篇文章,如果因为其它事打断了,又要重复操作一遍。</p>
<p>所以在微信查看公众号早期的历史文章体验非常糟糕。为了解决这个问题,不得不推荐一个工具,二十次幂</p>
<p>具体使用操作:</p>
<h3>第0步:打开网站</h3>
<p><a href="https://www.ershicimi.com/">https://www.ershicimi.com/</a></p>
<h3>第1步:搜索公众号</h3>
<p><img alt="微信截图_20191220012343.png" src="https://foofish.net/images/微信截图_20191220012343.png" /></p>
<p>点击头像或公众号名字,跳转到公众号主页,如果没有找到该公众号,可以添加我微信 go2071 ,备注【二十次幂】可以帮你处理</p>
<h3>第2步:选择正序排序</h3>
<p>点击正三角是正序排列,倒三角是倒序排列</p>
<p><img alt="微信截图_20191220013249.png" src="https://foofish.net/images/微信截图_20191220013249.png" /></p>
<p>这样你就能看到最早发的文章了。同时你还可以通过搜索关键字进行过滤。</p>
<p>如果使用正序查看发现第一篇文章不是最早的文章怎么办? 那是因为系统没有完整地采集数据,添加微信 go2071 ,找他帮你处理。</p>
<p>网站地址:<a href="https://www.ershicimi.com/">https://www.ershicimi.com/</a></p>结巴分词快速入门指南2019-12-20T00:52:42+08:002019-12-20T00:52:42+08:00刘志军tag:foofish.net,2019-12-20:jieba.html<p>结巴分词是Python语言中最流行的一个分词工具,本文将介绍结巴分词快速入门使用</p>
<h3>安装</h3>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">jieba</span>
</pre></div>
<h3>简单分词</h3>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">jieba</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">jieba</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="s2">"我爱中国北京大学"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span>我
爱
中国
北京大学
</pre></div>
<p>句子切分成了5个词组。</p>
<h3>全模式分词</h3>
<div class="highlight"><pre><span></span><span class="n">result</span> <span class="o">=</span> <span class="n">jieba</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="s2">"我爱中国北京大学"</span><span class="p">,</span> <span class="n">cut_all</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">for</span> <span class="n">word</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">word</span><span class="p">)</span>
</pre></div>
<p>输出</p>
<div class="highlight"><pre><span></span>我
爱
中国
北京
北京大学
大学
</pre></div>
<p>全模式分出来的词覆盖面更广。</p>
<h3>提取关键词</h3>
<p>从一个句子或者一个段落中提取前k个关键词</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">jieba ...</span></pre></div>如何给电脑版QQ、微信、爱奇艺设置代理2019-12-18T13:47:06+08:002019-12-18T13:47:06+08:00刘志军tag:foofish.net,2019-12-18:Proxifier-proxy.html<p>可能你会遇到这样的情况,公司网络不让上QQ,微信等聊天工具</p>Elasticsearch 分析器2019-12-14T20:52:42+08:002019-12-14T20:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-fenci.html<p>所谓分词就是将一段文本按照语义规则切分成多个词语,当有一篇文章标题是 “马云说996是福报”时,我们需要把这段文本切分成多个词语: 996、马云、福报 等。因为用户搜索的时候可能只会输入一个词语。</p>
<p>之所以要这样做是为了提高搜索的准确度,如果用户搜索的时候输入的关键字是 “996”,刚好能匹配到分词短语 996,就能命中该文本。ES 的搜索不象 MySQL 那样使用 like 语句执行模糊搜索。</p>
<p>搜索的质量取决于分词的好坏。例如 996 如果拆分成9和6,用户输入996又匹配不到,输入9或者6 可能又会搜到很多无关紧要的东西。</p>
<h3>分析器</h3>
<p>分析器的作用对文本进行分词处理。首先将文本拆分,构建倒排索引,然后对分词进行处理提高分词的搜索准确率。分析器包含3部分</p>
<ul>
<li>字符过滤器 character filter:将文本中的特殊字符过滤,例如html标签,标点符号. analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理。</li>
<li>分词器 tokenizer:将文本拆分成单个词条,一个analyzer必需且只可包含一个tokenizer</li>
<li>词项过滤器 token filter ...</li></ul>Elasticsearch 映射2019-12-14T19:52:42+08:002019-12-14T19:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-mapping.html<p>mapping保存的是索引的结构,类似于数据库中的表结构,索引里面有哪些字段、字段是什么类型,用什么分析器等等这些信息都保存在 mapping 中。 查询 mapping 结构如下:</p>
<div class="highlight"><pre><span></span><span class="n">GET</span> <span class="o">/</span><span class="n">customer</span><span class="o">/</span><span class="n">_mapping</span><span class="err">?</span><span class="n">pretty</span>
<span class="p">{</span>
<span class="s2">"customer"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"mappings"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"properties"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"address"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"text"</span><span class="p">,</span>
<span class="s2">"fields"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"keyword"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"keyword"</span><span class="p">,</span>
<span class="s2">"ignore_above"</span><span class="p">:</span> <span class="mi">256</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="s2">"age"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"long"</span>
<span class="p">},</span>
<span class="s2">"name"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"text"</span><span class="p">,</span>
<span class="s2">"fields"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"keyword"</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"keyword"</span><span class="p">,</span>
<span class="s2">"ignore_above"</span><span class="p">:</span> <span class="mi">256</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>我们在前面向索引中插入文档的时候,并没有事先制定索引里面字段的结构类型,这是因为 ElasticSearch 会自动根据数据的值反推出字段的类型,自动创建 mapping。</p>
<h3>创建 mapping</h3>
<p>第一种方式是在创建索引的时候指定mapping</p>
<div class="highlight"><pre><span></span><span class="n">PUT</span> <span class="n">my_index ...</span></pre></div>Elasticsearch 查询2019-12-14T18:52:42+08:002019-12-14T18:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-query.html<p>ES的核心功能之一就是提供搜索,搜索有两种方式,一种从 url 中读取所有的查询参数,用 GET 请求。另一个是使用 POST 请求 将 JSON 数据作为请求体,支持完整的 Elasticsearch DSL。DSL查询表达式(Query DSL),它是一种非常灵活又富有表现力的 查询语言。 Elasticsearch 使用它可以以简单的 JSON 接口来展现 Lucene 功能的绝大部分。在你的应用中,你应该用它来编写你的查询语句。它可以使你的查询语句更灵活、更精确、易读和易调试。</p>
<p>例如:查询customer索引中任意字段中有关键字"深圳"的文档</p>
<div class="highlight"><pre><span></span><span class="err">GET /customer/_search?q=深圳</span>
<span class="err">{</span>
<span class="err"> "took": 3,</span>
<span class="err"> "timed_out": false,</span>
<span class="err"> "_shards": {</span>
<span class="err"> "total": 1,</span>
<span class="err"> "successful ...</span></pre></div>Elasticsearch基本操作2019-12-14T15:52:42+08:002019-12-14T15:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-example.html<p>熟悉了elasticsearch 的基本概念后,可以动手实践了,实践才能出真知。</p>
<h3>显示索引列表</h3>
<div class="highlight"><pre><span></span>curl http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open accounts MtqOgd0aTb6emn2rj-VfNQ 1 1 2 0 5kb 5kb
</pre></div>
<p>用来表示当前系统中有哪些索引,一个索引用一行来记录来表示,每条数据记录索引的基本情况</p>
<ul>
<li>index :索引名</li>
<li>docs.count:文档数量</li>
</ul>
<h3>创建索引</h3>
<p>使用 <code>PUT</code> 请求,创建一个名叫 ...</p>Elasticsearch基本概念2019-12-14T15:52:42+08:002019-12-14T15:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-gainian.html<p>要使用好 Elasticsearch,有几个概念你不得不弄清楚。</p>
<h3>Node 、 Cluster</h3>
<p>Elasticsearch 本质上是一个分布式数据库,单个 Elasticsearch 实例称为一个节点(node),一组节点构成一个集群(cluster)。</p>
<h3>索引(index)</h3>
<p>Elasticsearch 的索引类似于巨大的字典结构,保存了关键字到文档记录之间的映射关系, 也称为倒排索引,索引使得 Elasticsearch 支持快速检索,ElasticSearch 将不同数据存储在不同索引(index)中。例如订单数据放在订单索引,用户数据放在用户索引中,如果类比 MySQL,索引就像数据库,可以向索引写入文档或者从索引中检索文档、更新文档、删除文档等操作。</p>
<h3>文档(Documents)</h3>
<p>文档可以理解为一条数据记录,例如一条订单记录,一条用户记录,都叫一个文档,文档用JSON 格式表示,文档可以由多个字段组成,例如一条用户记录中有名字、性别、地址等信息,在一个索引中可以存储无数个文档。</p>
<p><img alt="2018101619393456.png" src="https://foofish.net/images/2018101619393456.png" /></p>
<h3>分片和副本(Shards & Replicas ...</h3>Elasticsearch 安装2019-12-14T14:52:42+08:002019-12-14T14:52:42+08:00刘志军tag:foofish.net,2019-12-14:elasticsearch-install.html<p>环境:CentOS 7.0</p>
<blockquote>
<p>最新的Elasticsearch已经内置的JVM环境,无需自己安装Java环境,所以只要直接下载Elasticsearch安装文件就可以,不要安装Java,也不要配置Java_Home。如果是7.0以下版本,请按照本文档进行操作。</p>
</blockquote>
<p>Elasticsearch 是基于Java 搜索引擎 Luncene 开发的分布式搜索服务,所以先要安装 Java 环境。</p>
<h3>安装Java</h3>
<div class="highlight"><pre><span></span><span class="n">yum</span> <span class="n">install</span> <span class="n">java</span><span class="o">-</span><span class="mf">1.8</span><span class="o">.</span><span class="mi">0</span><span class="o">-</span><span class="n">openjdk</span>
</pre></div>
<p>检查是否安装成功</p>
<div class="highlight"><pre><span></span><span class="o">~</span> <span class="n">java</span> <span class="o">-</span><span class="n">version</span>
<span class="n">openjdk</span> <span class="n">version</span> <span class="s2">"1.8.0_201"</span>
<span class="n">OpenJDK</span> <span class="n">Runtime</span> <span class="n">Environment</span> <span class="p">(</span><span class="n">build</span> <span class="mf">1.8</span><span class="o">.</span><span class="mi">0</span><span class="n">_201</span><span class="o">-</span><span class="n">b09</span><span class="p">)</span>
<span class="n">OpenJDK</span> <span class="mi">64</span><span class="o">-</span><span class="n">Bit</span> <span class="n">Server</span> <span class="n">VM ...</span></pre></div>Django3.0正式发布!2019-12-03T15:52:42+08:002019-12-03T15:52:42+08:00刘志军tag:foofish.net,2019-12-03:django3-released.html<p>pip安装有两个常见问题,第一是下载慢,第二是无法安装。慢的原因是资源服务器放在大洋彼岸的美帝,无法安装多半是因为用的Windows系统</p>为什么你的Python包老是装不上?收下这个网站吧2019-12-03T15:52:42+08:002019-12-03T15:52:42+08:00刘志军tag:foofish.net,2019-12-03:pip-install-fail.html<p>pip安装有两个常见问题,第一是下载慢,第二是无法安装。慢的原因是资源服务器放在大洋彼岸的美帝,无法安装多半是因为用的Windows系统</p>推荐一个小工具,彻底禁止Win10自动更新2019-11-28T09:12:01+08:002019-11-28T09:12:01+08:00刘志军tag:foofish.net,2019-11-28:Windows_Update_Blocker.html<p>大家都用过Windows或者曾经用过。你们觉得使用 Windows过程中最烦人的是什么? 蓝屏? 不,是自动更新。</p>
<p>某游戏主播直播比赛时,,在线上十三万网友的共同注视下,Win10开启了强制更新并重启</p>
<p><img alt="v2-14be4ef1e10a48a29b5c807cb90da164_hd.webp" src="https://foofish.net/images/v2-14be4ef1e10a48a29b5c807cb90da164_hd.webp" /></p>
<p>正在直播的主持人大屏幕显示系统正在配置更新</p>
<p><img alt="v2-902a6c7a97e873e720ee1bbc91480cad_hd.jpg" src="https://foofish.net/images/v2-902a6c7a97e873e720ee1bbc91480cad_hd.jpg" /></p>
<p>像我这种要把Windows当服务器7*24小时使用的人来说,出个远门系统直接瘫痪。</p>
<p>win10的自动更新就像打不死的小强,尝试过很多种不同的方法,不管你是修改注册表设置,或者关掉更新服务都没用,而且每次更新都要耗费很长时间。</p>
<p><img alt="update.png" src="https://foofish.net/images/update.png" /></p>
<p>今天就给大家分享一个可以彻底关闭win10系统自动更新的小工具 Windows Update Blocker。</p>
<p><img alt="微信截图_20191129135150.png" src="https://foofish.net/images/微信截图_20191129135150.png" /></p>
<p>这个不到500k的小工具,下载后无需安装,解压后双击即可运行。</p>
<p>想要禁用更新直接选择“禁用服务”,同时勾选“保护服务设置”。 如果想恢复更新,直接选择“启用服务”即可。这比进入控制面板里面操作方便多了。</p>
<p><img alt="微信截图_20191129135635.png" src="https://foofish.net/images/微信截图_20191129135635.png" />
。</p>自己动手写个"狗屁不通"文章生成器2019-11-21T09:12:01+08:002019-11-21T09:12:01+08:00刘志军tag:foofish.net,2019-11-21:bullshit-generator.html<p>ossutil 是阿里云提供的命令行工具,用于管理OSS数据,支持将文件上传到阿里云的 OSS,同时支持Windows、Linux、 Mac平台。</p>
<p>前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。</p>
<p><img alt="微信截图_20191120160552.png" src="https://foofish.net/images/微信截图_20191120160552.png" /></p>
<p>背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法</p>
<p><img alt="download.jpg" src="https://foofish.net/images/download.jpg" /></p>
<p>不过,当我看到作者的代码之后</p>
<p><img alt="images.jpg" src="https://foofish.net/images/images.jpg" /></p>
<p>这程序代码不到50行</p>
<p><img alt="微信截图_20191120161020.png" src="https://foofish.net/images/微信截图_20191120161020.png" /></p>
<p>尽管我有多年的Python经验,但我竟然一时也没有看懂</p>
<p><img alt="69082a5b31a6ea556d72b4cc8deaa054.jpg" src="https://foofish.net/images/69082a5b31a6ea556d72b4cc8deaa054.jpg" /></p>
<p>这代码放到编辑器里还特么真能执行</p>
<p><img alt="e281-fyshfur3673884.jpg" src="https://foofish.net/images/e281-fyshfur3673884.jpg" /></p>
<p>当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文变量名只是最开始瞎写的时候边写语料边写代码时懒得切英文输入法了。</p>
<p>中文变量名也就忍了,但代码逻辑不好懂,最后我还是忍着剧烈的头痛把它的原理读懂了。</p>
<p>这究竟咋实现的呢?</p>
<p>其实,最后生成的文章内容都来自于素材文件 data.json, 这个文件的结构是这样的</p>
<div class="highlight"><pre><span></span><span class="p">{</span>
<span class="s2">"famous"</span><span class="p">:[</span>
<span class="s2">"爱迪生a,天才是百分之一的勤奋加百分之九十九的汗水。b"</span><span class="p">,</span>
<span class="s2">"查尔斯·史a,一个人几乎可以在任何他怀有无限热忱的事情上成功。b"</span><span class="p">,</span>
<span class="o">....</span>
<span class="p">],</span>
<span class="s2">"bosh"</span><span class="p">:[</span>
<span class="s2">"现在, 解决x的问题, 是非常非常重要的. 所以, "</span><span class="p">,</span>
<span class="s2">"我们不得不面对一个非常尴尬的事实, 那就是, "</span><span class="p">,</span>
<span class="o">....</span>
<span class="p">],</span>
<span class="s2">"after ...</span></pre></div>MitmProxy Bad HTTP request 问题处理2019-11-21T09:12:01+08:002019-11-21T09:12:01+08:00刘志军tag:foofish.net,2019-11-21:mitmproxy-bad-request.html<p>使用 mitmproxy 过程中,出现 Bad HTTP request line 的错误, 具体的错误日志大概是这样:</p>
<div class="highlight"><pre><span></span>10.0.2.2:61356: HTTP protocol error in client request: Bad HTTP request line: b'GET http://[2a01:b000:d:dc1::2:cafe]/images-nc/bg.gif?&testdomain=test-ipv6.com&testname=test_ipv6_img HTTP/1.1'
</pre></div>
<p>会导致图片等资源打不开,原因是这样的,代理请求时,有些请求走的不是HTTP协议,而是直接走的TCP协议 ...</p>SQLAlchemy or、and、like查询举例2019-11-21T09:12:01+08:002019-11-21T09:12:01+08:00刘志军tag:foofish.net,2019-11-21:sqlalchemy_or_and_like.html<h3>等于</h3>
<div class="highlight"><pre><span></span>query.filter(User.name == 'xxx')
</pre></div>
<h3>不等于</h3>
<div class="highlight"><pre><span></span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">'xxx'</span><span class="p">)</span>
</pre></div>
<h3>like</h3>
<div class="highlight"><pre><span></span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">like</span><span class="p">(</span><span class="s1">'</span><span class="si">%x</span><span class="s1">xx%'</span><span class="p">))</span>
</pre></div>
<h3>IN查询</h3>
<div class="highlight"><pre><span></span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">in_</span><span class="p">([</span><span class="s1">'leela'</span><span class="p">,</span> <span class="s1">'akshay'</span><span class="p">,</span> <span class="s1">'santanu'</span><span class="p">]))</span>
</pre></div>
<h3>NOT IN 查询</h3>
<div class="highlight"><pre><span></span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="o">~</span><span class="n">User</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">in_</span><span class="p">([</span><span class="s1">'lee'</span><span class="p">,</span> <span class="s1">'sonal'</span><span class="p">,</span> <span class="s1">'akshay'</span><span class="p">]))</span>
</pre></div>
<h3>ISNULL</h3>
<div class="highlight"><pre><span></span><span class="n">query</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">User</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">is_</span><span class="p">(</span><span class="bp">None</span><span class="p">))</span>
</pre></div>
<h3>IS NOT NULL ...</h3>用 python 下载 vimeo 视频2019-10-22T13:47:06+08:002019-10-22T13:47:06+08:00刘志军tag:foofish.net,2019-10-22:python-download-vimeo.html<p>现在vimeo上的视频尝试过使用在线的第三方网站进行下载,发现有些链接根本不支持,我决定用python解决这个问题。</p>Python3.8 新特性:f-strings调试2019-10-21T03:08:33+08:002019-10-21T03:08:33+08:00刘志军tag:foofish.net,2019-10-21:fstring-debug.html<p>这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟什么是仅位置参数(Positional-Only Arguments)</p>Python3.8 新特性:仅位置参数2019-10-18T03:08:33+08:002019-10-18T03:08:33+08:00刘志军tag:foofish.net,2019-10-18:pep457.html<p>这是Python3.8新特性的第二篇,第一篇介绍了赋值表达式,这篇文章花几分钟什么是仅位置参数(Positional-Only Arguments)</p>Python3.8 新特性:赋值表达式2019-10-17T03:08:33+08:002019-10-17T03:08:33+08:00刘志军tag:foofish.net,2019-10-17:pep572.html<p>赋值表达式的语法是:“ name := expression ”,这个曾经引起很大争议特性,最终还是加入到了Python3.8。不过它也仅仅只是一个锦上添花的特性,可以通过一个例子了解它的使用场景。</p>black: 一个不妥协的Python代码格式化工具2019-10-10T00:18:40+08:002019-10-10T00:18:40+08:00刘志军tag:foofish.net,2019-10-10:black.html<p>代码可读性是评判代码质量的标准之一,有一个衡量代码质量的标准是 Martin 提出的 “WFT” 定律,即每分钟爆出 “WTF” 的次数。你在读别人代码或者做 Code Review 的时候有没有 “WTF” 冲动呢?</p>
<p>为了帮助开发者统一代码风格,Python 社区提出了 PEP8 代码编码风格,它并没有强制要求大家必须遵循,Python 官方同时推出了一个检查代码风格是否符合 PEP8 的工具,名字也叫 pep8,后来被重命名为了 pycodestyle。</p>
<p>看如下代码:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">datetime</span>
<span class="k">class</span> <span class="nc">ListNode</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">val</span>
<span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="bp">None</span>
<span class="c1"># in python next is a ...</span></pre></div>如何识别公众号阅读刷量2019-09-27T11:47:06+08:002019-09-27T11:47:06+08:00刘志军tag:foofish.net,2019-09-27:刷量.html<p>刷量是黑产平台通过手机群控对公众号进行阅读刷量的行为,一篇真实阅读量几百的文章可以花几十上百块钱就可以轻松将阅读量刷到几千。</p>如何使用次幂数据进行公众号阅读刷量监控2019-08-11T13:47:06+08:002019-08-11T13:47:06+08:00刘志军tag:foofish.net,2019-08-11:ershicimi_monitor.html<p>如果你还没用过 Fabric,那么这篇文章就是帮你快速上手 Fabric 的。不管你现在用不用,先了解了以后也用得着。</p>Android adb 命令使用无线WIFI进行调试2019-08-10T09:12:01+08:002019-08-10T09:12:01+08:00刘志军tag:foofish.net,2019-08-10:adb-wireless-debug.html<p>使用USB线进行ADB调试有个问题就是经常线会松动,导致 device not found。这里有另一种方法就是使用WIFI无线连接调试。</p>
<p>首先确保手机和电脑在同一个局域网内。</p>
<p>第一步先使用USB将电脑与手机进行链接,打开命令行窗口,让手机监听一个TCP/IP连接,指定端口号:</p>
<div class="highlight"><pre><span></span> ~ adb tcpip 9999
restarting in TCP mode port: 9999
</pre></div>
<p>端口号 9999 可以换成其他的,但不要与电脑其它端口有冲突。</p>
<p>第二步查看手机IP</p>
<div class="highlight"><pre><span></span>~ adb shell ifconfig wlan0
wlan0 Link encap:UNSPEC Driver icnss
inet addr:192.168.31.104 Bcast:192.168.31.255 Mask:255.255 ...</pre></div>SQLAlchemy 多对多查询2019-07-23T06:12:01+08:002019-07-23T06:12:01+08:00刘志军tag:foofish.net,2019-07-23:sqlalchemy_many_to_many.html<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Video</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">comment</span><span class="o">=</span><span class="s2">"标题"</span><span class="p">)</span>
<span class="n">tags</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">relationship</span><span class="p">(</span><span class="s2">"Tag"</span><span class="p">,</span> <span class="n">secondary</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">lazy</span><span class="o">=</span><span class="s1">'subquery'</span><span class="p">,</span>
<span class="n">backref</span><span class="o">=</span><span class="n">db</span><span class="o">.</span><span class="n">backref</span><span class="p">(</span><span class="s1">'videos'</span><span class="p">,</span> <span class="n">lazy</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">Tag</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> 视频标签</span>
<span class="sd"> """</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">String</span><span class="p">(</span><span class="mi">100</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">comment</span><span class="o">=</span><span class="s2">"名称"</span><span class="p">)</span>
<span class="n">default_fields</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'id'</span><span class="p">,</span> <span class="s1">'name'</span><span class="p">]</span>
<span class="n">video_tag_table</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Table</span><span class="p">(</span><span class="s1">'video_tag_table'</span><span class="p">,</span>
<span class="n">db</span><span class="o">.</span><span class="n">Column ...</span></pre></div>如何判断公众号是否有刷阅读量行为2019-07-20T13:47:06+08:002019-07-20T13:47:06+08:00刘志军tag:foofish.net,2019-07-20:gongzhonghaoshualiang.html<p>广告主在公众号投放广告时,一般会通过文章阅读量等数据来评估公众号的投放价格,毕竟粉丝数这东西不对外公开咱们口说无凭。举例来说,假设公众号一周平均阅读量是10000,如果按照1元/阅读的标准收费,报价是1万。</p>用Pelican搭建一个极简静态博客系统2019-07-18T13:47:06+08:002019-07-18T13:47:06+08:00刘志军tag:foofish.net,2019-07-18:pelican.html<p>我一直建议每个开发者都要有写博客记笔记的习惯,一来可以沉淀知识,二来可以帮助别人,我使用过很多博客平台,也用Python开发过博客系统,就这么个东西折腾好几年,一直找不到理想的产品,直到我用Pelican之前。</p>Django admin 删除默认的 delete select action 操作2019-07-06T09:12:01+08:002019-07-06T09:12:01+08:00刘志军tag:foofish.net,2019-07-06:django_remove_delete_select_action.html<p>如图:</p>
<p><img alt="export_selected.png" src="https://foofish.net/images/export_selected.png" /></p>
<p>如果要移除默认的 delete_selected 操作,可以通过重写 get_actions 方法实现。</p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyModelAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
<span class="o">...</span>
<span class="c1"># 所有用户都不可见</span>
<span class="k">def</span> <span class="nf">get_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">actions</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_actions</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">'delete_selected'</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="k">del</span> <span class="n">actions</span><span class="p">[</span><span class="s1">'delete_selected'</span><span class="p">]</span>
<span class="k">return</span> <span class="n">actions</span>
<span class="c1"># 针对某个特定的用户不可见</span>
<span class="k">def</span> <span class="nf">get_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
<span class="n">actions</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_actions</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">'J'</span><span class="p">:</span>
<span class="k">if</span> <span class="s1">'delete_selected'</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="k">del ...</span></pre></div>SQLAlchemy update 报错2019-06-13T06:12:01+08:002019-06-13T06:12:01+08:00刘志军tag:foofish.net,2019-06-13:sqlalchemy_Cannot_evaluate_clauselist.html<p>更新语句是这样的:</p>
<p><code>python
result = Doctor.query\
.filter(Doctor.department_id==department_id) \
.filter(Doctor.id.in_(tuple(doctor_ids))) \
.update({"department_id":None})</code>
执行的时候报错</p>
<p>sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator <function comma_op at 0x03DA6ED0>". Specify 'fetch' or False for the synchronize_session parameter.
Traceback (most recent call last):</p>
<p>解决方法是:</p>
<div class="highlight"><pre><span></span><span class="n">result</span> <span class="o">=</span> <span class="n">Doctor ...</span></pre></div>Django 建立多字段唯一索引2019-06-08T09:12:01+08:002019-06-08T09:12:01+08:00刘志军tag:foofish.net,2019-06-08:django_unique_together.html<p>Django 中建立但字段唯一索引很简单,就是在字段上指定unique=True即可,如果是多字段唯一索引,可以使用<code>unique-together</code></p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">ModelA</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="n">field1</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="n">field2</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateField</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">unique</span><span class="o">-</span><span class="n">together</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'field1'</span><span class="p">,</span> <span class="s1">'field2'</span><span class="p">)</span>
</pre></div>
<p>对应的SQL语句是</p>
<div class="highlight"><pre><span></span>CREATE UNIQUE INDEX index_name on table (field1, field2)
</pre></div>SQLAlchemy Connection 事务操作2019-06-06T11:47:06+08:002019-06-06T11:47:06+08:00刘志军tag:foofish.net,2019-06-06:python-sqlalchemy-connection-trasition.html<p>默认情况,MySQL执行的SQL是autocommit的,SALAlchemy 查询语句也是 autocommit的,就是说如果没有明确声明事务的begin,每个单独的SQL都是一个独立的事务。但是在做交易系统时,比如银行给用户A转账给用户B时,有两个操作,从A里面减100,然后给B加100。这两个操作必须放在一个事务里面才行,否是就会出现钱扣了,对方又没到账的情况。</p>SQLAlchemy的Mapping与Declarative2019-06-05T11:47:06+08:002019-06-05T11:47:06+08:00刘志军tag:foofish.net,2019-06-05:python-mapping-declarative.html<p>前面介绍过vSQLAlchemy中的 Engine 和 Connection,这两个对象用在row SQL (原生的sql语句)上操作,而 ORM(Object Relational Mapper)则是一种用面向对象的思维来操作表数据的技术。所谓ORM 就是Python 对象到数据表的一种映射关系。</p>我也来记一次 关于 MySQL Waiting for table metadata lock 的问题2019-06-05T09:12:01+08:002019-06-05T09:12:01+08:00刘志军tag:foofish.net,2019-06-05:mysql-waiting-for-table.html<p>问题的起因是这样的,我在准备执行修改表结构的SQL,主要是新增字段,然后就卡住了,网站也无法访问了。系统瞬间崩溃,出现 502访问超时。</p>
<p>现在就来分析一下这个问题的原因。</p>
<p>Waiting for table metadata lock 的意思当前线程正在等待获取该表的 metadata 独占锁,但是该锁现在被其它线程占用了,如果对方一直不释放的话,我们就只能一直处于等待状态,后面对该表查询的线程也只能处于等待的状态,因此就导致了前面出现的这种情况,表结构修改不了,网站也无法正常访问了。</p>
<p>怎么知道该操作正处于 Waiting for table metadata lock 状态呢? 使用命令 <code>show processlist</code> 查看当前线程的运行情况。</p>
<p>如果你的网站访问量很大的话,而且修改的这个表又是被频繁读写的表,那么现在你估计会看到很多条Waiting for table metadata lock,大家都在等着这把锁的释放。怎么办呢?</p>
<p>正常情况就是等会儿就好了,如果长时间等待,该锁一定是被未提交的事务占用了,可以通过sql查询</p>
<div class="highlight"><pre><span></span>select trx_state ...</pre></div>MySQL 5.8 导出文件 报错 secure-file-priv2019-06-03T09:12:01+08:002019-06-03T09:12:01+08:00刘志军tag:foofish.net,2019-06-03:python-secure-file-priv.html<p>在执行一个批量杀进程的SQL时,本来我想将执行结果导出到文件,结果出现错误提示:ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement</p>
<div class="highlight"><pre><span></span> <span class="k">SELECT</span> <span class="n">CONCAT</span><span class="p">(</span><span class="s1">'KILL '</span><span class="p">,</span><span class="n">id</span><span class="p">,</span><span class="s1">';'</span><span class="p">)</span> <span class="k">AS</span> <span class="n">run_this</span> <span class="k">FROM</span> <span class="n">information_schema</span><span class="p">.</span><span class="n">processlist</span> <span class="k">WHERE</span> <span class="k">Host</span> <span class="k">LIKE</span> <span class="s1">'xxxx%'</span> <span class="k">ORDER</span> <span class="k">BY</span> <span class="n">id</span> <span class="k">into</span> <span class="n">outfile</span> <span class="s1">'/tmp/kill_process.txt'</span>
</pre></div>
<p>大致意思是MySQL启动的指定了参数 secure-file-priv,所以你要将文件导入到指定的目录下面去。</p>
<p>可以先查下该目录在什么位置</p>
<div class="highlight"><pre><span></span>mysql> SHOW VARIABLES LIKE ...</pre></div>Echart多条折线图单选2019-06-02T09:12:01+08:002019-06-02T09:12:01+08:00刘志军tag:foofish.net,2019-06-02:echart-single-select.html<p>只需要设置<code>legend</code>属性,就可以实现效果, data 参数表示可选的折线有哪几条, selected 表示默认哪些显示,true 表示显示,false 不限,selectedMode 表示单选,选了A就不能选B。</p>
<div class="highlight"><pre><span></span><span class="nx">legend</span><span class="o">:</span> <span class="p">{</span>
<span class="nx">data</span><span class="o">:</span> <span class="p">[</span><span class="s1">'阅读'</span><span class="p">,</span> <span class="s1">'在看'</span><span class="p">,</span> <span class="s1">'评论'</span><span class="p">,</span> <span class="s1">'赞赏'</span><span class="p">],</span>
<span class="nx">selected</span><span class="o">:</span> <span class="p">{</span>
<span class="s1">'阅读'</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="s1">'在看'</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="s1">'评论'</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="s1">'赞赏'</span><span class="o">:</span> <span class="kc">false</span>
<span class="p">},</span>
<span class="nx">selectedMode</span><span class="o">:</span><span class="s2">"single"</span>
<span class="p">},</span>
</pre></div>
<p><img alt="WX20190602-093737@2x.png" src="../../images/WX20190602-093737@2x.png" /></p>SQLAlchemy 中的 Engine 是什么?2019-06-01T11:47:06+08:002019-06-01T11:47:06+08:00刘志军tag:foofish.net,2019-06-01:python-sqlalchemy-engine.html<p>Engine 翻译过来就是引擎的意思,汽车通过引擎来驱动,而 SQLAlchemy 是通过 Engine 来驱动,Engine 维护了一个连接池(Pool)对象和方言(Dialect)。</p>阿里云 ossutil 使用2019-05-31T09:12:01+08:002019-05-31T09:12:01+08:00刘志军tag:foofish.net,2019-05-31:aliyun-ossutil.html<p>ossutil 是阿里云提供的命令行工具,用于管理OSS数据,支持将文件上传到阿里云的 OSS,同时支持Windows、Linux、 Mac平台。</p>
<h3>Linux 下载安装</h3>
<div class="highlight"><pre><span></span>wget http://gosspublic.alicdn.com/ossutil/1.6.1/ossutil64
chmod 755 ossutil64
# 初始化配置
./ossutil64 config
</pre></div>
<p>第一次使用前需要初始化配置参数,主要是填accessKeyID 和 accessKeySecret 以及 endpoint 等参数。</p>
<p><img alt="微信截图_20190531124027.png" src="https://foofish.net/images/微信截图_20190531124027.png" /></p>
<p>stsToken 可以为空</p>
<ul>
<li>endpoint:填写Bucket所在地域的域名信息</li>
<li>accessKeyID 与 accessKeySecret 进入控制台,点击个人头像即可看到</li>
</ul>
<p><img alt="微信截图_20190531124222.png" src="https://foofish.net/images/微信截图_20190531124222.png" /></p>
<p>从本地拷贝文件到OSS</p>
<div class="highlight"><pre><span></span>./ossutil64 cp /data/backupfile.sql.gz3 oss ...</pre></div>Chrome免安装插件截图方法2019-05-30T09:12:01+08:002019-05-30T09:12:01+08:00刘志军tag:foofish.net,2019-05-30:chrome-screenshot.html<p>打开开发者调试工具,Mac上按快捷键 <code>Cmd + Shift + P</code> ,Windows 使用快捷键 <code>Ctrl + Shift + P</code>,然后输入关键字 <code>screenshot</code> 即可进行区域截图、整屏截图、节点截图。</p>
<p><img alt="WX20190530-005523@2x.png" src="https://foofish.net/images/WX20190530-005523@2x.png" /></p>SQLAlchemy 查询最大值和最大的记录2019-05-29T09:13:01+08:002019-05-29T09:13:01+08:00刘志军tag:foofish.net,2019-05-29:sqlalchemy_max.html<p>查询最大值和最大值的那条记录方法完全不同,最大值可以使用函数 <code>max</code>,而最大记录需要先根据该字段排序(倒序),然后取第一条就是最大的记录</p>
<p>查最大值可以`func.max:</p>
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sqlalchemy.sql</span> <span class="kn">import</span> <span class="n">func</span>
<span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="p">)</span><span class="o">.</span><span class="n">scalar</span><span class="p">()</span>
</pre></div>
<p>查最大记录</p>
<div class="highlight"><pre><span></span><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Article</span><span class="p">)</span><span class="o">.</span><span class="n">order_by</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="o">.</span><span class="n">desc</span><span class="p">())</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
</pre></div>SQLAlchemy 查询指定的列字段2019-05-29T09:13:01+08:002019-05-29T09:13:01+08:00刘志军tag:foofish.net,2019-05-29:sqlalchemy_query_specify_column.html<p>如果是SQLAlchemy,可以使用:</p>
<div class="highlight"><pre><span></span><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="c1"># 或者</span>
<span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="o">.</span><span class="n">with_entities</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</pre></div>
<p>如果是 Flask_SQLAlchemy 使用:</p>
<div class="highlight"><pre><span></span><span class="n">Article</span><span class="o">.</span><span class="n">query</span> \
<span class="o">.</span><span class="n">with_entities</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="c1"># 或者</span>
<span class="n">db</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Article</span><span class="o">.</span><span class="n">read_num</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</pre></div>Django Model 多个外键来源于同一个表该如何表示2019-05-29T09:12:01+08:002019-05-29T09:12:01+08:00刘志军tag:foofish.net,2019-05-29:django_more_foreign_key_same_table.html<p>用 <code>related_name</code> 属性区分名字就可以了。在表中对应的字段就是 sample1_id, sample2_id</p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sample</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">class</span> <span class="nc">Mymodel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">model</span><span class="p">):</span>
<span class="n">example1</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Sample</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">'sample1'</span><span class="p">)</span>
<span class="n">example2</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">Sample</span><span class="p">,</span> <span class="n">related_name</span><span class="o">=</span><span class="s1">'sample2'</span><span class="p">)</span>
</pre></div>SQLAlchemy Model 有多个来源于同一个表中的外键如何表示2019-05-29T09:12:01+08:002019-05-29T09:12:01+08:00刘志军tag:foofish.net,2019-05-29:sqlalchemy_more_foreign_key_same_table.html<p>用related_name 属性制定名字就可以了。对应在表中的字段就是 sample1_id, sample2_id</p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Company</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">'company'</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">String</span><span class="p">(</span><span class="mi">50</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Employee</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">'employee'</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">company_id</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'company.id'</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">stakeholder_id</span> <span class="o">=</span> <span class="n">Column</span><span class="p">(</span><span class="n">Integer</span><span class="p">,</span> <span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'company.id'</span><span class="p">),</span> <span class="n">nullable</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">company</span> <span class="o">=</span> <span class="n">relationship</span><span class="p">(</span><span class="s2">"Company ...</span></pre></div>数据库方言(dialect)是什么?2019-05-27T09:12:01+08:002019-05-27T09:12:01+08:00刘志军tag:foofish.net,2019-05-27:what-is-db-dialect.html<p>抛开数据库,生活中的方言是什么?方言就是某个地方的特色语言,是一种区别于其它地方的语言,只有你们这一小块地方能听懂,出了这个地方又是另一种方言。</p>
<p>数据库方言也是如此,MySQL 是一种方言,Oracle 也是一种方言,MSSQL 也是一种方言,他们之间在遵循 SQL 规范的前提下,都有各自的扩展特性。</p>
<p>拿分页来说,MySQL 的分页是用关键字 <code>limit</code>, 而 Oracle 用的是 <code>ROWNUM</code>,MSSQL 可能又是另一种分页方式。</p>
<div class="highlight"><pre><span></span><span class="c1"># mysql</span>
<span class="n">select</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">t_user</span> <span class="nn">limit</span> <span class="mi">10</span><span class="p">;</span>
<span class="c1"># oracle</span>
<span class="n">select</span> <span class="o">*</span> <span class="kn">from</span> <span class="nn">t_user</span> <span class="nn">t</span> <span class="nn">where</span> <span class="nn">ROWNUM</span> <span class="o"><</span><span class="mi">10</span><span class="p">;</span>
</pre></div>
<p>这对于 ORM 框架来说,为了在上层的ORM层做了无差别调用,比如分页,对使用者来说,不管你底层用的是MySQL还是Oracle,他们用的都是一样的接口,但是底层需要根据你使用的数据库方言不同而调用不同的DBAPI ...</p>Django 数据模型 ForeignKey 的 on_delete 属性的可选值2019-05-24T09:12:01+08:002019-05-24T09:12:01+08:00刘志军tag:foofish.net,2019-05-24:django-foreignkey-on-delete.html<p>订单Order 与 用户 User 是多对一的关系,Order 表中有User外键 user_id,当你删除一条user数据的时候,与之关联的订单Order记录会受影响,具体根据 <code>on_delete</code> 的值来决定。</p>
<div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Order</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="n">user</span><span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="n">User</span><span class="p">,</span> <span class="n">on_delete</span><span class="o">=</span><span class="n">models</span><span class="o">.</span><span class="n">CASCADE</span><span class="p">)</span>
</pre></div>
<p>on_delete 没有默认值,定义的时候必须显示地指定一个值。否则会报错:</p>
<div class="highlight"><pre><span></span><span class="ne">TypeError</span><span class="p">:</span> <span class="n">__init__</span><span class="p">()</span> <span class="n">missing</span> <span class="mi">1</span> <span class="n">required</span> <span class="n">positional</span> <span class="n">argument</span><span class="p">:</span> <span class="s1">'on_delete'</span>
</pre></div>
<ul>
<li>CASCADE:级联删除,当你删除user记录时,与之关联的所有 order 都会被删除。</li>
<li>PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误,也就是说,如果有外键关联,就不允许删除,除非先把关联了外键的记录删除掉 ...</li></ul>操作数据库的命令行神器:mycli2019-05-23T18:12:01+08:002019-05-23T18:12:01+08:00刘志军tag:foofish.net,2019-05-23:mycli.html<p>GitHub 可谓各种神器都有,今天发现一个操作数据库的命令行工具,可以自动补全和语法高亮,以前在终端敲 SQL 的时候,你不仅要记住表名、字段名,各种函数都需要记住才能敲出一条完整的语句来,否则就是先 Google 百度查文档。而有了mycli 这个命令行辅助工具之后,省心不少。</p>Flask 环境变量 FLASK_APP 说明2019-05-23T09:12:01+08:002019-05-23T09:12:01+08:00刘志军tag:foofish.net,2019-05-23:flask_app.html<h3>FLASK_APP</h3>
<p><code>FLASK_APP</code> 用来说明Flask实例对象 app 所在的模块位置,例如 我把 app 写在 <code>hello.py</code> 中</p>
<div class="highlight"><pre><span></span><span class="c1"># hello.py</span>
<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
</pre></div>
<p>你必须设置 FLASK_APP=hello.py</p>
<div class="highlight"><pre><span></span># window
set FLASK_APP=hello.py
# linux
export FLASK_APP=hello.py
</pre></div>
<p>如果你没有指定<code>FLASK_APP</code>环境变量,flask 运行的时候首先会尝试自动去项目的根目录下的 <code>wsgi.py</code> 文件 或者 <code>app.py</code> 文件里面去找。</p>
<p>没找到就会报 NoAppException 错误。</p>
<p><img alt="微信截图_20190523125222.png" src="../../images/微信截图_20190523125222.png" /></p>Flask 环境变量 FLASK_ENV 说明2019-05-23T09:12:01+08:002019-05-23T09:12:01+08:00刘志军tag:foofish.net,2019-05-23:flask_env.html<h3>FLASK_ENV</h3>
<p><code>FLASK_ENV</code> 变量用来告诉Flask当前应用所运行的环境,有两个值,分别是 “production” 和 “development”,默认缺省值是“production”。</p>
<p>Flask自身和第三方扩展插件可能会基于此变量值改变自己的行为。</p>
<p>如果设置为:“development”,那么可实现:</p>
<p>1、激活调试器。
2、激活自动重载。
3、打开 Flask 应用的调试模式。</p>
<p>只要项目中代码有发生变化,程序就会自动重启。 在开发调试过程中很有用,如果是production,每次还要手动重启。</p>
<div class="highlight"><pre><span></span>D:\my>pipenv run flask run
* Environment: development
* Debug mode: on
[2019-05-23 19:06:22,004] INFO in __init__: True
* Restarting with stat ...</pre></div>Flask如何在view中读取config中的配置信息2019-05-23T09:12:01+08:002019-05-23T09:12:01+08:00刘志军tag:foofish.net,2019-05-23:flask_read_config_in_view.html<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">current_app</span> <span class="k">as</span> <span class="n">app</span>
<span class="nd">@api.route</span><span class="p">(</span><span class="s1">'/info/'</span><span class="p">,</span> <span class="n">methods</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'GET'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">get_account_num</span><span class="p">():</span>
<span class="n">num</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s2">"INFO"</span><span class="p">]</span>
</pre></div>如何用 Python 读取 Excel 文件2019-05-21T18:12:01+08:002019-05-21T18:12:01+08:00刘志军tag:foofish.net,2019-05-21:python-read-excle-file.html<p>Python 读取 Excel 需要用到第三方库 <code>xlrd</code>, 直接用 pip 安装就可以。</p>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">xlrd</span>
</pre></div>
<p>使用 xlrd 只需要理解几个概念就可以入门了。我用一张图来说明,因为 excel 是一个电子表格,跟数据库里面的表非常象,有行、列的概念。</p>
<p><img alt="WXWorkCapture_15584092753598.png" src="https://foofish.net/images/WXWorkCapture_15584092753598.png" /></p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xlrd</span>
<span class="c1"># 加载excel文件</span>
<span class="n">book</span> <span class="o">=</span> <span class="n">xlrd</span><span class="o">.</span><span class="n">open_workbook</span><span class="p">(</span><span class="s2">"C://Users/xxxx.xlsx"</span><span class="p">)</span>
<span class="c1"># 读第0张工作表</span>
<span class="n">sheet</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># 读第1行</span>
<span class="n">start_row</span> <span class="o">=</span> <span class="mi">1</span>
<span class="c1"># 获取第0张工资表</span>
<span class="n">sh</span> <span class="o">=</span> <span class="n">book</span><span class="o">.</span><span class="n">sheet_by_index</span><span class="p">(</span><span class="n">sheet</span><span class="p">)</span>
<span class="c1"># sh.nrows 表示所有行</span>
<span class="k">for</span> <span class="n">rx</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start_row ...</span></pre></div>supervisor 环境变量设置2019-05-21T08:12:01+08:002019-05-21T08:12:01+08:00刘志军tag:foofish.net,2019-05-21:supervisor-envrionment.html<p>项目中涉及到敏感的配置信息例如数据库密码等都可以配置在环境变量中,不跟代码一起走,以防代码哪天被泄露了导致整个系统暴露于公众之中,配置信息可以当做环境变量配置在 Supervisor 文件中,</p>
<div class="highlight"><pre><span></span><span class="k">[program:xxxx]</span>
<span class="na">environment</span><span class="o">=</span><span class="s">KEY=value</span>
</pre></div>
<p>如果有多个变量可以用','分隔</p>
<div class="highlight"><pre><span></span><span class="k">[program:xxxx]</span>
<span class="na">environment</span><span class="o">=</span><span class="s">KEY=value,Key2=value2</span>
</pre></div>
<p>如果value中含有特殊符号,必须用双引号「"」引起来。</p>
<div class="highlight"><pre><span></span><span class="k">[program:xxxx]</span>
<span class="na">environment</span><span class="o">=</span><span class="s">KEY=value,Key2=value2,key3="val.&"</span>
</pre></div>
<p>多个变量之间还可以换行,这样看起来舒服一点</p>
<div class="highlight"><pre><span></span><span class="k">[program:xxxx]</span>
<span class="na">environment</span><span class="o">=</span><span class="s"></span>
<span class="s"> KEY=value,</span>
<span class="s"> Key2=value2,</span>
<span class="s"> key3="val.&"</span>
</pre></div>GitBook 导出 PDF 报错 ebook-convert not internal or external command 怎么解决2019-05-20T18:12:01+08:002019-05-20T18:12:01+08:00刘志军tag:foofish.net,2019-05-20:gitbook-export-error.html<p>GitBook 导出 PDF 时报错:EbookError: Error during ebook generation: 'ebook-convert' is not recognized as an internal or external command,
operable program or batch file.</p>
<div class="highlight"><pre><span></span><span class="n">D</span><span class="p">:</span>\<span class="o">></span><span class="n">gitbook</span> <span class="n">pdf</span>
<span class="n">info</span><span class="p">:</span> <span class="mi">7</span> <span class="n">plugins</span> <span class="n">are</span> <span class="n">installed</span>
<span class="n">info</span><span class="p">:</span> <span class="mi">6</span> <span class="n">explicitly</span> <span class="n">listed</span>
<span class="n">info</span><span class="p">:</span> <span class="n">loading</span> <span class="n">plugin</span> <span class="s2">"highlight"</span><span class="o">...</span> <span class="n">OK</span>
<span class="n">info</span><span class="p">:</span> <span class="n">loading</span> <span class="n">plugin</span> <span class="s2">"search"</span><span class="o">...</span> <span class="n">OK</span>
<span class="n">info</span><span class="p">:</span> <span class="n">loading</span> <span class="n">plugin</span> <span class="s2">"lunr ...</span></pre></div>重写 Django Admin 的 Delete Selected 动作2019-05-20T09:12:01+08:002019-05-20T09:12:01+08:00刘志军tag:foofish.net,2019-05-20:override_delete_seleted_action.html<p>Django 管理后面有个删除选择项的 Action,有时我们想对它进行重写,在删除的时候做一些额外操作,例如删除model的同时,更新与之关联的对象,默认是这样的</p>
<p><img alt="微信截图_20190520143754.png" src="https://foofish.net/images/微信截图_20190520143754.png" /></p>
<p>重写后是这样的:</p>
<p><img alt="微信截图_20190520144959.png" src="https://foofish.net/images/微信截图_20190520144959.png" /></p>
<p>具体的实现方式:</p>
<div class="highlight"><pre><span></span><span class="nd">@admin.register</span><span class="p">(</span><span class="n">RecommendArticle</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">RecommendArticleAdmin</span><span class="p">(</span><span class="n">admin</span><span class="o">.</span><span class="n">ModelAdmin</span><span class="p">):</span>
<span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'delete_selected'</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">delete_selected</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">obj</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
<span class="c1"># 这里除了删除选择的对象之外,我还更新了其它对象</span>
<span class="n">Article</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">o</span><span class="o">.</span><span class="n">id</span><span class="p">)</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">is_ad</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">o</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
<span class="n">delete_selected</span><span class="o">.</span><span class="n">short_description</span> <span class="o">=</span> <span class="s1">'移除推荐列表'</span>
</pre></div>Python email 正则表达式写法2019-05-19T09:12:01+08:002019-05-19T09:12:01+08:00刘志军tag:foofish.net,2019-05-19:python-re-email.html<p>判断字符串是不是email电子邮件格式,可使用如下正则表达式表示:</p>
<div class="highlight"><pre><span></span><span class="s2">r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"</span>
</pre></div>
<p>能覆盖99%的场景</p>
<p>看个例子:</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">re</span>
<span class="o">>>></span> <span class="n">rex</span> <span class="o">=</span> <span class="s2">r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"</span>
<span class="o">>>></span> <span class="n">email</span> <span class="o">=</span> <span class="s2">"lzjun567@gmail.com"</span>
<span class="o">>>></span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">rex</span><span class="p">,</span> <span class="n">email</span><span class="p">)</span> <span class="c1"># 匹配</span>
<span class="o"><</span><span class="n">re</span><span class="o">.</span><span class="n">Match</span> <span class="nb">object</span><span class="p">;</span> <span class="n">span</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">18</span><span class="p">),</span> <span class="n">match</span><span class="o">=</span><span class="s1">'lzjun567@gmail.com'</span><span class="o">></span>
<span class="o">>>></span>
<span class="o">>>></span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">rex</span><span class="p">,</span> <span class="s2">"xxxx"</span><span class="p">)</span> <span class="c1"># 不匹配</span>
</pre></div>运行 SQLAlchemy 报错:Operand should contain 1 column(s) 怎么解决2019-05-19T08:12:01+08:002019-05-19T08:12:01+08:00刘志军tag:foofish.net,2019-05-19:sqlalchemy-mysql-operand.html<p>出现这种问题需要根据具体的sql语句来分析,在查询和插入的时候都有可能报这个错,反正就是sql没法正常插入,比如我遇到的一种情况就是有个字段本来应该是插入字符串,但是我不小心传了个list进去了,然后就报这个错了。</p>
<p>解决办法就是就list转换成str传进去就ok了。 具体的排错法就是将sql语句放在命令行里面执行一下,看哪里出了问题。</p>Django Admin 日期字段格式化2019-05-16T09:12:01+08:002019-05-16T09:12:01+08:00刘志军tag:foofish.net,2019-05-16:django-admin-date-format.html<p>在Django Admin 面板中,对于一些model里面的时间类型的字段,不希望显示默认的时间格式,例如下图:默认是 年-月-日 时:分:秒,有些字段我只希望显示日期,不需要具体的时间,该怎么办?</p>
<p><img alt="微信截图_20190516204025.png" src="../../images/微信截图_20190516204025.png" /></p>
<p>分两种情况</p>
<p>如果只是希望某几个时间字段有新的格式,那么就可以为它单独写一个函数</p>
<div class="highlight"><pre><span></span><span class="n">list_display</span> <span class="o">=</span> <span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="s1">'simple_published_at'</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">simple_published_at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="n">published_at</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2">"</span><span class="p">)</span>
<span class="n">simple_published_at</span><span class="o">.</span><span class="n">short_description</span><span class="o">=</span><span class="s2">"发文时间"</span>
</pre></div>
<p>如果希望整个系统所有的时间字段都使用同一种日期格式,那么可以在配置文件 setting.py 文件设置 DATETIME_FORMAT</p>
<div class="highlight"><pre><span></span>DATETIME_FORMAT = "Y-m-d"
</pre></div>python 处理 字典转换成URL查询参数2019-05-16T09:12:01+08:002019-05-16T09:12:01+08:00刘志军tag:foofish.net,2019-05-16:python-urlencode.html<div class="highlight"><pre><span></span><span class="c1">#python2 写法</span>
<span class="kn">import</span> <span class="nn">urllib</span>
<span class="n">urllib</span><span class="o">.</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">'key1'</span><span class="p">:</span> <span class="s1">'value1'</span><span class="p">,</span> <span class="s1">'key2'</span><span class="p">:</span> <span class="s1">'value2'</span><span class="p">})</span>
<span class="c1">#python3 写法</span>
<span class="kn">import</span> <span class="nn">urllib.parse</span>
<span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">'key1'</span><span class="p">:</span> <span class="s1">'value1'</span><span class="p">,</span> <span class="s1">'key2'</span><span class="p">:</span> <span class="s1">'value2'</span><span class="p">})</span>
<span class="c1"># 输出</span>
<span class="s1">'key1=value1&key2=value2</span>
</pre></div>命名难,难于上青天2019-05-16T07:21:55+08:002019-05-16T07:21:55+08:00刘志军tag:foofish.net,2019-05-16:python-naming.html<p>Quora 问答社区的一个开发者投票统计,程序员最大的难题是:如何命名(例如:给变量,类,函数等等),光是如何命名一项的选票几乎是其它八项的投票结果的总和。如何给变量命名,如何让它变得有意义成了程序员不可逾越的难题,这篇文章参考了 Clean Code ,提供7条命名建议,希望能在取名字的过程中给你带来一些帮助。</p>python3判断list是否为空2019-05-13T09:12:01+08:002019-05-13T09:12:01+08:00刘志军tag:foofish.net,2019-05-13:python-list-is-empty.html<p>在Python 中,判断list 是否为空可以直接用:</p>
<div class="highlight"><pre><span></span><span class="n">names</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">names</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"list不为空"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"list为空"</span><span class="p">)</span>
</pre></div>
<p>因为对于一个空的list,它的真值永远都是False。用 <code>len</code> 函数检查list里面元素的长度为0来判断是否为空是多此一举</p>
<div class="highlight"><pre><span></span><span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">names</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s2">"list 为空"</span><span class="p">)</span>
</pre></div>
<p>同样的道理可以衍生到字典(dict),集合(set),元组(tuple)上面去。</p>Python3 处理 URL 编码2019-05-13T09:12:01+08:002019-05-13T09:12:01+08:00刘志军tag:foofish.net,2019-05-13:url-encode.html<p>URL 链接只能包含ASCII字符,如果有中文等非ascii 字符,就要先编码,例如</p>
<div class="highlight"><pre><span></span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">ershicimi</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">search</span><span class="err">?</span><span class="n">q</span><span class="o">=</span><span class="err">程序员</span>
</pre></div>
<p>浏览器最自动转换成:</p>
<div class="highlight"><pre><span></span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">ershicimi</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">search</span><span class="err">?</span><span class="n">q</span><span class="o">=%</span><span class="n">E7</span><span class="o">%</span><span class="n">A8</span><span class="o">%</span><span class="mi">8</span><span class="n">B</span><span class="o">%</span><span class="n">E5</span><span class="o">%</span><span class="n">BA</span><span class="o">%</span><span class="mi">8</span><span class="n">F</span><span class="o">%</span><span class="n">E5</span><span class="o">%</span><span class="mi">91</span><span class="o">%</span><span class="mi">98</span>
</pre></div>
<p>在Python中,如将转换呢? 可以使用 <code>urllib.parse</code> 模块中的方法 <code>quote</code></p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">urllib.parse</span>
<span class="o">>>></span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">quote</span><span class="p">(</span><span class="s2">"https://www.ershicimi.com/search?q ...</span></pre></div>如何在非 Web 环境运行 Flask 关联的代码2019-05-13T08:12:01+08:002019-05-13T08:12:01+08:00刘志军tag:foofish.net,2019-05-13:run-flask-code-out-of-web.html<p>有时候需要在Flask项目中运行某些代码,但是又不希望是开启Webserver,比如直接运行一个函数,这个函数可能引用了flask相关的代码,如果直接运行会报错,提示:No application found. Either work inside a view function or push。</p>
<p>为了解决这个问题,可以这样做,将应用上下文推入到堆栈中:</p>
<div class="highlight"><pre><span></span><span class="n">app</span> <span class="o">=</span> <span class="n">create_app</span><span class="p">()</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">app_context</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">push</span><span class="p">()</span>
<span class="c1"># 再运行你的代码</span>
<span class="o">....</span>
</pre></div>Python 在函数中使用全局变量2019-05-13T06:12:01+08:002019-05-13T06:12:01+08:00刘志军tag:foofish.net,2019-05-13:use-global-variables-in-functions.html<p>在模块中定义的变量属于全局变量,函数中定义的变量属于局部变量,两个变量即使同名也互补影响,例如:</p>
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># 10</span>
</pre></div>
<p>如果希望打印出来a的结果是2,那么就要将函数中变量<code>a</code>声明为全局变量,使用关键字 <code>global</code></p>
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">foo</span><span class="p">():</span>
<span class="k">global</span> <span class="n">a</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># 2</span>
</pre></div>一行代码将 cookie 字符串转换成字典对象2019-05-12T09:12:01+08:002019-05-12T09:12:01+08:00刘志军tag:foofish.net,2019-05-12:extract_cookie.html<p>有时候我们写爬虫,需要将浏览器中的cookie字符串转换成字典对象,可以用一行代码将其转换过来,例如:</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">convert_cookies_to_dict</span><span class="p">(</span><span class="n">cookies</span><span class="p">):</span>
<span class="n">cookies</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">([</span><span class="n">l</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"="</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">cookies</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"; "</span><span class="p">)])</span>
<span class="k">return</span> <span class="n">cookies</span>
</pre></div>
<p>因为cookie在浏览器里面是用一个字符串来表示的,多个cookie之间用<code>;</code>连接,每个cookie的键值对是用<code>=</code>连接起来的,所以我们只需要用<code>split</code>方法将字符串进行切分就可以实现了。</p>Python 字符串转日期时间2019-05-12T01:14:01+08:002019-05-12T01:14:01+08:00刘志军tag:foofish.net,2019-05-12:str-to-datetime.html<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="s1">'2019-05-09 18:18:16'</span>
<span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</pre></div>Python日期时间转字符串2019-05-12T01:13:01+08:002019-05-12T01:13:01+08:00刘志军tag:foofish.net,2019-05-12:datetime-to-str.html<p>时间转字符串:strftime</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">,</span> <span class="s2">"2019-01-01 10:10:20"</span><span class="p">)</span>
<span class="s1">'2019-05-09 18:18:16'</span>
</pre></div>Python时间戳转日期时间2019-05-12T01:12:01+08:002019-05-12T01:12:01+08:00刘志军tag:foofish.net,2019-05-12:timestamp-to-datetime.html<p>时间戳转时间:fromtimestamp</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">datetime</span>
<span class="o">>>></span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="mi">1557397096</span><span class="p">)</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
</pre></div>
<p>时间转字符串:strftime</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="n">d</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="mi">1557397096</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d</span>
<span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">d</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
<span class="s1">'2019-05-09 18:18:16'</span>
</pre></div>CSS块级元素与行内元素2019-05-08T16:03:00+08:002019-05-08T16:03:00+08:00刘志军tag:foofish.net,2019-05-08:block-vs-inline.html<p>对于前端知识我一直没有体系化的掌握,所了解的都是一些零星散散的知识点,遇到问题半天才能解决,所以打算进行系统的学习一遍,基础的东西都是一劳永逸,这是重学前端系列的第一篇文章。</p>Python如何提取url中的参数2019-05-07T09:12:01+08:002019-05-07T09:12:01+08:00刘志军tag:foofish.net,2019-05-07:python-extract-query-string.html<p>如何用 Python 提取URL中的参数,例如:</p>
<div class="highlight"><pre><span></span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">foofish</span><span class="o">.</span><span class="n">net</span><span class="err">?</span><span class="n">q</span><span class="o">=</span><span class="n">python</span><span class="o">&</span><span class="n">k</span><span class="o">=</span><span class="n">java</span>
</pre></div>
<p>提取其中的参数为字典对象</p>
<div class="highlight"><pre><span></span><span class="p">{</span>
<span class="s2">"q"</span><span class="p">:</span> <span class="s2">"python"</span><span class="p">,</span>
<span class="s2">"k"</span><span class="p">:</span> <span class="s2">"java"</span>
<span class="p">}</span>
</pre></div>
<p>可以使用 <code>urlib.parse</code> 模块中的 urlpase 类来实现</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="kn">import</span> <span class="nn">urllib.parse</span> <span class="kn">as</span> <span class="nn">urlparse</span>
<span class="o">>>></span> <span class="n">url</span> <span class="o">=</span> <span class="s1">'http://foofish.net?q=python&k=java'</span>
<span class="o">>>></span> <span class="n">parsed</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">parsed</span>
<span class="n">ParseResult</span><span class="p">(</span><span class="n">scheme</span><span class="o">=</span><span class="s1">'http'</span><span class="p">,</span> <span class="n">netloc</span><span class="o">=</span><span class="s1">'foofish.net'</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="s1">'q ...</span></pre></div>Celery 报错 Windows 平台:ValueError: not enough values to unpack (expected 3, got 0)2019-05-06T09:12:01+08:002019-05-06T09:12:01+08:00刘志军tag:foofish.net,2019-05-06:celery_windows_error.html<p>在Windows平台Celery运行的时候报错:ValueError: not enough values to unpack</p>
<div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">2019</span><span class="o">-</span><span class="mo">05</span><span class="o">-</span><span class="mo">06</span> <span class="mi">09</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mi">10</span><span class="p">,</span><span class="mi">365</span><span class="p">:</span> <span class="n">ERROR</span><span class="o">/</span><span class="n">MainProcess</span><span class="p">]</span> <span class="n">Task</span> <span class="n">handler</span> <span class="n">raised</span> <span class="n">error</span><span class="p">:</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'not enough values to unpack (expected 3, got 0)'</span><span class="p">)</span>
<span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
<span class="n">File</span> <span class="s2">"c:\users\lzjun\.virtualenvs\weihub-flask-j3runhkh\lib\site-packages</span><span class="se">\b</span><span class="s2">illiard\pool.py"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">358</span><span class="p">,</span> <span class="ow">in ...</span></pre></div>VSCode 多行批量添加冒号2019-04-30T09:12:01+08:002019-04-30T09:12:01+08:00刘志军tag:foofish.net,2019-04-30:vscode-replace.html<h3>问题:VSCode 多行批量添加冒号</h3>
<p>有时候需要在 VSCode 重执行多行批量操作,比如给每行添加字符冒号、分号或者其它字符,你可以使用 VSCode 的基于正则表达式的替换功能。操作步骤:</p>
<p>1、<code>Ctrl + H</code> 调出替换窗口</p>
<p>2、<code>Alt + R</code> 开起正则表达式匹配模式</p>
<p>3、查找行输入 <code>$</code> ,替换行输入替换后的文本</p>
<p>4、<code>Ctrl+Alt+Enter</code> 替换全部</p>
<p><img alt="微信截图_20190430155056.png" src="../../images/微信截图_20190430155056.png" /></p>Windows pip 安装 pyautogui 报错 UnicodeDecodeError: 'gbk' codec can't decode2019-04-26T09:12:01+08:002019-04-26T09:12:01+08:00刘志军tag:foofish.net,2019-04-26:python-pyautogui-error.html<p>在Windows平台安装 PyAutoGUI 报错, UnicodeDecodeError: 'gbk' codec can't decode byte 0xa2 in position 905: illegal multibyte sequence, 这是字符编码的问题,解决的方法就是降低 PyGetWindow 版本,安装 PyGetWindow==0.0.1 后再安装 PyAutoGUI</p>
<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">PyGetWindow</span><span class="o">==</span><span class="mf">0.0</span><span class="o">.</span><span class="mi">1</span>
<span class="n">pip</span> <span class="n">install</span> <span class="n">pyautogui</span>
</pre></div>命令行神器 Click 快速上手2019-04-25T09:12:01+08:002019-04-25T09:12:01+08:00刘志军tag:foofish.net,2019-04-25:python-click.html<p>写 Python 的经常要写一些命令行工具,虽然标准库提供有命令行解析工具 <code>Argparse</code>,但是写起来非常麻烦,我很少会使用它。命令行工具中用起来最爽的就是 Click,它是 Flask 的团队 pallets 的开源项目。Click 只要很少的代码就可以优雅地创造一个命令行工具,它致力于将创建命令行工具的过程变的快速而有趣。</p>《代码整洁之道》读书笔记2019-04-16T11:47:06+08:002019-04-16T11:47:06+08:00刘志军tag:foofish.net,2019-04-16:clean-code.html<p>这是我最近在看的一本书 《代码整洁之道》 ,很早以前看过一次,不过基本都忘得差不多了,现在重新来看,发现现在写的代码隐约还是从中吸取了不少经验,这本书也推荐给你。</p>Python静态类型检查新工具:pyright 使用指南2019-03-29T01:43:33+08:002019-03-29T01:43:33+08:00刘志军tag:foofish.net,2019-03-29:pyright.html<p>微软开源Python静态类型检查新工具:pyright</p>996.ICU 火了2019-03-28T09:12:01+08:002019-03-28T09:12:01+08:00刘志军tag:foofish.net,2019-03-28:996ICU.html<p>GitHub有个项目写了大量的Python小脚本,有近万个的Star,我列了30个Pyhon小例子,或许能帮助你快速上手Python,而且他们都是能在实际中可以用到的,有时还能帮助你节省大量时间,相信照着练完之后,代码水平会大有长进。</p>提高工作效率的一点建议2019-03-25T09:12:01+08:002019-03-25T09:12:01+08:00刘志军tag:foofish.net,2019-03-25:productivity_of_programmer.html<p>程序员加班几乎是常态,你是不是每天都在加班?是不是觉得每天时间不够用?如果你的回答是 yes 的话,那么可能跟你的工作效率有关系。</p>说 Python 是最糟糕的语言,都没说到点子上2019-03-15T09:12:01+08:002019-03-15T09:12:01+08:00刘志军tag:foofish.net,2019-03-15:python-zaogao.html<p>有知友写了篇文章 《Python 是我用过最糟糕的语言之一》,说了一堆Python的缺点,但没一条说到点子上,引号里面是作者的观点,后面是我对他所说的做的解释。</p>Python Web 学习资料总结2019-03-14T09:12:01+08:002019-03-14T09:12:01+08:00刘志军tag:foofish.net,2019-03-14:python-web-resource.html30个Python 小例子,帮你快速上手Python2019-03-09T09:12:01+08:002019-03-09T09:12:01+08:00刘志军tag:foofish.net,2019-03-09:python-demo.html<p>GitHub有个项目写了大量的Python小脚本,有近万个的Star,我列了30个Pyhon小例子,或许能帮助你快速上手Python,而且他们都是能在实际中可以用到的,有时还能帮助你节省大量时间,相信照着练完之后,代码水平会大有长进。</p>2018 Python 调查报告解读,Flask 首次超越 Django,Python3 全面取代 Python22019-03-01T09:12:01+08:002019-03-01T09:12:01+08:00刘志军tag:foofish.net,2019-03-01:python-survey-2018.html<p>jetbrains 联合 Python基金会针对全球150个国家和超过2万名开发者做了一项调查,接受调查的对象都是正在使用Python的开发者和学生。 其中有84%的人把 Python 作为第一语言使用。和 Python 搭配最多的语言是 JavaScript。</p>110到Python面试题2019-02-25T09:12:01+08:002019-02-25T09:12:01+08:00刘志军tag:foofish.net,2019-02-25:interview_summary.html<p>信息量非常大!这是给Python开发者准备的110道笔试面试题,我只把问题列出来了,答案见文末,建议每道题都要认真刷一遍,有些题可以尝试用多种方式来解答,甚至做延伸学习,说真的,很多题都可以单独拎出来写一篇文章,毛主席说过一句话,不打无准备之仗,不打无把握之仗,方能立于不败之地,面试前准备越充分越自信,通过率越高。</p>Python不行了?2019-02-22T13:47:06+08:002019-02-22T13:47:06+08:00刘志军tag:foofish.net,2019-02-22:python_vs_go.html<p>看到一些文章开始鼓吹Go语言,唱衰Python,诸如 「Python再见,你好Go」,「不要再用Python了!谷歌等正在研发新编程语言」,「Python该过时了!深度学习需要新编程语言」,总结起来就是Python不行。</p>Python趣味挑战2019-02-22T09:12:01+08:002019-02-22T09:12:01+08:00刘志军tag:foofish.net,2019-02-22:pythonchallenge.html<p>有个牛逼的网站叫 www.pythonchallenge.com ,它是一个在线的 Python 技术挑战平台,一共有33道关卡,你只有正确回答了第一道题才能看到第二道题,依此类推</p>Scode 常用快捷键(Windows版)2019-01-22T09:12:01+08:002019-01-22T09:12:01+08:00刘志军tag:foofish.net,2019-01-22:scode-shortcut-windows.html<ul>
<li>打开/关闭侧边栏 ctrl + b</li>
<li>快速换行 ctrl + enter</li>
<li>当前文件查找内容:Ctrl+f</li>
<li>查找文件名:Ctrl+p</li>
<li>定位代码行数 Ctrl+g</li>
<li>删除整行:Ctrl+x</li>
<li>复制粘贴整行:Ctrl+d</li>
<li>格式化代码:Shift + Alt + F</li>
<li>全局替换:Ctrl+Alt+Enter</li>
<li>替换文本:Ctrl+h</li>
</ul>基于开源中文分词工具pkuseg-python,我用张小龙的3万字演讲做了测试2019-01-15T13:47:06+08:002019-01-15T13:47:06+08:00刘志军tag:foofish.net,2019-01-15:pkuseg-python.html<p>做过搜索的同学都知道,分词的好坏直接决定了搜索的质量,在英文中分词比中文要简单,因为英文是一个个单词通过空格来划分每个词的,而中文都一个个句子,单独一个汉字没有任何意义,必须联系前后文字才能正确表达它的意思。</p>靠写作能挣100万吗2019-01-01T00:57:59+08:002019-01-01T00:57:59+08:00刘志军tag:foofish.net,2019-01-01:make-money.html<p>不要被标题吓到,今天想说的就是写作</p>重新理解创业:一个创业者的途中思考2018-12-26T02:20:25+08:002018-12-26T02:20:25+08:00刘志军tag:foofish.net,2018-12-26:startup.html<p>标题是一本书的名字,作者是周航,易到用车的创始人,易到用车我没体验过,因为它是面向高端商务人士的一种打车服务。易到用车早期打车服务探索者,比Uber还早两个月,最后与滴滴的竞争败下阵,贱卖给乐视。</p>远程部署神器 Fabric,支持 Python32018-12-25T13:47:06+08:002018-12-25T13:47:06+08:00刘志军tag:foofish.net,2018-12-25:fabric.html<p>如果你还没用过 Fabric,那么这篇文章就是帮你快速上手 Fabric 的。不管你现在用不用,先了解了以后也用得着。</p>Pipenv 上手指南2018-12-19T13:47:06+08:002018-12-19T13:47:06+08:00刘志军tag:foofish.net,2018-12-19:Pipenv_tutorial.html<p>你可能听说Pipenv,如果还没使用过,那么恭喜你,这个工具可以让你的开发工作省心不少。同一时间段内我们有可能负责多个项目的开发,保证每个项目的环境独立,互不影响非常有必要的,virtualenv 就是干这个事的,Pip 主要负责安装第三方包,而 Pipenv 就是两者的结合体,给我们的开发带来了更多的便利性。 所有的命令都可以通过 pipenv 完成。</p>Django 最佳实践2018-11-25T13:47:06+08:002018-11-25T13:47:06+08:00刘志军tag:foofish.net,2018-11-25:django-best-practice.html<p>如果你决定学习如何用Python和Django 构建网站,这是不错的选择,这里列出了一系列Django最佳实践,如果你对某些观点不同意,可以在下面留言。</p>提升逼格的两个函数:setdefault 与 defaultdict2018-10-15T13:47:06+08:002018-10-15T13:47:06+08:00刘志军tag:foofish.net,2018-10-15:setdefault-defaultdict.html<p>在做 code review 的时候,发现有同学的代码看起来不那么 pythonic,忍不住写篇短文介绍两个函数:setdefault 与 defaultdict。</p>mitmproxy 使用指南2018-10-13T13:47:06+08:002018-10-13T13:47:06+08:00刘志军tag:foofish.net,2018-10-13:mitmproxy-toturial.html<p>mitmproxy 是 man-in-the-middle proxy 的简称,译为中间人代理工具,可以用来拦截、修改、保存 HTTP/HTTPS 请求。以命令行终端形式呈现,操作上类似于Vim,同时提供了 mitmweb 插件,是类似于 Chrome 浏览器开发者模式的可视化工具。</p>Celery 快速入门2018-09-28T13:47:06+08:002018-09-28T13:47:06+08:00刘志军tag:foofish.net,2018-09-28:celery-toturial1.html<p>在一个应用服务中,对于时效性要求没那么高的业务场景,我们没必要等到所有任务执行完才返回结果,例如用户注册场景中,保存了用户账号密码之后,就可以立即返回,后续的账号激活邮件,可以用一种异步的形式去处理,这种异步操作可以用队列服务来实现。否则,如果等到邮件发送成功可能几秒过去了。非常影响用户体验,而 Celery 可以用来实现这样的场景。</p>关于Python包和模块的10个知识清单2018-09-27T13:47:06+08:002018-09-27T13:47:06+08:00刘志军tag:foofish.net,2018-09-27:package-module-tips.html<p>有同学问题关于模块与包的问题,特给新人总结的关于Python包与模块的10个知识清单。</p>Python黑科技之FuckIt.py2018-09-01T11:47:06+08:002018-09-01T11:47:06+08:00刘志军tag:foofish.net,2018-09-01:fuckit.html<p>说起 Python 强大的地方,你可能想到是它的优雅、简洁、开发速度快,社区活跃度高。但真正使得这门语言经久不衰的一个重要原因是它的无所不能,因为社区有各种各样的第三库,使得我们用Python实现一个东西实在是太简单了,你经常会看到几行代码实现爬虫,10行代码实现人脸识别,虽然有些夸张,但确实就是有这样的库帮你把所有的繁文缛节全部封装了,最后给你开放一个优雅的 API。</p>Python:如何用一行代码获取上个月是几月2018-09-01T11:47:06+08:002018-09-01T11:47:06+08:00刘志军tag:foofish.net,2018-09-01:python-arrow.html<p>本文介绍的关于Python时间日期处理,日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外。但是,你知道在Python中有多少个相关的模块吗?datetime、time、calendar、 dateutil、 pytz 等等。 你知道有多少种数据类型吗?date、time、datetime、tzinfo、timedelta 等等。</p>推荐一些Flask资源2018-08-29T11:47:06+08:002018-08-29T11:47:06+08:00刘志军tag:foofish.net,2018-08-29:flask-resource.html<p>Flask 是 Python 中最流行的 Web 框架之一,以小巧、灵活、可扩展性强著称,相比 Django,它给了开发者最大限度的自由,如果你不喜欢关系型数据库,ok,没问题,切换成本非常低,而 Django 呢?你能遇到的问题它都帮你想好并且提供了对应解决方案,你自己就不要去重复造轮子了,比如模版引擎,ORM,不爽想替换?这个有点难。</p>关于Python 解包,你需要知道的一切2018-08-12T11:47:06+08:002018-08-12T11:47:06+08:00刘志军tag:foofish.net,2018-08-12:python-unpacking.html<p>解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来(防杠精:此处描述并不严谨,因为容器中的元素并没有发生改变)放在其它地方,好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员,这个过程就是解包。Python 中的解包是自动完成的</p>Python中10个必读的PEP提案2018-08-06T11:47:06+08:002018-08-06T11:47:06+08:00刘志军tag:foofish.net,2018-08-06:python-pep.html<p>PEP 是 Python 增强提案(Python Enhancement Proposal)的缩写。社区通过PEP来给 Python 语言建言献策,每个Python版本你所看到的新特性和一些变化都是通过PEP提案经过社区决策层讨论、投票决议,最终才有我们看到的功能。今天给大家介绍10个你需要知道的PEP。</p>不要太迷信网络上的数据2018-07-14T11:47:06+08:002018-07-14T11:47:06+08:00刘志军tag:foofish.net,2018-07-14:dont-trust-data.html<p>每个月初都有各种编程语言的排行榜,排行榜各式各样,时不时 Python 冒出来个排名第一,超越Java云云,比如这个 PYPL 指数榜,Python 势不可挡,开发者看了喜闻乐见。PYPL 指数原始数据基于 Google trends ,根据编程语言在 Google 上的搜索频率(次数)来评估语言的流行度。</p>为什么有人说 Python 多线程是鸡肋?2018-05-04T13:47:06+08:002018-05-04T13:47:06+08:00刘志军tag:foofish.net,2018-05-04:thread.html<p>为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?</p>看了很多代码,自己写却无从下手?2018-03-28T09:12:01+08:002018-03-28T09:12:01+08:00刘志军tag:foofish.net,2018-03-28:kan-liao-hen-duo-dai-ma-zi-ji-xie-que-wu-cong-xia-shou.html<p>学编程跟游泳很像,都是手艺活,重在实操。</p>什么是 Python 元类2018-01-28T13:47:06+08:002018-01-28T13:47:06+08:00刘志军tag:foofish.net,2018-01-28:what-is-metaclass.html<p>龟叔发明了 Python,然后集成了一堆概念在这门语言里面,比如:迭代器,装饰器,函数,生成器,类,对象,协程等等。</p>用 matplotlib 画图无法显示中文问题的根源及解决方案2018-01-21T13:47:06+08:002018-01-21T13:47:06+08:00刘志军tag:foofish.net,2018-01-21:matplotlib_mess.html<p>用pandas 或者 matplotlib 画图时,遇到中文时会显示出乱码</p>这些 Chrome 插件,提升效率不止10倍(二)2018-01-08T13:47:06+08:002018-01-08T13:47:06+08:00刘志军tag:foofish.net,2018-01-08:chrome-extenstion2.html<p>如果我说 Chrome 是世界上最好用的浏览器,估计也没什么人会反对,但是因为某些不可描述的原因导致很多功能没法正常使用,比如最具特性的扩展插件功能很多时候需要翻墙从应用商店下载,(其实也可以使用开发者模式从本地加载),今天推荐几个我最常用的插件。</p>用 Python 处理 HTML 转义字符2017-12-26T02:20:25+08:002017-12-26T02:20:25+08:00刘志军tag:foofish.net,2017-12-26:pycon-html-escape.html<p>写爬虫是一个发送请求,提取数据,清洗数据,存储数据的过程。在这个过程中,不同的数据源返回的数据格式各不相同,有 JSON 格式,有 XML 文档,不过大部分还是 HTML 文档,HTML 经常会混杂有转移字符,这些字符我们需要把它转义成真正的字符。</p>5个酷毙的Python工具2017-12-26T02:20:25+08:002017-12-26T02:20:25+08:00刘志军tag:foofish.net,2017-12-26:pycon-tools.html<p>工欲善其事必先利其器,一个好的工具能让起到事半功倍的效果,Python社区提供了足够多的优秀工具来帮助开发者更方便的实现某些想法,下面这几个工具给我的工作也带来了很多便利,推荐给追求美好事物的你。</p>零基础如何自学Python2017-12-15T13:47:06+08:002017-12-15T13:47:06+08:00刘志军tag:foofish.net,2017-12-15:how-to-learn-python1.html<p>程序员在普通人眼里就像魔法师,一个脚本轻松抢几十盒月饼,一个插件解决春运抢票难题,几行代码搭建一个网站,用微信自动聊天,在程序员眼里这些事太稀松平常了,他们只不过是利用了编程语言指挥计算机去自动完成一些需要人类重复操作的繁琐过程,等你会编程也就不觉得大惊小怪了。</p>用 Python 连接 MySQL 的几种姿势2017-12-05T13:47:06+08:002017-12-05T13:47:06+08:00刘志军tag:foofish.net,2017-12-05:python-mysql.html<p>尽管很多 NoSQL 数据库近几年大放异彩,但是像 MySQL 这样的关系型数据库依然是互联网的主流数据库之一,每个学 Python 的都有必要学好一门数据库,不管你是做数据分析,还是网络爬虫,Web 开发、亦或是机器学习,你都离不开要和数据库打交道,而 MySQL 又是最流行的一种数据库,这篇文章介绍 Python 操作 MySQL 的几种方式,你可以在实际开发过程中根据实际情况合理选择。</p>Python每日一题:第6题:如何设计一个代码统计工具2017-11-22T13:47:06+08:002017-11-22T13:47:06+08:00刘志军tag:foofish.net,2017-11-22:how-to-count-code.html<p>设计一个程序,用于统计一个项目中的代码行数,包括文件个数,代码行数,注释行数,空行行数。尽量设计灵活一点可以通过输入不同参数来统计不同语言的项目</p>What the fuck Python2017-11-18T13:47:06+08:002017-11-18T13:47:06+08:00刘志军tag:foofish.net,2017-11-18:What_the_fuck_Python.html<p>工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的效果</p>Python每日一题:第5题2017-11-13T13:47:06+08:002017-11-13T13:47:06+08:00刘志军tag:foofish.net,2017-11-13:daily-question5.html<p>设计一个算法,将URL转换成5部分,分别是:schema、netloc、path、query_params、fragment。</p>Python每日一题:第4题:用Python实现斐波那契数列2017-11-08T13:47:06+08:002017-11-08T13:47:06+08:00刘志军tag:foofish.net,2017-11-08:daily-question4.html<p>用Python实现斐波那契数列</p>Python每日一题:第3题:统计一个文件中每个单词出现的次数2017-11-03T13:47:06+08:002017-11-03T13:47:06+08:00刘志军tag:foofish.net,2017-11-03:daily-question3.html<p>统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。</p>Python陷阱:为什么不能用可变对象作为默认参数的值2017-11-03T13:47:06+08:002017-11-03T13:47:06+08:00刘志军tag:foofish.net,2017-11-03:python-tricks.html<p>上次分享过一篇关于图解Python变量与赋值的文章,今天接着这个话题继续聊一聊关于赋值的一些坑。先来看一道题目:</p>作为GitHub初级用户,如何向GitHub贡献代码2017-11-01T11:03:06+08:002017-11-01T11:03:06+08:00刘志军tag:foofish.net,2017-11-01:how-to-contribute-to-open-source-in-github.html<p>人类无法阻挡开源的力量,初学者如何参与一个 GitHub 开源项目</p>Python每日一题:第2题2017-10-30T13:47:06+08:002017-10-30T13:47:06+08:00刘志军tag:foofish.net,2017-10-30:daily-question2.html<p>设计一个猜数字的游戏,系统随机生成一个1~100之间的整数,玩家有5次机会,每猜一次系统就会提示玩家该数字是偏大还是偏小,如果猜中了,则告知玩家并提前结束游戏,如果5次都没猜中,结束游戏并告知正确答案。</p>Python每日一题:第1题2017-10-29T13:47:06+08:002017-10-29T13:47:06+08:00刘志军tag:foofish.net,2017-10-29:daily-question1.html<p>在使用 for 循环迭代一个列表时,有时我们需要获取列表中每个元素所在的下标位置是多少,例如 numbers = [10, 29, 30, 41],要求输出 (0, 10),(1, 29),(2, 30),(3, 41)</p>自学Python编程怎么学才不那么孤独2017-10-24T11:47:06+08:002017-10-24T11:47:06+08:00刘志军tag:foofish.net,2017-10-24:how-to-learn-python.html<p>Python 是当下最流行的编程语言,甚至高盛的一个调查表示 Python 超过汉语成为未来最重要技能,虽然有点耸人听闻,随着人工智能渗入到我们生活中的方方面面,以后编程就跟现在汽车一样普及,成为一项基本技能。</p>图解Python变量与赋值2017-10-22T13:47:06+08:002017-10-22T13:47:06+08:00刘志军tag:foofish.net,2017-10-22:python-variable.html<p>初学Python很多萌新表示对变量与赋值不理解,Python是一门独特的语言,与C语言有很大区别,学过C的都知道,给变量赋值时,需要先定义变量并指定类型,定义变量时会开辟一块内存区域,用于存储值,变量是该段内存区域的首地址</p>Pycharm中一些不为人知的技巧2017-10-13T13:47:06+08:002017-10-13T13:47:06+08:00刘志军tag:foofish.net,2017-10-13:pycharm-tips.html<p>工欲善其事必先利其器,Pycharm 是最受欢迎的Python开发工具,它提供的功能非常强大,是构建大型项目的理想工具之一,如果能挖掘出里面实用技巧,能带来事半功倍的效果</p>小程序开发体验2017-09-18T13:47:06+08:002017-09-18T13:47:06+08:00刘志军tag:foofish.net,2017-09-18:wechat-app.html<p>关注了公众号「Python之禅」的读者可能已经看到公众号绑定了一个小程序「Python之禅」,这是微信给所有订阅者发送的一条提醒。</p>发起一场GitChat是什么体验?2017-09-13T13:47:06+08:002017-09-13T13:47:06+08:00刘志军tag:foofish.net,2017-09-13:gitchat.html<p>如果说今年是智能元年,那么去年应该是直播元年,直播的形式也出现了多样化,从视频直播、语音直播,再到文字直播。GitChat 某种意义上也算是文字直播里的一种,不过,本质上它更是一款基于内容的产品。可能很多人跟我一样对 GitChat 不太了解,没记错的话,GitChat 诞生于 2016 年,一开始我就有关注其公众号,不过那时也没看懂 GitChat 这个产品,直到昨天我发起一场 Chat 的时候才明白它的产品形态。</p>Python:动态语言与鸭子类型2017-09-05T13:47:06+08:002017-09-05T13:47:06+08:00刘志军tag:foofish.net,2017-09-05:dynamic_type_and_duck_type.html<p>动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力如PHP、Ruby、Python 都属于动态语言,而C、C++、Java等语言则不属于动态语言。</p>关于操作 Python 列表最常见的10个问答2017-09-01T09:12:01+08:002017-09-01T09:12:01+08:00刘志军tag:foofish.net,2017-09-01:python-list-top10.html<p>列表是最常用的数据类型之一,本文整理了 StackOverflow 上关于列表操作被访问最多的10个问答,如果你在开发过程中遇到这些问题,不妨先思考一下如何解决。</p>用Python爬取微博数据生成词云图片2017-08-29T11:47:06+08:002017-08-29T11:47:06+08:00刘志军tag:foofish.net,2017-08-29:python-word-cloud.html<p>很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景。</p>荐书|4 本相见恨晚的 Linux 入门书籍2017-08-25T09:12:01+08:002017-08-25T09:12:01+08:00刘志军tag:foofish.net,2017-08-25:linux-book.html<p>有读者问可否推荐一些 Linux 入门书籍,刚好在知乎也看到类似的问题,几个零碎的命令难以在 Linux 环境中存活,如果要真正形成自己的知识体系,还是要靠阅读专业书籍来积累。Linux 对后端开发是必备技能,对 Python 开发者来说重要性不言而喻,将来你写的每一行代码,都有可能在 Linux 环境中运行。前端开发是否有必要学习 Linux 呢?这个就好比学驾照,学到了,总有一天会给你带来便利,暂时没时间学的可以先收藏着。</p>关于高效使用Python字典的清单2017-08-22T09:12:01+08:002017-08-22T09:12:01+08:00刘志军tag:foofish.net,2017-08-22:how-to-python-dict.html<p>字典(dict)对象是 Python 最常用的数据结构,社区曾有人开玩笑地说:"Python企图用字典装载整个世界",字典在Python中的重要性不言而喻,这里整理了几个关于高效使用字典的清单,希望Python开发者可以在日常应用开发中合理利用,让代码更加 Pythonic。</p>Python爬虫如何入门2017-08-18T13:47:06+08:002017-08-18T13:47:06+08:00刘志军tag:foofish.net,2017-08-18:python-crawler.html<p>学爬虫是循序渐进的过程,一上来直接爬虫肯定不现实,除非你已经有很好的背景知识了。作为零基础小白,大体上可分为三个阶段,第一阶段是入门,掌握必备的基础知识,第二阶段是模仿,跟着别人的爬虫代码学,弄懂每一行代码,第三阶段是自己写爬虫,这个阶段你开始有自己的解题思路了,可以独立设计爬虫系统。</p>字符串 Intern 机制2017-08-12T13:47:06+08:002017-08-12T13:47:06+08:00刘志军tag:foofish.net,2017-08-12:str-intern.html<p>字符串在 Python 中是最简单也是最常用的数据类型之一,在 CPython 中字符串的实现原理使用了一种叫做 Intern(字符串驻留)的技术来提高字符串效率。究竟什么是 intern 机制,这种机制又是通过什么方式来提高字符串效率的呢?希望这篇文章能够抛砖引玉。</p>单例模式的几种写法2017-08-09T04:55:47+08:002017-08-09T04:55:47+08:00刘志军tag:foofish.net,2017-08-09:python_singleton.html<p>Python创建单例模式的三种方式:1.使用装饰器,2. 使用基类, 3.使用元类</p>Python 2 和 Python 3 主要区别有哪些(一)?2017-08-01T13:47:06+08:002017-08-01T13:47:06+08:00刘志军tag:foofish.net,2017-08-01:python2_python3.html<p>你可能从来没有听说过学 Java 的纠结是学 JDK6 还是 JDK7,也没听说学 PHP 的纠结是学 PHP5 还是 PHP7,但在 Python 社区,有这么个怪问题:“学 Python 到底是学2还是学3?”这个问题就像月经一样每隔断时间就出现在你面前,也成了很多初学者的选择困惑,这个问题的“始作俑者”当然是 Python 它爹,大家众说纷纭,有说 Python2 是主流,大公司都在用,你应该学 2 。也有说 Python3 才是未来主流,大多数第三方框架已基本支持 Python3。个人看法是 Python2 还会存在很长一段时间(只要那些用 Python2 的公司还没倒闭,就一直会存在),你去找工作很有可能就需要用到 2,而 Python3 也是你必须要掌握的,因为越来越多的人会迁移到 3 上去,本质上,它俩是同一门语言,仅仅只是极少部分(1%?并没有严格统计)不兼容的地方,所以就没所谓学哪一个好,学了一个,另一个花很少时间就能掌握。今天给大家介绍 Python2 和 Python3 的一些主要区别。</p>Python进阶好书推荐2017-07-26T13:47:06+08:002017-07-26T13:47:06+08:00刘志军tag:foofish.net,2017-07-26:effective-python.html<p>上次给大家推荐了 Python 入门书,这次有读者问撸完了入门书之后该看什么书,这次就来推荐一本进阶书《Effective Python》。</p>耐人寻味的 for...else...语句2017-07-24T13:47:06+08:002017-07-24T13:47:06+08:00刘志军tag:foofish.net,2017-07-24:for-else.html<p>在 Python 中 else 不仅可以和 if 搭配使用,还有另一种特有的句法是 for…else …,除此之外,它还可以和 while、try…except 组合使用</p>如何正确理解@classmethod与@staticmethod2017-07-19T09:12:01+08:002017-07-19T09:12:01+08:00刘志军tag:foofish.net,2017-07-19:different_bettween_classmethod_and_staticmethod.html<p>Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的<strong>类方法</strong>,也可以是 @staticmethod 装饰的<strong>静态方法</strong>,用的最多的还是不带装饰器的<strong>实例方法</strong>,如果把这几个方法放一块,对初学者来说无疑是一头雾水,那我们该如何正确地使用它们呢?</p>简述 __init__、__new__、__call__ 方法2017-07-12T13:47:06+08:002017-07-12T13:47:06+08:00刘志军tag:foofish.net,2017-07-12:magic-method.html<p>任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建、初始化、使用、垃圾回收,不同的阶段由不同的方法(角色)负责执行。</p>一本书搞定Python入门到实践2017-07-02T09:12:01+08:002017-07-02T09:12:01+08:00刘志军tag:foofish.net,2017-07-02:python-toturial.html<p>上周介绍了几本Python从入门到进阶书籍,今天继续推荐好书,这本书是《Python编程:从入门到实践》。入门 Python 最好的书之一,适合零基础小白,也适合有其它语言背景的程序员</p>Python是怎么火起来的2017-07-01T09:12:01+08:002017-07-01T09:12:01+08:00刘志军tag:foofish.net,2017-07-01:why-is-python-so-popular.html<p>几年前 Python 在国内还只是一门小众语言,但从 2011开始 到现在,Python 的百度搜索指数翻了10 倍,从下图看得出 Python 在国内的流行度已经直逼 Java,大有赶超之势</p>for循环在Python中是怎么工作的2017-06-29T13:47:06+08:002017-06-29T13:47:06+08:00刘志军tag:foofish.net,2017-06-29:how-for-works-in-python.html<p><code>for...in</code> 是Python程序员使用最多的语句,for 循环用于<strong>迭代</strong>容器对象中的元素,这些对象可以是列表、元组、字典、集合、文件,甚至可以是自定义类或者函数,为什么这么多种类型的对象可以用于 for 循环中呢?究竟还可以作用在哪些对象上呢?答案是任何对象都可以,只要满足一定的条件。这是条件是什么?</p>[Python]写个带参数的装饰器2017-06-22T13:47:06+08:002017-06-22T13:47:06+08:00刘志军tag:foofish.net,2017-06-22:decorator-with-paramter.html<p>上篇文章从函数到装饰器一步一步介绍了Python装饰器的来由,不知你对装饰器理解了没有,强烈建议你自己动手写个装饰器应用到项目中加深理解。装饰器可以很简单,也可以很复杂,具体看业务场景,简单装饰器不带任何参数,而带参数的装饰器则更灵活,还有一种更为复杂的叫类装饰器。</p>Python装饰器为什么难理解?2017-06-17T13:47:06+08:002017-06-17T13:47:06+08:00刘志军tag:foofish.net,2017-06-17:understand-decorator.html<p>无论项目中还是面试都离不开装饰器话题,装饰器的强大在于它能够在不修改原有业务逻辑的情况下对代码进行扩展,权限校验、用户认证、日志记录、性能测试、事务处理、缓存等都是装饰器的绝佳应用场景,它能够最大程度地对代码进行复用。</p>Python列表与元组的区别是?2017-06-09T02:20:25+08:002017-06-09T02:20:25+08:00刘志军tag:foofish.net,2017-06-09:list-different-with-tuple.html<p>“列表(list)与元组(tuple)两种数据类型有哪些区别”这个问题在初级程序员面试中经常碰到,超出面试官预期的答案往往能加不少印象分,也会给后续面试顺利进行提供一定帮助,这道题主要考察候选人对Python基本数据结构的掌握程度,属于简单类型的送分题,那么该如何来回答才不至于丢分?</p>如何快速入门Python2017-06-06T13:47:06+08:002017-06-06T13:47:06+08:00刘志军tag:foofish.net,2017-06-06:python-101.html<p>学习任何一门语言都是从入门(1年左右),通过不间断练习达到熟练水准(3到5年),少数人最终能精通语言,成为执牛耳者,他们是金字塔的最顶层。虽然万事开头难,但好的开始是成功的一半,今天这篇文章就来谈谈如何开始入门 Python。只要方向对了,就不怕路远。</p>用Google挖掘赚钱思路2017-05-31T13:47:06+08:002017-05-31T13:47:06+08:00刘志军tag:foofish.net,2017-05-31:make-money-by-google.html<p>身为程序员,如果学了一堆技术却没有用武之地,实在可惜,如何把自己积累的技术利用起来?通俗一点,程序员有哪些赚钱的门路?</p>爬虫入门系列(六):正则表达式完全指南(下)2017-05-28T13:47:06+08:002017-05-28T13:47:06+08:00刘志军tag:foofish.net,2017-05-28:crawler-re-second.html<p>正则表达式是一种更为强大的字符串匹配、字符串查找、字符串替换等操作工具。上篇讲解了正则表达式的基本概念和语法以及<code>re</code>模块的基本使用方式,这节来详细说说 <code>re</code> 模块作为 Python 正则表达式引擎提供了哪些便利性操作。</p>我看 PyCon 2017大会(附视频合集下载)2017-05-26T02:20:25+08:002017-05-26T02:20:25+08:00刘志军tag:foofish.net,2017-05-26:pycon-2017.html<p>PyCon 2017 大会正在美国波特兰如火如荼地进行,不过它的关注度远没有 Google IO 大会、苹果 WWDC 大会那样受欢迎,毕竟这只是 Python 社区的狂欢节。反观国内的 Python 大环境,情况其实很糟糕,跟整个社会一样,似乎大家都很浮躁。至于 Pycon China,仍需努力。</p>爬虫入门系列(五):正则表达式完全指南(上)2017-05-23T13:47:06+08:002017-05-23T13:47:06+08:00刘志军tag:foofish.net,2017-05-23:re-tutorial.html<p>正则表达式处理文本有如疾风扫秋叶,绝大部分编程语言都内置支持正则表达式,它应用在诸如表单验证、文本提取、替换等场景。爬虫系统更是离不开正则表达式,用好正则表达式往往能收到事半功倍的效果。</p>一步一步教你认识Python闭包2017-05-15T10:40:06+08:002017-05-15T10:40:06+08:00刘志军tag:foofish.net,2017-05-15:python-closure.html<p>在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。</p>什么时候使用Lambda函数?2017-04-30T13:47:06+08:002017-04-30T13:47:06+08:00刘志军tag:foofish.net,2017-04-30:lambda.html<p>Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数。</p>基于Mycat分布式MySQL数据库部署实践指南2017-04-27T13:47:06+08:002017-04-27T13:47:06+08:00刘志军tag:foofish.net,2017-04-27:mysql-for-mycat.html<p>Mycat 是一款基于Java开发的开源数据库中间件,</p>爬虫入门系列(四):HTML文本解析库BeautifulSoup2017-04-26T13:47:06+08:002017-04-26T13:47:06+08:00刘志军tag:foofish.net,2017-04-26:crawler-beautifulsoup.html<p>系列文章的第3篇介绍了网络请求库神器 Requests ,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常有多种不同的格式,一种是 json 格式,这类数据对开发者来说最友好。另一种 XML 格式的,还有一种最常见格式的是 HTML 文档,今天就来讲讲如何从 HTML 中提取出感兴趣的数据</p>如何正确理解关键字"with"与上下文管理器2017-04-20T13:47:06+08:002017-04-20T13:47:06+08:00刘志军tag:foofish.net,2017-04-20:with-and-context-manager.html<p>如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器。</p>爬虫入门系列(三):用 requests 构建知乎 API2017-04-16T13:47:06+08:002017-04-16T13:47:06+08:00刘志军tag:foofish.net,2017-04-16:http-requests-zhihu-api.html<p>Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib、urllib2、urllib3、httplib、httplib2,都是和 HTTP 相关的模块,看名字觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人崩溃。</p>如何正确理解Python函数是第一类对象2017-04-12T13:47:06+08:002017-04-12T13:47:06+08:00刘志军tag:foofish.net,2017-04-12:function-is-first-class-object.html<p>函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了。但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性。那么什么是第一类对象呢?</p>爬虫入门系列(二):优雅的HTTP库requests2017-04-12T13:47:06+08:002017-04-12T13:47:06+08:00刘志军tag:foofish.net,2017-04-12:http-requests.html<p>Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib、urllib2、urllib3、httplib、httplib2,都是和 HTTP 相关的模块,看名字觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人崩溃。</p>用 Anaconda 完美解决 Python2 和 python3 共存问题2017-04-10T00:57:59+08:002017-04-10T00:57:59+08:00刘志军tag:foofish.net,2017-04-10:compatible-py2-and-py3.html<p>Python3 被越来越多的开发者所接受,同时让人尴尬的是很多遗留的老系统依旧运行在 Python2 的环境中,因此有时你不得不同时在两个版本中进行开发,调试。</p>爬虫入门系列(一):快速理解HTTP协议2017-04-06T13:47:06+08:002017-04-06T13:47:06+08:00刘志军tag:foofish.net,2017-04-06:understand-http.html<p>爬虫的基本原理是模拟浏览器进行 HTTP 请求,理解 HTTP 协议是写爬虫的必备基础,招聘网站的爬虫岗位也赫然写着熟练掌握HTTP协议规范,写爬虫还不得不先从HTTP协议开始讲起</p>Python爬虫之模拟知乎登录2017-03-30T13:47:06+08:002017-03-30T13:47:06+08:00刘志军tag:foofish.net,2017-03-30:python-auto-login-zhihu.html<p>经常写爬虫的都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 “登录” 离不开 HTTP 中的 Cookie 技术。</p>Python 中 "is" 与 "==" 操作有什么区别?2017-03-27T13:47:06+08:002017-03-27T13:47:06+08:00刘志军tag:foofish.net,2017-03-27:what-is-difference-between-is-and-euqals.html<p>在 Python 中,比较两个对象(变量)是否相等,可以用 “is” 和 “==” 操作,但它俩有什么区别?什么时候用 “is”,什么时候用 “==” ?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍。</p>Python3 是如何解决棘手的字符编码问题的?2017-03-26T13:47:06+08:002017-03-26T13:47:06+08:00刘志军tag:foofish.net,2017-03-26:how-python3-handle-charset-encoding.html<p>Python3 最重要的一项改进之一就是解决了 Python2 中字符串与字符编码遗留下来的这个大坑。<a href="https://foofish.net/why-python-encoding-is-tricky.html">Python 编码为什么那么蛋疼?</a>已经介绍过 Python2 字符串设计上的一些缺陷:</p>Python 编码为什么那么蛋疼?2017-03-20T13:47:06+08:002017-03-20T13:47:06+08:00刘志军tag:foofish.net,2017-03-20:why-python-encoding-is-tricky.html<p>据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它地方,问题总是重蹈覆辙,str 到 unicode 之间的转换用 decode 还是 encode 方法还特不好记,老是混淆,问题究竟出在哪里?</p>Python入门最容易犯的错误2017-03-19T13:47:06+08:002017-03-19T13:47:06+08:00刘志军tag:foofish.net,2017-03-19:python-newbie-made-mistake-usually.html<p>Python 以其简单易懂的语法格式与其它语言形成鲜明对比,初学者遇到最多的问题就是不按照 Python 的规则来写,即便是有编程经验的程序员,也容易按照固有的思维和语法格式来写 Python 代码,有一个外国小伙总结了一些大家常犯的错误</p>Python 函数中,参数是传值,还是传引用?2017-03-15T09:12:01+08:002017-03-15T09:12:01+08:00刘志军tag:foofish.net,2017-03-15:python-function-args.html<p>在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。</p>看完这篇,你就知道Python生成器是什么2017-03-11T13:47:06+08:002017-03-11T13:47:06+08:00刘志军tag:foofish.net,2017-03-11:what-is-python-generator.html<p>生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得不得去理解它、使用它、甚至爱上它。</p>代码这样写不止于优雅(Python版)2017-03-08T19:18:40+08:002017-03-08T19:18:40+08:00刘志军tag:foofish.net,2017-03-08:idiomatic_part2.html<p>python 这门语言最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。但有时候我们写代码,特别是 Python 初学者,往往还是按照其它语言的思维习惯来写,那样的写法不仅运行速度慢,代码读起来也费尽,给人一种拖泥带水的感觉,过段时间连自己也读不懂。</p>一份来自掘金社区的开发者报告2017-03-07T08:35:03+08:002017-03-07T08:35:03+08:00刘志军tag:foofish.net,2017-03-07:juejin-report.html<p>一份来自掘金社区的开发者报告</p>代码这样写更优雅(Python版)2017-03-01T19:18:40+08:002017-03-01T19:18:40+08:00刘志军tag:foofish.net,2017-03-01:idiomatic_python.html<p>python 这门语言最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。但有时候我们写代码,特别是 Python 初学者,往往还是按照其它语言的思维习惯来写,那样的写法不仅运行速度慢,代码读起来也费尽,给人一种拖泥带水的感觉,过段时间连自己也读不懂。</p>Anaconda 入门安装教程2017-03-01T00:57:59+08:002017-03-01T00:57:59+08:00刘志军tag:foofish.net,2017-03-01:anaconda-install.html<p>Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux、Mac、Windows系统,提供了包管理与环境管理的功能,解决了多版本Python并存、切换以及第三方包安装问题,内置了常用的科学计算包。</p>阮一峰老师文章的常识性错误之 Unicode 与 UTF-82017-02-27T00:18:40+08:002017-02-27T00:18:40+08:00刘志军tag:foofish.net,2017-02-27:unicode_utf-8.html<p>阮一峰老师对普及计算机基础技术功不可没,但毕竟老师不是神,因此也避免不了对某些概念有一些错误的理解</p>HTTPS 为什么更安全,先看这些2017-02-19T13:47:06+08:002017-02-19T13:47:06+08:00刘志军tag:foofish.net,2017-02-19:https-story-1.html<p>密</p>基于微博数据打造一颗“心”2017-02-14T02:33:12+08:002017-02-14T02:33:12+08:00刘志军tag:foofish.net,2017-02-14:python-heart.html<p>一年一度的虐狗节终于过去了,朋友圈各种晒,</p>Python 爬虫:把廖雪峰教程转换成 PDF 电子书2017-02-10T08:47:06+08:002017-02-10T08:47:06+08:00刘志军tag:foofish.net,2017-02-10:python-crawler-html2pdf.html<p>写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰老师的 Python 教程 爬下来做成 PDF 电子书方便大家离线阅读。</p>Python 编码错误的本质原因2017-02-08T13:47:06+08:002017-02-08T13:47:06+08:00刘志军tag:foofish.net,2017-02-08:python-unicode-error.html<p>不论你是写了多年 Python 还是刚入门 Python 的你,一定遇到过 UnicodeEncodeError、UnicodeDecodeError 的错误,每当遇到错误我们就拿着encode、decode函数翻来覆去的转换,有时试着试着问题就解决了,有时候怎么试都没辙,只有借用Google大神帮忙,</p>Python 表达式 i += x 与 i = i + x 等价吗?2017-02-05T09:37:16+08:002017-02-05T09:37:16+08:00刘志军tag:foofish.net,2017-02-05:iadd_add.html<p>Python 表达式 <strong><code>i += x</code></strong> 与 <strong><code>i = i + x</code></strong> 等价吗?如果你的回答是yes,那么恭喜你正确了50%,为什么说只对了一半呢?</p>有了这些 Chrome 插件,效率提升10倍2017-02-04T09:37:16+08:002017-02-04T09:37:16+08:00刘志军tag:foofish.net,2017-02-04:chrome-extension-1.html<p>工欲善其事,必先利其器。好用的Chrome插件能够极大地提高生产力效率,笔者推荐几款日常所用到的插件,分享给大家。</p>理解 Python 装饰器看这一篇就够了2017-01-18T16:03:00+08:002017-01-18T16:03:00+08:00刘志军tag:foofish.net,2017-01-18:python-decorator.html<p>装饰器本质上是一个函数,该函数用来处理其他函数,该函数可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值返回也是一个函数对象。它经常用于有切面需求的场景,比如</p>为什么 python3 执行 x in range(100000000001) 如此快?2017-01-14T13:47:06+08:002017-01-14T13:47:06+08:00刘志军tag:foofish.net,2017-01-14:why-range-so-fast.html<p>判断一个元素 <code>x</code> 是否存在于集合 <code>y</code> 中最简单粗暴地方法就是迭代,每次取出一个值与之比较,如果集合中存在一个值 <code>z</code> 等于 <code>x</code>就返回 true ,它的时间复杂度是 O(n),使用哈希算法的理论时间复杂度是 O(1),二分查找的时间复杂度是 O(log n),那么 Python 究竟会采用的哪种算法来实现呢?</p>你要的微信小程序都在这儿【持续更新中】2017-01-09T09:12:01+08:002017-01-09T09:12:01+08:00刘志军tag:foofish.net,2017-01-09:weixin-applet.html<p>你要的微信小程序都在这儿【持续更新中】</p>你要的微信小程序正式上线了2017-01-08T06:15:00+08:002017-01-08T06:15:00+08:00刘志军tag:foofish.net,2017-01-08:weixin-applet-comming.html<p>2016年12月28日微信之神张小龙在2017年的微信公开课讲解了小程序的来龙去脉,可是在小程序在还没出来之前,大家对小程序的期待只是停留在模糊的概念上,不过,也就是刚刚过去的一会儿,微信小程序千呼万唤始出来,犹抱琵琶半遮面。大家如果从好友或者群里面打开小程序之后,在微信的“发现”页面多出了小程序的入口。当先目前大部分用户还看不到。</p>我的2016书单2017-01-06T09:12:01+08:002017-01-06T09:12:01+08:00刘志军tag:foofish.net,2017-01-06:2016-book.html<p>说起2016年,恐怕是目前为止看书最多的一年,各种书籍都有,从小说到传记,从人文到科技,从历史到经济,反而这一年看的技术书籍少了很多。读了这么多书有用吗?</p>Python解惑:True与False2017-01-03T09:12:01+08:002017-01-03T09:12:01+08:00刘志军tag:foofish.net,2017-01-03:python-true-false.html<p>Python 中常用的数据类型<code>bool</code>(布尔)类型的实例对象(值)就两个,真和假,分别用<code>True</code>和<code>False</code>表示。在if 条件判断和while 语句中经常用到,不过在Python2.x 中,True 和False 却有着奇怪的用法,就是真假可以相互被替换,先看下面代码:</p>Python解惑:整数比较2016-12-26T09:12:01+08:002016-12-26T09:12:01+08:00刘志军tag:foofish.net,2016-12-26:python-int-mystery.htmlLinux中批量替换文件名2016-12-23T02:34:07+08:002016-12-23T02:34:07+08:00刘志军tag:foofish.net,2016-12-23:linux-rename.html字典对象的 Pythonic 用法2016-12-15T09:12:01+08:002016-12-15T09:12:01+08:00刘志军tag:foofish.net,2016-12-15:python-dict-usage.html<p>字典在Python中作为最常用的数据结构之一,和数字、字符串、列表、元组并列为5大基本数据类型,字典中的元素通过键来存取,字典的常用的Pyhonic用法有:</p>好玩的Python彩蛋2016-12-07T20:57:59+08:002016-12-07T20:57:59+08:00刘志军tag:foofish.net,2016-12-07:python-easter-eggs.html<p>Python作为一门严谨的编程语言,也充满了各种娱乐、恶搞、实用的彩蛋,程序员真的是一群创意无极限的家伙。笔者总结了Python中几个比较有趣的彩蛋。</p>一道面试题:说说进程和线程的区别2016-12-05T12:57:59+08:002016-12-05T12:57:59+08:00刘志军tag:foofish.net,2016-12-05:thread-and-process.htmlHTTPS的中那些加密算法2016-11-09T13:47:06+08:002016-11-09T13:47:06+08:00刘志军tag:foofish.net,2016-11-09:https-symmetric.html<p>Android L最新支持包推出两个UI控件RecycleView和CardView。RecyclerView是更先进,更灵活的ListView,这是一个很大的进步,因为Lis</p>正向代理与反向代理2016-10-21T02:05:04+08:002016-10-21T02:05:04+08:00刘志军tag:foofish.net,2016-10-21:proxy-and-reverse-proxy.html<p>Nginx作为时下最流行的HTTP服务器之一,同时它是一个反向代理服务器,提到反向代理服务器,有同学可能觉得这个概念很模糊,如果说到代理,他可能明白,但是再引出一个正向代理,估</p>Nginx配置中的 root 与 alias 指令的区别2016-10-09T03:08:33+08:002016-10-09T03:08:33+08:00刘志军tag:foofish.net,2016-10-09:nginx-root-different-with-alias.html<p>root和alias都可以定义在location模块中,都是用来指定请求资源的真实路径,比如:</p>HTTP中的分块传输编码是怎么回事?2016-10-05T08:16:37+08:002016-10-05T08:16:37+08:00刘志军tag:foofish.net,2016-10-05:http-transfer-encoding.html<p><code>Transfer-Encoding</code> 是HTTP header 中的 entity header,所谓entity header就是专门用来描述消息体(message bod</p>Linux文件权限介绍2016-09-30T08:36:35+08:002016-09-30T08:36:35+08:00刘志军tag:foofish.net,2016-09-30:linux-file-permission.html<p>Linux系统中的每个文件都有三种权限,分别是:读(read)、写(write)、执行(execute)。文件的执行操作就是运行该文件,比如一个python脚本文件,而目录的执</p>分析urllib.unquote乱码的原因2016-09-18T08:42:46+08:002016-09-18T08:42:46+08:00刘志军tag:foofish.net,2016-09-18:urllib-unquote.html<p>Python中的urllib模块用来处理url相关的操作,<code>unquote</code>方法对应javascript中的urldecode方法,它对url进行解码,把类似"%xx"的字符替</p>把时间当朋友2016-09-18T05:33:05+08:002016-09-18T05:33:05+08:00刘志军tag:foofish.net,2016-09-18:make_friend_with_time.html<p>把时间当朋友,你对她好。她就会对你好,你不理她,他就不理你。</p>在Linux中替换目录下多个文件中的字符串2016-09-13T02:34:07+08:002016-09-13T02:34:07+08:00刘志军tag:foofish.net,2016-09-13:replace-string-linux.html<p>在Linux中,替换多个文件中的某个字符串可以使用<code>grep</code>和<code>sed</code>的组合来实现这个功能。</p>CentOS升级Python2.72016-08-30T09:12:01+08:002016-08-30T09:12:01+08:00刘志军tag:foofish.net,2016-08-30:centos-python27.html<p>CentOS 6.X 自带的Python版本是 2.6 , 但是很多主流框架和第三方依赖包已经开始逐步放弃维护2.6版本了,况且如果一个全新的业务系统还是用Python2.6跑</p>CentOS7 环境 MySQL5.7 安装2016-08-11T02:20:25+08:002016-08-11T02:20:25+08:00刘志军tag:foofish.net,2016-08-11:mysql-install.html<p>MySQL官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾水,不知如何安装。下面笔者将</p>PYTHON编码的前世今生2016-08-03T05:02:09+08:002016-08-03T05:02:09+08:00刘志军tag:foofish.net,2016-08-03:python-character-encode.html<p>一旦走上了编程之路,如果你不把编码问题搞清楚,那么它将像幽灵一般纠缠你整个职业生涯,各种灵异事件会接踵而来,挥之不去。只有充分发挥程序员死磕到底的精神你才有可能彻底摆脱编码问题</p>一次完整的HTTP请求过程2016-07-12T01:36:41+08:002016-07-12T01:36:41+08:00刘志军tag:foofish.net,2016-07-12:http-request-process.html<p>一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个</p>完全理解Python迭代对象、迭代器、生成器2016-05-19T08:34:52+08:002016-05-19T08:34:52+08:00刘志军tag:foofish.net,2016-05-19:iterators-vs-generators.html<p>在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)、列表/集合/字典推导式(l</p>CentOS重新安装MySQL5.62016-05-13T07:21:55+08:002016-05-13T07:21:55+08:00刘志军tag:foofish.net,2016-05-13:centos-install-mysql.html<p>centOS系统安装MySQL小记</p>MySQL-Python Windows平台安装报错2016-04-26T08:25:13+08:002016-04-26T08:25:13+08:00刘志军tag:foofish.net,2016-04-26:mysql-python-windows.html<p>Windows平台用pip安装MySQL-Python包安装失败,说是要先安装Visual C++9.0,具体的报错堆栈信息是:</p>再见,广州2016-04-14T01:06:55+08:002016-04-14T01:06:55+08:00刘志军tag:foofish.net,2016-04-14:bey-guangzhou.html<p>2014年,一个包,一床被,一个人,来到广州。今天,刚好两年整的时间,带着一个家,离别广州,留下回忆。</p>面试中的道与术2016-03-30T14:08:33+08:002016-03-30T14:08:33+08:00刘志军tag:foofish.net,2016-03-30:interview-tips.html<p>拿完年终奖,过完年,不少朋友在新的一年就要开始准备寻觅更好的工作了,他们摩拳擦掌、跃跃欲试、自信心爆棚,薪资不涨它个50%都不好意思跳槽,手里没三五个offer都不好意思跟朋友</p>Linux性能监控命令详解:lsof2016-03-27T13:35:23+08:002016-03-27T13:35:23+08:00刘志军tag:foofish.net,2016-03-27:linux-command-lsof.html<p>查看当前系统所有的打开文件,在linux环境下,一切皆文件,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。</p>Git常用命令备忘2016-03-21T02:14:51+08:002016-03-21T02:14:51+08:00刘志军tag:foofish.net,2016-03-21:git-command.html<p>Git已经成为程序员日常工具之一,那些Git基本的命令,每天都要用的命令你都记住了吗?如果还没的话,笔者整理了一份清单,以备不时之需所用。</p>博客优化2016-03-08T04:19:51+08:002016-03-08T04:19:51+08:00刘志军tag:foofish.net,2016-03-08:blog-optimize.html<p>最近对我的博客http://foofish.net进行了一次性能优化,主要是针对前端部分,从如下几个方面进行,基本原则参照《构建高性能Web站点》这本书。</p>免费HTTPS证书Let's Encrypt安装教程2016-03-05T06:15:00+08:002016-03-05T06:15:00+08:00刘志军tag:foofish.net,2016-03-05:https-free-for-lets-encrypt.html<p>HTTPS在各大互联网站已经成为标配,就连某度也在前不久全面启用HTTPS,很多小网站也配置了HTTPS,这是未来的一种趋势。HTTPS的好处多多,可以防止各种攻击劫持,运营商</p>MySQL启动报错问题排查:InnoDB: Unable to lock ./ibdata1 error2016-03-03T01:43:33+08:002016-03-03T01:43:33+08:00刘志军tag:foofish.net,2016-03-03:mysql-unable-lock.html<p>在OS X环境下MySQL启动时报错,终端不断地重复打印上面的错误日志Unable to lock ./ibdata1 error,从错误日志看起来似乎有另外一个mysqld进</p>标签云算法Python实现2016-03-01T13:01:33+08:002016-03-01T13:01:33+08:00刘志军tag:foofish.net,2016-03-01:tag-cloud-implement.html<p>标签云(Tag Cloud)常见于各种博客站点中,标签有利于网站内容分类,还可以用于相关性内容推荐。近日笔者有空把个人的开源博客Django_blog添加了一个新功能--标签云</p>算法题:链表反转2016-02-28T17:14:11+08:002016-02-28T17:14:11+08:00刘志军tag:foofish.net,2016-02-28:linklist-reverse.html<p>链表的反转是一个很常见、很基础的数据结构题,输入一个单向链表,输出逆序反转后的链表,如图:上面的链表转换成下面的链表。实现链表反转有两种方式,一种是循环迭代,另外一种方式是递归</p>Linux性能监控命令详解:free2016-02-27T13:35:23+08:002016-02-27T13:35:23+08:00刘志军tag:foofish.net,2016-02-27:linux-command-free.html<p>在系统遇到各种IO瓶颈,内存使用率高,cpu使用率高等问题时,我们如何来定位错误?linux提供了很多命令来协助我们快速定位到错误,<code>free</code>命令是就是Linux最常用的命令</p>免费中文Python电子书(教程)2016-02-27T11:07:47+08:002016-02-27T11:07:47+08:00刘志军tag:foofish.net,2016-02-27:python-free-ebook.html<p>免费中文Python电子书(教程),涵盖了Python、Django、Tornado等入门、基础、实践教程。</p>12步教你理解Python装饰器2016-02-24T08:50:45+08:002016-02-24T08:50:45+08:00刘志军tag:foofish.net,2016-02-24:python-decorator-12.html<p>或许你已经用过装饰器,它的使用方式非常简单但理解起来困难(其实真正理解的也很简单),想要理解装饰器,你需要懂点函数式编程的概念,python函数的定义以及函数调用的语法规则等,</p>HTTP 缓存策略2016-01-28T04:01:52+08:002016-01-28T04:01:52+08:00刘志军tag:foofish.net,2016-01-28:http-cache-policy.html<p>浏览器一般缓存图片、CSS、JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助。HTTP缓存分为两部分,分别是本地缓存和缓存协</p>Python中的垃圾回收机制2016-01-21T12:52:18+08:002016-01-21T12:52:18+08:00刘志军tag:foofish.net,2016-01-21:python-gc.html<p>GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用。GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在业务逻辑上。但这并不意味着码农就可以不去了解GC,毕竟多了解GC知识还是有利于我们写出更健壮的代码。</p>
<h3>引用计数</h3>
<p>Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然被很多编程语言使用,『引用计数法』的原理是:每个对象维护一个<code>ob_ref</code>字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。它的缺点是需要额外的空间维护引用计数,这个问题是其次的,不过最主要的问题是它不能解决对象的“循环引用”,因此,也有很多语言比如Java并没有采用该算法做来垃圾的收集机制。</p>
<p>什么是循环引用?A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数虽然都为1,但显然应该被回收,例子: </p>
<div class="highlight"><pre><span></span> <span class="n">a</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c1">#对象A的引用计数为 1</span>
<span class="n">b</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span> <span class="c1">#对象B的引用计数为 1</span>
<span class="n">a ...</span></pre></div>Python字典对象实现原理2015-12-24T17:00:12+08:002015-12-24T17:00:12+08:00刘志军tag:foofish.net,2015-12-24:python_dict_implements.html<p>哈希表(也叫散列表),根据关键值对(Key-value)而直接进行访问的数据结构。它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,更新也快。而这个映</p>Python列表对象实现原理2015-12-16T14:10:37+08:002015-12-16T14:10:37+08:00刘志军tag:foofish.net,2015-12-16:python-list-implements.html<p>Python中的列表基于PyListObject实现,列表支持元素的插入、删除、更新操作,因此PyListObject是一个变长对象(列表的长度随着元素的增加和删除而变长和变短</p>Python字符串对象实现原理2015-12-10T16:23:20+08:002015-12-10T16:23:20+08:00刘志军tag:foofish.net,2015-12-10:python_str_inplements.html<p>在Python世界中将对象分为两种:一种是定长对象,比如整数,整数对象定义的时候就能确定它所占用的内存空间大小,另一种是变长对象,在对象定义时并不知道是多少。比如:str,li</p>Python 整数对象实现原理2015-12-08T15:48:26+08:002015-12-08T15:48:26+08:00刘志军tag:foofish.net,2015-12-08:python_int_implement.html<p>在Python对象中,整数对象是最简单的对象,用PyIntObject表示,它是一个对C语言中long类型的数值的扩展。</p>Python Virtualenv 介绍2015-11-25T00:22:55+08:002015-11-25T00:22:55+08:00刘志军tag:foofish.net,2015-11-25:virtualenv.html<p>动态语言中Ruby、Python都有自己的虚拟环境,通过创建虚拟环境能够使不同的项目之间的运行环境保持独立性而相互不受影响。例如项目A依赖Django1.4,而项目B依赖Dja</p>OS X El-Capitan 安装 virtualenvwrapper 遇到 Operation not permitted2015-11-25T00:18:40+08:002015-11-25T00:18:40+08:00刘志军tag:foofish.net,2015-11-25:six.html<p>事情是这样的,在安装完virtualenv后,想配合virtualenvwrapper使用,于是直接是pip安装:</p>修改Python的pip安装源2015-11-23T21:54:58+08:002015-11-23T21:54:58+08:00刘志军tag:foofish.net,2015-11-23:pip.html<p>用pip安装依赖包时默认访问 pypi.python.org,但是经常出现不稳定以及访问速度非常慢的情况,国内厂商提供的pipy镜像目前可用的有</p>Android 应用集成 LeanCloud 推送服务2015-08-21T21:12:06+08:002015-08-21T21:12:06+08:00刘志军tag:foofish.net,2015-08-21:leancloud_push_service.html<p>推送服务是唤醒用户继续使用App的一种手段,今天花时间了解LeanCloud的推送服务,读了下大概的文档,再结合Demo把推送服务集成到了西源坊的App中。罗列了一下开发的流程</p>小记:datetime 与 timestamp 相互转换遇到的坑2015-08-14T20:57:59+08:002015-08-14T20:57:59+08:00刘志军tag:foofish.net,2015-08-14:datetime-timestamp.htmlImportNew Android App 从0到12015-07-09T20:29:44+08:002015-07-09T20:29:44+08:00刘志军tag:foofish.net,2015-07-09:importnew_android_app_from_0_to_1.html<p>ImportNew是一个专注于 Java 相关技术分享的博客,平常自己关注ImportNew比较多,曾经有想过自己开发一个客户端出来,可以随时随地方便在移动设备上阅读,不过很多</p>【翻译】Android RecyclerView CardView2015-06-23T20:36:31+08:002015-06-23T20:36:31+08:00刘志军tag:foofish.net,2015-06-23:android-recyclerview-cardview.html<p>Android L最新支持包推出两个UI控件RecycleView和CardView。RecyclerView是更先进,更灵活的ListView,这是一个很大的进步,因为Lis</p>每日一Vim(0):入门教程:基本模式2016-12-01T19:30:00+08:002016-12-01T19:30:00+08:00刘志军tag:foofish.net,2015-06-23:vim-tutorial-1.html<p>Vim 入门:基本模式</p>如何在Python中正确使用static、class、abstract方法2015-06-17T18:13:04+08:002015-06-17T18:13:04+08:00刘志军tag:foofish.net,2015-06-17:guide-python-static-class-abstract-methods.html<p>本文试图让你如何正确使用static、class、abstract方法。</p>如何理解Python关键字yield2015-06-11T14:16:38+08:002015-06-11T14:16:38+08:00刘志军tag:foofish.net,2015-06-11:understanding-yield.html<p>两年前开始接触Python,在SO上看到一篇关于yield的文章,讲解不错,于是尝试将其翻译成了中文,发布在伯乐在线,后来译文收到了不少吐槽,于是两年后的今天对其文重新理解一篇</p>mongo-connector原理及改造2014-10-24T02:40:19+08:002014-10-24T02:40:19+08:00刘志军tag:foofish.net,2014-10-24:mongo-connector.html<p>这段时间因为项目的某个需求需要改造mongo-connector,改造开源产品首先要读懂别人的代码,于是总结记录一下自己的分析过程。这里假设你对Solr有一定的了解。</p>网页正文内容抽取2014-06-01T05:25:23+08:002014-06-01T05:25:23+08:00刘志军tag:foofish.net,2014-06-01:html-extractor.html<p>此代码是对论文《基于行块分布函数的通用网页正文抽取》的Python实现方式。论文的出发点是针对搜索引擎正文提取的解决方案,移除了所有的标签元素,因此我在此保留了标签元素,改进用</p>人生苦短,我用PyCharm2014-05-23T23:15:20+08:002014-05-23T23:15:20+08:00刘志军tag:foofish.net,2014-05-23:i-use-pycharm.html<p>有把Emacs比作是神的编辑器,VIM比作是编辑器之神,2012年开始接触VIM,一直沿用至今,也曾今总结过VIM的相关知识,文章都整理在以前的ITeye博客和GitHub,这</p>StringIO---像文件一样读写字符串2014-05-08T23:59:02+08:002014-05-08T23:59:02+08:00刘志军tag:foofish.net,2014-05-08:stringio.html<p>有些API仅接受文件对象,但是你只有一个字符串,比如使用gzip模块压缩字符串的时候,StringIO就可以派上用场了</p>单元测试学习2014-05-07T09:38:20+08:002014-05-07T09:38:20+08:00刘志军tag:foofish.net,2014-05-07:unittest.html<p>单元测试是个好东西,但是如果代码中多处有数据库访问(读/写),或者代码中包含一些复杂的对象,真实环境中难以被触发的对象的时候,该如何写单元测试呢?</p>一个月不刷微博2014-05-07T00:36:14+08:002014-05-07T00:36:14+08:00刘志军tag:foofish.net,2014-05-07:away-weibo.html<p>戒网这个想法源自于(4月7日)晚上的思索,大脑每天被各种网络(垃圾)信息充斥着,人也变得越来越浮躁,因此决定尝试摆脱互联网,虽然生活在(移动)互联网的大时代,想彻底隔离网络世界</p>MySQL慢查询配置2014-04-03T12:30:03+08:002014-04-03T12:30:03+08:00刘志军tag:foofish.net,2014-04-03:mysql-slow-query-log.html<p>慢查询日志是由一些SQL语句构成的,当查询时间超过了<code>long_query_time</code>的值时会生成慢查询日志,long_query_time的最小值是1s,默认值是10s。</p>django1.7新特性2014-04-03T10:29:48+08:002014-04-03T10:29:48+08:00刘志军tag:foofish.net,2014-04-03:django17-new-features.html<h3>The register decorator</h3>
<p>register(*models[, site=django.admin.sites.site])</p>Django Signals 从实践到源码分析2014-03-31T10:54:00+08:002014-03-31T10:54:00+08:00刘志军tag:foofish.net,2014-03-31:django-signals.html<p>当某个事件发生的时候,signal(信号)允许senders(发送者)用来通知receivers(接收者),通知receivers干嘛?你想要recivers干嘛就可以干嘛。这</p>斐波那契数列(Fibonacci)递归与非递归的性能对比2014-03-26T23:25:44+08:002014-03-26T23:25:44+08:00刘志军tag:foofish.net,2014-03-26:fibonacci.html<p>费波那契数列由0和1开始,之后的数就由之前的两数相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,</p>每天都在高速运作的大脑2014-03-21T14:48:03+08:002014-03-21T14:48:03+08:00刘志军tag:foofish.net,2014-03-21:th.html<p>每天都在忙,但是好像没看到什么有价值的东西出来。</p>Django-Compressor 静态文件压缩2014-03-21T14:08:40+08:002014-03-21T14:08:40+08:00刘志军tag:foofish.net,2014-03-21:django-compressor.html<p>在网站开发阶段,对于静态资源文件比如JS,CSS等文件都是未经过压缩合并处理的,这对于访问量巨大的网站来说不仅浪费带宽,而且也会影响网站的访问速度。django-compres</p>Markdown 代码语法高亮2014-03-17T12:39:00+08:002014-03-17T12:39:00+08:00刘志军tag:foofish.net,2014-03-17:markdown-and-pygments-syntax-highlight-code.html<p>以前总结过一篇文章让markdown支持django1.6,由于Django1.6默认不支持markdown了,所以需要自己写过滤器。现在遇到一个新的麻烦是,代码块默认情况下没</p>git进阶教程2014-03-15T08:16:28+08:002014-03-15T08:16:28+08:00刘志军tag:foofish.net,2014-03-15:git-advanced.html<p>今天无意中看到据说是史上最简单的Git教程,看完后又学到了不少新东西,把自己学到东西总结并记录下,否则总觉得少了些什么东西。</p>什么是描述符(descriptor)2014-02-26T11:19:44+08:002014-02-26T11:19:44+08:00刘志军tag:foofish.net,2014-02-26:what-is-descriptor-in-python.html<p>只要是定义了<code>__get__()</code>、<code>__set()__</code>、<code>__delete()__</code>中任意一个方法的对象都叫描述符。那描述符协议是什么呢?这个协议指的就是这三个方法。</p>仅仅是一个轮子2014-02-25T12:17:41+08:002014-02-25T12:17:41+08:00刘志军tag:foofish.net,2014-02-25:why-you-reinvent-a-blog.html<p>神马“轮子”?这个“轮子”当然指的就是你现在访问的这个博客,称不上系统,只能算是自己喜欢的一个工具,就和吃饭一样,除了妈妈做了最好吃的外,其二就是自己做的。但是妈妈可不会写程序</p>理解Python装饰器2014-02-18T16:03:00+08:002014-02-18T16:03:00+08:00刘志军tag:foofish.net,2014-02-18:decorator.html<p>装饰器本质上是一个函数,该函数用来处理其他函数,该函数可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值返回也是一个函数对象。它经常用于有切面需求的场景,比如</p>理解Python GIL2014-02-18T12:07:55+08:002014-02-18T12:07:55+08:00刘志军tag:foofish.net,2014-02-18:understand-gil.html<p>什么是GIL</p>Python多线程编程2014-02-17T15:54:04+08:002014-02-17T15:54:04+08:00刘志军tag:foofish.net,2014-02-17:mutil-thread-programming.html<p>python2.4前有个thread模块支持多线程编程,2.4后新增了threading模块,提供更高级别和更强大的线程支持.</p>MySQL分表分区2014-02-17T01:34:34+08:002014-02-17T01:34:34+08:00刘志军tag:foofish.net,2014-02-17:mysql-partition.html<h4>垂直分表</h4>系统学习MySQL2014-02-16T23:05:00+08:002014-02-16T23:05:00+08:00刘志军tag:foofish.net,2014-02-16:learning-mysql.html<p>标题来源于知乎的一个问题如何系统学习MySQL,毕业至今一直做开发,但是对数据库存储的了解相对来说欠缺比较多,而几乎所有的应用系统离不开数据库的支撑,so,今年准备在数据库这一</p>有序字典2014-02-15T00:46:46+08:002014-02-15T00:46:46+08:00刘志军tag:foofish.net,2014-02-15:ordered-dict-in-python.html<p>有时候我们想起要对字典进行排序,但在python中dict对象中的键值对是没有顺序的,但是在collections模块中有个子类OrderedDict,它能记住字典的插入顺序。</p>排序算法对比分析2014-02-14T17:00:42+08:002014-02-14T17:00:42+08:00刘志军tag:foofish.net,2014-02-14:sort-algorithm-compare.html<p>冒泡排序是一种交换排序,相邻之间的两个元素进行比较,如果两个元素的顺序是错误的,那么就交换位置.</p>理解Python字符集编码2014-02-14T02:33:12+08:002014-02-14T02:33:12+08:00刘志军tag:foofish.net,2014-02-14:understanding-python-charset.html<p>在python中和字符串相关的类型,分别是<strong>str,unicode</strong>两种不同的类型:</p>python 函数式编程处理函数:map(),filter(),reduce()2014-02-10T10:37:24+08:002014-02-10T10:37:24+08:00刘志军tag:foofish.net,2014-02-10:function-programming.html<p>map, filter, reduce,</p>LEGB规则2014-02-08T18:35:03+08:002014-02-08T18:35:03+08:00刘志军tag:foofish.net,2014-02-08:python-legb.html<p>Python在确定一个变量(名字)的核心规则是LEGB,只有熟悉LEGB规则,才能清楚在程序执行过程中调用的变量究竟是什么。理解LEGB前,首先需要对Python的作用域、命名</p>Django自定义User模型2014-02-08T11:59:48+08:002014-02-08T11:59:48+08:00刘志军tag:foofish.net,2014-02-08:django-custom-user.html<p>Django1.5自定义用户profile可谓简单很多,编写自己的model类MyUser,MyUser至少要满足如下要求:</p>Django url()函数详解2014-02-08T11:35:46+08:002014-02-08T11:35:46+08:00刘志军tag:foofish.net,2014-02-08:django-url.html<p>url()函数看起来的格式象:<code>url(r^/account/$', views.index, name=index)</code>,它可以接收四个参数,分别是两个必选参数:<code>regex</code></p>终于忍受不鸟MIUI了2014-01-20T10:33:13+08:002014-01-20T10:33:13+08:00刘志军tag:foofish.net,2014-01-20:miui.html<p>终于忍受不鸟MIUI了,换回HTC原生系统,原生系统更开放,估摸着这手机至少还可以用两年。哈哈:-D</p>Django+Ubuntu+Nginx+Gunicorn应用部署2014-01-18T17:53:18+08:002014-01-18T17:53:18+08:00刘志军tag:foofish.net,2014-01-18:django-deploy.html<p>Django在python语言中是最受欢迎的全栈式web框架,过去部署Django应用一般采用Apache+mod_wsgi,但是随着Nginx出色的性能表现,Django也有</p>Gevent简介2013-11-21T00:03:50+08:002013-11-21T00:03:50+08:00刘志军tag:foofish.net,2013-11-21:gevent-introduce.html<p>gevent 是一个python网络框架,对应Java的netty框架,使用greenlet提供异步API,基于libevent ,它为各种并发和网络相关的任务提供了整洁的AP</p>Python“不为人知的”特性2013-10-30T15:52:42+08:002013-10-30T15:52:42+08:00刘志军tag:foofish.net,2013-10-30:python-tricks-tips.html<p>本文整理自Stack Overflow上的热门问题“hidden features of python”,早期有人做过类似的整理,但是内容比较旧而且比较粗糙,因此笔者在原文基础</p>理解yield(生成器)2013-10-20T12:59:29+08:002013-10-20T12:59:29+08:00刘志军tag:foofish.net,2013-10-20:yield.html<p>任何使用yield关键字的函数都称之为生成器,另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器。(有关</p>Python中下划线的变量是什么个意思2013-09-27T12:19:43+08:002013-09-27T12:19:43+08:00刘志军tag:foofish.net,2013-09-27:python_xiahuaxian.html<p>这篇文章说两个问题</p>