猫窝私语 — Makumo's Blog

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

@玛酷猫5年前

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

魔兽十年

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

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

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

魔兽十年

@玛酷猫5年前

11/30
16:54
心情点滴

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

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

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

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

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

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

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

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

@玛酷猫6年前

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被谷歌判定成日本了。。各种无语。

博客文章丢失和找回

@玛酷猫6年前

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裁出一个圆

@玛酷猫6年前

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开发项目

@玛酷猫6年前

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问题

@玛酷猫6年前

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了

@玛酷猫6年前

06/30
12:07
计算机

使用ngrok进行微信本地调试

接手微信公众平台的二次开发工作,最苦逼的莫过于调试了,每次完成都要传到服务器上,在用手机调试,各种烦躁。于是乎在网上找找本地调试的方法,一搜还真不少,思路都是一样的,就是想办法把手机端提出的请求转变到本地测试环境上。综合难易程度,决定选用ngrok软件来进行本地调试。

设置起来也很简单,首先去ngrok官网注册一个账号(不幸被墙,需要自行搭梯子。顺便吐槽下很多很好用的小工具都在墙外。),注册完成后会得到一个Tunnel Authtoken,先复制保存下来,留着后用。然后下载软件,由于用的windows,所以就下载windows版本的,下载后解压,就得到一个ngrok.exe的文件

WIN+R,cmd打开命令提示行,进入ngrok.exe那个目录,运行ngrok authtoken 之前得到的Tunnel Authtoken,登陆下,然后运行ngrok http 80 就可以使用了,窗口会显示关联的域名、状态、连接数和请求。如下图ngrok

由于个人开发习惯,IIS下面会有多个测试网站存在,然后在HOST里面会写一堆如下的指向

www.a.com 127.0.0.1
www.b.com 127.0.0.1
www.c.com 127.0.0.1
#等等…………………………

在IIS站点中主机名填上www.a.com就可以直接用www.a.com这个域名来做测试,再将上面ngrok虚拟出来的网址填写进主机名中,就OK了,从此就可以愉快的调试了。不过每次运行得到的网址都会变更,需要重新修改微信公众平台和IIS设置。如果想每次运行网址不变,可以使用ngrok http -subdomain=自定义的域名 80 来固定二级域名,不过这个功能属于高级用户,也就是要收费的,5美元/月起,我等屌丝还是老老实实用免费版的。

使用ngrok进行微信本地调试

@玛酷猫6年前

04/29
12:05
计算机

Laravel 学习(二)数据库建立与迁移

继续按着教程走,Laravel自带了一个用户系统,http://站点/home 即可直接访问,不过由于没有数据库部分,登陆和注册都是铁定报错的。Laravel鼓励敏捷、迭代的开发方式,所以Laravel迁移给你提供了一种在迭代方式中修改数据库架构的手段,它不要你用SQL操作,而是允许你使用PHP代码。Laravel架构生成器允许我们快速创建数据库表和插入列或索引。它使用清洁和富有表现力的语法来操作数据库。Laravel迁移可以当作数据库的版本控制。

按着教程来,首先先修改数据库配置文件,在Laravel文件下下面的.env文件

DB_HOST=localhost
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=123456

接着运行命令执行数据库迁移操作

php artisan migrate

以上都是按照在linux环境下,而我本地环境是IIS,必然就是各种坑爹错误。搜索了下网上关于IIS下运行Laravel资料很少,琢磨了下无外乎路径问题。

首先是php路径,如果没有配置,直接运行php会提示“php 不是内部或外部命令,也不是可运行的程序
或批处理文件。” 依次右击桌面上的“计算机”,选择“属性”,选择“高级系统设置”,点击“环境变量”,在系统变量中找到“Path”并双击,在变量最后面加上php的文件夹,例如我的php文件夹“D:\Work\work-dll\php-5.6.7”(我配置的时候Path里面已经有了,估计应该是安装composer的时候写入的)

然后依次左下角“开始”,点击运行,输入“CMD”回车,WINDOWS8便利很多,直接WIN+X,选“命令提示符”,敲命令进入站点目录,然后执行数据库迁移操作,比如我的

C:\Users\makumo>d:
D:\>cd Work\work-zone\wwwroot\laravel
D:\Work\work-zone\wwwroot\laravel>
D:\Work\work-zone\wwwroot\laravel>php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table

这样数据库就建立好了,在mysql里面就能看到migrations、password_resets、users三个表,就可以只用Laravel自带的用户系统。

Laravel 学习(二)数据库建立与迁移