猫窝私语 — Makumo's Blog

玛酷猫的温馨小窝,记录生活点点滴滴。

@玛酷猫8 年前

08/3
16:07
计算机

windows 10周年更新蓝屏解决

终于等到windows10的周年更新,之前系统一直各种那种小问题,比如商店无法打开、应用无法打开、各种闪退等等,本想着重装系统,嫌麻烦一直凑合用着,顺便等周年更新(之前一直称为红石Redstone版),这种大更新就相当于重新装次系统,以上那些小问题或多或少会解决的,虽然可能会出现新的问题。官方说是2日放出更新,昨天刷了一天系统都没出现提示,今天上午刷了会也没提示有更新,直接下载官方的易升来升级了。后台挂着下载升级包,就去干活去了。不一会提示30分钟倒计时重启升级,保存下手头的工作,直接重启。然后就是等待那百分比的数字慢慢的跳动。

刷刷手机本想着一切顺利升级完成呢,结果屏幕DUANG的一下蓝了,蓝了,蓝了。。。。。顿时心里一万只草泥马奔过。屏幕显示 Driver IRQL not less or equal (CHDRT64.sys) 错误代码 C1900101-30018,新版的蓝屏居然还配一个二维码,还没来得及扫下看看啥内容就回滚原来版本。。。心想这不会这么衰吧,每次大升级都出点妖蛾子,重新试了次,这次是用微软的工具下载系统ISO镜像,然后使用完整镜像升级,这次留意了下,到32%的时候蓝掉了,还是同样的错误提示。网上搜了下,遇到这个的还不多,都没什么解决方案,无非都是重做系统,用数字大礼包修复系统。。。微软社区有人问了一样的问题,不过是1年前,应该是windown8.1升级到windows10遇到的(传送门)和我一样用的也是联想的yoga,不过下面给出的方法很官方的说法,啰里啰唆一大堆,无外乎磁盘错误扫描、文件完整性检查、系统错误检查、保持最新更新等等,其实没啥用(事实上又臭又长没仔细看,一目十行的看了下)

既然每次都是CHDRT64.sys这个文件引起的蓝屏,那就看下这个是什么东东,网上搜了下,结果也没有多少帮助的,好在在联想的官网上发现了点端倪(传送门),这个是Conexant Audio Driver声卡驱动的一个更新说明,其中有段写着

(Fix) Fixed an issue where BSOD 7E on CHDRT64.sys when overwrite-installing Audio driver from 4.XX.X.XX to 8.XX.XX.X

大概意思就是修复从覆盖安装时引起CHDRT64.sys蓝屏(BSOD:Blue Screen of Death)的问题,既然知道这个文件是声卡驱动,那就简单了,把你干掉看你还咋蹦跶。直接把声卡驱动卸载了,然后重新升级,这次顺利跳过32%那个坎,直接升级完成,问题解决。一起解决的还有之前所说的应用商店和应用的问题,又可以愉快的玩耍了。

windows 10周年更新蓝屏解决

@玛酷猫9 年前

04/20
22:04
计算机 项目管理

再聊聊钉钉开发

之前吐槽了下微信的开发,最近在钉钉中开发一套业务系统,顺便也吐槽下钉钉好了。

起因也很简单,上一家公司一直再用钉钉作为办公OA,相对于传统OA,钉钉更注重移动办公,手机体验感很好,换新公司后,也推荐使用钉钉作为日常办公OA。设置好后,大家也都开始尝试使用,可能是公司大多数人之前很少使用此类软件,对于OA存在一定抵触心理,不过使用一段时间后也都还好,毕竟每天也就占用几分钟的时间。

钉钉里面的业务模块还是比较少,公司的一个业务模块找不到适合的模块改造,于是准备在钉钉下自己开发。最早是准备单独做,后来考虑到办公OA用的是钉钉,很多业务逻辑都在钉钉里面沟通或者下达,何不也一并做进钉钉里面好了,还省得在单独处理用户和登录认证模块,并且以后系统还可以打通。

