2019年6月8日 By mikel 分类: C#

来源: 跨浏览器的打印程序的设计 – Web打印 – 博客园

我在多年之前设计过一个ActiveX的打印控件,当时在市面上找不到符合自己要求的打印控件,所以就按照自己的思路设计开发了一个打印控件,并共享出来,没想到得到许多同行朋友的认可,大家用起来觉得还挺不错的。

已经过了许多年,浏览器已经由当年的IE或以IE为内核的国产浏览器为主流,转为以Google的Chrome浏览器或以Chrome为内核的国产浏览器为主流了,ActiveX已经成为昨日黄花。我本想这么多年过去了,各种技术都是日新月异的,作为打印应该早就不是什么问题,可到了自己做项目开发时,需要用到比较复杂一点的打印时,去网上找一找,才发现打印这一块的技术还是没有多大的发展,排在百度搜索前几名的所谓轻打印控件,还是和许多年前一样的有以下几个毛病:一是报表设计繁琐,既当爹又当妈的,既要用JavaScript定义报表的格式,又要组织报表的数据,一个操作窗口,需要自己先计算好各显示的坐标,然后再一一的画出来,这样的报表设计用起来使人发狂,一二个报表还可以勉强对应,要是多做几个就累死人了,而且以后维护修改也很麻烦。二是打印的数据量稍大一点,比如一次打印几十页数据,浏览器就卡死在那里,半天都没有反应,打印一个大一点的报表,把用户和公司的技术服务都快逼疯了。三是所谓的HTML打印,因为浏览器页面和纸张,在版面和精度控制方面的差异,导致网页显示和实际打印的效果差很远,而且因为页面一般是前端程序员通过JS、CSS等技术设计出来的,而报表开发这个一般是属于后端程序员的工作,这样硬是把后端开发的工作推给前端,还很难把报表这一块做好。

我想如其用着这些蹩脚的东西,还不如把自己多年前设计的打印控件进行升级,让其支持所有的主流浏览器。Chrome注重安全性、健壮性和用户体验,而打印程序需要管理用户本地的打印机,作为浏览器中渲染执行的网页程序,是无法直接控制打印机,所以这个必须通过应用程序来进行精准打印。所有的浏览器都可以通过URL Protocol协议来调用本地程序。

这个跨浏览的打印控件的总体设计思路是:在服务端把打印模板设计好,把所需要打印的数据组织好,再生成一个临时文件的URL,然后把此URL作为参数通过URL Protocol协议去调用本地的打印控件,打印控件下载此临时文件,再解析出打印模板和打印数据,最后进行直接打印或打印预览。

我按照此思路,编写了服务端的类库和打印控件,服务端的类库是完全开源的,提供所有的源代码,目前的源代码版本有Java、C#、PHP,对于其它语言,我暂时还没有用过,有需要的朋友可以自己完善一下。要集成到自己的项目中,也是比较简单的,我提供了详细的说明文档,一般只需要引用2个源文件就可以直接调用其中的函数了。

对于打印控件,因为涉及HTTP、JSON等技术,这个C#比C++更快开发,所以我采用.net framework 3.5进行开发,这个框架是Win 7系统自带,对于Win 7和Win 10 的电脑无需再次安装,对于古老的XP则需要先安装此框架。

开发了此打印控件之后,除了自己的项目使用之后,我共享给同行朋友使用,他们一致反应,控件稳定好用,兼容Windows系统下的所有浏览器;速度快,打印预览100页,也只需要5秒钟;设计效率高,通过简单的拖放就可以设计一份完美的中国式报表; 还支持用户自主在线设计报表等。

有需要的朋友,请加入QQ群:218392762(一群:135506194、二群:150850837都已满,请加入三群)或者请直接Q我:12988672。

报表预览、编辑和开发包下载的网址:  http://www.lc-simple.com/PirntTest/

