猫窝私语 — Makumo's Blog

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

@玛酷猫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 年前

12/11
10:58
心情点滴 魔兽世界

魔兽十年

魔兽十年 回首望去
刹那间不知有多少的回忆 涌上心田
那个总是给你做面包的法师
也许此时此刻 正在为下个月的房贷忙碌奔波
那个喜欢变成熊跳舞的奶德
则已经忙着在家里面奶孩子了
那个沉默寡言的副坦克
如今做了一家公司的副总
依旧在独当一面着 而那个总是被你调戏的 牧师妹子
现在估摸着呀 也应该嫁人啦
魔兽十年 无数强大的公会败给了时间
多少一起玩耍的伙伴相忘于江湖
在我们的回忆里 它就像一个与现实世界相交的独立空间
我们在此相遇过 却不得不渐行渐远
魔兽对于我们 不仅是一个游戏 它是一整个青春呐

——暴走大事件第四季第22期

想想公测的时候加入游戏,期间断断续续,直到熊猫人彻底AFK,和工会的小伙伴们奋斗的日日月月,一次次的FD,感慨万分。电脑中保存了一张MC首次FD的合影,也在几次重做系统中不知去向,就像视频中所说,10年了,当年的一群人现在都已经结婚生子,各自有自己的家庭事业,“相忘于江湖”,不过在这里要谢谢你们,感谢当年一起的游戏的岁月,一起创造的美好回忆。

魔兽十年

@玛酷猫9 年前

11/30
16:54
心情点滴

在健康面前,神马都是浮云

伢上上周突然高烧,后去医院检查,诊断为疱疹性咽峡炎,幸好发现的早,挂了两天水,貌似没发展起来直接被扑灭了,嘴里的泡丝毫没有影响小家伙的食欲,一顿饭一大碗。然而一周后,本人不幸中招,咽喉痛、发烧,本以为是咽喉炎,挂了两天吊水,紧接着手脚开始出疱疹皮疹,疼的要命,还以为得了手足口了,去医院检查只是病毒感染,开了药,吃了两天慢慢下去了,手上泡也开始结痂蜕皮,一周下来各种折腾,花钱无数。

感觉做程序员这行越来越成为高危行业了,且不说新闻上面各种耸人听闻的猝死报道,私下里同行聊天也发现大部分都在加班中,加班俨然已经成为一种文化,还有各种职业病,像什么肩周炎、腰肌劳损、腱鞘炎之类的技术群里一问,就能炸出一群潜水的,十之八九都有。在医院和医生闲聊,被问及做什么行业的,答之作IT的,医生随后说了句话:你们这行真不是人干的,之前有个人也是搞IT的,头发都快掉光了。除了生理问题,心理问题也不少,码农KO产品的段子,各个版本都有,虽然大部分仅仅是段子,但也反映负面情绪的积压。

许多人刚步入社会前几年凭着自己年轻,猛打猛拼,经常通宵加班,几年下来,虽然别人看起来小有所成,然后身体搞垮了,痛苦也只有自己知道。而往往前几年都是学习积累的过程,再加上程序员一般都不善于经营自己,做出的再大的成就往往都是公司的。等你各方面都准备好做一番自己的事业的时候,常常还没有被对手打败,先被自己的身体狠狠的踩在脚下。

月初和几个同学小聚,聊天打屁之外顺便也相互打听下近况和其他有联系的人的情况,才得知原来隔壁寝室的同学的夫人肺癌晚期,大学时代辅导员夫人年初刚过世,也是癌症复发,当时小聚的几个人唏嘘不已,在座的几个也都有各种各样身体小恙,平时应酬也是能推就推,有空就相约打球健身。想想自己还是依旧保持那种亚健康的状态,天天上班一坐一天,一周也都没出去运动下的,周末也都是各种理由,其实也就是懒罢了。也难怪今年整体状态都欠佳,动不动就各种小病,什么感冒什么拉肚子,也是要改变下了。尤其是现在有了小孩,一生病就容易传染给小孩,大病号、小病号都要夫人一人照顾,再加上家务,一周下来也累的不行。