说做就做,首先还是看文档,虽然两者的模式类似,都是获取相关认证授权信息,然后接口调用,相比微信简单明了的文档,钉钉的开发文档就显得过于复杂繁琐,经常A模块中出现一个参数b需要在B模块获取,有个链接跳过去,然后再看B模块中有个参数c需要在C模块中获取,然后绕来绕去,最后彻底晕菜了。微信的开发仅针对微信内置浏览器,接口也基本两种模式,一种是程序通过API接口进行数据通信,另一种是用JSAPI的模式数据通信。钉钉开发不仅针对内置浏览器,还有PC版软件和第三方APP,相对提供的接口方式就比较丰富。对于我这个项目而言,主要还是使用内置浏览器方式调用web页面方式。文档大概看了几遍,有了基本概念,加上之前微信开发的一些经验。准备着手开发,毕竟文档脱离了具体项目是很难完全理解的。

由于钉钉存在手机版和PC版,这个业务模块在钉钉两个版本都会使用到,PC版为主,移动为辅,这个就要求页面要自适应宽度,在不同的宽度版本(移动和PC)都要良好的提现,文档中也有对于两个版本的一些宽度尺寸的规范。模块的UI框架直接使用了Amaze UI,这个框架以前项目开发中使用过,文档和易用性都还不错,有些功能或者细节方面还不是很好,不够灵活。不过基本能满足一般项目。(其实还是懒得折腾),框架定好了,刚开始开发就遇到一个大坑,移动版和PC版的JSAPI居然不是同一个,这个一开始没注意到(最开始使用的PC版),等到登录开发完调试的时候才发现,PC版获取钉钉登录信息并自动登录业务系统没问题,移动版直接卡在获取钉钉登录信息那块了。后来多次调试加上仔细看了下文档才发现这个问题。知道问题就好处理,加个移动端判断调用不同的JSAPI文件解决。其实个人认为获取钉钉登录信息通过钉钉自身的接口更好一些,跳转到钉钉的一个认证页面上,获取后在跳转回项目并带着认证信息,钉钉文档里面也有这个接口,不过需要申请才能使用,好像还要有一定的要求,本着不折腾的原则(其实就是懒),暂时用JSAPI的方式处理。接下来就是正常的项目开发,暂时用到钉钉接口的地方不多,最多的也就是将项目里面的信息推送到群里面或者DING下某些人。

钉钉的调试也不是很方便,比微信好的地方就是调试非接口性的功能,钉钉可以在普通浏览器调试,而微信接口控件会直接提示请使用微信打开。但是调试接口方便的,微信可以在官方的开发工具里面调试,而钉钉就只能在客户端调试,好在有PC版的钉钉,至少不用老是在手机上面点来点去了,也希望钉钉会对应出个开发工具,至少方便项目的调试。

针对钉钉不断侵占企业OA这个市场,微信也针对的推出企业微信,虽然之前微信也推出过企业号,但是功能简单,易用性差加上功能没法定制,估计也没多少企业再用。这次的企业微信完全朝着钉钉去的,不可否认企鹅的借(chao)鉴(xi)能力,面对小企业基本能碾死一大片,这回面对阿里,最终结果还不得而知,不过借助微信的势,不可小觑。

再聊聊钉钉开发

@玛酷猫9 年前

02/24
21:01
数据库

MySQL同一表中重复数据处理

PS:工作中的随手记录,并非最佳处理方式,仅作为一种思路。

筹备新系统的过程中,遇到这样一个情况,数据库中一个表已经添加了300条信息,这时候突然从外部直接导入了1000条信息,其中有一部分重复信息,在重复的信息里面,新加入的数据有一个字段数据是原来数据里面没有的。现在需要将重复数据中原来没有的那个字段数据更新到原始数据中,并且删除重复数据。假设数据表结构简约如下:

表A
id name phone
1 张三
2 李四
3 王五
-----------------------------
1000 李四 1234567890
1001 赵六 0987654321

其中虚线以上部分是原有数据,以下部分是批量导入数据,phone字段仅新插入数据有内容。

由于在一个表中,先查下有多少重复数据,SQL如下

select name,count(name) as num from 表A group by name having num>1

有一点要注意就是在group by的语句中where和having的区别,两者处理数据顺序不同,where是在group by之前处理筛选数据,having则是group by之后在处理筛选数据,其中重复的数据大概有接近200条。

下一步就是把重复的这近200条数据中,新加入数据中那一个特殊字段的数据更新到老数据中。思路为先从上面重复数据里面分离出后添加的数据,将后添加数据特殊字段内容更新到前面老数据中,假设后添加数据起始id为1000。