跨浏览器的打印程序的设计 – Web打印 – 博客园已关闭评论
2019年6月8日 By mikel 分类: 架构设计

来源: 理解serverless无服务架构原理(一) – 龙恩0707 – 博客园

阅读目录

一:什么是serverless无服务?

serverless中文的含义是 “无服务器”,但是它真正的含义是开发者再也不用过多考虑服务器的问题,但是并不代表完全去除服务器,而是我们依靠第三方资源服务器后端,比如使用 Amazon Web Services(AWS) Lambda. 计算服务来执行代码,那么Serverless架构分为 Backend as a Service(BaaS) 和 Functions as a Service(FaaS) 两种技术,Serverless 它是由开发者实现的服务端逻辑运行在无状态的计算容器中,它是由事件触发,完全被第三方管理的。

什么是BaaS?

Baas 的英文翻译成中文的含义:后端即服务,它的应用架构由大量第三方云服务器和API组成的,使应用中关于服务器的逻辑和状态都由服务提供方来管理的。比如我们的典型的单页应用SPA和移动APP富客户端应用,前后端交互主要是以RestAPI调用为主。只需要调用服务提供方的API即可完成相应的功能,比如常见的身份验证,云端数据/文件存储,消息推送,应用数据分析等。

什么是FaaS?

FaaS可以被叫做:函数即服务。开发者可以直接将服务业务逻辑代码部署,运行在第三方提供的无状态计算容器中,开发者只需要编写业务代码即可,无需关注服务器,并且代码的执行它是由事件触发的。其中AWS Lambda是目前最佳的FaaS实现之一。

Serverless的应用架构是将BaaS和FaaS组合在一起的应用,用户只需要关注应用的业务逻辑代码,编写函数为粒度将其运行在FaaS平台上,并且和BaaS第三方服务整合在一起,最后就搭建了一个完整的系统。整个系统过程中完全无需关注服务器。

二:与传统模式架构区别?

传统的架构模式是使用C/S架构的,在典型的web应用程序中,服务器接收前端的HTTP请求处理,在保存或查询数据库之前,数据可能会经过多个应用层,最终后端会返回一个响应。比如它可以是JSON形式或其他格式等。然后他会将响应返回给客户端,比如如下图所示:

在传统开发模式中,开发流程:设计师设计页面 -> 服务端开发 和 前端分别开发,服务器开发完成后,-> 服务部署 ->服务部署完成后,就是前后端联调 -> 前后端联调 -> 前后端联调完成后就是测试了,-> 测试, 测试完成需要上线,因此 -> 上线,上线完成后,需要运维维护,因此 -> 运维。在传统开发模式中,开发一个应用程序,从开始到上线需要不同的角色来做不同的事情,沟通成本非常大,并且运维过程中需要考虑到 服务器的负载均衡、事务、集群、缓存、
消息传递和数据冗余等等这些事情,在目前传统模式中存在如上问题。可以使用如下示意图来看下如上流程。如下图所示:

在Serverless架构中,应用业务逻辑是基于FaaS架构形成多个相互独立的功能组件的。并且以API服务的形式向外提供服务,在FaaS中,后端的应用被拆分成为一个个函数,我们只需要编写完成函数后部署到serverless服务即可。后续我们也不用关心任何服务器的操作。那么整个流程就只需要我们一个前端工程师的角色来完成所有的开发工作,那么沟通成本降低了。因此我们可以使用如下示意图来表示项目流程,如下所示:

前端工程师是居于serverless去写后端服务的,典型的就是居于 AWS Lambda 中编写代码,AWS中支持不同的语言。
Lambda计算服务它能够以大规模并行的方式执行代码来响应事件。通过使用Lambda以及使用各种功能强大的API和Web服务,开发者可以快速的构建松耦合,可扩展性及高效的架构体系。

注意:Lambda是什么?它是一种计算服务,它在AWS基础上执行用JavaScript、node.js、Python、C#或java编写的代码,源代码将被打包并部署到孤立的容器中,该容器有单独分配的内存、磁盘空间和处理器。代码、配置和依赖项的组合被称作为Lambda函数。

