教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
1
使用AI实现高精度钢琴曲转谱Piano Transcription简明使用教程
37,794 阅读
2
使用ESP8266Wifi模块制作Wifi杀手
37,467 阅读
3
unravel 让图片唱歌详细教程 Real Time Image Animation 项目
27,387 阅读
4
佳能相机刷Magic Lantern魔灯固件
23,505 阅读
5
战地3 正版账号免费分享!
16,213 阅读
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
标签搜索
python
前端
环境搭建
空镜素材
Ubuntu
markdown
神器
黑苹果
编码
技巧
Git
数据库
开发
下载工具
Youtube
CDN
PDF
OST
电影原声带
音乐
易小灯塔
累计撰写
176
篇文章
累计收到
44
条评论
首页
栏目
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
页面
搜索到
175
篇与
的结果
2018-04-12
使用Docker部署分布式文件系统FastDFS
使用Docker部署分布式文件系统FastDFSFastDFS是一个开源的轻量级分布式文件系统, 功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。比较适合文件比较多的网站, FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,FastDFS比较适合以中小文件为载体的在线服务,比如跟NGINX(APACHE)配合搭建图片服务器。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。上传交互过程 client询问tracker上传到的storage,不需要附加参数; tracker返回一台可用的storage; client直接和storage通讯完成文件上传。 下载交互过程 client询问tracker下载文件的storage,参数为文件标识(卷名和文件名); tracker返回一台可用的storage; client直接和storage通讯完成文件下载。 client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用FastDFS的安装和使用FastDFS可以使用docker进行部署要完全使用fastdfs的功能的话,需要安装配置的文件实在太多,包括libcomment,nginx,fdfs-nginx-module等其他依赖模块,都需要浪费很多的时间和精力,为了更好的解决这个问题,提高效率,利用doker技术完成对fastdfs镜像的构建,效率提高上百倍,几分钟内就搞定了获取镜像可以通过拉取镜像命令获得docker image pull delron/fastdfs 或者直接下载好镜像文件载入docker load -i 文件路径/fastdfs_docker.tar 镜像的下载地址链接: https://pan.baidu.com/s/1jQ3zIPVIPuAtAcCA3Dqm0w 密码: 2ghn加载好镜像后,就可以开启运行FastDFS的tracker和storage了。运行Docker开启docker服务docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker # 将fastDFS tracker运行目录映射到本机的 /var/fdfs/tracker目录中 查看tracker是否运行起来docker container ls 如果要停止tracker服务,可以执行如下命令docker container stop tracker 重新运行tracker,可以执行如下命令docker container start tracker 运行storage开启storage服务docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.25.170:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage # RACKER_SERVER=本机的ip地址:22122 本机ip地址注意不要使用127.0.0.1 # 将fastDFS storage运行目录映射到本机的/var/fdfs/storage目录中 查看storage是否运行起来docker container ls 要停止storage服务,可以执行如下命令docker container stop storage 重新运行storage,可以执行如下命令docker container start storage 注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。FastDFS客户端的使用FastDFS的Python客户端安装pip install fdfs_client-py pip install mutagen pip isntall requests 使用ipython调试时发现语法错误如下In [1]: from fdfs_client.client import Fdfs_client Traceback (most recent call last): File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-1-a4c50acd3321>", line 1, in <module> from fdfs_client.client import Fdfs_client File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/fdfs_client/client.py", line 12, in <module> from fdfs_client.utils import * File "/home/moin/.virtualenvs/py3/lib/python3.6/site-packages/fdfs_client/utils.py", line 230 print get_file_ext_name('/bc.tar.gz') ^ SyntaxError: invalid syntax In [2]: 应该是因为是python2的版本所以在python3下使用所以出现语法错误, 所以在网上找了个修改好的版本, 使用python3的可以下载下面这个安装使用链接: https://pan.baidu.com/s/1eMD1MBhJifpG_APd7wOJgw 密码: tpzkpip install fdfs_client-py-master.zip 使用使用FastDFS客户端,需要有配置文件。在你的项目目录下新建fastdfs目录,将新建client.conf配置文件放到这个目录中。# 连接超时 connect_timeout=30 # 网络超时 network_timeout=60 # 存储日志文件的路径 base_path=FastDFS客户端存放日志文件的目录 # trackerserver 地址设置 tracker_server=运行tracker服务的机器ip:22122 # 日志级别: log_level=info # if use connection pool use_connection_pool = false # connections whose the idle time exceeds this time will be closed connection_pool_max_idle_time = 3600 # if load FastDFS parameters from tracker server load_fdfs_parameters_from_tracker=false # if use storage ID instead of IP address use_storage_id = false # specify storage ids filename, can use relative or absolute path # same as tracker.conf # valid only when load_fdfs_parameters_from_tracker is false # since V4.05 storage_ids_filename = storage_ids.conf #HTTP settings http.tracker_server_port=80 上传文件需要先创建fdfs_client.client.Fdfs_client的对象,并指明配置文件,如from fdfs_client.client import Fdfs_client client = Fdfs_client('你的项目/fastdfs/client.conf') 通过创建的客户端对象执行上传文件的方法client.upload_by_filename(文件名) 或 client.upload_by_buffer(文件bytes数据) 进入ipython进行测试In [1]: from fdfs_client.client import Fdfs_client In [2]: client = Fdfs_client('你的项目/fastdfs/client.conf') In [3]: client.upload_by_filename('/home/moin/Pictures/01.jpg') # 上传一张图片 getting connection <fdfs_client.connection.Connection object at 0x7f7500da5dd8> <fdfs_client.fdfs_protol.Tracker_header object at 0x7f7500da5cf8> Out[4]: # 出现这个代表上传成功 {'Group name': 'group1', 'Remote file_id': 'group1/M00/00/00/wKgZqluQiseARzRPAAISqdrr6pM456.jpg', 'Status': 'Upload successed.', 'Local file name': '/home/moin/Pictures/01.jpg', 'Uploaded size': '132.00KB', 'Storage IP': '192.168.25.170'} 然后访问地址就可以看到刚刚上传的照片了http://192.168.25.170:8888/group1/M00/00/00/wKgZqluQiseARzRPAAISqdrr6pM456.jpg # 服务器地址:8888/文件路径
2018年04月12日
2,080 阅读
0 评论
0 点赞
2018-04-05
Django 网络请求超时问题
服务器架构: gunicorn、 Django、nginx最近在工作中遇到一个奇怪的问题,某段逻辑偶尔会出现异常,却偏偏看不到error log。查看代码发现里面有一段网络请求的逻辑,resp = urlopen(url) 这里忽略一个重要的参数 - timeout, urlopen将默认读取 socket defaulttimout。 如果socket也没有设置的话,请求将一直等待,直到出错断开。>> socket.getdefaulttimeout() >> None 看起来就是一个疏忽,诡异的地方在于一直看不到请求报错!!没有报错就看不到错误日志,没有错误日志就无法自动报警,导致了这个问题一直没有被暴露。继续研究日志,在很后面的地方发现一个异常,刚好与发起网络请求的log相差30s。[2017-01-04 12:00:54 +0000] [1260] [CRITICAL] WORKER TIMEOUT (pid:19348) [2017-01-04 12:00:54 +0000] [19348] [INFO] Worker exiting (pid: 19348) [2017-01-04 12:00:54 +0000] [19417] [INFO] Booting worker with pid: 19417 是的,gunicorn worker 超时重启了。原因: gunicorn worker默认 Timeout 为30秒,当网络堵塞超过30秒时,worker将自动重启,这样永远也看不到网络超时的Error解决方法:1、修改gunicorn 默认超时时间 (添加到启动参数,按需修改)--timeout 60 2、非异步网络请求必须添加timeout参数,且不能大于等于gunicorn worker超时时间总结:要关注每个view工作时间,耗时长的任务建议做成异步任务(如使用Celery)
2018年04月05日
2,830 阅读
0 评论
0 点赞
2018-04-03
CentOS没有ifconfig命令的解决办法
全新安装centos的时候,运行ifconfig准备查看服务器IP的时候, 发现会报错-bash:command not found 网上搜了下, 原因可能是最小化安装centos等Linux发行版的时候会默认不安装ifconfig等命令解决的办法: yum安装ifconfig这个包首先搜索下$ yum search ifconfig 发现ifconfig所属的命令包是net-tools.x86_64安装$ yum install net-tools.x86_64 中途会询问“Is this os [y/d/n]”,按y回车,Complete完成安装。安装完之后就可以输入ifconfig查看网卡信息了
2018年04月03日
4,146 阅读
0 评论
0 点赞
2018-04-03
了解Web框架安全
暂无简介
2018年04月03日
3,938 阅读
0 评论
0 点赞
2018-04-02
CentOS解决终端乱码
CentOS修改终端输出语言 远程连接centos服务器的时候, 发现有些字符会乱码在网上搜了下, 发现是默认语言设置的问题. 可输入echo $LANG和locale查询 修改默认语言, 编辑配置文件$ vi /etc/locale.conf 添加下面字段, wq保存LANG=”zh_CN.UTF-8” 应用配置文件, 使其生效$ source /etc/locale.conf 问题解决
2018年04月02日
3,255 阅读
0 评论
0 点赞
2018-03-22
websocket协议
WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是: WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样; WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。 以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回 Response 给客户端,连接阶段一直是阻塞的。而 WebSocket 解决了 HTTP 的这几个难题。当服务器完成协议升级后( HTTP -> WebSocket ),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于 WebSocket 只需要一次 HTTP 握手,服务端就能一直与客户端保持通信,直到关闭连接,这样就解决了服务器需要反复解析 HTTP 协议,减少了资源的开销。
2018年03月22日
919 阅读
0 评论
0 点赞
2018-03-17
使用ESP8266Wifi模块制作Wifi杀手
esp8266是一个wifi物联网模块ESP8266的一些实际应用:智能电源插头家庭自动化网状网络工业⽆无线控制婴儿监控器网络摄像机传感器网络可穿戴电子产品无线位置感知设备安全ID标签无线定位系统信号成果图在B站科技区看到有个20块钱制作一个wifi杀手拯救爱玩手机游戏的朋友, 顿时来了兴趣, 马上就下单去买了个, 看到有二代三代的, 三代esp32性能还好些, 虽然比二代贵, 就买新不买旧的原则就买了三代. 买回来发现这个不能刷wifi杀手的那个固件啊!!!! 然后又去买个二代(md浪费我30大洋)esp8266(二代)esp32(三代)不废话下面接上教程原理是通过发送取消认证报文让客户端以为路由器需要让自己断开连接从而断开wifi,伪造路由器向客户端发送取消认证报文,使客户端主动断开wifi连接。并且支持自定义热点伪造(批量生成假Wi-Fi信号)。固件项目地址:https://github.com/spacehuhn/esp8266_deauther固件汉化版和烧录工具地址: : https://pan.baidu.com/s/1bWmAHpIjazwSFCqyLKaVnw 密码: 2bt61.将固件解压到桌面2.选择要刷的固件3.将固件复制到桌面4.打开烧录软件5.按图片设置进行烧录6.完成后按RST重启重启后会看到一个zhangguangzhang的wifi密码就是wifi名, 手机或笔记本连上去浏览器输入192.168.4.1就可以进行管理了
2018年03月17日
37,467 阅读
4 评论
342 点赞
2018-03-16
Jupyter Notebook 安装使用
简介: 网页交互式编辑器, 多用于数据分析安装pip install jupyter notebook pip3 install jupyter配置设置jupyter notebook --generate-config启动jupyter notebook # 指定6666端口启动 jupyter notebook --port 6666找到内核配置路径λ jupyter kernelspec list Available kernels: python2 C:\Users\admin\AppData\Roaming\jupyter\kernels\python2 python3 C:\Users\admin\AppData\Roaming\jupyter\kernels\python3修改Python路径为当前Python的安装路径{ "argv": [ "D:\\DevelopTools\\Python37\\python.exe", "-m", "ipykernel_launcher", "-f", "{connection_file}" ], "display_name": "Python 3", "language": "python" }打开指定的notebook文件: jupyter notebook notebook.ipynb指定运行的端口:jupyter notebook --port 9999启动服务器但不打开浏览器:jupyter notebook --no-browser查看服务器帮助内容:jupyter notebook --help可配合vscode使用
2018年03月16日
753 阅读
0 评论
0 点赞
2018-03-16
Docker容器学习笔记
Docker容器学习笔记 Docker是一个开源的容器引擎, 让开发者可以打包让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux上.容器和虚拟机的区别Docker的特点速度快,大多数 Docker 容器只需要不到 1 秒中即可 启动Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器 或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了 一个命令行工具 Docker 以及一整套 RESTful API。可以在同一台宿主机上运行 Docker 守护 进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。 docker镜像镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来。Docker 容器就是: 一个镜像格式; 一些列标准操作; 一个执行环境。Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模 型运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。在Ubuntu中安装Dockersudo apt-get install docker 启动与停止安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令# 启动docker sudo service docker start # 停止docker sudo service docker stop # 重启docker sudo service docker restart Docker的镜像操作Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。列出镜像docker image ls 拉取镜像docker image pull hello-world 删除镜像docker image rm hello-world 创建容器docker run [option] 镜像名 [向启动容器中传入的命令] 常用可选参数说明: -i 表示以“交互模式”运行容器 -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。 --name 为创建的容器命名 -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。 -d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。 -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射 -e 为容器设置环境变量 --network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同 交互式容器例如,创建一个交互式容器,并命名为myubuntudocker run -it --name=myubuntu ubuntu /bin/bash 在容器中可以随意执行linux命令,就是一个ubuntu的环境,当执行exit命令退出时,该容器也随之停止。守护式容器创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。docker run -dit --name=myubuntu2 ubuntu 进入已运行的容器docker exec -it 容器名或容器id 进入后执行的第一个命令 如docker exec -it myubuntu2 /bin/bash 查看容器# 列出本机正在运行的容器 docker container ls # 列出本机所有容器,包括已经终止运行的 docker container ls --all 停止与启动容器# 停止一个已经在运行的容器 docker container stop 容器名或容器id # 启动一个已经停止的容器 docker container start 容器名或容器id # kill掉一个已经在运行的容器 docker container kill 容器名或容器id 删除容器docker container rm 容器名或容器id 将容器保存为镜像我们可以通过如下命令将容器保存为镜像docker commit 容器名 镜像名 镜像备份与迁移我们可以通过save命令将镜像打包成文件,拷贝给别人使用docker save -o 保存的文件名 镜像名 如docker save -o ./ubuntu.tar ubuntu 在拿到镜像文件后,可以通过load方法,将镜像加载到本地docker load -i ./ubuntu.tar
2018年03月16日
1,624 阅读
0 评论
0 点赞
2018-03-15
Python Django 商城开发简单小结
用python django框架,参与开发了一个电商物流的项目,简单说就是从用户(店主)在各个电商平台拉订单,然后智能选仓,发送订单,由仓库出货。订单后处理功能包括:各电商平台拉取订单,检查订单(去重,留言分析,货到付款标识识别,地址合法性检查),拆单/并单,选仓发货。 辅助功能包括:允许开展营销活动(满元赠,满件赠)。允许开启消费者理智期(延迟处理订单)。全国范围智能选仓进行备货,业内叫分仓。项目采用python django框架,涉及到下面几个技术要点: 1、以外键(Foreign Key)为关联,进行前向,后向联合查表,组合成一个QuerySet对象输出。 def get(self, user_id, order_id): # filter方法,这是最常用的一个方法,用来取出数据库中的表项,是一个list。 order_details = OrderDetail.objects.\ filter(order_id=order_id, is_deleted=False). \ select_related('sku') # select_related是后向查表,以'sku'为外键的另一张子表,一并查出来。 order_history = OrderHistory.objects.filter(order_id=order_id) # prefetch_related是前向查表,一并查出父表,并且可以迭加使用。 order = Order.objects.\ prefetch_related(Prefetch('order_detail', queryset=order_details, to_attr='order_details')).\ prefetch_related(Prefetch('order_history', queryset=order_history)).\ select_related('store').\ get(user_id=user_id, id=order_id) return order #返回的order是一个django QuerySet对象。是组合了多张表构成的一个对象。 2、QuerySet对象可以多次条件过滤,从而支持多条件查询操作。warehouse_list是一个QuerySet对象,可以经过几个不同条件的过滤和排除,从而得到符合多条件的对象。if 'province' in dict_arg: warehouse_list = warehouse_list.filter(province__in=dict_arg['province']) if 'city' in dict_arg: warehouse_list = warehouse_list.filter(city__in=dict_arg['city']) if 'not_approved' in dict_arg: warehouse_list = warehouse_list.exclude(approved=dict_arg['not_approved']) # province__in,数据库列名加上__in的意思是一个条件判断,判断province是否在=后的列表中。这是django强大之处。 3、prefetch_related另一种经典用法,关联表列名conditions = { "warehouseservice__code": SERVICE_ITEMS[0][0], } # 'warehouseservice_set'这是warehouse的一个父表的QuerySet对象。实际上django在查表时,一并把关联表全部查出来了的。 # 'warehouseservice__price'和"warehouseservice__code"是父表中的两个列名:price和code。 warehouse_list = warehouse_list.prefetch_related('warehouseservice_set') .filter(**conditions).order_by('warehouseservice__price') 4、django排序输出# 用order_by方法,可以对多个列名进行排序,先排第一个,第一个相同的情况下,按第二个来排。默认是升序,前面加-是降序。 warehouse_list = warehouse_list.order_by('-stars_level', 'cost_per_order') 5、http url中的query取参方法# 前端用GET或POST方法提交时,都可以在http url中添加query参数,就是?type=1这种参数。 request.GET 类似于一个字典,更好的办法是用 request.GET.get('a', 0) 当没有传递 a 的时候默认 a 为 0 一个同事写了一个get_param_by_request(params, param_name, default_val=None, _type=None)方法来达到这个目的, 看来似乎没必要。 6、url正则表达式写法 django框架给出了一个urlpatterns = [ url(r'^create$', livechat_view.create, name='create_channel'), # 发送申请看仓消息 url(r'^requests$', livechat_view.requests, name='create_or_list_requests'), # idx是频道号,func是动作名。这两个参数都通过url给进来。这是一个技巧。 url(r'^(?P<idx>\w+)/(?P<func>\w+)$', livechat_view.handle, name='pause_resume_delete'), ] django的匹配url时,是从上到下来顺序执行的,如果我们把最后一行提到最前面,那创建频道和发送看仓消息就得不到正确的匹配。7、前后台参数传递,用code而不是值,前端要展示的值,由后端查出来给前端。OPERATION_CODE = ( (10, '创建订单', '接收订单'), (11, '订单审核成功', '订单通过系统审核'), (30, '仓库接单', '仓库成功接受发货任务'), (31, '发货完成', '仓库出库完成'), ) 这个编码值,传递起来简单准确,数据量也少。当一个代码的描述值发生变化时,code仍然不用变。8、基于ModelSerializer做序列化,返回json对象给前端。class OrderHistorySerializer(ModelSerializer): order_id = CharField(source='order.id') class Meta: model = OrderHistory fields = [ 'id', 'created_at', 'updated_at', 'order_id', 'is_system', 'operator_id', 'copy_operator_name', 'action', 'comment', ] 把要返回的字段放进去,就可以得到json化的dict返回,比较方便快捷。
2018年03月15日
1,431 阅读
0 评论
0 点赞
2018-03-11
不使用sudo执行Docker
Docker守候进程绑定的是一个unix socket,而不是TCP端口。 这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。 为了避免每次运行docker命令的时候都需要输入sudo,可以创建一个docker用户组,并把相应的用户添加到这个分组里面。当docker进程启动的时候,会设置该套接字可以被docker这个分组的用户读写。这样只要是在docker这个组里面的用户就可以直接执行docker命令了。操作步骤: 1.创建docker组:sudo groupadd docker1 2.将当前用户加入docker组:sudo gpasswd -a ${USER} docker1 3.重启服务:sudo service docker restart1 4.刷新Docker成员:newgrp - docker
2018年03月11日
1,355 阅读
0 评论
0 点赞
2018-03-11
PicGo:好用的跨平台图床神器
作者介绍:作为一个比较常用 Markdown 写文章、博客的人,在 Markdown 里插入图片对我而言一直一个比较繁琐的活。以前每周写电影推荐的时候,我要在 Markdown 里插入一张电影海报,我需要如下的操作:打开豆瓣的网站,选一张满意的海报,下载;打开七牛的网站,登录,点点点,找到上传,上传;关闭上传窗口,找到地址,复制地址,再关闭七牛;粘贴到 Markdown 里。每次都需要繁琐的打开网页进行一些必要而枯燥的操作。这样很麻烦。在用过 Mac 上一款很不错的小工具应用 iPic 后我非常喜欢它的简洁操作。不过它免费版本并不支持七牛图床。所以我就想着,能不能自己写一个类似的工具呢?结合自己的使用习惯再顺便加点功能。于是我就开始自己的图片上传工具的开发了。它叫做PicGo。功能展示打开详细窗口右键点击menubar图标可以找到打开详细窗口的菜单。基本操作预览上传区上传区支持拖拽上传或者点击区域打开文件夹上传相册区支持查看你上传成功的所有图片。点击图片可以预览。点击图片下面的图标可以复制链接或者删除图片(只是删除本地数据,使其不在相册区里出现)支持编辑相册的图片信息(v1.5)有些时候可能上传的图片的url事后需要更改,比如修改http到https,比如加上一些操作后缀(例:七牛图床支持的?imgslim)等等。PicGo本次的更新也让你能够更方便地管理你的图片库。微博图床上传的图片不会出现在你的微博相册里。可以选择链接的图片质量,这样在复制到剪贴板里的图片将会对应修改成对应的链接地址。设置你的微博图床可以选择两种模式:只需填写你的微博用户名密码即可。缺点:上传速度会慢(尤其windows平台),因为要经过很多层验证。并且如果出现需要验证码的情况无法解决。只需Cookie上传(PicGo v1.3.2及以上版本支持)。切换成cookie模式。然后先登录微博(必须先登录),之后打开minipublish页面,如果你是mac用户,使用command+alt+i,如果你是windows用户,使用F12打开控制台,选择Network标签栏。然后刷新一下页面,找到Network里的minipublish一项,再找到minipublish右侧的Cookie一项,把Cookie冒号后的值全部复制(不要把Cookie:这个也复制了)然后填入PicGo里的Cookie一栏。这样就行了。七牛图床对应的密钥信息需要到七牛自己的控制台里找到。其中需要注意的是,自己的存储空间的区域需要确定:设定上传地址是指七牛云自动分配给你的网址,或者是你自己绑定的域名(注意要加http://或者https://):网址后缀通常是你用到了七牛的图片处理工具的时候会用到的一些处理参数。腾讯云COS从PicGo v1.5版本开始,支持COSv4和v5版本。V4版本说明v4版本是这个:需要登录腾讯云控制台。打开密钥管理按照对应的提示找到自己的APPID、SecretId、SecretKey。存储的空间名是你的bucket名字。存储的区域需要额外注意,请到bucket列表里打开需要上传的bucket空间,然后如图可以看到对应的区域以及区域代码,比如我的是tj:对应的区域代码如下:如果你想把图片上传到你的bucket空间的某个文件夹下,则需要在PicGo里的指定存储路径里加上你的文件夹路径。比如temp/(注意一定要加/)V5版本说明1. 获取你的APPID、SecretId和SecretKey访问:https://console.cloud.tencent.com/cam/capi2. 获取bucket名以及存储区域代号访问:https://console.cloud.tencent.com/cos5/bucket创建一个存储桶。然后找到你的存储桶名和存储区域代号:v5版本的存储桶名称格式是bucket-appId,类似于xxxx-12312313。存储区域代码和v4版本的也有所区别,v5版本的如我的是ap-beijing,别复制错了。3. 选择v5版本并点击确定然后记得点击设为默认图床,这样上传才会默认走的是腾讯云COS。又拍云存储空间名即为你的服务名,加速域名即为你又拍云分配给你的域名或者是你自己绑定的域名。请注意,加速域名需要加http://或https://。操作员即为你自己为该存储空间设定的操作员名,密码即为对应的密码。网址后缀为你针对图片进行的一些处理参数。由于又拍云官方没有对云存储有一个直观的控制面板,所以推荐可以采用第三方web面板来查看和操作:又拍云存储Web版操作工具GitHub图床1. 首先你得有一个GitHub账号。注册GitHub就不用我多言。2. 新建一个仓库记下你取的仓库名。3. 生成一个token用于PicGo操作你的仓库:访问:https://github.com/settings/tokens然后点击Generate new token。把repo的勾打上即可。然后翻到页面最底部,点击Generate token的绿色按钮生成token。注意:这个token生成后只会显示一次!你要把这个token复制一下存到其他地方以备以后要用。4. 配置PicGo注意:仓库名的格式是用户名/仓库,比如我创建了一个叫做test的仓库,在PicGo里我要设定的仓库名就是Molunerfinn/test。一般我们选择master分支即可。然后记得点击确定以生效,然后可以点击设为默认图床来确保上传的图床是GitHub。至此配置完毕,已经可以使用了。当你上传的时候,你会发现你的仓库里也会增加新的图片了:阿里云OSS首先先在阿里云OSS的控制台里找到你的accessKeyId和accessKeySecret: 创建一个bucket后,存储空间名即为bucket:确认你的存储区域的代码:也可以在bucket页面找到:如上图,存储区域就是oss-cn-beijing存储路径比如img/的话,上传的图片会默认放在OSS的img文件夹下。注意存储路径一定要以/结尾!存储路径是可选的,如果不需要请留空。Imgur登录Imgur后,在此处生成你的ClientId,记得选第二项,不需要callbackurl的。于是你可以拿到你的clientId:注意:imgur貌似对中国大陆的IP和请求做出了限制,所以如果clientId没错的情况下无法上传图片的时候,可以考虑配置代理设置。默认只支持HTTP代理。如果觉得设置麻烦的可以考虑使用SM.MS图床。PicGo设置自定义快捷键PicGo v1.4.0版本开始支持自定义快捷键(默认快捷键是Cmd+Shift+P【Mac】或者Ctrl+Shift+P【Windows】),点击侧边栏PicGo设置选中修改快捷键:在打开的dialog里,点击input框,然后按下你想要的快捷键(也可以是组合键)。然后点击确定保存(否则不生效!)自定义链接格式PicGo预置的有四种链接格式:Markdown`HTML\URL\UBB。如果你都不喜欢,想要自定义链接格式,可以选择Custom,然后在PicGo设置里点击自定义链接格式`,然后你可以配置自己想要的复制的链接格式。开关更新助手PicGo每次启动的时候会去检查最新版本。如果当前版本低于最新版本会提示你更新。如果你不想接到这条消息,那么可以在PicGo设置里把打开更新助手这个选项关闭。推荐大家打开这个开关,新的版本通常会修复bug已经加入新的功能,让PicGo更好用~开机自启选择是否开机自启动。上传前重命名如果你想在图片上传前能够有机会改动你的图片名,那么可以选择开启图片上传前重命名:之后你在上传的时候就会弹出一个小窗口让你重命名文件。如果你不想重命名,点击确定、取消或者直接关闭这个窗口都是可以的。如果你想要重命名就在输入框里输入想要更改的名字,然后点击确定即可。另外这个特性也支持批量上传,如下:选择想要显示的图床很多时候你并不会使用上PicGo给你提供的全部的图床。所以为了精简显示你可以只选择你想要的图床来显示,这样侧边栏也就不会出现滚动条了。不过需要注意的是,这个仅仅是显示/隐藏而并不是剔除相应的功能。假如你隐藏了七牛云,你依然是可以通过七牛云来上传图片的。上传提示打开之后会在每次上传图片的时候弹出提示框提示正在上传自动时间戳命名开启之后会自动将上传的文件名替换成时间戳: ![](https://user-images.githubusercontent.com/12621342/40976264-2de18afe-6900-11e8-8f35-746820632eb8.png)检查更新用以主动发起更新检查。
2018年03月11日
9,196 阅读
0 评论
2 点赞
2018-03-11
Nginx学习笔记
正向代理:代理端代理的是客户端。 反向代理:代理端代理的是服务端。1. 正向代理正向代理类似一个跳板机,代理访问外部资源。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 正向代理的用途: 访问原来无法访问的资源,如google 可以做缓存,加速访问资源 对客户端访问授权,上网进行认证 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息 2. 反向代理反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理的作用:1.保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。2.负载均衡通过反向代理服务器来优化网站的负载 Nginx的使用nginx的使用主要是对配置文件的配置配置文件位于conf文件夹的nginx.conf文件主要结构... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 } 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。 events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。 http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。 server块:配置虚拟主机的相关参数,一个http中可以有多个server。 location块:配置请求的路由,以及各种页面的处理情况。 配置文件示例########### 每个指令必须有分号结束。################# #user administrator administrators; #配置用户或者组,默认为nobody nobody。 #worker_processes 2; #允许生成的进程数,默认为1 #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址 error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大连接数,默认为512 } http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain #access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。 sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。 upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #热备 } error_page 404 https://www.baidu.com; #错误页 server { keepalive_requests 120; #单连接请求上限次数。 listen 8080; #监听端口 server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 #root path; #根目录 #index vv.txt; #设置默认页 proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0.0.1; #拒绝的ip allow 172.18.5.54; #允许的ip } } } 需要注意的有以下几点 $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址 $remote_user :用来记录客户端用户名称; $time_local : 用来记录访问时间与时区; $request: 用来记录请求的url与http协议; $status : 用来记录请求状态;成功是200, $body_bytes_s ent :记录发送给客户端文件主体内容大小; $http_referer :用来记录从那个页面链接访问过来的; $http_user_agent:记录客户端浏览器的相关信息; 惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。 每个指令必须有分号结束。
2018年03月11日
712 阅读
0 评论
0 点赞
2018-03-07
Celery异步任务的使用
我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果由于各种原因,这封邮件发送所需时间较长,那么客户端将会等待很久,造成不好的用户体验.我们将耗时任务放到后台异步执行。不会影响用户其他操作。除了注册功能,例如上传,图形处理等等耗时的任务,都可以按照这种思路来解决。 如何实现异步执行任务呢?我们可使用celery. celery除了刚才所涉及到的异步执行任务之外,还可以实现定时处理某些任务 Celery是一个功能完备即插即用的任务队列。elery的特点是: 简单,易于使用和维护,有丰富的文档。 高效,单个celery进程每分钟可以处理数百万个任务。 灵活,celery中几乎每个部分都可以自定义扩展。 一个celery系统可以包含很多的worker和broker,可增强横向扩展性和高可用性能。安装使用$ pip install -U Celery Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人。Redis也是一款功能完备的broker安装Redis$ sudo apt-get install redis 使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app。app应用是我们使用celery所有功能的入口,比如创建任务,管理任务等,在使用celery的时候,app必须能够被其他的模块导入。创建应用创建tasks.py模块, 其内容为:from celery import Celery # 我们这里案例使用redis作为broker app = Celery('demo', broker='redis://:332572@127.0.0.1/1') # 创建任务函数 @app.task def my_task(): print("任务函数正在执行....") Celery第一个参数是给其设定一个名字, 第二参数我们设定一个中间人broker, 在这里我们使用Redis作为中间人。my_task函数是我们编写的一个任务函数, 通过加上装饰器app.task, 将其注册到broker的队列中。现在我们在创建一个worker, 等待处理队列中的任务.打开终端,cd到tasks.py同级目录中,执行命令:$ celery -A tasks worker --loglevel=info 或者 $ celery -A tasks worker -l init 调用任务任务加入到broker队列中,以便刚才我们创建的celery workder服务器能够从队列中取出任务并执行。如何将任务函数加入到队列中,可使用delay()。进入python终端, 执行如下代码:from tasks import my_task my_task.delay() 通过worker的控制台,可以看到我们的任务被worker处理。调用一个任务函数,将会返回一个AsyncResult对象,这个对象可以用来检查任务的状态或者获得任务的返回值。存储结果想跟踪任务的状态,Celery需要将结果保存到某个地方。有几种保存的方案可选:SQLAlchemy、Django ORM、Memcached、 Redis、RPC (RabbitMQ/AMQP)。例子我们仍然使用Redis作为存储结果的方案,任务结果存储配置我们通过Celery的backend参数来设定。我们将tasks模块修改如下:from celery import Celery # 我们这里案例使用redis作为broker app = Celery('demo', backend='redis://:332572@127.0.0.1:6379/2', broker='redis://:332572@127.0.0.1:6379/1') # 创建任务函数 @app.task def my_task(a, b): print("任务函数正在执行....") return a + b 给Celery增加了backend参数,指定redis作为结果存储,并将任务函数修改为两个参数,并且有返回值。Celery使用简单,配置也非常简单。Celery有很多配置选项能够使得celery能够符合我们的需要,但是默认的几项配置已经足够应付大多数应用场景了。配置信息可以直接在app中设置,或者通过专有的配置模块来配置。直接通过app来配置from celery import Celery app = Celery('demo') # 增加配置 app.conf.update( result_backend='redis://:332572@127.0.0.1:6379/2', broker_url='redis://:332572@127.0.0.1:6379/1', ) 专有配置文件对于比较大的项目,我们建议配置信息作为一个单独的模块。我们可以通过调用app的函数来告诉Celery使用我们的配置模块。配置模块的名字我们取名为celeryconfig, 这个名字不是固定的,我们可以任意取名,建议这么做。我们必须保证配置模块能够被导入。 配置模块的名字我们取名为celeryconfig, 这个名字不是固定的,我们可以任意取名,建议这么做。我们必须保证配置模块能够被导入。下面我们在tasks.py模块 同级目录下创建配置模块celeryconfig.py:result_backend = 'redis://:332572@127.0.0.1:6379/2' broker_url = 'redis://:332572@127.0.0.1:6379/1' tasks.py文件修改为:from celery import Celery import celeryconfig # 我们这里案例使用redis作为broker app = Celery('demo') # 从单独的配置模块中加载配置 app.config_from_object('celeryconfig') 我的项目目录:TestCelery/ ├── proj │ ├── celeryconfig.py │ ├── celery.py │ ├── init.py │ └── tasks.py └── test.py celery.py内容如下:from celery import Celery # 创建celery实例 app = Celery('demo') app.config_from_object('proj.celeryconfig') # 自动搜索任务 app.autodiscover_tasks(['proj']) celeryconfig.p模块内容如下:from kombu import Exchange, Queue BROKER_URL = 'redis://:332572@127.0.0.1:6379/1' CELERY_RESULT_BACKEND = 'redis://:332572@127.0.0.1:6379/2' tasks.py模块内容如下:from proj.celery import app as celery_app # 创建任务函数 @celery_app.task def my_task1(): print("任务函数(my_task1)正在执行....") @celery_app.task def my_task2(): print("任务函数(my_task2)正在执行....") @celery_app.task def my_task3(): print("任务函数(my_task3)正在执行....") 启动worker:$ celery -A proj worker -l info 键入ctrl+c可关闭worker.调用任务,可使用delay()方法:my_task.delay(2, 2) 也可以使用apply_async()方法,该方法可让我们设置一些任务执行的参数,例如,任务多久之后才执行,任务被发送到那个队列中等等.my_task.apply_async((2, 2), queue='my_queue', countdown=10) 任务my_task将会被发送到my_queue队列中,并且在发送10秒之后执行。如果我们直接执行任务函数,将会直接执行此函数在当前进程中,并不会向broker发送任何消息。无论是delay()还是apply_async()方式都会返回AsyncResult对象,方便跟踪任务执行状态.
2018年03月07日
2,901 阅读
0 评论
0 点赞
2018-03-05
解决Ubuntu异常关机之后出现initramfs进不了系统
当Ubuntu在异常断电或者强制关机时, 有很大的概率会导致开机进不了系统, 卡在有initramfs字样的界面.很多人碰到这种问题时往往选择了重装系统, 其实在这种情况下, 是可以修复的首先要准备一个Ubuntu镜像, 用软碟通等工具刻录到U盘, 然后从U盘启动, 进入试用模式(live环境),如果是虚拟机, 可以设置里直接加载镜像, 然后在虚拟机开机的时候点按esc键(就是左上角的那个按键), 选择cd-rom启动, 一样是进入到试用模式进入到系统之后到磁盘管理查看Ubuntu的系统文件路径, 比如我的是/dev/sda1先把这个磁盘卸载打开终端命令行, 输入命令卸载umount /dev/sda1 然后用fsck命令检测修复磁盘fsck -t ext4 /dev/sda1 完成之后就可以拔掉U盘了重启之后便能正常进入到系统了
2018年03月05日
7,252 阅读
0 评论
1 点赞
1
...
7
8
9
...
12