update 表A as aa 
inner join (select a.id,a.name,a.phone from 表A as a,(select name,count(name) as num from 表A group by name having num>1) as b where a.name = b.name and a.id >= 1000) as bb
on aa.name = bb.name
set aa.phone = bb.phone
where aa.id < 1000

这里不知道是不是mysql(5.6)版本问题还是其他原因,之前使用update……set……from……select……where语句来更新数据的时候报错,后来换成上述语句更新。

更新完了后就是删除重复数据了,主要还是删除后面添加进来的数据。

delete from 表A 
where id in (
  select aa.id from (
    select a.id from 表A as a,
      (select name,count(name) as num from 表A group by name having num>1) as b 
      where a.name = b.name and a.id >= 1000
    ) aa
  )

这里其实多套了一层select,由于mysql中不允许在同一个表中先select出数据在update这个表,会报类似这样的错误 You can’t specify target table for update in FROM clause,中间多加了一层select来规避这个错误的出现。

至此问题处理完毕。其实在一个表中做这样的处理是非常不好的方法,在数据导入的时候先导入一个临时表中,在进行两个表之间的数据处理,从逻辑上和语句上面都简单很多,出现意外错误的几率也会少很多,误操作影响原有数据几率也小很多。

MySQL同一表中重复数据处理

@玛酷猫9 年前

01/19
11:14
计算机 项目管理

微信开发闲扯

自从去年6月份开始接手微信开发,算下来也有半年多了,其间进坑无数,所幸依旧尚存,不得不吐槽下。

首先要说的就是微信这种开发模式,简直丧心病狂、毫无人性呀,不知道当初开发团队是处于什么考虑的,流程各种绕,前置依赖很多,虽然说有开发文档,但是如果你不去开发项目,仅仅的是看文档的话,直接就绕晕掉了。订阅号和服务号,再加上认证,就是四种类型的账号,对应不同的接口权限,加上微信开放平台的接口,微信支付的接口,零零总总一大堆,居然后面还有应用号,不知道又会开放什么新接口。

其次是调试困难,在官方开发工具出来之前,只有一个简单的网页版接口调试工具,用来检测下通信数据传输和返回值是否正常。对于大部分开发者都是本机开发,微信接口映射到本机就是个麻烦的事情,固定IP的话可以在路由器里面做下端口映射,非固定IP可以用一些动态域名比如花生壳之类的,或者使用ngrok工具,其实也是一种动态域名方法,即便是这样问题也很多,一方面大部分使用都是免费动态域名,每次域名都会变,都需要在公共平台里面修改接口地址,另一方面要使用jssdk接口的话域名需要备案,备案,备案。。。。。说完了后端部分就轮到前端了,由于接口必须需要微信浏览器支持,所以在普通浏览器里面用正常的方法都会显示微信的提示。在官方开发工具出来之前,还没有什么很好的解决办法,基本都是去掉微信jssdk部分调页面的效果,线上调试用微信PC版,可以看到源代码,查看下一些动态的内容是否正常输出,再剩下的问题就要靠经验了。还好微信也意识到自己这个生态环境不是很友善,出了开发工具,感觉就是个深度定制的chromium,使用起来还是比较方便的,至少能解决之前的页面和JS调试的痛处。

再次,微信开发应用使用起来也不是很友好,最严重的就是通过公共平台进入开发的应用,比如现在很流行的微商城,我在浏览商品的时候突然来了一个微信消息或者其他的信息,打开看了后就没回到之前浏览的页面了,尤其是在进行一些流程性的步骤,比如说购买,只能重新来过。通俗点说就是抗干扰能力非常差。这就需要开发者在开发应用的时候简单明了,层级流程尽量的短小,无需过多思考,一两步就能完成。也就限制了大型复杂的系统的接入性,不是不能接入,而是使用体验会很差,一有干扰直接重来。不清楚应用号会不会在这方便有所改变。