三:serverless优缺点?

优点有如下:

1. 降低创业公司启动成本

当一家创业公司的时候,在开发web的时候,我们需要版本管理服务器、持续集成服务器、测试服务器、应用版本管理仓库等作为基础服务。
线上运行的时候,为了应对大量的请求,我们还需要一个好的数据库服务器。当我们应用面向普通的用户时,我们需要:

1.1 邮件服务,用于发送提醒,注册等服务。
1.2 短信服务,用于注册,登录等用户授权操作。

如上一些对于大公司来讲,都有现成的基础设施。可是对于创业公司来讲。这都需要一些启动成本。但是如果我们使用serverless就可以降低这些成本。

2. 减少运营成本

对于创业公司来讲,他们没有基础设施,没有财力,也可能没有能力去建设基础设施,采用云服务是最好的选择,可以为他们节省大量的资金。
他们只要将精力放在对用户价值的产品之上即可,他们不需要自己去搭建服务器,因此会有更多的时间去开发业务功能。而采用函数计算的serverless与云服务器最大的区别是:云服务器需要一直运行,比如说月费或年费要多少钱租,但是serverless是按需计费的,如果有请求到来的时候,才运行函数,否则的话,是不需要钱的。

3. 降低开发成本

serverless会提供一系列的配套服务,比如 我们只需要在配置文件上写下数据库的表名,那么数据就会存储到对应的数据库里面,并且会提供一系列的函数计算模板,我们只需要写好我们的配置即可,那么这一系列的东西都可以自动,高效的完成任务。

4. 实现快速上线

对于一些传统项目来讲,我们在本地开发需要部署环境,到开发环境或测试环境,我们还是需要部署环境。但是serverless可以在部署上有优势,并且很轻松的实现上线。因为serverless内部相当于有 内建自动化部署功能,并且在该里面都是由供应商提供的功能,每次我们写完业务代码后,我们只需要运行下即可,在AWS Lambda 函数计算里面,函数一般在上传后几秒钟内,就能做好调用准备。

5. 系统安全性更高。

要保持服务器一直运行不是件容易的事情,并且还需要考虑黑客不同类型的攻击,但是有serverless后,我们不需要考虑这些问题了,这些问题第三方供应商已经会帮我解决这些问题的。

6. 能适应微服务架构和扩展性能力强

Serverless 的背后是 诸如 AWS Lambda 这样的 FaaS(Function as a Services)。

对于传统应用来说,要应对更多的请求的方式,就是部署更多的实例。然而,这个时候往往已经来不及了。而对于 FaaS 来说,我们并不需要这么做,FaaS 会自动的扩展。它可以在需要时尽可能多地启动实例副本,而不会发生冗长的部署和配置延迟。

以亚马逊的AWS Lambda为案例,Lambda能让我们不用思考任何服务器,也就是说,不用我们处理服务器上的部署,服务器的容量和服务器的扩展和失败容错,还有服务器上选择什么OS操作系统,语言的更新,日志等等问题。你的应用程序只需要和多个第三方的API或服务打交道,也可以自我创建一个无服务器的
API。

缺点有如下:

1. 不适合长时间运行应用

serverless 在请求到来的时候才运行,当应用不运行的时候会进入 “休眠状态”,下次当请求来临时,应用将会需要一个启动时间,可以叫 冷启动,如果我们的应用需要一直长期不间断的运行,处理大量的请求,那么可能就不适合使用serverless来架构了,如果这种情况下,我们需要使用像EC2这样的云服务器会是一个更好的选择。

EC2相当于我们自己买了一辆车,在Lambda 相当于我们租了一辆车。如果我们长期租车的话,那么肯定比买车更贵,但是租车可以减少一部分车维护成本。

2. 完全会依赖于第三方服务

