[转]malloc/free 的开销,如何去掉这种开销?忘记free内存泄漏怎么办?
Unix/LinuxC技术 jack 2014-12-4 00:16
背景:C语言里重新分配及释放结构体会产生一些开销,可能导致巨大的性能瓶颈。解决这个问题的一个办法是为分配的结构体单独维护一个表。当用户不需要某个结构体实例时,将其返回结构体池中。当我们需要某个实例时,从结构体池中获取一个对象。如果池中没有可用的元素,我们就可以动态分配一个实例。这种方法高效地维护一个结构体池,能按需重复使用动态内存。
一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。
为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。
可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。
其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chunk尺寸,对齐,排错...),如果可以忍受这些缺陷,或者说是限制,还是比较值得的。下一步就是它的灵活性——让它可以更加容易集成进其它系统。
对于C标准库,如果能增加一个/一族这样的分配器,还是很有价值的。从理论上讲,只要free时多传一个size参数,就可以完全去掉额外的开销。这样两个函数就可以做到:
这样做还有一个额外的好处,就是可以更好地对齐,假定程序需要按32字节对齐,malloc/free 就至少需要32字节做簿记,如果再加上内存越界检测,就需要64字节。salloc/sfree则只需要将分配的内存对齐到32字节边界即可。
但是这对程序的正确性要求很高,malloc/free中,内存越界检测可以很容易实现,而salloc/sfree就完全做不到(除非增加额外簿记)。一个好主意是可以在debug版中加入这些差错功能,而在release版中去掉。
更好(确切地讲应该是更灵活)的方案是,实现一个
而让 salloc/sfree简单地作为 mpool 的包装。
gcc的std::allocator基本上是按这样的方式实现的,只不过,它的size参数,大多数时刻是自动传递的(知道具体的class/struct,也就知道它的尺寸)。实现方式上,使用 size_aligned/align 作为索引去访问特定尺寸的mempool,一个 mempool 是多个链表串起来的大chunk,每个chunk内部是链表穿起来的cell。这也许是最好的实现方式了,除了节省的额外空间开销,时间开销上,如果不考虑加锁,一次alloc平均可以在10时钟周期内完成,dealloc用的时间更短。相比之下malloc/free耗的时间也要多得多。
原文来自:http://blog.csdn.net/whinah/article/details/4693828
如何减少频繁分配内存(malloc或者new)造成的内存碎片?
高性能之内存池(频繁使用malloc和new会降低性能)
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
(1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程保护。也不需要维护内存空闲表的额外开销,从而获得较高的性能。
(2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性,提升了程序性能。
(3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题。
(4)当需要分配管理的内存在100M一下的时候,采用内存池会节省大量的时间,否则会耗费更多的时间。
(5)内存池可以防止更多的内存碎片的产生
(6)更方便于管理内存
转自:http://blog.sina.com.cn/s/blog_6abf2c040101fj3f.html
忘记free内存泄漏怎么办?
linux C内存泄露检测实现及内存泄露检测的一般方法
linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。一般可以有如下几种方式来避免内存泄露:
1) 使用智能指针,这个在C++中较为常见;
2) 使用内存池;
3) 自己封装一层malloc/free等等。当申请内存时,将申请信息放入到一个已分配内存信息链表里面。free时,删除对应的信息表的节点。在程序执行结束前,扫瞄该信息表,若还存在信息节点,那么该节点记录的就是泄露的内存信息。若链表为空,那就是说没有发生内存泄露;
4)使用检测工具检测内存泄露,进而修补程序,这样的工具有比如Valgrind等等。
摘录自:http://www.xuebuyuan.com/1764051.html
一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。
为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。
可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。
其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chunk尺寸,对齐,排错...),如果可以忍受这些缺陷,或者说是限制,还是比较值得的。下一步就是它的灵活性——让它可以更加容易集成进其它系统。
对于C标准库,如果能增加一个/一族这样的分配器,还是很有价值的。从理论上讲,只要free时多传一个size参数,就可以完全去掉额外的开销。这样两个函数就可以做到:
这样做还有一个额外的好处,就是可以更好地对齐,假定程序需要按32字节对齐,malloc/free 就至少需要32字节做簿记,如果再加上内存越界检测,就需要64字节。salloc/sfree则只需要将分配的内存对齐到32字节边界即可。
但是这对程序的正确性要求很高,malloc/free中,内存越界检测可以很容易实现,而salloc/sfree就完全做不到(除非增加额外簿记)。一个好主意是可以在debug版中加入这些差错功能,而在release版中去掉。
更好(确切地讲应该是更灵活)的方案是,实现一个
而让 salloc/sfree简单地作为 mpool 的包装。
gcc的std::allocator基本上是按这样的方式实现的,只不过,它的size参数,大多数时刻是自动传递的(知道具体的class/struct,也就知道它的尺寸)。实现方式上,使用 size_aligned/align 作为索引去访问特定尺寸的mempool,一个 mempool 是多个链表串起来的大chunk,每个chunk内部是链表穿起来的cell。这也许是最好的实现方式了,除了节省的额外空间开销,时间开销上,如果不考虑加锁,一次alloc平均可以在10时钟周期内完成,dealloc用的时间更短。相比之下malloc/free耗的时间也要多得多。
原文来自:http://blog.csdn.net/whinah/article/details/4693828
如何减少频繁分配内存(malloc或者new)造成的内存碎片?
高性能之内存池(频繁使用malloc和new会降低性能)
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
(1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程保护。也不需要维护内存空闲表的额外开销,从而获得较高的性能。
(2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性,提升了程序性能。
(3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题。
(4)当需要分配管理的内存在100M一下的时候,采用内存池会节省大量的时间,否则会耗费更多的时间。
(5)内存池可以防止更多的内存碎片的产生
(6)更方便于管理内存
转自:http://blog.sina.com.cn/s/blog_6abf2c040101fj3f.html
忘记free内存泄漏怎么办?
linux C内存泄露检测实现及内存泄露检测的一般方法
linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。一般可以有如下几种方式来避免内存泄露:
1) 使用智能指针,这个在C++中较为常见;
2) 使用内存池;
3) 自己封装一层malloc/free等等。当申请内存时,将申请信息放入到一个已分配内存信息链表里面。free时,删除对应的信息表的节点。在程序执行结束前,扫瞄该信息表,若还存在信息节点,那么该节点记录的就是泄露的内存信息。若链表为空,那就是说没有发生内存泄露;
4)使用检测工具检测内存泄露,进而修补程序,这样的工具有比如Valgrind等等。
摘录自:http://www.xuebuyuan.com/1764051.html
背景:
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
阅读全文
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
阅读全文
[缓存集群]php memcached缓存集群--转
Php/Js/Shell/Go jack 2014-12-1 14:50
背景:cache有多台,addServer,这块里有一个算法不是太好,在腾讯时在做云存储时有兄弟改成了环形算法,更能最大限度的在添加机器后影响小,这块我目前没几台机器没有这个必要,自己写还不如这位兄弟写的,特转。
阅读全文
阅读全文
[实践OK]Linux下机械磁盘大小查看之fdisk -l 命令使用方法, linux下测试磁盘的读写IO速度。
Unix/LinuxC技术 jack 2014-11-26 23:42
即使是RAID多张盘组成高可用,但在Linux下显示也是一块,但有时用df -h看不清楚,得用 fdisk -l 查看:
一)Linux下机械磁盘大小查看之fdisk命令使用方法:
[root@xidan-testserver-428 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol03
22G 22G 0 100% /
/dev/mapper/VolGroup00-LogVol00
32G 4.4G 26G 15% /usr
/dev/mapper/VolGroup00-LogVol01
32G 6.3G 24G 21% /var
/dev/mapper/VolGroup00-LogVol04
171G 865M 161G 1% /data
/dev/sda1 244M 20M 212M 9% /boot
tmpfs 4.0G 0 4.0G 0% /dev/shm
查看总大小:fdisk -l,有299.4G,但是实际分成下面两个区后并没有那么大:
[root@xidan-testserver-428 ~]# fdisk -l
Disk /dev/sda: 299.4 GB, 299439751168 bytes
255 heads, 63 sectors/track, 36404 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 36404 292158090 8e Linux LVM
合计大小:
[root@xidan-testserver-428 ~]# expr 22 + 32 + 32 + 171 + 4
261
二)背景:vps出现负载高的情况,有一盘是挂载的,不知是不是因代码放上面运行慢引起的,磁盘不行?
阅读全文
一)Linux下机械磁盘大小查看之fdisk命令使用方法:
[root@xidan-testserver-428 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol03
22G 22G 0 100% /
/dev/mapper/VolGroup00-LogVol00
32G 4.4G 26G 15% /usr
/dev/mapper/VolGroup00-LogVol01
32G 6.3G 24G 21% /var
/dev/mapper/VolGroup00-LogVol04
171G 865M 161G 1% /data
/dev/sda1 244M 20M 212M 9% /boot
tmpfs 4.0G 0 4.0G 0% /dev/shm
查看总大小:fdisk -l,有299.4G,但是实际分成下面两个区后并没有那么大:
[root@xidan-testserver-428 ~]# fdisk -l
Disk /dev/sda: 299.4 GB, 299439751168 bytes
255 heads, 63 sectors/track, 36404 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 32 257008+ 83 Linux
/dev/sda2 33 36404 292158090 8e Linux LVM
合计大小:
[root@xidan-testserver-428 ~]# expr 22 + 32 + 32 + 171 + 4
261
二)背景:vps出现负载高的情况,有一盘是挂载的,不知是不是因代码放上面运行慢引起的,磁盘不行?
阅读全文
背景:curl "http://jackxiang.com/post/7634/" curl: (52) Empty reply from server,我估计是Nginx的缓存cgi动态为静态的模块可能出了点问题。
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
背景:今天访问自己博客时偶尔出现如下mysql问题:
Bo-Blog Database System Tips: Can not connect to MySQL server
Time: 2014-11-22 4:56am
Script:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Errno.: 2002
找了一下有一位兄弟是这么说的:
刚刚装好的环境,经常会出现Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 的问题。其实解决这个问题一般有两种解决方法的思路:
其一,就是mysql启动的时候生成的这个mysql.sock文件,而却所在的文件夹的写入权限,所以给这个文件夹足够的权限就好了,至于这个文件夹在哪儿,可以查看/etc/my.cnf就能看到。
vi /etc/my.cnf
其二,就是php没有加载上这个文件。具体做法就是查看php.ini,里面相关联的mysql.sock文件所在的地址是否跟/etc/my.cnf生成的一致。php.ini中:
?
mysql.default_socket=/tmp/mysql.sock
vi php.ini
璞玉的修改成这个了。
如果修改了php.ini,如果是centos,请重启php-fpm,然后重启nginx或者apache即可。
/TMP/MYSQL.SOCK
摘自:http://www.pooy.net/original-solve-the-problem-cant-connect-to-local-mysql-server-through-sockettmpmysql-sock.html
更多:http://www.linuxdiyf.com/bbs/thread-75335-1-1.html
Bo-Blog Database System Tips: Can not connect to MySQL server
Time: 2014-11-22 4:56am
Script:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Errno.: 2002
找了一下有一位兄弟是这么说的:
刚刚装好的环境,经常会出现Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 的问题。其实解决这个问题一般有两种解决方法的思路:
其一,就是mysql启动的时候生成的这个mysql.sock文件,而却所在的文件夹的写入权限,所以给这个文件夹足够的权限就好了,至于这个文件夹在哪儿,可以查看/etc/my.cnf就能看到。
vi /etc/my.cnf
其二,就是php没有加载上这个文件。具体做法就是查看php.ini,里面相关联的mysql.sock文件所在的地址是否跟/etc/my.cnf生成的一致。php.ini中:
?
mysql.default_socket=/tmp/mysql.sock
vi php.ini
璞玉的修改成这个了。
如果修改了php.ini,如果是centos,请重启php-fpm,然后重启nginx或者apache即可。
/TMP/MYSQL.SOCK
摘自:http://www.pooy.net/original-solve-the-problem-cant-connect-to-local-mysql-server-through-sockettmpmysql-sock.html
更多:http://www.linuxdiyf.com/bbs/thread-75335-1-1.html
背景:在xp下用IE下载了一个firefox的网络安装程序,下载安装后发现是英文。
好像是更新了一下系统,重启后运行火狐变成了英文,怎么调成中文
1.打开Firefox浏览器,在地址栏输入“about:config”打开
2.点击底部的确认按钮进入
3.在左边第一列找到“general.useragent.locale”这一项,然后双击,把框内内容改为“zh-CN”4.关闭浏览器再打开即可
后来,发现本来就是英文版,设置了没用。还是下载时直接下一个中文的全安装包得了。
好像是更新了一下系统,重启后运行火狐变成了英文,怎么调成中文
1.打开Firefox浏览器,在地址栏输入“about:config”打开
2.点击底部的确认按钮进入
3.在左边第一列找到“general.useragent.locale”这一项,然后双击,把框内内容改为“zh-CN”4.关闭浏览器再打开即可
后来,发现本来就是英文版,设置了没用。还是下载时直接下一个中文的全安装包得了。
这个问题困扰了好久,昨天到网上查了很多资料,介绍了两种办法
1:设置input的height和line-height,line-height比height稍小一些,但这种方式只在IE中生效,FireFox中文字仍然是
顶部显示的
2:设置input的padding-top,padding-top=(height-line-height)/2,这种方法勉强可以是的文字想居中 位置靠近,但padding-top的值的慢慢的调节,调节了很久发现文字终于居中了,结果文本框的高度也变大了,一个很大的文本框看其来总有点不协调,请问大家是怎么调节<input type="text">使得文字居中的( vertical-align:middle 也试过,但是没有效果)
3:请问Dreamweaver中有没有专门用于显示文字的标签呢,就像asp.net中的label一样的,在表单中经常会看到 “用户名:”+文本框 ,怎么让“用户名:”和后面的文本框垂直居中呢
欢迎各位高手指导,最好能亲手调试过在回答,能答多少就答多少,言之有理即可得分
阅读全文
1:设置input的height和line-height,line-height比height稍小一些,但这种方式只在IE中生效,FireFox中文字仍然是
顶部显示的
2:设置input的padding-top,padding-top=(height-line-height)/2,这种方法勉强可以是的文字想居中 位置靠近,但padding-top的值的慢慢的调节,调节了很久发现文字终于居中了,结果文本框的高度也变大了,一个很大的文本框看其来总有点不协调,请问大家是怎么调节<input type="text">使得文字居中的( vertical-align:middle 也试过,但是没有效果)
3:请问Dreamweaver中有没有专门用于显示文字的标签呢,就像asp.net中的label一样的,在表单中经常会看到 “用户名:”+文本框 ,怎么让“用户名:”和后面的文本框垂直居中呢
欢迎各位高手指导,最好能亲手调试过在回答,能答多少就答多少,言之有理即可得分
阅读全文
Linux服务器查看占用IO较高的程序
Unix/LinuxC技术 jack 2014-11-22 12:01
开启IO监控:
sysctl vm.block_dump=1
#或
echo 1 >/proc/sys/vm/block_dump
开启后内核会将IO读写dump到日记,用dmesg查看:
dmesg
进程读写block到磁盘dm-0:
mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0
bash(8336): dirtied inode 7391146 (dmesg) on dm-0
统计当前占用IO最高的10个进程:
dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
摘处:http://www.haiyun.me/archives/linux-dmesg-io-dump.html
sysctl vm.block_dump=1
#或
echo 1 >/proc/sys/vm/block_dump
开启后内核会将IO读写dump到日记,用dmesg查看:
dmesg
进程读写block到磁盘dm-0:
mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0
bash(8336): dirtied inode 7391146 (dmesg) on dm-0
统计当前占用IO最高的10个进程:
dmesg |awk -F: '{print $1}'|sort|uniq -c|sort -rn|head -n 10
摘处:http://www.haiyun.me/archives/linux-dmesg-io-dump.html
转贴,Android手机一键Root原理分析,如何获取到root的原理分析。
Unix/LinuxC技术 jack 2014-11-21 17:50
背景:android手机是linux内核的手机,当然linus自己可能发现漏洞,但同时其linux是开源的,代码是公开的,只要能读取其root的一个su的机制,及内核相关权限代码,可能发现各种漏洞,有些漏洞是内核自己的,比如linus作为linux之父亲,自己都提交一个,有些呢是程序调用时需要用root去获取如某些设备权限等,此时会编译原理的大牛就可以在此处作文章了,经过努力是可以实现提权的,再就是利用如linux下多进程的原理:如linux内核会对孤儿进程会用1号进程去收养,恶意创建N多进程后,其adb崩溃重启瞬间没法让1号进程去执行降权,此时adb就是root,这是一个内核和应用程序相结合的提权,总之,提权这种事情都对linux的内核较熟悉,对多进程啊,对哪些地方需要root的代码有研究,也就是黑发生在内部,提权拿钱这种事情,不光linux系统,人类这个大的系统也有类似的情形,叫专政策漏洞,在法律灰色地带干赚钱,法律这套体系已经被他摸透了,已经被root了,法律不健全,或故意不打补丁引起的,所以需要开源、开放、透明,一块打补丁,所谓政策开放、透明、在法制下阳光运行就是这个理儿。
阅读全文
阅读全文
背景:在21ic上看一篇文章说向51单片机say bye bye,有点意思,但是就目前来说新的低成本方案成本低于51的涌现,再就是调试后到硬件的结合程度,再就是对寄存器的操作等都存在问题,于是说bye了,不过目前有新的avr平台如Arduino的出现,不亚于arm下的raspberryPi。也就是说这块来讲人人都能学点皮毛就能开发出一个小硬件功能,但就我的个人感觉呢,这块硬件还是像老中医一样,需要有多年的功力的,不全是像这文章所述一样,精华呢,就像那个周星驰的西游降魔篇中的孙悟空一样,小且有力,有穿透力的,成魔也好成佛也好都得小得有压强,是一个同意的整体,51是你练手摔打的一座小山,come on,呵呵。
阅读全文
阅读全文
背景:想做智能硬件,语音识别成文字,再解析做相关操作是一个重要的点功能,国内就没有一个厂商像google一样提供一个web的协议进行翻译么?能不能更开放点,把这点能力给开放出来,毕竟如果哪家小公司去做这一块成本相当的高,有讯飞一家,还有没有更勇于开放的呢?呵呵,;webchat,只能在微信里用。
阅读全文
阅读全文
Linux操作系统下生成一个指定大小的文件
Unix/LinuxC技术 jack 2014-11-19 17:56
磁盘预留空间的实验:
1、首先在要预留空间的分区上使用dd命令生成一个指定大小的文件:
创建一个10M的文件,名字是foobar:
# dd if=/dev/zero of=/home/foobar bs=1K count=10000
In Unix-like operating systems, /dev/zero is a special file that provides as many null characters (ASCII NULL, 0x00; not ASCII character "digit zero", "0", 0x30) as are read from it. One of the typical uses is to provide a character stream for overwriting information. Another might be to generate a clean file of a certain size. Using mmap to map /dev/zero to RAM is the BSD way of implementing shared memory.
2、将这个文件格式化:
# mke2fs -vFm0 /home/foobar 100000000 //(1K * 10000)
3、将这个文件mount,之后就可以向这个文件中写内容了,就好比向一个目录中写内容一样:
# mount -o loop home/foobar /mnt/mountpoint
摘自:http://blog.csdn.net/penn902/article/details/5746606
更多:http://blog.chinaunix.net/uid-8504518-id-2030389.html
1、首先在要预留空间的分区上使用dd命令生成一个指定大小的文件:
创建一个10M的文件,名字是foobar:
# dd if=/dev/zero of=/home/foobar bs=1K count=10000
In Unix-like operating systems, /dev/zero is a special file that provides as many null characters (ASCII NULL, 0x00; not ASCII character "digit zero", "0", 0x30) as are read from it. One of the typical uses is to provide a character stream for overwriting information. Another might be to generate a clean file of a certain size. Using mmap to map /dev/zero to RAM is the BSD way of implementing shared memory.
2、将这个文件格式化:
# mke2fs -vFm0 /home/foobar 100000000 //(1K * 10000)
3、将这个文件mount,之后就可以向这个文件中写内容了,就好比向一个目录中写内容一样:
# mount -o loop home/foobar /mnt/mountpoint
摘自:http://blog.csdn.net/penn902/article/details/5746606
更多:http://blog.chinaunix.net/uid-8504518-id-2030389.html
[实践OK]Web服务器(如Apache、Nginx)会默认开启对断点续传的支持,php支持断点续传的文件下载类,PHP上传实现断点续传文件的方法。
Php/Js/Shell/Go jack 2014-11-19 17:05
背景:大文件的断点续传,有时网络波动啥的,需要断点从已经下载位置续传下载文件,对于没有传过的文件再次从开始下载就麻烦了,这块http协议支持的,Apache和Nginx都支持这样的方法实现了从某个部分进行断点下载。
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
服务器是否支持断点续传的判断:
更多 0
断点续传 linux wget 服务器 curl
通常情况下,Web服务器(如Apache)会默认开启对断点续传的支持。因此,如果直接通过Web服务器来提供文件的下载,可以不必做特别的配置,即可享受到断点续传的好处。断点续传是在发起HTTP请求的时候加入RANGE头来告诉服务器客户端已经下载了多少字节。等所有这些请求都返回之后,再把得到的内容一块一块的拼接起来得到完整的资源。
Resumable download file Web服务器(如Apache)默认开启断点续传
你可以通过以下的命令来测试一下。
Linux 测试服务器是否支持断点续传
localhost [~]# wget -S http://httpd.apache.org/images/httpd_logo_wide_new.png 2>&1 | grep ‘Accept-Ranges’
Accept-Ranges: bytes
输出结果 Accept-Ranges: bytes ,说明服务器支持按字节下载。
curl 命令发送字节范围下载
curl –range 0-99 http://images.apple.com/home/images/billboard_iphone_hero.jpg
这样可以到最开始99字节,结果如下图:
curl range bytes request curl 命令发送字节范围请求
说明从服务器端按字节范围下载是完全没有问题的。
现在我们尝试以下方式:
1、一次性下载整个图片。
localhost [~]# curl –range 0-98315 http://images.apple.com/home/images/billboard_iphone_hero.jpg > test.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 98316 100 98316 0 0 524k 0 –:–:– –:–:– –:—:— 527k
完成后,test.jpg完全等于billboard_iphone_hero.jpg,文件大小为98,316 字节。
实践如下:我的Nginx服务器,请求下看是否支持,如下:
1)实践下下载这块的header返回头有Accept-Ranges: bytes证明Nginx也是支持断点续传下载的:
(1)Curl包含range的请求头是这样的:
(2)其抓包Nginx的返回头是这样:
HTTP/1.1 206 Partial Content
Server: nginx
Date: Wed, 19 Nov 2014 14:45:07 GMT
Content-Type: image/jpeg
Content-Length: 109
Last-Modified: Fri, 07 Nov 2014 05:06:12 GMT
Connection: keep-alive
ETag: "545c5344-1b8c"
Expires: Fri, 19 Dec 2014 14:45:07 GMT
Cache-Control: max-age=2592000
Content-Range: bytes 0-108/7052
4)通过前面的curl及wget联合起来,先后组合起来实现一个断点下载整个图片,并看其服务器返回头(curl已经下了前面的108,后从109开始wget:
(1)先保存一部分到108:
(2)再通过wget的断点续传下载命令-c,请求剩下的部分(Content-Range: bytes 109-7051/7052):
A)加上-S看返回头, -S, --server-response 打印服务器响应。:
B)发起头如下,也就是说经curl保存一部分后,wget通过-c参数时,后面它会去读取目前文件大小,后写在http头里去找服务端要,请求头如下:
注意:字节是从0开始,结束字节为总字节长度 减 1。
来自:http://ju.outofmemory.cn/entry/23646
Nginx:http://chenzhenianqing.cn/articles/926.html
阅读全文
Linux双网卡配置两个网关导致网络无法使用
Unix/LinuxC技术 jack 2014-11-17 23:32
Linux服务器有两个网卡,配置eth0为公网使用,eth1为内网使用。
分别为两个网卡配置IP地址,DNS,网关等。重启生效后,发现无法访问公网,ping网关也能ping通,ping同一个网关下的其他公网地址也能ping通。
1> 刚开始ping的时使用域名,怀疑是DNS无法解析,遂直接ping IP地址,同样无法ping,排除与DNS的关系。
2> 由于能够ping同一个网关下的IP地址,所以服务器网卡等肯定没有问题。应该还是网卡配置导致。
3> 后来仔细检查eth0和eth1的配置,发现配置了两个网关。其中eth1配置了内网的网关,修改eht1的网关与eth0一致后,问题解决。
上述问题还是比较容易犯,配置网卡的时候通常都是和别的环境对照着配,稍不注意,就会配置多个网关。
来自:http://www.linuxidc.com/Linux/2011-03/32955.htm
分别为两个网卡配置IP地址,DNS,网关等。重启生效后,发现无法访问公网,ping网关也能ping通,ping同一个网关下的其他公网地址也能ping通。
1> 刚开始ping的时使用域名,怀疑是DNS无法解析,遂直接ping IP地址,同样无法ping,排除与DNS的关系。
2> 由于能够ping同一个网关下的IP地址,所以服务器网卡等肯定没有问题。应该还是网卡配置导致。
3> 后来仔细检查eth0和eth1的配置,发现配置了两个网关。其中eth1配置了内网的网关,修改eht1的网关与eth0一致后,问题解决。
上述问题还是比较容易犯,配置网卡的时候通常都是和别的环境对照着配,稍不注意,就会配置多个网关。
来自:http://www.linuxidc.com/Linux/2011-03/32955.htm
规划产品于做项目:
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
很多时候我们根本不会考虑产品规划的事情,因为我们是在做项目,客户项目化定制理所当然,那如果抱着这种思想项目始终无法转会为产品,没有产品自然无法产生应该有的产品化后的规模效应。项目型IT企业最后完全演变为IT外包企业,更谈不上企业的核心竞争力。
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
产品规划真正要做的就是产品和项目本身的分离,产品变化为一个平台,项目变化为产品基础上的配置和实施。实施本身存在差异,但是产品平台本身可以产生强大的规模效应和底层支撑。IT企业核心竞争力最终还是体现在产品上,产品是企业核心研发能力和价值的重要体现。对于如何进行产品规划,针对IT企业而言从如下几个方面来进行说明。
背景分析和现状调研
市场驱动研发,当你无法像苹果一样引领市场的还是很,那就更好的去满足市场的需求。既然是规划,那么很多时候考虑的则是不是满足现有需求,而是要去挖掘潜在的市场需求。
背景分析重点是你规划的产品方向相关的业界标准,市场发展趋势,产品所涉及到的新技术的发展趋势等。而现状调研则是当前市场现状,现状分析越清楚越容易后续的定位和差异化。同时现状分析还不包括了我们自身的现状,包括已有的研发产品,已经涉及到的相关项目,团队人员情况等。任何规划要能落地就一定不能脱离实际。
理解市场很困难,因为市场无时无刻不在变化,很多时候需要的是要在合适的时候推出合适的产品。产品本身依托太多的外在环境,IT基础设施的发展等,太超前了是死,完全跟随也没有出路。则是必须面对的一个问题,也是产品规划不可避免的风险。但是你不能回避,没有理解清楚市场,就谈不上细分市场,产品定位和差异化等。正如我们自己,没有清楚的认识自己,就谈不上定位自己和规划自己。
产品定位分析
产品规划的核心在市场营销方法论,而市场营销核心本身又在STP(细分,目标和定位),简单来说核心在于差异化。通过差异化充分的扬长避短,发挥自己的优势。
当我们谈产品的定位的时候,又必须进一步的细化客户的需求,从客户来说我们有哪些客户和客户群,他们是如何划分的?从需求来说有哪些需求和功能要求,其各自的优先级又是如何的。市场驱动研发,从4P到4C,进一步的体现产品最大的成功就是市场销售量,要达到该目标那产品必须实现客户价值,客户价值即时产品价值。
市场和客户想清楚了,那接下来就是匹配的事情,我们的能力必须要匹配需求和能够实现需求,必须要清楚的认识到我们已有的优势和劣势,我们面对哪些竞争。SWOT看着很简单,但是真正分析到位确很困难的,因为很多时候很多是主观分析,很难有完整的数据来做支撑。蓝海里面讲价值创新,那前提是首先通过SWOT分析明确自身的差异化核心价值体现在哪里?这样才能剔除传统和不增值内容,加入新技术和创新点。
产品定位输出包括两个重要方面,一个是做什么产品,或者说做该产品的里面的那一个更加具体的类型,该产品的核心功能必须有哪些?另外一个即是产品的目标市场或客户是谁,目标客户是否足够细分? 很多时候我们老想做一款通吃的产品,到后面导致产品大量的定制和膨胀,最终产品又变成了定制项目。
产品总体规划
切合前面的市场分析和产品定位,那么我们产品规划目标和产品发展愿景是什么?产品愿景将进一步回答产品的核心价值所在。产品愿景是我们期望产品是什么样子,遵循一个什么样的发展路线,解决哪些客户的核心问题以体现核心价值。产品愿景可以看得更加长远点,超过3年或者更长时间,虽然存在太多的不确定性,但是我们仍然要有一个清晰的愿景。正如你想把你的孩子培养成什么样一个人一样,必须有一个大方向和愿景。
产品愿景和大方向清楚了,接下来才是分阶段的规划,或者叫路标规划,路标规划让我们对一个长时间周期的规划有了一个更加清楚的里程碑,这是产品规划内容最粗粒度的一个落地考虑。有了路标,我们的航线更加清晰,要达到最终的大目标我们就必须一个个小路标一步步的走过来。
路标规划是一个长时间周期规划,3-5年甚至更长时间,那这个想清楚了接下来就要考虑最近1-2年如何做?最近3-6个月如何做?这一步需要更加详细的规划,以方便实施和落地。在现在互联网时代,产品研发也必须敏捷,短周期迭代,以应对变化和进行调整。
一个是如何做和做哪些?那么另外一个重要的就是如何推和如何实施?我们在做之前相关的市场规划策划,产品方案等工作就必须开始和并行。产品研发和市场工作并行,而不是等产品真正出来了才考虑如何推广。
产品研发规划
研发规划离我们就很近了,首先研发规划的输入应该是产品规划或产品年度规划,产品年度规划的内容需要通过产品研发规划落地。研发规划可以理解成大的项目计划,那自然应该包括项目范围和需求收集,需求分析和优先级的评估,研发资源的投入和成本,研发功能点,研发进度计划。如果存在多个子产品,还必须考虑研发产品组合规划,然后才是子产品的研发计划。
研发计划需要进一步细化到短周期的产品研发项目和版本,每一个版本有明确的项目范围和交付功能,有明确的资源申请和资源拖入,研发的每个版本最终通过立项后要严格按项目管理的方式进行计划,执行和跟踪。
研发规划里面另外一个重点就是技术规划,很多时候我们的研发规划和技术规划是放在一起的,但是不同的产品研发往往是涉及到相同的技术和平台。那么这部分应该抽取出来,根据产品开发方法论,本身也是包括了产品,平台和技术三个层面的内容。平台层和技术层如果足够强大,那么产品本身的灵活和可配置性也越强。
资源管理和管道管理在产品组合管理里面是一个重要内容,在研发规划里面一定要考虑到对资源的需求,特别是涉及到多产品规划的时候,资源冲突往往是一个很头疼的事情。而研发资源往往又不适合在同一时间兼顾多个产品或项目。资源规划本身包括了对资源技能的要求,时间的要求和数量的要求。这些都需要提前考虑到。
产品财务规划
产品财务规划是产品战略规划和商业模式中盈利模式分析和规划内容的进一步落地。财务规划必须回答问题是产品投入多大,需要多少成本?后续盈利模式如何,需要多久能够开始盈利。是否有进一步的可持续的盈利模式,还有哪些增值点,这些都必须考虑到。
资源一定要分阶段投入,产品也最好能够分迭代版本逐步退出。要知道产品研发周期越长,那么成本投入越大,企业本身的现金流压力也就越大。公司做产品规划,做产品的目的只有一个就是合法的赚取最大化的利润。这是很正常的一个事情,一方面是回报员工和股东,一方面是公司可持续长久发展。
产品财务规划首先是产品的投资回收期和内部收益率分析,其次是产品投入预算,预算的进一步分解等。有预算后续有执行,就容易进一步的按产品核算成本和收益。对于产品推出市场,又必须考虑产品的定价策略,产品定价策略需要考虑市场本身成熟度,客户关系积累,产品本身的发展多方面信息进行完善。
摘自:http://blog.sina.com.cn/s/blog_493a84550100z0n5.html
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
很多时候我们根本不会考虑产品规划的事情,因为我们是在做项目,客户项目化定制理所当然,那如果抱着这种思想项目始终无法转会为产品,没有产品自然无法产生应该有的产品化后的规模效应。项目型IT企业最后完全演变为IT外包企业,更谈不上企业的核心竞争力。
有产品规划意识也不一定就能做出产品,特别是当我们试图从项目来驱动和衍生产品的时候,我们把项目个性化的内容误认为是产品通用化的内容,由于项目本身的短平快本身就无法形成一个通用化的产品底层模型,同时项目研发和产品研发本身又不分家,最后发现还是在做项目。
产品规划真正要做的就是产品和项目本身的分离,产品变化为一个平台,项目变化为产品基础上的配置和实施。实施本身存在差异,但是产品平台本身可以产生强大的规模效应和底层支撑。IT企业核心竞争力最终还是体现在产品上,产品是企业核心研发能力和价值的重要体现。对于如何进行产品规划,针对IT企业而言从如下几个方面来进行说明。
背景分析和现状调研
市场驱动研发,当你无法像苹果一样引领市场的还是很,那就更好的去满足市场的需求。既然是规划,那么很多时候考虑的则是不是满足现有需求,而是要去挖掘潜在的市场需求。
背景分析重点是你规划的产品方向相关的业界标准,市场发展趋势,产品所涉及到的新技术的发展趋势等。而现状调研则是当前市场现状,现状分析越清楚越容易后续的定位和差异化。同时现状分析还不包括了我们自身的现状,包括已有的研发产品,已经涉及到的相关项目,团队人员情况等。任何规划要能落地就一定不能脱离实际。
理解市场很困难,因为市场无时无刻不在变化,很多时候需要的是要在合适的时候推出合适的产品。产品本身依托太多的外在环境,IT基础设施的发展等,太超前了是死,完全跟随也没有出路。则是必须面对的一个问题,也是产品规划不可避免的风险。但是你不能回避,没有理解清楚市场,就谈不上细分市场,产品定位和差异化等。正如我们自己,没有清楚的认识自己,就谈不上定位自己和规划自己。
产品定位分析
产品规划的核心在市场营销方法论,而市场营销核心本身又在STP(细分,目标和定位),简单来说核心在于差异化。通过差异化充分的扬长避短,发挥自己的优势。
当我们谈产品的定位的时候,又必须进一步的细化客户的需求,从客户来说我们有哪些客户和客户群,他们是如何划分的?从需求来说有哪些需求和功能要求,其各自的优先级又是如何的。市场驱动研发,从4P到4C,进一步的体现产品最大的成功就是市场销售量,要达到该目标那产品必须实现客户价值,客户价值即时产品价值。
市场和客户想清楚了,那接下来就是匹配的事情,我们的能力必须要匹配需求和能够实现需求,必须要清楚的认识到我们已有的优势和劣势,我们面对哪些竞争。SWOT看着很简单,但是真正分析到位确很困难的,因为很多时候很多是主观分析,很难有完整的数据来做支撑。蓝海里面讲价值创新,那前提是首先通过SWOT分析明确自身的差异化核心价值体现在哪里?这样才能剔除传统和不增值内容,加入新技术和创新点。
产品定位输出包括两个重要方面,一个是做什么产品,或者说做该产品的里面的那一个更加具体的类型,该产品的核心功能必须有哪些?另外一个即是产品的目标市场或客户是谁,目标客户是否足够细分? 很多时候我们老想做一款通吃的产品,到后面导致产品大量的定制和膨胀,最终产品又变成了定制项目。
产品总体规划
切合前面的市场分析和产品定位,那么我们产品规划目标和产品发展愿景是什么?产品愿景将进一步回答产品的核心价值所在。产品愿景是我们期望产品是什么样子,遵循一个什么样的发展路线,解决哪些客户的核心问题以体现核心价值。产品愿景可以看得更加长远点,超过3年或者更长时间,虽然存在太多的不确定性,但是我们仍然要有一个清晰的愿景。正如你想把你的孩子培养成什么样一个人一样,必须有一个大方向和愿景。
产品愿景和大方向清楚了,接下来才是分阶段的规划,或者叫路标规划,路标规划让我们对一个长时间周期的规划有了一个更加清楚的里程碑,这是产品规划内容最粗粒度的一个落地考虑。有了路标,我们的航线更加清晰,要达到最终的大目标我们就必须一个个小路标一步步的走过来。
路标规划是一个长时间周期规划,3-5年甚至更长时间,那这个想清楚了接下来就要考虑最近1-2年如何做?最近3-6个月如何做?这一步需要更加详细的规划,以方便实施和落地。在现在互联网时代,产品研发也必须敏捷,短周期迭代,以应对变化和进行调整。
一个是如何做和做哪些?那么另外一个重要的就是如何推和如何实施?我们在做之前相关的市场规划策划,产品方案等工作就必须开始和并行。产品研发和市场工作并行,而不是等产品真正出来了才考虑如何推广。
产品研发规划
研发规划离我们就很近了,首先研发规划的输入应该是产品规划或产品年度规划,产品年度规划的内容需要通过产品研发规划落地。研发规划可以理解成大的项目计划,那自然应该包括项目范围和需求收集,需求分析和优先级的评估,研发资源的投入和成本,研发功能点,研发进度计划。如果存在多个子产品,还必须考虑研发产品组合规划,然后才是子产品的研发计划。
研发计划需要进一步细化到短周期的产品研发项目和版本,每一个版本有明确的项目范围和交付功能,有明确的资源申请和资源拖入,研发的每个版本最终通过立项后要严格按项目管理的方式进行计划,执行和跟踪。
研发规划里面另外一个重点就是技术规划,很多时候我们的研发规划和技术规划是放在一起的,但是不同的产品研发往往是涉及到相同的技术和平台。那么这部分应该抽取出来,根据产品开发方法论,本身也是包括了产品,平台和技术三个层面的内容。平台层和技术层如果足够强大,那么产品本身的灵活和可配置性也越强。
资源管理和管道管理在产品组合管理里面是一个重要内容,在研发规划里面一定要考虑到对资源的需求,特别是涉及到多产品规划的时候,资源冲突往往是一个很头疼的事情。而研发资源往往又不适合在同一时间兼顾多个产品或项目。资源规划本身包括了对资源技能的要求,时间的要求和数量的要求。这些都需要提前考虑到。
产品财务规划
产品财务规划是产品战略规划和商业模式中盈利模式分析和规划内容的进一步落地。财务规划必须回答问题是产品投入多大,需要多少成本?后续盈利模式如何,需要多久能够开始盈利。是否有进一步的可持续的盈利模式,还有哪些增值点,这些都必须考虑到。
资源一定要分阶段投入,产品也最好能够分迭代版本逐步退出。要知道产品研发周期越长,那么成本投入越大,企业本身的现金流压力也就越大。公司做产品规划,做产品的目的只有一个就是合法的赚取最大化的利润。这是很正常的一个事情,一方面是回报员工和股东,一方面是公司可持续长久发展。
产品财务规划首先是产品的投资回收期和内部收益率分析,其次是产品投入预算,预算的进一步分解等。有预算后续有执行,就容易进一步的按产品核算成本和收益。对于产品推出市场,又必须考虑产品的定价策略,产品定价策略需要考虑市场本身成熟度,客户关系积累,产品本身的发展多方面信息进行完善。
摘自:http://blog.sina.com.cn/s/blog_493a84550100z0n5.html