最后对于微信这个业态,我一直认为正确的微信模式就是服务号的模式,个人非常反感订阅号,虽然有很少部分订阅号质量非常高,也仅仅泥塘里的一两颗荷花,剩下的都是信息垃圾,各种鸡汤、伪科学、广告推广等等。我们现在处于信息泛滥的时代,人们已经开始由原来的被动接受信息转变成主动获取想要的信息,订阅号那种天天推送的模式反而令人反感,至少对我来说,再加上微信也是注意到了这些,将订阅号全部合并折叠起来,消息的获取宽度更窄,其实也是鼓励运营者向服务号转变。通过之前微信要推出应用号这个消息也能看出来,微信在不断的弱化自身的媒体属性,更多的作为一种平台,或者说是入口。公共平台利用微信上的人脉,加上微信很方便的扫码、摇一摇周边等参与模式,将用户导入进自己的平台系统中去,这种精准化营销是其他平台不具有的。支付宝虽然也在做类似的事情,可是起步晚了很多,虽然用户基数也不小,可是要用户改变已经养成的使用习惯,也是很难的。如果解决好微信开发的应用使用上的问题的话,也可以是企业一个很好的营销入口。

微信开发闲扯

@玛酷猫9 年前

01/5
18:40
心情点滴 计算机

猫窝搬迁至国内

当初因为嫌麻烦懒得去备案,猫窝一直安放在国外,已经好多年了,偶尔服务商调整IP,没注意查看邮件暂时无法访问几天外,整体无大碍,也就是访问慢一些,倒也还在忍受之内。不过近期一连串事情,也让我有了想搬回来的想法。

首先就是备案号,放国外的初衷就是嫌麻烦,也就没有备案号,可是国内越来越多的服务需要提供备案号,第一个就是微信公共平台,近半年来一直在做这方面的开发,虽然公司有些平台账号可以测试,但是由于做活动的需要,经常换来换去,也挺麻烦,自己有个还是方便些,同时做些其他开发也不用拿公司的号来测试,第二个就是一些CDN服务,比如七牛,在这个带宽费用比硬件费用贵的多的时代,图片放在CDN上面还是有必要的,CDN提供的临时域名毕竟太不友好,又长又不好记,肯定是绑定自己的域名方便,但是绑域名同样需要备案号。随着国内互联网管控的越来越严格,很多API接口呀,服务呀可能都慢慢的需要接入域名必须先备案。

话说回来有备案号,网站也不用一定要放在国内,这就说到第二个方面,就是访问速度,近半年网站的访问速度明显下降,主要可能还是要归功于伟大的墙,对很多国外空间商都不很友好,ping起来并不高,但是访问起来明显卡顿。去后台发个文、更新下都要卡半天,那感觉,很不爽。

最后关键的一点就是阿里云做活动抽了张88元的代金券,作为秉持有券不用太浪费的原则,购置一台最低档的虚拟主机,反正就是放个个人博客,再加上也没什么人访问,也不需要多好的配置。然后就是填表提交材料,照相,备案,一气下来也蛮顺利,今天备案号下发下来。

剩下的就简单了,程序打个包下下来,数据库备份下下来,再传上去还原下,解析域名,duang,完成。

以上纯属想当然,实际中也遇到一些问题。

首先就是htaccess文件,这个文件在国外的空间管理系统是隐藏的,打包就没打进去,导致搬家后自定义页面全部都是404,更不用说个性化的用cat作为页面后缀(SEO什么的完全不考虑,我的猫窝我做主),又从原来空间拷下来再传上去。其实在后台上面固定链接里面重新保存下也能生成htaccess文件,只不过原来的里面还有以前老域名的301跳转,所以还是直接拿来了。

站点在墙内了,Gravatar自然而然的挂掉了,头像全都是叉叉,网上搜了下,SSL还没墙,是用这个就好了,添加在主题的function.php中,代码如下

function get_ssl_avatar($avatar) {
   $avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://secure.gravatar.com/avatar/$1?s=$2" class="avatar avatar-$2" height="$2" width="$2">',$avatar);
   return $avatar;
}
add_filter('get_avatar', 'get_ssl_avatar');

放上去,头像的确显示了,不过都是2倍的大小,问题严重呀,看来这个方法也是很久之前的了,看了下原来的头像代码

<img alt='' src='https://secure.gravatar.com/avatar/cae0907deb928695845b7627d7236a60?s=44&#038;d=identicon&#038;r=g' srcset='https://secure.gravatar.com/avatar/cae0907deb928695845b7627d7236a60?s=88&amp;d=identicon&amp;r=g 2x' class='avatar avatar-44 photo' height='44' width='44' />