有一档儿童节目主题曲里面有这么一句:财富就是家人全都没有嗝屁。一家人健健康康的比什么都好。以前一个人的时候很少考虑这些,现在有家有小孩了,责任也就多了起来,自己是家里的天,不能这么轻易被身体打垮。做一个全身体检,在制定一个循序渐进的运动计划,希望在春季身体状态、精神状态有个明显的转变,为下一步的计划做好先前准备。

PS:隔了天再写,完全不知道当天的思路,写东西还是要一气呵成,断断续续的都不知道写的是什么了。。。

在健康面前,神马都是浮云

@玛酷猫9 年前

10/14
14:13
心情点滴

博客文章丢失和找回

前段时间由于IDC升级服务器,将原来服务器上的虚拟空间更换到新的服务器上,不知道中途到底出了什么岔子,导致博客丢失了将近半个月的数据,本人算是比较懒的了,影响不大,也就一篇文章。毕竟是自己的原创文章,其他地方也没备份,总不能辛苦白费。于是乎除了联系IDC方面,自己也想办法恢复了。

最开始想到的就是订阅里面应该有,从好几年前就开始有RSS订阅的习惯,很多有帮助的博客或者网站都订阅到RSS里面,最早当然使用谷歌RSS订阅服务,自从谷歌关闭了这个服务后就转战feedly了,很多人都说谷歌RSS一死,世上再无好的RSS工具,不过对于我来讲,也就算是个轻度用户,每天浏览下订阅的文章,有兴趣的点进去看下,然后直接全部标记成已读,好的文章会用pocket收集分类下。之前听说ifttt支持feedly直接到picket,后来注册了才发现要成为feedly收费用户才能使用,只有手动来处理了。不过feedly居然把搜索功能作为收费会员功能,忍不住要吐槽下。

以上跑题跑远了。。言归正传,免费版是没有搜索功能的,只能点到自己的博客的rss里面,最新的一篇就安静的躺在那里,复制出来,重新发布下,顺便调整了下发布时间,像是原来时间点发布出来的。呵呵。不过浏览量和评论就没有了。

另一种方法就是使用搜索引擎的快照功能。我的博客百度收录很差,这里直接使用谷歌了,如何使用谷歌就不再累述了,作为一个技术宅,自备各种梯子。使用site:makumo.com 加关键字的方式很快的就找到之前丢失的那篇文章,点击链接右侧小箭头会出来网页快照,打开直接复制重新排版发布就行了。

不过最好的办法还是多备份,防患于未然。

PS:最近chrome起始页和谷歌搜索各种跳日本域名,用了https://www.google.com/ncr 都没什么效果。用的是加拿大的梯子,估计这个IP被谷歌判定成日本了。。各种无语。

博客文章丢失和找回

@玛酷猫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问题

@玛酷猫9 年前

07/8
10:23
计算机

URL Rewrite终于支持WINDOWS10了

自从升级到Windows 10后,IIS下两大常用工具URL Rewrite和PHP Manager就装不上了,都提示需要IIS7或者以上版本,Windows 10的IIS版本是10,两个软件都识别不了。PHP Manager直接在IIS站点下面新建程序映射就行了,虽然切换修改PHP稍微麻烦点,URL Rewrite只能写web.config,就是麻烦点。毕竟很多源码都自带.htaccess规则文件,直接导入就行了,不用自己把.htaccess内容翻译成web.config。

前段时间无意去微软官网搜了下,发现URL Rewrite更新新版本了,看时间5月27号发布的,快一个月了。Supported Operating System里面赫然写着Windows 10,立马下下来安装,一切顺利,打开IIS又看到那熟悉的图标,唯一遗憾的就是设置是英文的,估计本地化工作还欠缺,不过不影响使用。

PHP Manager依旧不支持,作者页面下面不少留言说是不支持windows 10,不知道作者啥时候更新下软件。也只有等等Windwos 10正式版发布后作者会不会有所行动。

URL Rewrite终于支持WINDOWS10了