slan's blog

Face loneliness, or seek comfort in temporary escapes?

写了一个项目时间倒计时工具

写了一个项目时间倒计时工具

最近迷上了GTD,一直使用doit.im管理要做的事情。

不过,执行不是很强,总感觉自己的安排和自己真正怎么做的,契合度不高。

GTD最关键的是时间安排,决定好最优先级的事情。但是在网站上排了马上就做之后,往往还是会因为各种事情,没按这个执行。

我想如果能有一个工具,让我只处理这一件最优先级的事情,并且能实时看到我的预估剩余时间,耗费了多少时间。

我可能会去反思怎么去改进事情的安排,所以我做了这个工具,如图:

[图没了见谅.....]

打开工具,设置我要做的事情,我预估要多久。然后开始计时。

这工具会跑在所有窗口上面,保证我干任何事情,都会看到我现在要干嘛。。。这样应该走神也能马上拉回来。

默认出现在右上角下来一点点。

[图没了见谅.....]

然后就开始计时了,经过一天的试用,发现实际耗费的时间,往往比预估的时间要长,这是在doit.im上没反思的事情。

too simple too young啊!

国际惯例:

github开源,地址:https://github.com/qhgongzi/out_of_time

环境需求:win7无压力运行,xp需要.net 3.5

2013-09-08 22:24:00 +0000 UTC

boost shared_ptr 使用时的一个内存泄漏注意事项

boost shared_ptr 使用时的一个内存泄漏注意事项

自从用了智能指针之后,内存泄漏这种问题就很少发生了,不过今天运行的时候,程序狂吃内存,就是不知道哪儿出了问题。

最后虽然知道是一个低级错误,不过也值得注意下。

情况是这样的,一个拥有异步函数的类。构造代码如下:

boost::shared_ptr httpClient(new client(*m_ioServ,task,respone_));
 
httpClient->send(boost::bind(&http::MessageBack,this,_1,cb,httpClient));

send是一个异步发送函数,按理说,这个函数还没发送,因为异步原因马上返回了,httpClient就释放了,为了不让他释放,也是为了保存异步回调,这个boost::bind之后的回调函数被作为一个类的成员函数给保存了起来,如下:

class client
    {
    public:
        typedef boost::function result)> ClientCallBack;
        ClientCallBack mHttpBack;
    }

这样就产生了智能指针永远无法释放的问题,类似相互引用,成员回调对象没释放,类不会释放。类不先释放,成员更不会释放。

说到底boost bind是一个对象,保存了智能指针,导致了相互引用的问题。使用时应该注意下。

最后解决办法是client创建的时候,没有使用智能指针,直接new 一个对象,然后在MessageBack里delete,如下:

 client* httpClient=new client(*m_ioServ,task,respone_);
 httpClient->send(boost::bind(&http::MessageBack,this,_1,cb,httpClient));

虽然问题解决了,但是感觉不是很对,希望有人能指教。最好是用智能指针自动管理对象。

2013-09-02 22:50:00 +0000 UTC

安装mediawiki的时候,出现Catchable fatal error

安装mediawiki的时候,出现Catchable fatal error

今天准备装个公司内部wiki,前面都一气呵成。一切安装完成之后,出现错误:

Catchable fatal error: Argument 1 passed to ScopedCallback::__construct() must be an instance of Closure, unknown given, called in /usr/local/apache/wiki/includes/cache/MessageCache.php on line 346 and defined in /usr/local/apache/wiki/includes/ScopedCallback.php on line 33

简单的看了下,意思是传递给ScopedCallback这个类的参数必须是个闭包(匿名函数)。但是给的确实未知参数。这个unknown很少见过,一般都是提示错误的类型,NULL什么的。于是看了下代码,这段是这样的:

$cache = $this->mMemc;
$isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
    $cache->delete( $statusKey );
} );

看样子是给这个回调类,传递删除key的匿名函数,但是这个匿名函数却无法识别,匿名函数是5.3开始支持的,公司用的5.4,应该不是不支持匿名函数的问题,那就看看写法有没有问题,但是找了一下,这写法也对的。

测试发现公司机器上最基本的匿名函数都不支持 如:

function() { return true; }

开始从环境找原因,最后对比本机与内网机器,因为本机是可以正常运行mediawiki的,看了下,相同的匿名函数本机都能运行。

最后对比发现,本机比内网机少装了eAccelerator,多装了xdebug,查了下eAccelerator closure。发现eAccelerator在5.4下确实不兼容closure。

换APC,搞定。

2013-07-02 19:56:00 +0000 UTC