为了适配高分屏,头像里面有两个路径,分别对应原始大小和双倍大小,按照上面正则替换全都换成后面双倍大小尺寸,所显示的头像都是两倍大了,而且原来的方法直接把图片标签替换了,原来图片中带的其他参数也全部丢弃了。其实只用替换掉路径就好了,把原来的路径换成SSL的路径,修改后如下

function get_ssl_avatar($avatar) {
   $avatar = preg_replace('/[^\']*avatar\/([^\']*)/','https://secure.gravatar.com/avatar/$1',$avatar);
   return $avatar;
}
add_filter('get_avatar', 'get_ssl_avatar');

保存,上传,刷新,完美。

另外一个问题就是Jetpack,在墙内虽然也能使用,但是由于墙的存在,很多功能都失效了,而且我这里貌似和后台主题有些冲突,开启插件后,自定义主题就会报500错误,禁用就好了,具体原因不详,在原来的空间不存在这个,可能还是和空间配置或者墙有些关系,反正还有其他的一些替代方法,就暂时不去理他了。

最后试了下定时备份和备份发送邮箱,空间好像有所限制,没法收到备份邮件,看来要勤快点多做备份了。顺便找找有没有其他备选方案。

猫窝搬迁至国内

@玛酷猫9 年前

12/24
22:58
计算机

跳版本号的时代

自从windows 10消息的发布,微软就带了个跳版本号的坏头,直接把9给生吞了,(错怪微软了,ORACLE很早就干过这类事情。)前段时间PHP 7消息的发布,且不说如何如何进步,6也被无情的跳过了。最近在改之前同事thinkphp写的站点,去官网查了下手册,才发现thinkphp 5版本也在悄然上线公测了,3.2直接到5.0,跳过了4这个版本。

跳板本号的原因可能有很多,风俗呀、忌讳呀、个人喜好等等,更多的一种情况是,现行版本和新版本并行开发和维护,对现行版本改动很大的新需求都会放到新版本中,慢慢的新版本需求越来越多,期望越来越大,开发进度却越来越缓慢,最终只有放弃这个分支,重新梳理现行版本的下一个版本,导致版本号的跳跃。

由此可见项目管理的重要度,随着项目的推广,使用人群越来越多,各种声音也不断的出现,有需要增加新功能的,有需要精简的;有的需要改成这样,有需要改成那样,众口难调。一味的迎合用户往往结果就是谁都满足不了,最终只能得到一个臃肿不堪、漏洞不断的项目。坚持项目的初始理念,抓住项目的目标人群,再加上合理的迭代,才能保证项目正常的发展下去。而往往这些都是说起来简单,做起来却要很是下一番功夫的。

跳版本号的时代

@玛酷猫9 年前

09/17
12:27
PHP

如何用PHP裁出一个圆

先说下需求:前段时间神秘花园很火,于是乎客户想要制作神秘花园的网页游戏,涂色盘是圆形的,网页将涂色盘加载进当前的canvas中,当网友涂色完毕提交后,将canvas内容转化为图片数据传送至后台保存。这时接收到的数据包括整个canvas内容,整体是个矩形,除了网友涂色部分,还有整个背景、颜色盘、一些按钮之类的,这就需要把网友涂色的那个圆形部分裁剪下来。

我的思路分成两部分,首先裁剪成正方形,毕竟直接在矩形上面裁出一个圆相对来说麻烦一些。项目使用的thinkphp框架(v3.1),裁正方形还是比较快捷的,直接调用自带的函数即可

import('ORG.Util.Image.ThinkImage');
$image = new ThinkImage(THINKIMAGE_GD, $file);
$image->crop(516,516,45,119)->save($file);//crop四个参数分别为长、宽、x偏移、y偏移

下一步就是要裁圆了,网上搜索了下居然没有搜索到多少有用的代码,感觉这个对大家都不是什么难处,看来自己这个半路出家的基础还是不太好呀。幸好在一个很老的帖子(08年的帖子)的回帖里面看到Sunyanzi@phpchina的一个思路,原帖地址传送门,代码如下:

<?php
//-----------------------------------------------------------
// * Sunyanzi @ phpchina
//-----------------------------------------------------------

class image_cutter {
	private $original_image;
	private $cutted_image;
	private $diameter;
	private $radius;