如果我们所有和应用相关的服务放在第三方服务上的话,就可能会涉及到安全性问题,因此我们可以将不重要的API或服务放在serverless上。
当然如果我们自己有服务设施的话,那肯定使用自己的设施服务的,当我们自己使用serverless架构的时候,那么我们就已经和供应商绑定了。
如果这个时候我们将服务迁到别的云服务商上就没有那么容易了。

3. 缺乏调式和开发工具,排查问题困难。

4. 无法用于高并发运用。

为每个请求启动一个进程开销太高,流量瞬间爆发容易超时。比如淘宝的双十一支付宝高峰期,每秒处理交易笔数8万多笔,也就意味着我们的系统内每秒有8万多个进程创建又被销毁。那么这样就会造成系统开销很大。解释和第一点一样的原理。

四:使用serverless的应用场景有哪些?

Serverless 适合构建比较简单的应用,比如上传一张图片,对一段音频/视频进行编码或解码,对请求返回一小段数据等。

Serverless架构主要有以下特点:

1. 实现了细粒度的计算资源分配。
2. 不需要预分配资源。
3. 具备真正意义上的高度扩容和弹性。
4. 按需使用,按需计费。

因此以下应用将可能使用serverless架构:

1. 静态网站的管理。
2. 替代WordPress(Serverless Blog Project)
3. 个人媒体服务器(less!)
4. 物联网Iot或家庭自动框架或项目 (使用 AWS IoT)

理解serverless无服务架构原理(一) – 龙恩0707 – 博客园已关闭评论
2019年6月7日 By mikel 分类: Debug, 数据库

来源: tempdb太大引起磁盘容量不足的处理 – 简书

最近公司项目在用SQLServer2012,因数据量非常大,程序跑起来临时表的数据量高达40多G,严重影响C盘的存量,所以决定将临时表文件迁移到存量比较大的分区。

  • 临时方法:重启MSSQLServer服务可删除缓存,可是不方便,更好的方法是更换缓存分区。

具体方法:

1.在SQLServer中运行以下代码:
SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID(‘tempdb’);

运行后会返回tempdb.mdf与templog.ldf的路径。

2.在控制面板-管理工具-服务中停止MSSQLSERVER的服务并将以上两个文件移动到其他分区,并记下路径。再执行以下语句:

GO
ALTER DATABASE tempdb 
MODIFY FILE (NAME = tempdev, FILENAME = 'D:\tempdb\tempdb.mdf');
GO
ALTER DATABASE tempdb 
MODIFY FILE (NAME = templog, FILENAME = 'D:\tempdb\templog.ldf');

NAME = tempdev,NAME = templog 是逻辑名,FILENAME 指向的是数据库文件的实际位置
3.重启服务,检查SQLserver是否移动成功:

FROM sys.master_files
WHERE database_id = DB_ID('tempdb'); 
运行后会返回新的tempdb.mdf与templog.ldf的路径。  

坑来了!

第二天重启电脑后发现sqlserver2012不能登录了,MSSQLSERVER 显示[[SQL Server无法连接到服务器]标题: 连接到服务器 ——— 无法连接到 ****],找不到指定文件……并且启动MSSQLSERVER服务时会自动停止,经过查看计算机管理日志后发现错误:

  • 尝试打开或创建物理文件 ‘F:\tempdb\tempdb.mdf’ 时,CREATE FILE 遇到操作系统错误 5(拒绝访问。)。
  • FCB::Open failed: 无法打开文件号 1 的文件 F:\tempdb\tempdb.mdf。操作系统错误: 5(拒绝访问。)。

确定是改变临时表路径引起的权限问题!

解决方法:
分区->属性->安全
把User的权限改为完全控制,重启服务即可。

参考资料:http://www.cnblogs.com/shadow-ccos/p/5304106.html

作者:shakesbears
链接:https://www.jianshu.com/p/f7674b38833f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