php利用命名空间管理项目模块

php利用命名空间管理项目模块

缘由

之前Tita的model结构是这样的,model目录用自动加载机制来加载用到的类,运行久了就有一个问题,这一个目录的类越来越多,很不好管理,于是就想分目录来存放相关的类,将不同类别的类文件放到不同的目录只有,自动加载越来越不好弄了,因为要遍历model下的所有目录。如果子目录还要划分小类,那更是一场灾难,于是将目光转向命名空间,虽然觉得反斜杠来当分隔符比较的2,但是相对管理那么多复杂的类,还是很激动的将命名空间支持添加到了Tita。

在这里,我们利用命名空间和php自动加载机制,较为完美的实现了模块的清晰划分,目前对效果很满意。看反斜杠也不觉得反感了。

教程

如何理解命名空间,在命名空间出现以前,所有的函数,类变量都在一个空间。命名空间出来以后,这块空间就叫做了一个特殊的全局空间,对于没有划分自己空间的代码,都放在全局空间。

如果你新建一个空间,比如叫做admin,你就能通过new admin\User();语句来实例一个user类。如果你需要另一个全局的User类,你可以之前的老方法用new User()来创建,需要注意的是,在一个命名空间内不能不带命名空间前缀去访问另外一个空间的类,即使访问全局的类也不行。

你在admin空间内,如果要使用全局的User,则需要这样来创建:new User();带上全局空间的符号。这样我们就能根据不同的模块,来划分不同的功能了。

如何定义一个命名空间

很简单,在文件最开始的地方写上,namespace xxx;那么这个文件的内容,就都被放在了xxx空间下。如果要定义xxx的子空间,则可以写上namespace xxx\abc;

在代码中使用别名

定义好的命名空间,可以使用完全的地址去访问,比如space\child_space\mid_space\class(),但是每次用这么一长条来表示类不是太麻烦了。一个还好,当一个文件中多次使用这个空间的时候,那就相当难受了。

  • 导入命名空间,跟c++差不多。use space\child_space\mid_space;跟c++不一样的是,你导入了这个空间之后,不能直接去调用这个空间的类class(),php只能将最后的空间名当作别名来导入,在这里我们来使用mid_space\class();
  • 导入空间使用自定义别名,use space\child_space\mid_space as myspace;然后可以调用myspace\class();
  • 导入类,跟导入空间差不多,use space\child_space\mid_space\class;不过类被导入了之后,可以直接使用。调用class();也可以 use space\child_space\mid_space\class as myclass;来用一个新类名来调用。例如myclass();

如何方便的管理命名空间

如果定义了命名空间,还把文件放在一个目录,那就没多大意义了,我们可以将命名空间与目录绑定到一起。让空间与目录层次上保存一直,在Tita框架中,model是数据层目录,我们新建了一个pack目录,里面放了两个包,money和props。如图:props里面有个文件,叫做Cars.php,里面放了一个类叫Cars,声明命名空间 namespace pack\props;,我们在外部调用的时候,就可以使用pack\props\Cars()。

如何自动加载命名空间中的类

命名空间不会自动去包含相应的文件,我们使用的时候,依然需要去手动,或者自动去加载相应的文件,在之前是通过autoload或者spl_autoload_register来自动加载对应的类,其实命名空间同样能用这两个机制来加载,当你访问new pack\props\Cars();的时候,传递到autoload函数的类名将是 pack\props\Cars,我们根据自己定义的目录规则,来加载这个文件

$class=str_replace('', '/', $class);
$file=APP_PATH.'/model/'.$class.'.php';
if(is_file($file))
{
    include $file;
}

代码解释下,先将pack\props\Cars,拼成APP_PATH./model/pack/props/Cars.php 然后去包含。这样我们就自动加载了命名空间中的类。

2013-06-09 19:40:00 +0000 UTC

vs2012更新update2之后编译的程序无法在xp下运行

vs2012更新update2之后编译的程序无法在xp下运行

今天发布一个更新,用户反馈在xp下无法运行。

出现提示:无法定位程序输入点InitializeCriticalSectionEx 于动态链接库 KERNEL32.dll 上

程序是MFC程序采用静态链接的方式编译的。

之前一直没问题。于是google了下,找呀找,找呀找,找到了这个:http://support.microsoft.com/kb/2835600/en

783276: A fix for ATL & MFC XP targeting is included. This fix addresses the following scenario:

In Visual Studio 2012 Update 2, you create a C++ Win32 Console Application project.

In the application wizard, you select both ATL and MFC.

