Selling a property can be a challenging task, especially in today’s competitive real estate market. With so many properties available for sale, it’s important to ensure that your property stands out from the crowd. One way to do this is by creating a single property website. And with MyListingPage, you can easily create a stunning […]
The post Free Single Property Websites for Real Estate Agents first appeared on Davy's Blog.SVN Update时被中断,下次更新或Cleanup的时候提示: The pristine text with checksum ‘faeace54ae64f899db370be1457341d2b1b72a69’ was not found 错误 解决方法如下: 将出错文件的信息从SVN记录数据库wc.db中删除,然后重新Update出错文件所在路径即可。 到官网下载 sqlite 如果是Windows系统,下载Precompiled Binaries for Windows 下红框中版本 上面的命令执行完毕后,再删除出错文件本身,再重新Cleanup,Update想要更新的文件夹就不会出现问题了。
The post SVN Pristine text not found 解决方案 first appeared on Davy's Blog.thinkphp提供了一个参数让我们配置session过期时间。 然而这一配置是否真的有效?在多次测试之后,不遂人意。 why?那我们试着从源码上分析这个配置参数的,它是怎么让尝试着然我们的session过期的。 上图在中展现了框架对session有效期的操作,它设置了php.ini中的两个变量“session.gc_maxlifetime”和“session.cookie_lifetime”的值。 那么我们继续追问?这个两个参数就能让session按照自己设置的时间过期? 我们看看这两个参数代表着什么? session.gc_maxlifetime:session的有效生存时间,过了这个时间session将进入销毁队列。 session.cookie_lifetime:值为0代表关闭浏览器,保存在客户端的sessionid将立即失效。 session.gc_maxlifetime这个是关键,但过了这个时间并不能马上销毁,这又涉及到session.gc_probability和session.gc_divisor,这两个参数决定超过gc.maxlifetime的session被销毁的概率,只有session被销毁才能算过期。 上面的的几个因素说明了单纯配置SESSION_OPTIONS就想让session过期是行不通的,至少这种过期是有概率成分的。 还有session比较糟糕的是他没有像cookie那样默认就有域的隔离,如果你没做session.path的设置,那么运行在同一个服务器上的不同项目session文件是存在同一个目录的,不同项目的对maxlifetime的配置就会相互影响,gc的垃圾回收机制会按照后来者的配置值进行删除,前者的设置无效了。 对于上面的一些问题,我们的解决方案是什么? 对于session的有效时间设置要在代码层进行,我们了解到session过期的本质是session文件的销毁,我们把被动销毁,改为主动销毁。 拿我的项目,举例说明,我要让一个登录在一个小时内过期,即在线时间为一个小时。 1.配置config。 2.在LoginController中的登陆接口,把会话开始时间主动存到session中,代码入下: 3.在BaseController中的构造函数加上会话是否过期,让登录后的每一个请求都做会话过期判断,如下代码: 上面的操作是双管齐下来了一个双保险,即对session.gc_maxlifetime和session.cookie_lifetime的设置,同时主动对会话过期时间做判断。如果gc没有回收过期的session,那么程序中会话过期判断就会进行补刀。 好了,今天‘对thinkphp有效的设置session过期时间’就介绍到这,希望对你有所帮助。 原文:http://www.qiusuoweb.com/81.html
The post Thinkphp如何有效的设置session过期时间 first appeared on Davy's Blog.PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。 一个已知管用的方法是,使用 session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。 但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢? 大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录…… 要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分): 1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! 还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。 前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以…… 如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤: 1、“session.use_cookies”:设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改; 2、“session.cookie_lifetime” :这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样。 3、“session.gc_maxlifetime”: 这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!那么我们也把它设置为99999999。 在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。 由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_pisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_pisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。 到此为止,工作一切正常。那为什么会发生 gc_maxlifetime 无效的情况呢? 在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为 \tmp,在 Windows下通常为 C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。 还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。解决这个问题的一个方法是,把session.gc_probability/session.gc_pisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。 但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值……只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了! 但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!———————————————————————————— 打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数,这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。记下了SessionID的名称后,我们就可以实现永久的Session数据储存了! 代码如下: 后记:其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!把session放入mysql的Example:数据库里建表:session ( sesskey varchar32 , expiry int11 , value longtext)code:代码执行前已经连接数据库了。 代码如下: open,write那些参数哪里来的。 修改php.ini配置的两个常用函数: get_cfg_var(‘session.gc_maxlifetime’) : 取得session.gc_maxlifetime的值 […]
The post php session有效期的问题 first appeared on Davy's Blog.DMARC(Domain-based Message Authentication, Reporting & Conformance)是一种基于现有的SPF和DKIM协议的可扩展电子邮件认证协议,邮件收发双方建立了邮件反馈机制,便于邮件发送方和邮件接收方共同对域名的管理进行完善和监督。对于未通过前述检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。从而有效识别并拦截欺诈邮件和钓鱼邮件,保障用户个人信息安全。 https://service.exmail.qq.com/cgi-bin/help?subtype=1&no=1001520&id=16 1.在设置DMARC记录之前,请务必确保已设置SPF记录: TXT记录值为:v=spf1 include:spf.mail.qq.com ~all 2.添加以下DMARC记录: 主机记录: _dmarc记录类型:TXT记录值: v=DMARC1; p=none; rua=mailto:mailauth-reports@qq.com 注意:DMARC记录里,有一个值可由你来自定义: p:用于告知收件方,当检测到某封邮件存在伪造发件人的情况,收件方要做出什么处理; p=none; 为收件方不作任何处理p=quarantine; 为收件方将邮件标记为垃圾邮件p=reject; 为收件方拒绝该邮件 SPF (或是Sender ID)是Sender Policy Framework的缩写。当你定义了你域名的SPF记录后,接收邮件方会根据你的SPF记录来判断连接过来的IP地址是否被包含在SPF记录里面,如果 在,则认为是一封正确的邮件,否则则认为是一封伪造的邮件。现在绝大部份反垃圾邮件系统都支持SPF过滤,这种过滤一般不会有误判,除非是邮件系统管理员 自己把SPF记录配置错误或遗漏. a 你域名的A记录。mx MX服务器会有退信等。inlude 如果有可能通过一个isp来发信,isp有自己的SPF记录,则填入这个isp的域名。比如你使用Google Apps,应该增加include:google.com记录,因为你的邮件时从Google服务器发出去的。ip4: 你还有没有其他的ip发信?可能你的smtp服务器是独立出来的,那么就填入你的IP地址或者网段。~all: 意思是除了上面的,其他的都不认可。 设定 SPF 发信验证 SPF 是一个防止网域冒名发信的机制,透过设定自己网域的 TXT 纪录来指定发信主机,如果接收 Email 的主机找不到信件网域的 SPF 记录,在无法验证的情况下退信机率极高!要加入 SPF 很简单,请在 DNS 新增一笔记录如下: Type: TXTHost: @Value: […]
The post SPF and DMARC first appeared on Davy's Blog.在某些情况下,我们需要对列表进行某些操作,例如对列表中的每一个元素都乘以2,这样一般来说就是遍历每个元素在乘以2。那么写下来就得两行了。而且这会修改原来的列表,如果要求不能修改原来的列表,又得多一行了。 一眼看上去就是臃肿二字。 Python提供了更加简便的写法: 输出: 1 3 5 7 2 6 10 14 这么写显得简便得多了。而且也很容易懂,先说for elem in mylist这部分,就是一个循环——声明elem临时变量,遍历mylist列表。而elem*2则表明对elem临时变量进行乘以2的操作,最后[]则很好理解,因为我们需要的是一个列表。总的来说就是从mylist列表中取元素,返回一个每个元素都乘以2的列表。 列表解释的强大之处不仅仅如此,还可以进行条件过滤: 那么这样就把列表中所有的偶数的二次方都输出出来了。
The post Python中的List Comprehensions(列表解释|列表生成式) first appeared on Davy's Blog.下面是MoviePy中的几种对clip的修改: 非常常见的修改clip属性的方法有:clip.set_duration, clip.set_audio, clip.set_mask, clip.set_start 等. 已经实现的特效 .clip.subclip(t1,t2): 截取t1到t2时间段内的片段;还有一些高级效果,loop:让clip循环播放、time_mirror:让clip倒播,这些方法位于特殊的模块 moviepy.video.fx, moviepy.audio.fx,应用clip.fx方法,比如 clip.fx(time_mirror) 让视频倒播。 以上的特效其实本质上并不是原地直接修改的(没有对原始视频修改),而是根据修改产生新的clip。所以,我们如果想让修改生效,需要将修改过的产生的clip赋值给某clip,保存修改。举个栗子。 所以,当我们写出 clip.resize(width=640), moviepy并不是立刻就逐帧修改clip。一般只会先修改第一帧,其他的左右的帧只有在需要的时候(最后写入文件或者预览)才会被resize。 另一方面,可以这样讲,创建一个clip,几乎是不会占用时间和内存的,几乎所有的计算其实发生在最后转换的时刻。 moviepy中的时间表示 很多方法都接受时间参数,clip.subclip(t_start,t_end),截取两个时间点之间的clip片段,在这个方法中,时间既可以用 (t_start=230.54), 以秒的时间来表示,也可以用 (t_start=(3,50.54)),以3分50.54秒的形式来表示,还可以 (t_start=(0,3,50.54)) 或者 (t_start=(00:03:50.54)), 以,小时,分钟,秒的形式老表示。 大多数没有赋值的时间参数会有一个默认值,比如 clip.subclip(t_start=50), t_end的默认值就是视频的长度,clip.subclip(t_end=50),那么t_start就默认为0.当时间是负数的时候,代表倒数n秒。比如,clip.subclip(-20, -10)会截取倒数20秒到倒数10秒之间的片段。 改变clip属性的方法 clip.fx 假定我们很多修改clip的方法。这些方法呢,都是输入一个clip和一些参数,输出一个新的clip。 如果我们要按顺序,依次修改clip,那么你可能会这样写: 但是上面的代码可读性不高,我们可以利用clip.fx来实现一种更简练的写法。 看上去是不是好多了。在模块 moviepy.video.fx 和 moviepy.audio.fx 中已经实现来一些修改clip的方法,这些fx的方法会自动的作用到和clip相关的声音和mask上,所以我们在修改clip的时候并不需要去关心声音和mask的处理,除非我们确实要对声音或者mask做一些特殊的处理。 在实际应用中,当我们使用 from moviepy import.editor * 的时候,这两个模块会被加载为 vfx和afx, 所以我们会像下面这样写 为方便起见,当我们使用 moviepy.editor 的时候,比如我们使用resize的时候,我们经常会使用 clip.resize(…) 这样的简便的写法来代替 clip.fx( vfx.resize, …) 的写法。 创建用户自定义特效的方法 clip.fl 我们可以使用 clip.fl_time、clip.fl_image 或者更普遍的 […]
The post MoviePy-Clips变换与特效 first appeared on Davy's Blog.经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理。以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人。忙里偷闲,对ffmpeg的这一组函数进行了一下封装,顺便测试了一下各种算法。 简单说一下测试环境,我使用的是Dell的品牌机,i5的CPU。ffmpeg是2010年8月左右的当时最新版本编译而成,我使用的是其静态库版本。 sws_scale的算法有如下这些选择。 首先,将一幅1920*1080的风景图像,缩放为400*300的24位RGB,下面的帧率,是指每秒钟缩放并渲染的次数。(经过我的测试,渲染的时间可以忽略不计,主要时间还是耗费在缩放算法上。) 算法 帧率 图像主观感受 SWS_FAST_BILINEAR 228 图像无明显失真,感觉效果很不错。 SWS_BILINEAR 95 感觉也很不错,比上一个算法边缘平滑一些。 SWS_BICUBIC 80 感觉差不多,比上上算法边缘要平滑,比上一算法要锐利。 SWS_X 91 与上一图像,我看不出区别。 SWS_POINT 427 细节比较锐利,图像效果比上图略差一点点。 SWS_AREA 116 与上上算法,我看不出区别。 SWS_BICUBLIN 87 同上。 SWS_GAUSS 80 相对于上一算法,要平滑(也可以说是模糊)一些。 SWS_SINC 30 相对于上一算法,细节要清晰一些。 SWS_LANCZOS 70 相对于上一算法,要平滑(也可以说是模糊)一点点,几乎无区别。 SWS_SPLINE 47 和上一个算法,我看不出区别。 总评,以上各种算法,图片缩小之后的效果似乎都不错。如果不是对比着看,几乎看不出缩放效果的好坏。上面所说的清晰(锐利)与平滑(模糊),是一种客观感受,并非清晰就比平滑好,也非平滑比清晰好。其中的Point算法,效率之高,让我震撼,但效果却不差。此外,我对比过使用CImage的绘制时缩放,其帧率可到190,但效果惨不忍睹,颜色严重失真。 第二个试验,将一幅1024*768的风景图像,放大到1920*1080,并进行渲染(此时的渲染时间,虽然不是忽略不计,但不超过5ms的渲染时间,不影响下面结论的相对准确性)。 算法 帧率 图像主观感受 SWS_FAST_BILINEAR 103 图像无明显失真,感觉效果很不错。 SWS_BILINEAR 100 和上图看不出区别。 SWS_BICUBIC 78 相对上图,感觉细节清晰一点点。 SWS_X […]
The post ffmpeg中的sws_scale算法性能测试 first appeared on Davy's Blog.更改视频亮度,增加字幕,去除音轨,淡入特效,转换,截取时间,控制位置,组合图框,合成多段, ** 如果此篇文章有帮助到你,欢迎点击下方/页面上任意广告,支持我们,谢谢!
The post moviepy 样码 first appeared on Davy's Blog.moviepy底层使用ffmpeg读取和导出视频以及音频文件。它使用ImageMagic对视频插入文字以及生成GIF(可选)。对于不同的媒体文件的处理是通过python高效的数值计算库numpy来完成的。一些特效处理等使用到了python的图像处理库比如PIL,scikit-images以及科学计算库scipy等。 关于moviepy的一些基础概念。moviepy的核心概念是clips,可以是AudioCLips 和 VideoClips 。这些clips可以被修改(剪切,降低播放速度,调整亮度等)或者和其他的clips混合到一起组成新的clips。然后这些clips可以通过pygame或者Ipython(jupyter notebook)预览,或者导出为videos文件或者GIF。VideoClips可以通过一个视频文件,图像文件或者文字以及动画来创建,这些VideoClips还可以有音轨(audio track)即 AudioCLips以及mask(这种一种特殊的VideoClips,当其他的clips混合在一起的时候,这个mask决定哪些clips可以显示出来)。具体操作下面我们主要以代码的形式展示。 Sample Code – clip_array的使用 Sample Code – CompositeVideoClips 上面的代码还是将三个clip组合到一起形成一个新的clip,只不过这次对每一个clip都做了一些操作,比如上面的 set_start 方法就是设置视频开始播放的时间, set_position 是设置clip的位置, crossfadein 是设置连接视频渐变的时间,还有很多其他的方法可以具体参考文档,使用这些方法,我们就可以将视频剪辑的更加丰富多彩,符合我们的要求。 Sample Code – Compositing audio clips 上面的代码逻辑不难理解。首先构建了一个 VideoClip 对象,然后使用 subclip 方法截取音频50-55秒,然后保存为新的音频文件。接着对视频clip对象采用 set_audio 方法设置audio track,这里需要注意的是clip的很多方法都是采用”流式”操作,即 clip.set_xxx 放回的仍然是一个clip,因此可以连续使用set_xxx方法,所以需要注意使用set_xxx之后需要将结果保存到一个新的对象,否则设置是无效的。最后需要注意 clip.fx 是通用的设置clip的方法,具体用法可以查看文档。 Sample code – Create custom effects 上面的代码展示了如何使用clip的 fl 和 fl_time 以及 fl_image 方法来生成一些特效。fl_time方法接收一个函数,对video的时间轴进行修改,该函数接收的是视频的时间属性t,所以上面的clip.fl_time(lambda x:3*x) 会让视频的播放速度加快3倍,而clip.fl_time(lambda x:1+sin(x)) 则让视频按照正弦的timeline播放,视频会有些抖动。 fl_image 对视频每一帧图像进行修改,其接收的也是一个函数作为参数,该函数的参数为image(ndarray),所以上面的 invert_green_blue 函数做的工作就是将图片的green channel 和 blue channel 转换。而 fl函数是一个更一般的函数,其也是接收一个函数作为参数,该函数的参数有两个,一个是 get_frame 函数,一个是当前帧的时间t,函数需要返回一个image(ndarray),而不难看出上面的scroll 函数就是让视频随着时间的变化在水平方向向下移(展示图片的一部分,高度始终不变),在竖直方向上不改变。 […]
The post python视频处理库:moviepy 第二篇 first appeared on Davy's Blog.