tempdb太大引起磁盘容量不足的处理 – 简书已关闭评论
2019年6月7日 By mikel 分类: Debug, 数据库

来源: 故障处理记录-tempdb太大引起磁盘容量不足的处理(更新ing) – 影澜 – 博客园

上班时候遇到的问题,系统在进行某操作的时候报错,按习惯查看数据库错误日志发现是磁盘无法写入,直接登录数据库服务器,果然C盘是被占满了只有9M剩余,查找文件发现原因在于这个tempdb达到了21G。

当时有想到的方案是:

1、收缩数据库,不知道时间多长不知道会有什么影响,放弃

2、清理日志,但日志清了也只有2G空间,清空的时间也不好说,说不定清完再飚上来,放弃

3、重启服务,一般会初始化成几M大小,但也有可能还是一样大,而且不知道重启后恢复会不会有问题,时间多长,会不会有其他什么影响,放弃;

4、重启服务器,以前也有过宕机无法远程所以重启,采用后tempdb确实初始化了

重启服务器无效的备用方案:把tempdb转移到空间较大的分区(后来查了一下一样也要停止服务来修改再启动服务)

具体方法:检查tempdb的逻辑名字和位置:

SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

停止服务,记录下数据库文件的位置,然后打开目录复制数据库相关文件到新的位置,移动也可以,执行以下脚本:

复制代码
USE master;
GO
ALTER DATABASE tempdb 
MODIFY FILE (NAME = tempdev, FILENAME = 'D:\tempdb\tempdb.mdf');
GO
ALTER DATABASE tempdb 
MODIFY FILE (NAME = templog, FILENAME = 'D:\tempdb\templog.ldf');
GO
复制代码

NAME = tempdev,NAME = templog 是逻辑名,FILENAME 指向的是数据库文件的实际位置

最后检查tempdb移动是否成功:

SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

回头会学习一下前3种操作方式的影响和如何确定tempdb增长的原因,再做记录

故障处理记录-tempdb太大引起磁盘容量不足的处理(更新ing) – 影澜 – 博客园已关闭评论
2019年6月7日 By mikel 分类: Debug, 数据库

来源: SqlServer 2008的tempdb数据文件大小暴增处理 – weixin_34148340的博客 – CSDN博客

tempdb数据文件暴增,导致服务器磁盘空间被耗尽!

 

1.查看tempdb的使用分配情况

  1. use tempdb
  2. go
  3. SELECT top 10 t1.session_id,
  4. t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count,
  5. t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
  6. t3.login_name,t3.status,t3.total_elapsed_time
  7. from sys.dm_db_session_space_usage t1
  8. inner join sys.dm_exec_sessions as t3
  9. on t1.session_id = t3.session_id
  10. where (t1.internal_objects_alloc_page_count>0
  11. or t1.user_objects_alloc_page_count >0
  12. or t1.internal_objects_dealloc_page_count>0
  13. or t1.user_objects_dealloc_page_count>0)
  14. order by t1.internal_objects_alloc_page_count desc

2.从internal_objects_alloc_page_count和internal_objects_dealloc_page_count可以看出,给session分配了44096页,计算一下:

select 44096*8/1024/1024 as [size_GB]

 

可能是因为时间太久,已经找不到导致暴增的会话。

 

3.如果产生问题的会话还存在的话,可以根据会话id进一步查看具体执行的SQL内容

  1. select p.*,s.text
  2. from master.dbo.sysprocesses p
  3. cross apply sys.dm_exec_SQL_text(p.SQL_handle) s
  4. where spid = 74

 

临时重启了数据库服务器后解决问题。但是目前还要继续监控分析,因为没有根本解决问题。

SqlServer 2008的tempdb数据文件大小暴增处理 – weixin_34148340的博客 – CSDN博客已关闭评论
2019年6月7日 By mikel 分类: 数据库

来源: sqlserver解决tempdb过大的问题 – u011747152的博客 – CSDN博客