On the project's Property Pages screen, you specify the following options:

Platform Toolset: v110_xp

Use of MFC: Use MFC in a Static Library

Use of ATL: Static Link to ATL

You run the application on a computer that is running Windows XP or Windows Server 2003.

In this scenario, you receive the following error message:

Application Name - Entry Point Not Found

The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll

原来是这群混蛋更新update2造的bug。已经在update3修复了。于是果断下载之,重新编译之后,终于xp正常打开了。

vs2012 update3 下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=39305

在这个页面点下载,然后选择vs2012.3 RC.exe 你看到这篇文章的时候,可能已经不是RC版了,选择类似的就ok

直接点下一步,然后运行,在线安装,我4m宽带,大概十几分钟就装好了。

2013-05-13 21:22:00 +0000 UTC

mysql无法启动排错

mysql无法启动排错

上班打开虚拟机,系统是ubuntu,在连接数据库的时候发现无法连接数据库

试着启动mysql:执行service mysql start 提示:Job failed to start

在终端执行mysql命令:提示:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

继续找日志,发现/var/log下的mysql都没有日志。。

只有系统日志,打开syslog这个文件,发现:

Apr 28 10:54:22 localhost kernel: [   31.015430] init: mysql main process (901) terminated with status 1

Apr 28 10:54:22 localhost kernel: [   31.015457] init: mysql main process ended, respawning

Apr 28 10:54:23 localhost kernel: [   31.930266] init: mysql post-start process (902) terminated with status 1

Apr 28 10:54:23 localhost kernel: [   31.939001] type=1400 audit(1367117663.768:12): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=949 comm="apparmor_parser"

Apr 28 10:54:24 localhost kernel: [   33.060400] init: mysql main process (953) terminated with status 1

Apr 28 10:54:24 localhost kernel: [   33.060426] init: mysql respawning too fast, stopped

只提示mysql进程无法启动。还是没办法定位问题。

在修改了几个配置,仍然无法启动之后,决定重装mysql。。

先备份数据库文件,防止数据跟表都没了。cd到/var/lib/mysql/ 这个目录下,将整个目录拷走。然后重装mysql。

悲剧的是,重装之后依然无法启动。万幸的是mysql错误日志出来了,位置在\var\log\mysql\error.log

发现以下error:

130428 11:28:55 [ERROR] /usr/sbin/mysqld: Table './mysql/db' is marked as crashed and last (automatic?) repair failed

130428 11:28:55 [ERROR] Fatal error: Can't open and lock privilege tables: Table './mysql/db' is marked as crashed and last (automatic?) repair failed

130428 11:28:55 [ERROR] /usr/sbin/mysqld: File '/var/run/mysqld/mysqld.pid' not found (Errcode: 13)

130428 11:28:55 [ERROR] /usr/sbin/mysqld: Error reading file 'UNKNOWN' (Errcode: 9)

130428 11:28:55 [ERROR] /usr/sbin/mysqld: Error on close of 'UNKNOWN' (Errcode: 9)

发现是mysql库下db这个表有问题,导致启动失败,cd 到存表文件的目录/var/lib/mysql/mysql 然后执行修复文件命令:myisamchk -of db.MYI 重新启动。终于启动成功了。

还有怎么找存放mysql数据文件的路径,可以执行 find / -name *.MYD

2013-04-28 11:53:00 +0000 UTC

消息推送全开也没有那怕一条消息

消息推送全开也没有那怕一条消息

每天在微博,腾讯新闻,cnblog,osc等各个产生自己感兴趣的消息的地方往返,晚上却不记得自己看过什么。

每天开着各种消息推送,qq,微信,微博。逛着说说,朋友圈,却很少发现和自己有关的东西。

感觉和世界在脱节,想做点什么,却什么都没做。每天在消磨着激情。越来越少的沉迷于某种事情。状态真不好。

tasklist在失控,越来越懒得去根据tasklist来做东西,很容易被打扰。我在失控。甚至连睡觉也失控,因为我很想睡懒觉的,可是真的能睡的时候,又担心时间被我浪费了。赶紧起床后却依旧各种新闻逛着,各种消息慢慢吸着。

就像一个超负荷的机器人,接受着各种指令,刚往前却要向左,向左之后又想向右。

总会有一种声音告诉我,别那么浮躁,要沉淀下来。我却不知道怎么做。因为别人不是我自己。

如果把我忘掉,那边就把我彻底忘掉,让我一个人行走的斑斓的世界。让我自己去发现,这个世界很美丽。

2013-03-17 22:33:00 +0000 UTC