Ubuntu 创建快捷启动应用程序
在 $HOME/.local/share/applications 目录下,新建文件: youapp_name.desktop,然后在其中填入以下内容:
1 | [Desktop Entry] |
其中 Exec
对应的是启动命令,如果是自己写的脚本,那就在以 Exec=sh
开头。Icon
对应的是图标
Ubuntu18 如何将快捷方式锁定在启动器上
长按图标,然后选择添加到收藏夹即可
在 $HOME/.local/share/applications 目录下,新建文件: youapp_name.desktop,然后在其中填入以下内容:
1 | [Desktop Entry] |
其中 Exec
对应的是启动命令,如果是自己写的脚本,那就在以 Exec=sh
开头。Icon
对应的是图标
长按图标,然后选择添加到收藏夹即可
对于热门文章的定义是:
单位时间内,(”分享“数 + ”点赞“数 + ”评论“数)的总和大于某特定值的文章,被视为热门文章。
热门文章的列表是由后台动态生成的,而且在每次生成的时候,产生的数据不一定是相同的。为了减轻系统的压力和提高api的响应速度,该计算任务使用celery 进行后台任务调度。
后台定时任务是循环任务,任务执行时向缓存数据库中插入当前时段计算出的热门文章索引值,缓存数据库采用的是redis。
客户端有一个社区列表的展示界面,该列表的排序方式是按照关注人数进行反向排序(从大到小),类似:
社区id | 社区名称 | 社区关注人数 |
---|---|---|
1 | AAA | 4 |
3 | CCC | 3 |
2 | BBB | 2 |
4 | DDD | 1 |
但是社区的 关注人数是动态变化的 ,当社区数量较多时也要考虑分页的情况,那么该列表的排序和分页有了很大的难度。
more >>这里简单整理当前的实现思路,并指出明显的缺陷和暂时解决不了的问题,待以后有能力解决。
在一个列表中,如果避免一次请求大量数据的问题,使用分页是最好的解决方式,而且在接触开发以来,也一直认为分页是最简单的基础,最容易实现的部分。然后在正式工作的第一个月,便改变了这个思想,虽然分页还是最基础的部分,但是已经不认为它是简单的了,它的实现,在某些场景下,让现在的我觉得还有很棘手的。
本文又名《简单的分页不简单》。为本人的第一篇工作笔记,以下所有的内容,均仅作为个人学习总结所用,特此声明!本文记录下当前这个状态的自己对于分页的理解,会留下目前解决不了的问题,等待未来的自己能够回来替自己解答。
参考文章:
https://developer.twitter.com/en/docs/tweets/timelines/guides/working-with-timelines
http://zhiheng.me/156
https://aotu.io/notes/2017/06/27/infinite-scrolling/index.html
”电梯式分页“,我觉得这个名字是十分贴切,这个名词形象的描述了这种分页模式的过程。常见的有百度的搜索页。
more >>1 |
|
安装完成之后,命令行启动
/usr/bin/google-chrome-stable
启动完成之后锁定到启动器即可。
1 | sudo add-apt-repository ppa:hzwhuang/ss-qt5 |
Ubuntu18及以上版本会在add-apt-repository
之后会报错,需要手动去改源中的版本信息:
打开文件:
1 | sudo vi /etc/apt/sources.list.d/hzwhuang-ubuntu-ss-qt5-bionic.list |
将下面bionic
改成 xenial
:
1 | deb-src http://ppa.launchpad.net/hzwhuang/ss-qt5/ubuntu xenial main |
注意,Ubuntu 18及以上版本,以下方式添加全局代理已经无效。目前的做法就是,在设置网络中,“网络代理”选择手动,填入相应的代理IP和端口。然后登录谷歌,同步插件SwitchyOmega,进行代理。成功之后再禁用设置网络中的网络代理。
1 | sudo pip install genpac |
https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt 保存到本地gfwlist.txt
在fwlist.txt 目录下,执行以下命令:
1 | genpac --pac-proxy "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" --gfwlist-local=gfwlist.txt --output="autoproxy.pac" |
点击:System settings > Network > Network Proxy,选择 Method 为 Automatic,设置 Configuration URL 为 autoproxy.pac 文件的路径,点击 Apply System Wide。
格式如:file:///home/{user}/autoproxy.pac
file:///home/wen/Downloads/autoproxy.pac
界面优化工具,可以自定义系统主题、图标、锁屏界面内容、字体,管理插件等内容
1 | sudo apt-get install gnome-tweak-tool |
将近一天的折腾,终于ok了,实现了如题的新玩法。这里做一个简单的记录,记录自己踏过的坑,其实还主要是ssh-key的问题。主要参考这里
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点
.pyc
文件,当第二次导入时,就会直接加载 .pyc
文件,而不会再次执行模块代码由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决
单例模式可以再系统设置全局的访问点,优化共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理
本来想整理一下,以上说的几种常见的单例实现模式在Python中的实现表现,但是感觉对Java和Python理解的深度不够,懵懵懂懂之间,不敢胡乱总结,只得贴一些python自己的实现方式,没法进行对比了。先继续学习,深入了解一些再回来整理。
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
1 | # mysingleton.py |
__new__
使用 __new__
来控制实例的创建过程,这里没有线程的问题,下面的例子就是演示多线程的时候,看看是不是出问题,结果没有。
1 | class Singleton(object): |
装饰器(decorator)可以动态地修改一个类或函数的功能。
1 | def singleton(cls, *args, **kw): |
虽然进行了两次实例化,但仍为同一个实例
1 | import threading |
首先解释一下什么叫 API :
应用程序接口(英语:Application Programming Interface,简称:API ),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实践中,编程接口的设计首先要使软件系统的职责得到合理划分。良好的接口设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性。(来自维基百科)
API 在多端中使用的更节省资源。网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备……)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行。
关于RESTful的相关知识,参考设计一套良好 REST API
more >>本文参考最新的 pymongo 官方文档进行整理,至文档更新时,PyMongo的版本号为3.6.1
开始之前,请确保你的pymongo
被正确安装,在 Python shell 中,应该运行以下代码而不会引发异常:
import pymongo
另外一个条件就是确保MongoDB实例正在默认主机和端口上运行(如果你的操作系统是windows,可以参考这篇文章进行mongodb的安装和运行)
more >>tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true