#查出最大的spid
use tempdb
go
SELECT top 10 t1.session_id,
t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count,
t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
t3.login_name,t3.status,t3.total_elapsed_time
from sys.dm_db_session_space_usage t1
inner join sys.dm_exec_sessions as t3
on t1.session_id = t3.session_id
where (t1.internal_objects_alloc_page_count>0
or t1.user_objects_alloc_page_count >0
or t1.internal_objects_dealloc_page_count>0
or t1.user_objects_dealloc_page_count>0)
order by t1.internal_objects_alloc_page_count desc

#看是哪条SQL导致的
select s.text,p.*
from master.dbo.sysprocesses p
cross apply sys.dm_exec_SQL_text(p.SQL_handle) s
where spid = 55

sqlserver解决tempdb过大的问题 – u011747152的博客 – CSDN博客已关闭评论
2019年6月7日 By mikel 分类: 数据库

来源: 实战案例–TEMPDB暴涨 – phper111的博客 – CSDN博客

前言

tempdb暴增,造成磁盘空间不足,甚至影响业务运行。

正文

如图,tempdb log文件从7.40开始突然暴涨,因为 tempdb 0 M到 40G
 

tempdb 所在磁盘是C 盘
C盘的可用空间正好也为40G
在下午16.22左右的时候tempdb 文件暴涨已经影响到业务使用.临时解决是备份收缩日志。下面通过监控信息查找造成问题的原因:
查看7.40 之后这段时间 的运行语句,发下有个会话1085一直在运行
这个会话分配了内部对象(就是使用了tempdb的对象)
 
而言会话从7.46开始,一直持续到下午16.20 从时间上也非常吻合。所以他就是我们要找的元凶。

原因

对应普通的 简单模式的数据库无法重用日志的主要原因是没有做checkpoint,和存在没有提交的事务。但对于TEMPDB 来讲 他不需要预写日志。因为Tempdb 不支持重做(Redo)但需支持回滚(rollback).这也是tempdb日志存在的原因.
如果一个事务还没有提交,那它可以在任何时候回滚。SQL Server必须做好这种准备,以便能够从日志记录中找回修改前的数据内容,完成回滚。在SQL Server里面,所有的日志记录都有严格顺序,中间不可以有任何跳跃。所以如果某个数据库有没有提交的事务,SQL Server会标记所有从这个事务开始的日志记录(不管和这个事务有没有关系)为活动事务日志 。这些日志记录都有可能“需要”被用来做回滚。

解决

找到语句后,这个语句一直持续运行的原因是,等待ASYNC_NETWORK_IO
这说明,客户端和数据库服务器网络传输存在问题或者程序中未接收数据库传输的数据。更多的是后者。问题就提交给开发,检查代码,对程序进行优化。

补充

查看日志空间使用的方法:
DBCC LOGinfo() 查看vlf的状态
DBCC SQLPERF(LOGSPACE) 建议用,查看日志空间的使用 ,更准。
从UI 或者查
  用下面的语句查:

都是不准的
实战案例–TEMPDB暴涨 – phper111的博客 – CSDN博客已关闭评论
2019年6月7日 By mikel 分类: C#

来源: C# json解析时,得到JObject后怎么判断它的某一键值是否存在?_博问_博客园

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.IO;

namespace JsonTest
{
class Program
{
static void Main(string[] args)
{
string str = “{\”3\”:123,body:456,list:{title:’abc’,body:’what’}}”;
JObject jo = JObject.Parse(str);
if (jo.Property(“3”) == null || jo.Property(“3”).ToString() == “”)
{
Console.WriteLine(“键值key不存在!”);
}
bool hasErr = jo.Properties().Any(p => p.Name == “err”)//或是这样
IEnumerable properties = jo.Properties();
foreach (JProperty item in properties)
{
Console.WriteLine(item.Name + “:” + item.Value);
}
Console.ReadKey();
}
}
}
参考:
http://q.cnblogs.com/q/46146/

