积累日常生活的点滴,开发过程的心得。

如何基于i18n和Views本地化分类(Term)视图

i18n对于Term字段的本地化支持两种模式,一种是针对同一个Term创建多个Node,每个Node对应不同的语言,一种是针对一个Term Node,提供多种翻译,根据选定的语言上下文指定不同的翻译来显示。前一种模式非常麻烦,因为要多创建N个Node,而后一种虽然简单,但是views却不支持。

幸好有人开发了相应的扩展,让我们可以支持后者https://github.com/nelovishk/i18ntaxonomy_views/。
安装插件后,翻译好你的分类项目,然后在views的显示路径前加上语言路径就可以了。
http://www.xxx.com/zh-hans/xxx_views

使用AFJSONDecode的一个陷阱

AFJsonDecode在IOS5以上直接用的系统自带的Json解码器,在IOS4上面我们要使用Jsonkit等外部的Json解码器,否则会报错。

Three20正在死亡?

看上去越来越多的人正在放弃Three20,包括它的作者本人也另外开了一个新的项目。我想最重要的一点就是那东西太笨重了,它从根本上要求你把所有的东西都用它来替换,包括UITableViewController,UIViewController,你必须把它们全部换掉才行。而Three20本身又缺乏文档,想稍微改造一下,要看半天它的实现。学习曲线太高,用户不友好。其实大家更喜欢非侵入式的,可以很容易整合,剪裁或者替换的方案,而不是一个什么都要干的恐龙一样的东西。大家更容易接受渐进式的改变,而不是革命式的变化,那样大家会因为未知而觉得恐慌,觉得项目不可控。

但是很多人不明白这个道理,感觉Antlr的作者就有点2,总是不停的推倒重写框架代码,最后搞得大家都没法Follow,谁都不愿意费了半天劲学完的东西又要重学一遍,写过的Target每次都要重写一遍。Gnome和Ubuntu的开发团队更是2B中的战斗机,Unity已经把人搞得快吐血了,又要出一个Mir。

又及,今天看了Antlr4的教程,感觉作者重写Antlr4还有是有一定道理的,因为整个结构都变掉了,完全采用了Visitor模式。

Raspberry Pi PogoPlug MK808电视棒

看上去不错,不过还没想好除了做视频服务器外还能干啥?

http://uniteng.com/index.php/2013/03/12/smart-home-portal/
http://qwhomeautomation.com/

傲慢与偏见

看了英国人拍的傲慢与偏见,很好看。回过头来看情节,其实也就是另一个灰姑娘的故事,其实应该算台湾的那些席绢写的面向女性意淫书的鼻祖吧。

又及,今天看了简,奥斯汀的传记,看起来她的爱情很不幸,她写的小说很多都是对爱情的向往,对她写灰姑娘的故事表示同情。

移植windows下的VC程序到Linux下的gcc环境

这次要移植的程序是个命令行程序,相对于MFC的程序移植要简单很多。下面是一些常见的问题。

1.数据类型的不一致

VC下面的int64是__int64, gcc下面是int64_t,需要写一个tyepdef来处理,另外就是gcc需要include inttypes.h。

2.一些编译指令的不同

比如inline, vc 是_inline,gcc是 __attribute__((always_inline))

3.内存分配的不同
vc的内存对齐分配的api是_aligned_free,_aligned_malloc
gcc是free,memalign

内存对齐的处理也不一样
#if WIN32
#define ALIGN(x) __declspec(align(x))
#elif LINUX
#define ALIGN(x) __attribute__((aligned (x)))
#endif

4.数据类型的自动转换
vc可以自动将int转换为double,gcc必须强制转换

5.多线程处理
gcc用的是pthread,vc用的是自己的多线程库。

openmp的处理
VC里面在ide可以加入openmp的支持,gcc的编译选项是-fopenmp,引用的库是-lgomp

visual studio的memory leak查找工具

complex上的visual leak detector ,注意运行的时候一定要把runtime下的所有dll都复制到程序目录下,只拷贝vld的dll会有问题

重载C++的new operator来检查内存分配情况

傻逼客户要求我提交一份程序内存分配情况的报告,要求有单元名,函数名,分配行号,分配的最大尺寸,是否有内存泄漏。

malloc还比较好办, 用个宏替换一下就行。new 分配符分配的内存就比较麻烦。看了一下代码中用new的地方有300多处,每个地方加log累死了,于是查了半天,发现可以用重载new operator的方法来实现。

inline void * _cdecl operator new (size_t cbSize, char *szFile , char* szFunc, UINT nLineNo)

{

void *p = malloc(cbSize );

printf ("file \"%s\" func:%s line: %d size:%d.\n",szFile, szFunc, nLineNo, cbSize);
// we return the address + sizeof(AllocHeader)

return p;
}

inline void _cdecl operator delete(void *p)

{
free(p);
}

#define new new(__FILE__, __FUNCTION__, __LINE__)

为Drupal创建自定义的Filter

Drupal的Term的父子关系有一个问题,Term_Data表里面没有Tid为0的数据,但是对于根节点来说,它们的Parent又为0,
当使用Parent Term 的Relationship时,因为Term Data表中没有tid为0的数据,views自动生成where条件无法选出根节点的子节点。这时候只能是通过views php的自定义的Filter来实现,输入下面的代码。

if (isset($view->exposed_input['tid']))
return 'term_hierarchy.parent = '.$view->exposed_input['tid'];
else
return 'term_hierarchy.parent = 0';

同步内容