	public function __construct( $image_path ) {
		/* load the original image ... */
		$image = imagecreatefromjpeg( $image_path );
		/* get image size ... */
		$x = imagesx( $image );
		$y = imagesy( $image );		
		/* diameter of the circle is always the smaller side ... */
		$this->diameter = $x > $y ? $y : $x; 
		/* radius is half a diameter ... am i must explain this ...? */
		$this->radius = $this->diameter / 2;		
		/* save the original image ... */
		$this->original_image = $image;		
		/* create new canvas to save our work ... */
		$this->create_blank_image();		
		/* PAINTING TIME ... */
		$this->read_the_original_image_and_write();		
		/* i'm positively bursting to see what we have done ... */
		return;
	}

	private function __destruct() {
		/* hey my dear brower ... it's not a html page comes ... */
		header("Content-type: image/png");
		/* show our work ... */
		imagepng( $this->cutted_image );
		/* we have to cleaned up the mass before left ... */
		imagedestroy( $this->original_image );
		imagedestroy( $this->cutted_image );		
		/* so ... how do you think about this ...? */
		return;			
	}

	private function create_blank_image() {			
		/* create a true color square whose side length equal to diameter of the circle ... */
		$image = imagecreatetruecolor( $this->diameter,$this->diameter );
		/* we also need a transparent background ... */
		imagesavealpha($image, true);
		/* create a transparent color ... */
		$color = imagecolorallocatealpha($image, 0, 0, 0, 127);
		/* ... then fill the image with it ... */
		imagefill($image, 0, 0, $color);		
		/* nothing to do then ... just save the new image ... */
		$this->cutted_image = $image;		
		/* go back and see what should we do next ..? */
		return;			
	}

	private function read_the_original_image_and_write() {
		/* actually we need a smooth circle ... */
		for ( $x = 0; $x <= $this->radius; $x += 0.01 ) {
			/* standard form for the equation of a circle ... don't tell me you never knew that ... */
			$y = sqrt( $this->diameter * $x - pow( $x , 2 ) ) + $this->radius;
			/* i think i should call this successive scans ... */
			for ( $i = $x; $i < $this->diameter - $x; $i++ ) {
				/* half of the circle ... */
				imagesetpixel (
					$this->cutted_image , $i, $y, 
					imagecolorat( $this->original_image, $i, $y )
				);

				/* the other half of course ... */
				imagesetpixel ( 
					$this->cutted_image , $i, $this->diameter - $y, 
					imagecolorat( $this->original_image, $i, $this->diameter - $y ) 
				);
			}				
		}
			
		/* avoid the white line when the diameter is an even number ... */
		if ( ! is_float( $this->radius ) )
			for ( $i = 0; $i < $this->diameter; $i++ )
				imagesetpixel ( 
								$this->cutted_image , $i, $this->radius - 1,
								imagecolorat( $this->original_image, $i, $this->radius - 1 )
				);						
		/* woo ... not as difficult as you think ... that's all ... */
		return;
	}
}

new image_cutter( HERE_COMES_THE_ORIGINAL_IMAGE_PATH );
?>

读了下代码,大概了解了下原理,以x轴为参考,0.01像素步长,通过圆的公式计算出对应y点的位置,然后将循环将X轴这条线上落在y点外(圆外)的点用透明色填充。实际放到项目中测试,发现个问题,由于项目中圆的半径比较大,516像素,按照0.01步长来计算,在x刚起步时,计算后的y值之间的间隔会大于1个像素,表现在页面上就是在圆的中间出现两条白线,将步长减少到0.004的时候白线消失,但是由于步长变小,整个循环数目变大,耗时严重,一次将近30秒的时间。

既然Sunyanzi提供了一个思路,那我就把它简化下,毕竟图片最小点是像素,那我就以1像素为步长,y轴也不计算了,直接也以1像素为步长,通过圆的方程式算出半径,比较半径的大小,大于我需要的圆的半径的点,把他用透明色填充掉就OK了。思路有了就开始动手。仅修改上面代码中裁圆的那个函数read_the_original_image_and_write()