C# json解析时,得到JObject后怎么判断它的某一键值是否存在?_博问_博客园已关闭评论
2019年6月6日 By mikel 分类: Debug

Selenium

来源: 用Python完成毫秒级抢单,助你秒杀淘宝大单 – 上海小胖 – 博客园

目录:

  1. 引言
  2. 环境
  3. 需求分析&前期准备
  4. 淘宝购物流程回顾
  5. 秒杀的实现
  6. 代码梳理
  7. 总结

0 引言

年中购物618大狂欢开始了,各大电商又开始了大力度的折扣促销,我们的小胖又给大家谋了一波福利,淘宝APP直接搜索:小胖发福利,每天领取三次粉丝专属现金大红包。

有了现金大红包,如何做到更省钱的剁手呢?今天给大家提供一种思路,用Python实现秒杀订单,借用自动化方式完成最优解。

1 环境

操作系统:Windows

Python版本:3.7.2

2 需求分析&前期准备

2.0 需求分析

我们的目标是秒杀淘宝的订单,这里面有几个关键点,首先需要登录淘宝,其次你需要准备好订单,最后要在指定时间快速提交订单。

登录淘宝,这里就要用到一个爬虫利器Selenium,它是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击、下拉等等操作,所见即所得。另外对于一些 JavaScript 渲染的页面来说,此种抓取方式非常有效。

2.1 Selenium的安装

Selenium 的安装很简单,可采用如下方式。

pip install selenium

Selenium安装好之后,并不能直接使用,它需要与浏览器进行对接。这里拿Chrome浏览器为例。若想使用Selenium成功调用Chrome浏览器完成相应的操作,需要通过ChromeDriver来驱动。

2.2 ChromeDriver的安装

这里是ChromeDriver的官方下载地址。

链接:

https://chromedriver.storage.googleapis.com/index.html

我们在下载之前先来确认下我们使用的Chrome浏览器版本。

在这里插入图片描述

通过ChromeDriver的下载链接,找到与之对应的Chrome浏览器版本,根据你电脑系统的平台类型进行下载。

在这里插入图片描述
在这里插入图片描述

下载完成之后,解压,将其放置在Python安装路径下Scripts文件夹中即可

在这里插入图片描述

上述操作结束后,我们执行如下命令,测试一下

from selenium import webdriver
# 打开Chrome浏览器
browser = webdriver.Chrome()

代码执行后,若成功打开了浏览器,则证明你的ChromeDriver安装的没问题,可以正常愉快地使用Selenium了。

接下来,我们先来回顾下淘宝购物流程。

3 淘宝购物流程回顾

3.1 首先要打开淘宝网站

https://www.taobao.com

换作使用Seleuinm方式,代码如下:

browser.get("https://www.taobao.com")

3.2 我们登录淘宝才能进行下一步操作

在这里插入图片描述
换成Seleuinm方式,代码:

browser.find_element_by_link_text("亲,请登录").click()

这时我们就要就跳到了一个扫码登录的页面,我们用手机进行扫码,登录成功之后进行下一步。

3.3 登录成功之后,我们来打开购物车,链接如下:

https://cart.taobao.com/cart.htm

换成Seleuinm方式,代码:

browser.get("https://cart.taobao.com/cart.htm")

3.4 我们想要全选购物车中的商品,直接点击全选即可

在这里插入图片描述

换成Seleuinm方式,代码:

browser.find_element_by_id("J_SelectAll1").click()

注:若你的购物车商品比较多,又不想全选购买,那就 手动 勾选想要下单的商品。

3.5 勾选好商品后就可以“结算”下单

在这里插入图片描述

换成Seleuinm方式,代码即:

browser.find_element_by_link_text("结 算").click()

3.6 等待提交完订单后才算数

在这里插入图片描述

换成Seleuinm方式,代码即:

browser.find_element_by_link_text('提交订单').click()