private function read_the_original_image_and_write(){
        for ( $x = 0; $x <= $this->radius; $x++ ) {
            for ( $y = 0; $y <= $this->radius; $y++ ) {
                if(sqrt( pow( $x- $this->radius , 2 ) + pow( $y- $this->radius , 2 ))<$this->radius){
                    imagesetpixel (
                        $this->cutted_image , $x, $y,
                        imagecolorat( $this->original_image, $x, $y )
                    );
                    imagesetpixel (
                        $this->cutted_image , $this->diameter - $x, $y,
                        imagecolorat( $this->original_image, $this->diameter - $x, $y )
                    );
                    imagesetpixel (
                        $this->cutted_image , $x, $this->diameter - $y,
                        imagecolorat( $this->original_image, $x, $this->diameter - $y )
                    );
                    imagesetpixel (
                        $this->cutted_image ,$this->diameter -  $x, $this->diameter - $y,
                        imagecolorat( $this->original_image, $this->diameter - $x, $this->diameter - $y )
                    );
                }
            }
        }
    }

实际效果速度那是没说的,毕竟简化了,基本上秒出,效果相对之前的方法来说差了点,一周的锯齿感强了点,不过由于图片比较大,反倒不是很明显,有需要的话可以将步长调到0.5,效果会好一点,速度不是太影响,图片小的话可以放得更低一点。上面例子是直接输出图片,实际应用为保存成文件,这个就比较简单了,就不在这里贴代码了。

如何用PHP裁出一个圆

@玛酷猫9 年前

08/17
11:45
PHP

用phpstorm+git+dropbox开发项目

一直以来都是一个人在开发项目,最多也就是配备一个设计、一个前端,整体代码部分也还都是一个人在写,也就很少会使用到版本控制。phpstorm的历史功能用起来也就够了,很方便的查询之前的修改记录。直到周边朋友和同事或多或少的都出现了一些意外导致代码丢失或者损坏,比如硬盘损坏呀,误删除、误格式化之类的,为了这种苦逼的事情不落在自己头上(事实上自己也苦逼了一次,格式化错U盘了,幸好里面都是些暂存资料和音乐,都有备份,损失不大)一直想找个方便的备份方法,又要能及时同步信息。

一开始是用U盘/SD卡(电脑上常年插着一张SD卡)作为备份方法,总觉得U盘也不方便,而且出过一次意外后,就想着换用云盘来处理。国内云盘虽然空间一个比一个大,但是总感觉不靠谱的样子,对国内的企业的诚信缺乏信心,虽然自己写的代码也值不了几个钱。还有就是不方便,用的多的百度云盘,最然提供的自动同步的功能,但是如果换个电脑或者重装一下百度云,还都需要重新每个文件同步一下,对于一个项目若干碎片文件,很费时间,而且貌似没有对比机制,直接全部上传覆盖。选来选去还是使用以前一直用的dropbox,虽然问题也比较多,需要翻墙(对程序猿来说架梯子都是基本技能),空间小(初始2G,好友邀请满才25G,相对于国内动不动就上T小很多,不过存代码基本够用),网络不稳定(这个用梯子克服),但是易用度还是不错的,尤其是能有对比机制来同步,再加上dropbox的共享功能,完全可以做到多人协同使用。

说到协同就不得不说git,要弄就一次到位,所以也参考网上的文章把git也用了起来。dropbox直接同步git仓库,快1个月的使用,感觉也非常好。尤其是在使用git后,每次提交都会写清楚开发/修改的地方,开发进程清楚明了。不过目前还是没有经历过多人git开发的项目,想想项目各种分支各种合并,也是蛮有趣的。

PS:配置方法就不多说了,网上很多,比如这篇: 用Dropbox作为Git服务器——详细图解,phpstorm在设置里面的版本控制 填上git的路径即可。

用phpstorm+git+dropbox开发项目

@玛酷猫9 年前

07/28
13:07
计算机

解决WINDOWS10无法安装PHP Manager问题

IIS下两大利器URL Rewrite和PHP Manager对WINDOWS10都十分不友好,分别提示IIS版本过低,汗颜。不过这也怪微软不按常理出牌,非要跳过9的版本号直接到10,还好官方URL Rewrite做了一次小升级,解决掉安装的问题,可是PHP Manager作者貌似失踪很久,最新一次登录还在14年,网上终于看到有大神提出了解决方案,就是修改注册表,欺骗安装程序跳过版本检测。具体方法打开注册表,找到如下键位:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters
右侧的 MajorVersion 是DWORD值,它的值十六进制是a(也就是十进制的10),把它改成9。然后安装,安装完成后在改回a即可。

解决WINDOWS10无法安装PHP Manager问题