3.7 订单成功秒下之后,接下来的付款,慢慢来就好。

在这里插入图片描述

4 秒杀的实现

秒杀的实现,思路也很简单。这里有两个时间点,一是抢购时间,一是当前时间。只需要比较这两个时间点,到了抢购时间立即下单即可。

记录时间,需要使用datetime这个内置模块,代码如下:

import datetime
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')

5 代码梳理

首先得登录淘宝,这里我们定义一个login函数

def login():
    # 打开淘宝首页,通过扫码登录
    browser.get("https://www.taobao.com")
    time.sleep(3)
    if browser.find_element_by_link_text("亲,请登录"):
        browser.find_element_by_link_text("亲,请登录").click()
        print(f"请尽快扫码登录")
        time.sleep(10)

接下来就是勾选购物车中的商品,这里我们定义一个picking函数

def picking(method):
    # 打开购物车列表页面
    browser.get("https://cart.taobao.com/cart.htm")
    time.sleep(3)


    # 是否全选购物车
    if method == 0:
        while True:
            try:
                if browser.find_element_by_id("J_SelectAll1"):
                    browser.find_element_by_id("J_SelectAll1").click()
                    break
            except:
                print(f"找不到购买按钮")
    else:
        print(f"请手动勾选需要购买的商品")
        time.sleep(5)

等待抢购时间,定时秒杀,这里我们定义一个buy函数

def buy(times):
    while True:
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
        # 对比时间,时间到的话就点击结算
        if now > times:
            # 点击结算按钮
            while True:
                try:
                    if browser.find_element_by_link_text("结 算"):
                        browser.find_element_by_link_text("结 算").click()
                        print(f"结算成功,准备提交订单")
                        break
                except:
                    pass
            # 点击提交订单按钮
            while True:
                try:
                    if browser.find_element_by_link_text('提交订单'):
                        browser.find_element_by_link_text('提交订单').click()
                        print(f"抢购成功,请尽快付款")
                except:
                    print(f"再次尝试提交订单")
            time.sleep(0.01)

6 总结

短短几十行代码就能秒杀淘宝订单,赶紧行动起来吧!记着,每天在淘宝上搜索小胖发福利,领取粉专属福利哟~

关注公众号「Python专栏」,后台回复「抢单器」获取全套代码!

用Python完成毫秒级抢单,助你秒杀淘宝大单 – 上海小胖 – 博客园已关闭评论
2019年6月5日 By mikel 分类: 数据库

来源: Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法 – 独行客 – 博客园

这两天在进行网站搬家,这次网站搬家采用直接打包mySQL数据库和网页文件的形式进行迁移,上传好mySQL data目录里面的网站数据库至VPS上mysql存放数据库的目录里面,解压就行。我的VPS存放数据库的路径是 /usr/local/mysql/var。

上传好网站数据,解压,配置好数据库链接参数就行,网站就能正常连接上了,我本以为这已 经是顺利迁移完成了,但后来操作的时候,发现只能读取数据库的内容,不能更改写入任何信息,提示#1036 – Table ‘* ‘ is read only (*号为任意表),也就是说表只有只读属性。

通过SSH,给数据库文件777权限,admin是我的数据库文件夹

1、chmod -R 0777 /usr/local/mysql/var/admin/

给数据库目录的所属用户和组改为MySQL

2、 chown -R mysql:mysql admin

但是这样还不能更改数据库,首先,找到mysqladmin所在位置,一般都在mysql/bin下面,我的在/usr/local/mysql/bin 里面,还需要运行以下命令:

3、./mysqladmin -u root -p flush-tables

之后输入root账号的密码,马上就好了,没有任何任何提示,然后测试一下,能正常读写,搬家也就顺利完成。

Linux下MySql出现#1036 – Table ‘ ‘ is read only 错误解决方法 – 独行客 – 博客园已关闭评论
备案信息冀ICP 0007948