Quantcast
Channel: IT社区推荐资讯 - ITIndex.net
Viewing all 15843 articles
Browse latest View live

移动互联网:人口红利结束了,提升效率的公司吃香了

$
0
0

编者按:本文作者曾航(新浪微博@ 曾航),前21 世纪经济报道资深记者,著有《一只 iPhone 的全球之旅》一书,现担任触控科技的战略总监。

昨天看到消息,专注于游戏行业云服务的公司 UCloud获得B轮5000万美元的融资,我认为这和此前 TalkingDataApp Annie等B2B公司获得大额融资一样, 标志着中国的移动互联网正由人口红利驱动,转变为效率提升驱动

中国本轮移动互联网的发展大约从2009年左右开始发端,那时候3G正式在中国启动,智能手机开始在中国悄然流行,中国一夜之间涌现出了数以万计的移动开发者,再加上资本向这一领域持续投入,中国移动互联网迎来了黄金的5年爆发期。

此前5年的移动互联网发展,主要是人口红利驱动的,其标志性事件是功能机转智能机的换机潮。整个2013年,中国共卖出了3.47亿部智能手机,中国以极快的速度成为世界第一大智能手机大国,世界第一大移动互联网市场。

这种人口红利在中国呈现阶梯状发展,智能手机和3G网络最早在中国的北京、上海等一线城市普及,早期以3000-5000元的高端手机为主,此后随着手机价格的快速下滑,开始迅速往2、3线城市、县城及农村一级市场普及。

中国移动互联网的许多应用,都是依靠人口红利快速发展自己的用户数。我们以手机游戏行业为例,2011年中国手机游戏用户仅为8000万人,到了2014年,这一规模将迅速增长到3亿人。源源不断倒入的新增手机游戏用户使得这一市场快速扩大,我们在行业的各种会议上经常能够听到“洗用户”这三个字,只要有源源不断的用户倒入,一些品质不高的游戏也能获得很高的收入。

但进入2014年以来,中国智能手机的人口红利已经基本宣告结束。2014年Q1,中国的智能手机出货量首次出现了负增长,这是一个非常明确的信号,中国的功能机转智能机换机潮已经基本结束。

这一过程远远比我们想象中来得快,因为中国是世界手机制造第一大国,几年前我写《 一只iPhone的全球之旅》这本书时还在感慨显示屏、手机芯片等紧俏核心部件被苹果提前包下,使得其他手机厂商苦不堪言,但是到了今天,中国产的各种手机配件已经可以基本满足日益增长的巨大需求,500块钱在今天已经可以买到一个非常好的智能手机。

今年年初以来,我们听到许多手机应用商店的流量已经停止增长甚至开始负增长,这直接导致了手机游戏行业出现流量饥渴症,大批优秀的手机游戏因为无法倒入足够的用户而达不到收入预期。许多移动App的用户增长也开始明显放缓,一些靠吃人口红利的App感受到了明显的压力,当老用户开始衰退,新用户跟不上的时候,增长变得非常乏力。

2014年注定将是中国移动互联网的一个重要分水岭,效率的低下严重阻碍了移动互联网的进一步发展,当人口红利结束的时候,那些提升效率型的公司将变得格外吃香。

1)提升开发效率的公司

移动互联网的一个重要特征是中小团队居多。我们以手机游戏行业为例,在PC端游时代,一款游戏动辄需要几百名研发人员,历时几年才能开发完毕,而在手机游戏时代,一个20个人的小团队,花上几个月的时间就可以开发一款相当不错的手机游戏。

小团队具有灵活、激励充分的特征,由于赚的每一分钱都是自己的,因此干劲十足,这是在大公司打工完全不具备的优势。

cocos2d-xunity3d这样的开发引擎的出现,使得中小团队和大公司在手游开发上的差距变得越来越小,小团队的优势被极大激发,这也使得市场上出现了越来越多《刀塔传奇》这样的游戏。第三方引擎的普及使得大部分手游团队都不会选择自己去开发引擎,从而大幅提升开发效率。

类似的开发工具还包括Xcode、AppMobi、Kony、Corona、OpenPlug等。

2)提升流量转化效率的公司

移动互联网的流量分发目前以应用商店为主,但是应用商店流量增长已经远远不能满足整个行业的流量饥渴。而广大长尾App经过5年的发展积累起了巨量的用户资源,又无法转变成有效的应用分发流量。

在App里面通过投放Banner移动广告带来应用下载激活的转化率大概是万分之一,由展示到点击的转化率是百分之一,由点击到最后激活的转化率又只有百分之一。

不久前从某知名应用商店听来的数据,点击该商店内的应用下载后的未激活率高达70%——也就是说多达70%的应用没有下载成功,或者说该应用商店有70%的流量是浪费的。

在这种情况下,一些数据挖掘公司,如比邻弘科、TalkingData将有可能提升流量转化效率。此外WebApp的崛起将大幅提升流量转化效率,因为用户将不再需要下载App才能使用应用,因此WebApp方案提供商如cocos2d-HTML5、磊友将有可能在产业链中扮演越来越重要的作用。此外,像芒果、chartboost、Vungle这样的提升广告效率的技术型公司,也有很大的发展间。

3)提升运营效率的公司

像UCloud这样的公司,可以让中小手游开发者快速解决服务器基础架构的问题,运维管理问题,节约了资金成本,包括刀塔传奇、啪啪三国等成功的手机游戏都使用了UCloud的产品。

此外还有大量SDK型公司,例如提升社交分享效率的 ShareSDK、Share+,提升推送效率的个推、极光推送等,提升数据分析效率的TalkingData、App Annie、友盟等,提升测试效率的Testin、梅泰诺等。

我认为UCloud的融资是一个标志性事件,接下来相信会有越来越多提升效率性的公司融资,而且估值都不低。

除非注明,本站文章均为原创或编译,转载请注明: 文章来自 36氪

36氪官方iOS应用正式上线,支持『一键下载36氪报道的移动App』和『离线阅读』立即下载!


亚马逊 Fire Phone 到来:内容新入口,3D 很出色

$
0
0

BqbkS3WCQAAAzC2

亚马逊在 2 年前就被传出正在开发自有品牌手机,《商业周刊》资深作者布拉德·斯通(Brad Stone)在今天带来更多消息。他说,亚马逊在 2009 年就开始着手开发智能手机,早期同时开发了两款手机,最后低端设备被渐渐忽略,团队将精力集中在一款支持 3D 显示的高端手机上。

发布会前夕科技博客们“抽丝剥茧”式的爆料,亚马逊含糊暧昧的预热视频,情报、谍图,系统、参数……所有信息汇聚到一起,将人们对亚马逊手机的期待持续提高。现在,它终于到来了。

Fire Phone

feature-immersive._V351099443_

似乎是对 Kindle Fire 平板电脑的延续,亚马逊将首款智能手机命名为 Fire Phone。它的配置与传言有些出入,Fire Phone 采用:

  • 高通 2.2GHz 四核处理器
  • 2G 内存
  • 4.7 英寸 720p 显示屏,最高亮度为 590 尼特,室外下也可以看清屏幕内容
  • 1300 万像素后置镜头,采用 5 枚镜片组成的镜组,光圈大小为 f2.0,支持 OIS 光学防抖。拥有独立拍照键
  • 其它:双声道杜比音效扬声器,Cloud Drive 提供无限量的照片云存储空间

feature-firefly._V351138530_

软件端,贝索斯特别介绍了一项名为 Firefly 的新功能。Firefly 是一项识别功能,按住手机上的 Firefly 按钮,你可以通过摄像头扫描书籍、CD 的编码。Firefly 还能识别唱片和电影的封面,你甚至可以用它扫描一段 URL 链接。

很明显,Firefly 是一项目的性很强的产品——扫描完书籍、唱片,系统下面会给出该商品在亚马逊商店中的链接,点击后就可以购买。

演示过程中,Firefly 的识别速度很快。贝索斯在展示前打趣说,“我得快点演示这项功能。因为我得让你们看看它到底有多快。”

速度上的优势之外,Firefly 的精准度看起来也还不错。当然,具体效果还需要实际上手来验证。

除了图像识别,Firefly 还能识别歌曲,并且给出歌曲名称。苹果在 iOS 8 中同样为 Siri 加入了“听歌辨曲”功能,这会是未来的一个趋势吗?

贝索斯承诺,亚马逊会将 Firefly 开发工具提供给开发者,方便他们在自己的软件中加入文字、音乐和图片的识别功能。

3D 显示

feature-dp._V349436054_

在冗长的硬件配置和 Firefly 的功能描述后,贝索斯终于开始介绍 Fire Phone 的 3D 显示特性——“动态视角”(Dynamic perspective)。

实现动态视角的硬件基础是位于手机四角的 4 枚摄像头。镜头可以捕捉周围环境的位置,配合软件算法,呈现出 3D 效果。

贝索斯说,动态视角每分钟要刷新 60 次,以此来维持 UI 的 3D 效果。从演示来看,动态视角的 3D 效果非常明显,锁屏壁纸可以看到明显的景深,地图应用也可以渲染出非常出色的立体效果。

BGR 和 TechCrunch 的信源同时表示,亚马逊在去年秋天开始开发拥有 3D 效果的动态视角。专利文件同样显示,亚马逊在很早之前就筹划类似的产品,与之相关的专利文件最早要追溯到 2008 年。

如此前《华尔街日报》的消息所述,亚马逊和 AT&T 签订了合作协议,Fire Phone 将由后者独家销售。2007 年苹果发布初代 iPhone 时,AT&T 就曾与苹果签订了 iPhone 的独家销售权,合作协议持续 3 年多,AT&T 赚到钵满盆溢。亚马逊 Fire Phone 有可能成为 AT&T 下一个金矿。

根据 AT&T 的规定,购买 16G Fire Phone 需要签订 2 年合约,合约价为 199.99 美元;购买 64G Fire Phone 同样需要绑定 AT&T 的服务,它的合约价为 299 美元。

 

题图来自 WSJD/Twitter

阅读、思考、自我反省,相信坚持可以改变人生。

#欢迎关注爱范儿认证微信公众号:AppSolution(微信号:appsolution),发现新酷精华应用。



爱范儿 · Beats of Bits |原文链接· 查看评论· 新浪微博· 微信订阅· 加入爱范社区!


服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

$
0
0
早期,我们使用 Debian 作为服务器软件,后来转向了CentOS,主要原因如下:

1、CentOS/RHEL的生命周期是7年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安装操作系统。要知道重新折腾一个生产机是很麻烦而且有风险的事情。

[2012.2.1]今天刚刚收到红帽子的通知邮件,RedHat 5, RedHat 6的生命周期,延长到10年,太牛叉了。这个对企业用户很重要。

而Debian的生命周期是不固定的,一般新版本发布以后,上个版本再维护18个月。而Debian的版本发布时间间隔不稳定,经常会延期。综合起来一个版本的生命周期一般在3~4年。

[2014.4.24]Debian 宣布对Squeeze(6.0),提供5年的LTS长期支持。

Ubuntu的LTS版生命周期是5年。

如果你选用了 Debian 或者 Ubuntu作为服务器,等生命周期过了以后,就没有安全补丁,你的服务器就会裸奔或者需要重新安装系统。

2、RedHat是一个值得尊敬的开源公司,长期以来Linux内核RedHat的贡献程度都是最多的。可以这么说,如果一个Linux方面的问题,RedHat搞不定,那么也很少有其他公司可以搞定了。公司有一批Linux内核方面的如雷贯耳的大牛,比如:
  • Alan Cox - Core developer, numerous contributions
  • Ingo Molnar - x86 subsystem maintainer
  • Al Viro - VFS subsystem maintainer, linux内核贡献第二多的个人
  • David Miller - Sparc Port maintainer, linux网络部分开发者, linux内核贡献最多的个人
  • Jeff Garzik - Sata subsystem maintainer
  • John Linville - Wireless subsystem maintainer
  • Stephen Tweedie - Ext3 filesystem developer
  • Eric Sandeen - XFS, Ext4 filesystem developer
  • Josef Bacik - Btrfs filesystem developer
  • Rik Van Riel - VM developer
  • Ric Wheeler - Filesystem developer
  • Val Henson - Filesystem developer
  • Dave Jones - Fedora kernel maintainer
  • Kyle McMartin - Fedora kernel maintainer
  • Chuck Ebbert - Fedora kernel maintainer
  • Eric Paris - LSM/SELinux/Audit/Capabilities maintainer
  • Eugene Teo - Security Response
  • Kay Sievers - Hotplug

3、CentOS/RHEL对硬件的支持很好,主流硬件厂商早就将服务器拿过去测试,一般不存在硬件的兼容性问题。

而Debian就麻烦了,由于有版权上的考虑和代码纯洁性上的洁癖,一些硬件驱动和软件被删掉了,导致安装过程有问题。比如 Dell 服务器上,大量使用的网卡 BroadCom,就驱动不了,安装了以后,网络起不来。

4、大量商业软件,比如 Oracle ,都是针对 Redhat认证的,有大量的帮助文档和使用说明,有良好的技术支持。出了问题,也容易在网上找到类似的答案和经验。

5、CentOS 是RedHat的克隆版,如果需要可以随时平滑切换到 RedHat,从而享受RedHat的服务支持。要知道厂商的服务,是最后一道防火墙,如果你给一个大客户做方案,他们一般会倾向选用商业服务。万一出了什么问题,还有Redhat可以求助,或者有一个RedHat可以承担责任 :-)

6、如果你是一个工程师,熟悉了 CentOS/RedHat ,找工作更加容易。如果你是一个企业老板,相对也容易招聘到熟悉CentOS/RedHat的工程师。RHCE的培训,也相对较完善,认同程度高。

7、CentOS/RHEL 的批量安装更加方便

在机房,使用kickstart + PXE安装,给客户,使用定制的kickstart光盘,一键安装,一般在5分钟左右就可以安装完。

上述3,4,5,6几点中,都说明CentOS/RHEL相对于其他Linux操作系统,有相对完整的生态环境,很多公司在CentOS/RHEL投入了大量资源,积累了大量经验,绑定了自己的利益,这个是CentOS/RHEL得以长期良好发展的保证。

=============
补充对评论的一些回复

1. 所谓的“centos稳定性非常差”,不知道你指的是什么?能否举一些CentOS不稳定的例子?至少我们用了这么多年CentOS,稳定性上可以说是坚如磐石的。如果是你说的由于yum升级造成的混乱,那只能说明你对centos不熟悉。
2、RHEL/centos 对于一些新的软件的支持,采用 SCL的方式支持,比如ruby193,python27, python 33, PHP 54, nodejs 0.10, mariadb55, postgresql 9.2
AdditionalResources/Repositories/SCL
3、debian/ubuntu 同样存在版本稳定和程序太老的矛盾,比如他们的LTS版本,一般是两年多更新一次。 squeeze是2011年2月发布,wheezy是2013年5月发布,如果你在2013年4月使用Debian,你会发觉好多软件太老,比如:
内核:2.6.32,和Centos 6 一样的
glibc 还是使用的2.11.2
mysql使用的5.1.49
openjdk使用的是 6
php使用的是 5.3.3
python使用的是2.6.6

下一个版本的Deiban,至少要到 2015年下半年才能发布,而RHEL7/CentOS7的正式版发布在即,里面用到的不少软件,都比 wheezy的要新。按照你的逻辑,在接下来较长的时间里,是否CentOS比起Debian更加前卫?

再看看 Rio 的回复:“之前我用了很长一段时间的 Debian,但它的更新实在太慢了(好几年啊有木有!)”,呵呵

4、“debian的支持时间也非常长期 ”,这个最近确实有了改善,Debian刚刚宣布对 Debian 6.0 有了5年的LTS长期支持。可以这么说,Debian也看到了LTS的重要性,向CentOS学习了一把。
Debian -- News -- Long term support for Debian 6.0 Announced

但Debian做得还不够,因为Debian的LTS在后续版本,比如 Debian 7 (wheezy), Debian 8 (jessie) 里的支持政策还不明朗:
Debian -- Security Information -- DSA-2907-1

Debian的LTS支持,也不是Debian 官方安全团队维护的,而是由其他志愿者维护的,工作效率和质量是否有保证还不知道。相比RHEL明晰的发展策略和安全更新策略,有10年的安全补丁保证,还有不少差距。

5、“debian这个系列的软件包也比较新,debian和他儿子ubuntu很多软件包维护是共享的,更新速度非常快”,不知道你使用的是稳定版还是测试版。稳定版里面你是如何看到软件包“更新速度非常快”的。

— 完 —
本文作者: 彭勇

【知乎日报】 你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 129 个回答,查看全部。
延伸阅读:
服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
企业级别的 Linux,包括 Desktop 版本和 Server 版本,哪一种 Linux 发行版不错呢?

某智能家居项目框架学习总结

$
0
0

这个月来第一篇博客,各种其他事情。。


之前负责过一个智能家居项目的二次开发,苏州一家公司做的,项目还是分了好几个系统,对业务流程的不同部分进行了划分,我是此项目的主要负责人,通过老师的指导,对这个项目也有了一些了解。此项目运用了一些框架,有些也是我第一次接触到的,下面将对项目用到的一些框架进行总结。

下面可能会出现几个有关智能家居的名词,介绍一下

1、机顶盒:每一个家庭都应该至少有一个机顶盒,控制电器开关都是由机顶盒向各电器的接收器发送命令

2、客户端:也就是用户的移动设备,手机、平板都可以,我们支持的系统有IOS和安卓



1.MINA                                                                                                                       


Mina框架是第一次听说,当时老师简单说了一下,主要是用来线程复用,因为每一个机顶盒都是通过socket来连接,每一个socker在等待接受命令的时候都得有一个线程来轮训,这样肯定要对线程做一个线程池的管理。后来也挺感兴趣的,在网上看了一下,mina是基于NIO的开发框架,JAVA在jdk1.4以后对NIO提供了支持,mina是将其封装了一下,提高了程序员的开发效率。普通BIO的就是上面说的一个socket一个线程,是阻塞式的,NIO提供的是非阻塞式的IO机制,每一个socket都交给一个线程,由这个线程统一分配给线程池中线程,大大节省了线程阻塞式切换当前上下文时的开销
。非阻塞式IO机制如下图所示:





2.OpenRemote                                                                                                          


以下是Openremote官网的介绍:


OpenRemote is software integration platform for residential and commercial building automation. OpenRemote platform is automation protocol agnostic, operates on off-the-shelf hardware and is freely available under an Open Source license. OpenRemote's architecture enables fully autonomous and user-independent intelligent buildings. End-user control interfaces are available for iOS and Android devices, and for devices with modern web browsers. User interface design, installation management and configuration can be handled remotely with OpenRemote cloud-based design tools.

其主要是为安卓和IOS提供的一个在线设计界面的一个系统,用户可以自定义要展示的界面,拖动一些按钮等待,生成在一个XML,类似于工作流的在线流程设计器,由程序来解析XML,实现自己在线做UI,无需安装,在线更新,就可以更改手机端UI设计






3.Spring MVC                                                                                                             


除了基本的一些接口,他们还利用Spring MVC实现rest服务。

REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议.(以上载自网络)

项目里面有一些服务之间的通信使用了 rest,其也用了其他服务商提供的rest接口,比如短信接口、语音接口等。


还有一些其他常见的就不一一介绍了,quartz任务调度框架等,都是一些初级WEB程序员常见的,引入quartz对定时任务做一写处理等等
作者:hacke2 发表于2014-6-18 23:38:08 原文链接
阅读:119 评论:0 查看评论

《权力的游戏》:暂时告别,乔治·马丁继续

$
0
0

zap-game-of-thrones-season-4-episode-2-the-lio-024
目前,整个文化界都在为乔治·R·R·马丁的作品着迷,特别是畅销的《冰与火之歌》(A Song of Ice and Fire)系列,HBO剧集《权力的游戏》(Game of Thrones)正是根据这部小说改编,第四季在周日(6月15日)晚终结。

尽管取得了这样的成功,HBO对《权力的游戏》的阐释与马丁的原著之间存在一些矛盾之处。《权力的游戏》平均每集有超过1800万观众观看,本季更是超越了《黑道家族》(Sopranos),成为HBO台收视率最高的剧集。拥有了这样的数据,斯塔克(Stark)、兰尼斯特(Lannister)、拜拉席恩(Baratheon)和坦格利安(Tagaryen)们已经不再属于马丁自己了。

这一季,剧集攀上收视率高峰的同时也招致了尖锐的批评,马丁同意谈一谈该剧迄今为止的成功之处,哪些地方缺失了,以及他本人对什么地方感到激动。作为一位作家,他既在电视行业做了很多工作,也写出了高踞榜首的小说,因此能从一个罕有的角度进行观察。

乔治·R·R·马丁坐在椅子上,和一个粉丝在一起。电视剧集《权力的游戏》由他的著作改编创作。HBO的铁王座很棒,但并不是他喜欢的样子。 Colby Katz for The New York Times

乔治·R·R·马丁坐在椅子上,和一个粉丝在一起。电视剧集《权力的游戏》由他的著作改编创作。HBO的铁王座很棒,但并不是他喜欢的样子。
Colby Katz for The New York Times

在最近的一次电话采访中,他认为把自己的小说搬上电视屏幕不算困难,“因为他们做了非常出色的工作”。他指的是由大卫·贝尼奥夫(David Benioff)与D·B·威斯(D. B. Weiss)领导的《权力的游戏》团队,他俩担任主创,为HBO带来了该剧。马丁觉得他俩是“龙的继父们”。不过,还有一件事能让马丁非常高兴。
该剧目前每季只有十集,作为一个拥有史诗的想象力,能创造出几百个(如果不是上千个)栩栩如生的人物的作家,假如HBO能给他的作品更大空间,那他就觉得再好不过了。

“我希望每季能拍更多集,”他在新墨西哥州圣塔菲的家中说。“我希望能有13集。有了13集,我们就可以把不得不删掉的一些小一些的场面也拍进去,那些小场面让故事更加深刻丰满。”

不过他也理解预算有限。拍摄地点遍及世界各地——冰岛、北爱尔兰、马耳他、摩洛哥——还有那么多重大战役。据报道,一季《权力的游戏》要花费6000万到7000万美元。“战争戏很贵,”马丁说,20世纪80年代,他曾在电视行业工作,声音里也有种资深人士的无奈。

至于那些没有拍出的时刻,他举了该系列第一本书《权力的游戏》里一个没有拍出的片段。史塔克一家与皇室一起来到维斯特洛的首都君临城。珊莎(Sansa)与艾莉亚·史塔克(Arya Stark)姊妹受邀和瑟曦王后(Queen Cersei)一起喝茶,吃柠檬蛋糕,但是艾莉亚想去和屠夫的儿子一起狩猎,两姐妹为此吵了架。

马丁说,他希望能拍这一幕,是因为它为剧情增添了质感,能在早期塑造两姐妹的性格与关系。尽管没在剧集中拍出来,但饰演珊莎的演员索菲·特纳(Sophie Turner)和饰演艾莉亚的麦茜·威廉姆斯(Maisie Williams)在试镜时拍了这一幕。

马丁自20世纪70年代开始在科幻杂志上发表短篇小说,他总是首先把自己视为虚构类作家,而图书的世界也给他带来了无数荣誉,包括雨果奖、星云奖、斯托克奖与世界奇幻奖。“我更像是一个隐士,而不是协作者,”他说。

不过,当他在电视业工作的时候还是要与人合作,他曾经为1986年CBS的《迷离时空》(The Twilight Zone)担任编剧,为1987年在CBS首播的《美女与野兽》(Beauty and the Beast)担任编剧和制片。但是“有点挫折感,”他说。作为作家,他更关心:“我怎样让它变得更好,更有力?这里该用什么字眼?我希望有最终决定权。我厌倦了打间接的战斗,也就是好莱坞的权力等式。”

他补充:“如果我不喜欢安妮的某个建议,”他指的是自己的编辑,班塔姆出版社(Bantam Books)的安妮·格罗尔(Anne Groell)——“我根本就不用在乎。在电视业,电视台、制片公司都像高高在上的宙斯一样踩在你头上。”

所以他离开了电视行业,重新回到小说老本行,1991年开始了《冰与火之歌》这部长篇史诗,他决心让这个故事带领自己回归最初的创作热情,能走多远就走多远。

今年65岁的马丁出生在新泽西州的贝永,是码头工人的儿子。他从小就喜欢奇幻和科幻小说以及漫画。他年轻时喜欢的作家包括罗伯特·海因莱因(Robert Heinlein)、杰克·万斯(Jack Wance)、J.R.R. Tolkien(J. R. R. Tolkien)的《指环王》(The Lord of the Rings)和漫威漫画。在1963年的《神奇四侠》(Fantastic Four)第20期上,甚至刊登了署名乔治·R·马丁的漫迷来信——显然他当时还没有在名字中加上托尔金式的第二个“R”——内容是关于《神奇四侠》的第17期,其中神奇先生(Mr. Fantastic)、石头人(the Thing)和同伴与末日博士(Dr.Doom)作战。甚至在那时,马丁就开始关注打斗的比例和页面的价值。

艾莉亚(麦茜·威廉姆斯饰,左二)和珊莎·史塔克(索菲·特纳饰)在《权力的游戏》中。 Helen Sloan/HBO

艾莉亚(麦茜·威廉姆斯饰,左二)和珊莎·史塔克(索菲·特纳饰)在《权力的游戏》中。
Helen Sloan/HBO

“我无法理解,你们的页数那么少,怎么能塞进那么多打斗情节,”他写道。

在《冰与火之歌》系列中,马丁也用很多页数写了很多打斗情节,自1996年《权力的游戏》出版以来,他已经写了大约5000页。书中虽然有很多奇幻元素,但在很多方面,它更像一部史诗式的19世纪小说,带有精巧的奇幻框架,更像托尔斯泰而不是托尔金。马丁说,他从来没想到它会被改编为电视剧。

有些人宁愿它没被HBO改编。随着剧集愈来愈流行,有些人批评它描绘性暴力。但马丁说,这是这个世界不可避免的一个方面。“强暴与性暴力一直是每一场战争的一部分,从古苏美尔人的战争直至如今,”在上个月的一封电子邮件中,他这样告诉《纽约时报》,“把它们从以战争和权力为核心的叙事中删去是大错特错,而且是不诚实的。”

但在最近的采访中,马丁很快指出,他在HBO剧集中的角色是第二位的。他是一位联合执行制作人,每一季也创作一集剧本。他说自己试着不去为电视剧的改动而烦心。“但是,”他说,“小改动会引起后面的大改动。”

以第一季中的音乐家马瑞里安(Marillion)为例,在HBO的版本中,马瑞里安残疾了,他的舌头被乔弗里国王(King Joffrey)一时兴起拔了出来,后来就从剧中消失了。在小说里可不是这样,在书中,培提尔·贝里席(Petyr Baelish)谋杀莱莎·艾伦(Lysa Arryn)时,马瑞里安充当了替罪羊角色(这个情节将在电视剧的本季播出)。“所以在电视里这段就需要修改,”马丁说起莱莎的死,“蝴蝶效应是逐渐累加的。”

但是他的梦想,他的想象力又怎样呢?HBO能满足吗?他说,他对所有服装、场景设计和特效都很满意。如果他能更多参与进去,会建议一些微调和变化。“不,不,让头盔更像这样吧。”

但是有一个重要道具令他不满:对铁王座的残酷性与纪念意义的展示。“HBO的铁王座成了一种象征,”他在博客中写道,“好吧,它可能是这样的。设计很棒,也非常符合剧集气氛。现在有它的三种不同尺寸的复制品和镇纸。所有人都知道。我喜欢它。所有的复制品我都有,就放在我的架子上。”

但是,他又写道:“但这不是我在写《凛冬的寒风》(The Winds of Winter,冰火系列尚未出版的第六卷——译注)时心里想象的铁王座。也不是我希望我的读者看到的铁王座。书中描写的王座巨……巨大、笨重,是黑色的,而且很扭曲,前方有极高的铁质台阶,国王坐在高踞的椅子上,俯瞰着宫廷里的所有人……我的王座是一头阴森地矗立在国王大厅中的野兽,丑陋,而且不对称……HBO的王座却完全不是这样。”

不管剧迷们更喜欢哪种王座,周日晚《权力的游戏》本季结束后,他们又得继续翘首企盼(该剧已被续订了第五季和第六季)。根据班特姆出版社,该书印了3100多万册,新书《凛冬的寒风》不管何时出版,很可能会马上成为畅销书。

《权力的游戏》电视剧的成功令马丁在某种程度上成了明星。作为一个霍比特人那样心宽体胖的人,他并不是流行文化明星界中那种典型的外表取胜的人物。“太不真实了,”他在采访中说,“你一直盼望着成功。但成为名人把这推向了另一面,名人老得快。”

不管出名不出名,马丁仍然必须每天坐下来写作,因为千百万焦急的粉丝都在等待、期盼着《凛冬的寒风》早日到来。对于有些书迷来说,他写得实在太慢,但保证质量是需要花时间的。被问到《凛冬的寒风》进展如何时,马丁的声音里带着一丝叹息,他只能说,“还在继续”。

这是杰出的梦想家面临截稿期的叹息。
-------------------------
本文最初发表于2014年6月15日。
翻译:董楠

【本文内容版权归纽约时报公司所有,阅读更多影视评论请下载纽约时报中文网iPhone & iPad App ( http://nyti.me/s/q7dc57) ”】

极简主义如何帮我克服了拖延症

$
0
0

我曾是个严重的拖延症患者。因为拖延症,我的论文迟迟未能动笔,资格考试一拖再拖;因为拖延症,我经常推迟老板交给的任务,最严重的一次拖了6个月。而拖延症带来的内疚感、焦虑感、自卑感和生活的无序感让我仿佛掉入一个爬不出来的泥潭。

1、 为什么很多时间管理的方法不适合我?

为了克服拖延症,我曾尝试了各种方法。我在网上打过卡,用过GTD,用过番茄法,尝试过网上各种各样的记事本跟踪记录方法。在刚开始使用这些方法的时候,我总是兴致勃勃,似乎也能收到一点功效,但总是以失败告终。

我发现这些方法不适用于我,主要有两个原因:(1)我拖延的一个重要原因是因为自卑和不安全感,什么都想要,什么都不敢放弃,对自己的能力和精力又没有客观的评估,所以负担过重,潜意识开始罢工。而上述时间管理方法不但没让我的日程表简单一点,反而增加了很多繁琐的计划、打卡、评估的工作,让负担更重了。(2)很多时间管理方法注重效率,让我会有点强迫症发作,总是处于一种紧张状态,时间一长就无法负荷,整个人又一泻千里。

我不是说GTD等方法不好,但是每个人的情况不同,找到适合自己的方法最重要。我的时间管理的目标,不是快一点多一点努力一点,而是慢一点专注一点。

2、 对生活进行简化之后我的改变

(1) 每天上网闲逛的时间控制在了一个小时之内
(2) 从很少运动到每天坚持跑步或者游泳40分钟
(3) 每天有5小时时间专注来写论文(这期间完全断网),虽然看起来不多,但是如果够专注,5小时就能有很多产出。我这一个月看的文献和完成论文的进度比之前几个月还多
(4) 每天多了2个小时的阅读时间
(5) 养成了很好的作息时间(早6点起床,晚10点睡觉)
(6) 有较强的幸福感和对于生活的掌控感

3、 我是怎样做的?

(1) 首先确定你的人生目标和想要怎样的生活。
(2) 梳理你手头正在做的事情。先把手头的事情无论大小全列出来,再根据与你生活目标的相关性和重要性进行筛选,只保留5件最重要的事情,比如我只保留了写论文、健身、阅读与写作、陪伴家人这几件事情。在保证了这最重要的5件事情的基础上再考虑其它的事情,如果其它事情与这5件事情有冲突,果断舍弃。
(3) 每次给自己一个新任务的时候,都要进行充分评估,需要花多少时间精力?有什么收获?如果不是有非常重要的意义和收获,就不要去做。不要一时兴起就去做某件事,否则如果不能坚持下去,或者没有足够的时间精力将其做到很好,一来给别人留下不靠谱、做事不细致不认真或者能力不强的印象,二来伤害自己的自信心和对生活的掌控感。
(4) 根据你筛选的最重要的5件事情来安排一日作息时间。给自己大块不受打扰的时间处理最重要的事务。比如我的4件重要事务,论文放在清晨和上午、健身放在下午、阅读和陪伴家人放在晚上,这些时间一定要得到保证,且排除任何干扰,比如写论文或者阅读的时候,我会断网,手机静音。
(5) 控制上网时间。网络是一大时间杀手,stayfocusd是一个非常好的工具。我现在每天清晨和上午的论文时间、晚上的阅读写作时间都是用这个工具实行强制断网,每天可以上网的时间只集中在下午1:30-4:30。
(6) 当任务精简之后,你会发现不再需要复杂的计划,复杂的工具,不再需要打卡。我也不给自己设立严格的定量目标。

Q&A

1、开始时很难坚持,该怎么办?

(1) 给自己创造一个专注的环境,没法干别的事情。去图书馆,只带电脑和必须的文具书籍。开头的一个星期尽量不带手机。
(2) 断网的技巧:
a) 若要上网查找文献等,把它集中在一个时间段,比如下午。上午的时间只用来看文献、分析数据做实验、写作。在断网的时间内如果的确需要查找某个文献,先把它记录下来,等到上网时间段再查。如果遇到不立即上网论文就没法再继续做的情况(这么久我从来没碰到过),可以换一项任务,或者用图书馆的共用电脑查,查完马上回来。还有一个方法是在stayfocusd里设置白名单,除了几个数据库网站以外其它网站都不能上。
b) 选择在一天结束的时候而不是开始的时候断网。我是每天下午学习工作结束,要去吃饭的时候将stayfocusd软件的Nuclear Option 设置为未来20小时不能上网,这样保证了我只能每天下午上网。有人会担心电脑不能上网了,碰到紧急情况怎么办。事实上只要你安排得当,是不会有很多紧急情况发生的。若真有这样的情况,可以借别人的电脑、用学校的公共电脑、网吧。很多时候我们担心意外情况,只是给自己找借口。
c) 在愧疚的时候断网。也许你又容忍自己在网上瞎逛了好几个小时,觉得有一丝内疚感涌上心头,这个时候赶紧打开Nuclear Option ,只要几秒钟,你就能获得未来若干小时的断网时间。
(3) 给自己手边准备一个本子或者word文档。当你想干别的事情,控制不住自己的时候,把自己的想法情绪全部记录下来,然后relax,静心待几分钟,什么也不干,只是让自己的心安静下来。告诉自己这就和毒瘾发作是一样的,熬过了这段时间,一切都会好的。你会发现你敲完一些字后,想要放弃的想法就没那么强烈了。
(4) 转换工作任务。比如论文写不下去了,我就去阅读或者游泳,总比浪费在网上瞎逛上强。但记住,只能在你选定的5项重要任务中选。实在什么工作都干不下去的情况下,选择做一件不要动脑子的机械劳动,比如洗衣服、拖地
(5) 保持环境的整洁,个人物品的有序。整理房间有助于获得对于生活的控制感。把不需要的东西全部处理掉。当你觉得又陷入拖延症的泥沼时,去整理房间吧。
(6) 把你的每日安排固定下来,即使周末和节日也不例外。
(7) 看到自己每天的进步,表扬和接纳自己,这样你会发现自己的控制力会增强。

 

 

作者:时光中的时光


可能有关的近期文章:


Mysql 查看连接数,状态

$
0
0
来源  http://blog.csdn.net/starnight_cbj/article/details/4492555


命令: show processlist;
如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
show processlist;只列出前100条,如果想全列出请使用show full processlist;
mysql> show processlist;



命令: show status;

命令:show status like '%下面变量%';

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
Connections 试图连接MySQL服务器的次数。
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
Delayed_writes 用INSERT DELAYED写入的行数。
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
Flush_commands 执行FLUSH命令的次数。
Handler_delete 请求从一张表中删除行的次数。
Handler_read_first 请求读入表中第一行的次数。
Handler_read_key 请求数字基于键读行。
Handler_read_next 请求读入基于一个键的一行的次数。
Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
Handler_update 请求更新表中一行的次数。
Handler_write 请求向表中插入一行的次数。
Key_blocks_used 用于关键字缓存的块的数量。
Key_read_requests 请求从缓存读入一个键值的次数。
Key_reads 从磁盘物理读入一个键值的次数。
Key_write_requests 请求将一个关键字块写入缓存次数。
Key_writes 将一个键值块物理写入磁盘的次数。
Max_used_connections 同时使用的连接的最大数目。
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
Open_tables 打开表的数量。
Open_files 打开文件的数量。
Open_streams 打开流的数量(主要用于日志记载)
Opened_tables 已经打开的表的数量。
Questions 发往服务器的查询的数量。
Slow_queries 要花超过long_query_time时间的查询数量。
Threads_connected 当前打开的连接的数量。
Threads_running 不在睡眠的线程数量。
Uptime 服务器工作了多少秒。







My.ini配置 虚拟内存








innodb_buffer_pool_size=576M   ->128M InnoDB引擎缓冲区

query_cache_size=100M             ->32 查询缓存
tmp_table_size=102M                  ->32M 临时表大小
key_buffer_size=16m                  ->8M



设置max_connections

命令:show variables like '%max_connections%'
(这个办法在debian+mysql  Ver 12.22 Distrib 4.0.22, for pc-linux (i386)
里实验了)
设置办法是在my.cnf文件中,添加下面的最后红色的一行:




--------------------------------------------------------------------------------



[mysqld]
port=3306
#socket=MySQL
skip-locking
set-variable = key_buffer=16K
set-variable = max_allowed_packet=1M
set-variable = thread_stack=64K
set-variable = table_cache=4
set-variable = sort_buffer=64K
set-variable = net_buffer_length=2K
set-variable = max_connections=32000
(在院里的DELL机器mysql4.0里的语法不同
max_connecionts=2000
直接这么写就好了







--------------------------------------------------------------------------------



修改完毕后,重启MySQL即可。当然,为了确保设置正确,应该查看一下max_connections。

注意:
1、虽然这里写的32000。但实际MySQL服务器允许的最大连接数16384;
2、除max_connections外,上述其他配置应该根据你们系统自身需要进行配置,不必拘泥;
3、添加了最大允许连接数,对系统消耗增加不大。
4、如果你的mysql用的是my.ini作配置文件,设置类似,但设置的格式要稍作变通。




用mysqld --help 可以查看到max_connections 变量。 
或者 mysql -uuser -p
后mysql>show variables;
也会看到max_connections 。  

下面是修改张老师 的redhat9的方法:

先是mysql -uw01f -p
mysql>show variables;
看到max_connections 为100
mysql>exit;
vi /etc/my.cnf
    [mysqld]
set-variable=max_connections=250  #加入这些内容
:wq

/etc/init.d/mysqld restart
好了,行了。



下面的是抄的,我用不了
mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些, 有两种办法可以修改最大连接数,一种是修改safe_mysqld,另一种是直接修改原代码并重新编译。下面我们就分别介绍这两种方法:

1.修改safe_mysqld
找到safe_mysqld编辑它,找到mysqld启动的那两行,在后面加上参数 :

-O max_connections=1000

例如 :(其中前面有---的是原来的内容,而+++是修改过以后的)
--- safe_mysqld.orig Mon Sep 25 09:34:01 2000
+++ safe_mysqld Sun Sep 24 16:56:46 2000
@@ -109,10 +109,10 @@
if test "$#" -eq 0
then
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR /
- --skip-locking >> $err_log 2>&1
+ --skip-locking -O max_connections=1000 >> $err_log 2>&1
else
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR /
- --skip-locking "$@" >> $err_log 2>&1
+ --skip-locking "$@" -O max_connections=1000 >> $err_log 2>&1
fi
if test ! -f $pid_file # This is removed if normal shutdown
then
然后关闭mysql重启它,用
/mysqladmin所在路径/mysqladmin -uroot -p variables
输入root数据库账号的密码后可看到
| max_connections | 1000 |
即新改动已经生效。

2.修改原代码

解开MySQL的原代码,进入里面的sql目录修改mysqld.cc找到下面一行:

{ "max_connections", (long*) &max_connections,1000,1,16384,0,1},

把它改为:

{ "max_connections", (long*) &max_connections,1000,1,16384,0,1},

存盘退出,然后./configure ;make;make install可以获得同样的效果。

已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



Linux 内存高速缓存(cache)类型分析

$
0
0

      在Liunx内存管理机制中,除了对目录项(dentry,Linux文件系统中某个inode的链接)进行缓存外,

还采取了两种高速缓存,即Buffer Cache和Page Cache,前者针对磁盘块的读写,后者针对文件inode的

读写。通过增加这些Cache,有效缩短 I/O时间。

       先通过free命令查看内存使用情况:

                 free -m

                    total       used       free     shared    buffers     cached  

Mem:         32176      30032       2144          0        249      25938

-/+ buffers/cache:       3844      28332

Swap:            0          0          0

        返回结果中,buffer和cache说明两种前面提及的两种高速缓存使用内存情况,其中:

        Buffers :说明缓存块设备读写的内存大小(buffer cache),这部分缓存主要用于

                       目录项、inode等文件系统元数据。如果ls一个包含很多内容的目录,可以

                       发现这个值明显增大。

        Cache   :说明用于缓存文件系统读写的内存大小(page cache),这部分缓存主要用于

                        打开的文件,如果 cache 的值很大,说明缓存的文件较多,在进行读写时,命

                        中率也将提高,如果频繁访问到的文件大部分被缓存,则必然减少磁盘的读IO。

                       It is similar like "Buffers", only this time it caches pages from file reading.

两种cache处理数据采用策略是不同的,具体如下:

buffer采用先进先出策略,cache则采用最少使用原则(LRU),即对于buffer缓存来说,

当缓存的内容达到其最大容量时,最先缓存的内容被清空,对于cache来说,当缓存的内容达到

其最大容量时,最少被访问的内容被清空。

 
释放不同高速缓存的方法是通过修改/proc文件系统相关参数,/proc是Linux虚拟文件系统,

通过对其进行读写操作实现与用户空间和内核空间的通信。即通过修改/proc中的内容,对当前kernel

的行为做出调整。内存缓存释放是通过调整/proc/sys/vm/drop_caches的值实现。

        具体规则如下:

              1)释放page cache

                     echo 1 > /proc/sys/vm/drop_caches
              2)是否VFS目录项和文件系统inodes
                     echo 2 > /proc/sys/vm/drop_caches
              3)释放 pagecache,VFS目录向和inodes
                   echo 3 > /proc/sys/vm/drop_caches
        其实在具体的应用中,不需要手动是否内存高速缓存,因为linux提供了相关机制来实现对这些高速
的最优控制,除非你看着不爽。其实查看实际的可以内存不是看free返回的第一行,而是看第二行,即
        -/+ buffers/cache:       3844      28332
        其中3844是实际已经使用的内存大小,28332是可用内存大小,前面的 -/+ buffers/cache是指:
        实际使用内存=used-buffers-cached
        实际可用内存=free+buffers-cached


已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐




详解Mysql安全配置

$
0
0

目录

1. 前言
2. Mysql账户权限安全
3. Mysql数据的网络安全配置
4. 密码策略安全
5. Mysql日志
6. Mysql数据库服务所在主机安全配置
7. 部署SQL注入检测、防御模块
8. mysqld安全相关启动选项
9. mysql备份策略

1. 前言

Mysql数据库安全配置、或者叫加固属于风险模型中的一环,它需要安全人员在理论和实践的学习中不断发现新的问题,并针对这些问题对数据的各个方面的配置进行强化。本文试图围绕着数据库风险识别、数据库安全加固这个问题,探讨可以采取的措施来最大程度的保证我们的数据库的安全控制处在一个较好的水平。 

2. Mysql账户权限安全

mysql中存在4个控制权限的表,分别为

1. mysql.USER表
2. mysql.DB表
3. mysql.TABLES_PRIV表
4. mysql.COLUMNS_PRIV表

要注意的是,Mysql中有一个数据库"information_schema",似乎里面保存的也是一些权限信息,但是要明白的是,这个数据库"information_schema"是为系统管理员提供元数据的一个简便方式,它实际上是一个视图,可以理解为对Mysql中的一个信息的封装,对于Mysql主程序来说,身份认证和授权的信息的来源只有一个,就是"mysql"。

http://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html

0×1. mysql.USER表

select * from USER;
desc USER;
mysql> desc USER;+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
| password_expired       | enum('N','Y')                     | NO   |     | N       |       |
+------------------------+-----------------------------------+------+-----+---------+-------+

0×2. mysql.DB表

select * from DB;
desc DB;
mysql> desc DB; +-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+

0×3. mysql.TABLES_PRIV表

select * from TABLES_PRIV;
desc TABLES_PRIV;
mysql> desc TABLES_PRIV;  
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             |
| Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| User        | char(16)                                                                                                                          | NO   | PRI |                   |                             |
| Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             |
| Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv  | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO   |     |                   |                             |
| Column_priv | set('Select','Insert','Update','References')                                                                                      | NO   |     |                   |                             |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+

0×4. mysql.COLUMNS_PRIV表

select * from COLUMNS_PRIV;
desc COLUMNS_PRIV;
mysql> desc COLUMNS_PRIV;  +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                         | Null | Key | Default           | Extra                       |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                     | NO   | PRI |                   |                             |
| Db          | char(64)                                     | NO   | PRI |                   |                             |
| User        | char(16)                                     | NO   | PRI |                   |                             |
| Table_name  | char(64)                                     | NO   | PRI |                   |                             |
| Column_name | char(64)                                     | NO   | PRI |                   |                             |
| Timestamp   | timestamp                                    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO   |     |                   |                             |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+

以上是这4个表的基本结构,在我们进行数据库连接、登录的时候,mysql权限表的验证过程为:

1. 先从user表中的:    
    1) Host    
    2) User    
    3) Password
这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
2. 通过身份认证后,进行权限分配,按照:    
    1) user    
    2) db    
    3) tables_priv    
    4) columns_priv
的顺序进行验证。
即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv
如果全局权限表user对应的权限为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限
如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。逐级下降

用流程图表示如下:

了解了Mysql的账户权限原理和判断流程,我们接下来需要了解就是应该以怎样的方式去进行权限配置,才能达到所谓的"最小权限原则"呢?Mysql的账户权限优先级顺序是:

user->db->tables_priv->columns_pri

稍作思考,我们可以发现,这些表的作用本质上是一样的,区别就在于它们的作用域范围不同,从user到columns_pri逐级作用域范围降低,因此控制粒度也增大,它们的配置遵循"就近原则",即以优先级最低的那个为准,所以,我们在进行Mysql的账户权限安全配置的时候会发现"我们似乎在做很多重复性的工作"。但我们要明白的,Mysql的这种逐层次的权限配置体系为我们提供了一个细粒度的控制方法。所以我们的权限配置也应该按照这个顺序来有规划地进行。

0×1. USER表

权限

权限级别

权限说明

最佳安全实践: 网站使用账户是否给予

CREATE

数据库、表或索引

创建数据库、表或索引权限

建议给与,安装WEB系统时需要创建表

DROP

数据库或表

删除数据库或表权限

     建议给与

GRANT OPTION

数据库、表或保存的程序

赋予权限选项

      不建议给与

REFERENCES

数据库或表

      不建议给与

ALTER

更改表,比如添加字段、索引等

     建议给与

DELETE

删除数据权限

     建议给与

INDEX

索引权限

     建议给与

INSERT

插入权限

     建议给与

SELECT

查询权限

     建议给与

UPDATE

更新权限

     建议给与

CREATE VIEW

视图

创建视图权限

     建议给与

SHOW VIEW

视图

查看视图权限

     建议给与

ALTER ROUTINE

存储过程

更改存储过程权限

      不建议给与

CREATE ROUTINE

存储过程

创建存储过程权限

      不建议给与

EXECUTE

存储过程

执行存储过程权限

      不建议给与

FILE

服务器主机上的文件访问

文件访问权限

不建议给与,防止因为注入导致的隐私文件泄漏

CREATE TEMPORARY TABLES

服务器管理

创建临时表权限

不建议给与,防止借助临时表发动的二次注入

LOCK TABLES

服务器管理

锁表权限

      不建议给与

CREATE USER

服务器管理

创建用户权限

       不建议给与

PROCESS

服务器管理

查看进程权限

      不建议给与

RELOAD

服务器管理

执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限

       不建议给与

REPLICATION CLIENT

服务器管理

复制权限

      不建议给与

REPLICATION SLAVE

服务器管理

复制权限

      不建议给与

SHOW DATABASES

服务器管理

查看数据库列表权限

      不建议给与

SHUTDOWN

服务器管理

关闭数据库权限

      不建议给与

SUPER

服务器管理

执行kill线程权限

      不建议给与

从表格中可以看到,USER表主要针对数据库的账户进行粗粒度的权限控制,定义了"某人允许做什么事"。

0×2. DB表

权限

说明

网站使用账户是否给予

Select   

可对其下所有表进行查询

建议给予

Insert            

可对其下所有表进行插入

建议给予

Update               

可对其下所有表进行更新

建议给予

Delete                   

可对其下所有表进行删除

建议给予

Create                  

可在此数据库下创建表或者索引

建议给予

Drop                 

可删除此数据库,及此数据库下的表

不建议给予

Grant               

赋予权限选项

不建议给予

References             

未来MySQL特性的占位符

不建议给予

Index                

可对其下的所有表进行索引

建议给予

Alter                  

可对其下的所有表进行更改

建议给予

Create_tmp_table          

创建临时表

不建议给予

Lock_tables             

可对其下所有表进行锁定

不建议给予

Create_view              

可在此数据下创建视图

建议给予

Show_view             

可在此数据下查看视图

建议给予

Create_routine         

可在此数据下创建存储过程

不建议给予

Alter_routine        

可在此数据下更改存储过程

不建议给予

Execute         

可在此数据下执行存储过程

不建议给予

Event               

可在此数据下创建事件调度器

不建议给予

Trigger

可在此数据下创建触发器

不建议给予

DB表可以看成是USER表对权限控制的一个补充,一个更细粒度地、针对数据库库级别的权限控制。

同时,DB表也隐式包含了将账户限定在某个数据库的范围内这个配置,即限制某个用户只能用对它自己的数据库的控制权,对不属于它的数据库禁止操作,这能有效防止横向越权的发生。

mysql> select host,db,user from db;
+------+---------+------+
| host | db      | user |
+------+---------+------+
| %    | test    |      |
| %    | test\_% |      |
+------+---------+------+

可以看到,user字段为空,表示当前不对用户做任何数据库属权限制,在网站的部署过程中,应该单独针对网站建立一个账户一个独立的数据库,并为这个账户分配唯一的专属数据库,防止网络被入侵后的横向、纵向提权。

对于Mysql中的账户权限相关的安全配置,总结如下:

1. 针对每个网站建立一个单独的账户
2. 为每个网站单独建立一个专属数据库(虽然DEDE、DZ普通采用表前缀的方法来实现"一库多站",但好的做法还是"一库一站") 
3. 按照user->db->tables_priv->columns_pri的顺序进行细粒度的权限控制
4. 为每个用户单独配置一个专属数据库,保证当前用户的所有操作只能发生在它自己的数据库中,防止SQL注入发生后,黑客通过注入点访问到系统表

账户权限安全配置需要的常用命令 

1. 新建一个用户并给予相应数据库的权限
grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd';
grant all privileges on database.* to user@localhost identified by 'passwd';

2. 刷新权限
flush privileges;

3. 显示授权
show grants;

4. 移除授权
revoke delete on *.* from 'user'@'localhost';

5. 删除用户
drop user 'user'@'localhost';

6. 给用户改名
rename user 'jack'@'%' to 'jim'@'%';

7. 给用户改密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

3. Mysql数据的网络安全配置

对数据库所在的DMZ的网络拓朴的安全配置也是我们在进行安全评估的时候需要考虑的一个方面,这对防御内网扫描、网络攻击有一定帮助。

0×1: 限制访问Mysql端口的IP

对Mysql的访问IP的限制,可以从应用层和主机层来分别达到目的

1. 主机层:    
    1) windows可以通过windows防火墙    
    2) Linux下可以通过iptables
来限制允许访问mysql端口的IP地址
//只允许指定的IP进行访问
iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT
..
iptables -P INPUT DROP

可以看到,这种方法的缺点是硬编码导致灵活性低,如果mysql的默认端口3306被修改了(例如8890),则这条iptables规则也需要相应的修改

mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| .         | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| ::        | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| localhost |      |                                           |
+-----------+------+-------------------------------------------+

这几行记录表明了root这个账户只能是本机登录,在部署的过程中,我们可以为指定账户添加某个安全的跳板机,并保证这个跳板机IP是不变的。

0×2: 修改mysql的端口
windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现。

port     = 3306

对mysql端口的修改可以从一定程度上防止端口扫描工具的扫描。

0×3: 限制连接用户的数量
数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,设置my.cnf 文件的mysqld中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。

#vi /etc/my.cnf
[mysqld]
max_user_connections 2

4. 密码策略安全

这里所谓的密文策略安全包括Mysql自身的账户密码的安全、也包括网站用户的密码安全。

0×1: mysql账户密码

因为mysql本身没有抗穷举的帐号锁定机制,所以对于mysql自身的登录帐号,尤其是root帐号,需要遵循"密码强度策略"设置高强度的密码,保证攻击者从穷举帐号攻击这条路无法获得合适的投资收益比。

0×2: 网站用户的密码

数据库管理员无法规定用户的网站使用什么样的密码策略,这完全取决于用户自己的编码习惯、或者说是站长所使用的CMS的编码习惯。这方面,mysql无法做的更多,但也许可以做的是建立一个针对网站密码穷举、脱库攻击的日志追溯系统,当发生脱库攻击时能第一时间给用户提供"事发现场"的更多信息。或者数据库管理员主动进行可控的撞库测试,提前帮助用户发生潜在的撞库、脱库风险。

5. Mysql日志

启动Mysql的日志不仅可以为我们提供性能热点的分析,还可以帮助我们加固Mysql数据库的安全,例如:

1. 从日志中获得典型SQL注入语句
2. 利用正则模型从日志中捕获注入攻击的发生
3. 在脱库、数据泄漏之后获得关于受攻击数据库的情况、泄漏范围等数据

mysql有以下几种日志,它们都在my.ini中进行配置:

1. 错误日志:-log-err
log-error=E:/wamp/logs/mysql_error.log

2. 查询日志(记录所有SQL语句):-log 
log=E:/wamp/logs/mysql.log

3. 慢查询日志:-log-slow-queries 
    1) 查看慢查询时间
    show variables like "long_query_time";默认10s   
    2) 查看慢查询配置情况
    show status like "%slow_queries%";    
    3) 查看慢查询日志路径
    show variables like "%slow%";
//存储位置、长SQL的阈值
E:\wamp\bin\mysql\mysql5.6.12\data\LittleHann-PC-slow.log
long_query_time=5

4. 更新日志:-log-update 

5. 二进制日志:-log-bin//记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件log-bin=E:/wamp/logs/bin

查看日志开启情况:

show variables like 'log_%'; 
+----------------------------------------+----------------------------------------------------+
| Variable_name                          | Value                                              |
+----------------------------------------+----------------------------------------------------+
| log_bin                                | ON                                                 |
| log_bin_basename                       | E:\wamp\bin\mysql\mysql5.6.12\data\mysql-bin       |
| log_bin_index                          | E:\wamp\bin\mysql\mysql5.6.12\data\mysql-bin.index |
| log_bin_trust_function_creators        | OFF                                                |
| log_bin_use_v1_row_events              | OFF                                                |
| log_error                              | E:\wamp\logs\mysql.log                             |
| log_output                             | FILE                                               |
| log_queries_not_using_indexes          | OFF                                                |
| log_slave_updates                      | OFF                                                |
| log_slow_admin_statements              | OFF                                                |
| log_slow_slave_statements              | OFF                                                |
| log_throttle_queries_not_using_indexes | 0                                                  |
| log_warnings                           | 1                                                  |
+----------------------------------------+----------------------------------------------------+

6. Mysql数据库服务所在主机安全配置

安全问题是一个综合的纵深问题,Mysql的安全配置和所在系统(*iux、windows)的安全配置密切相关。

0×1: mysql进程运行账号
所谓"mysql进程运行账户",即以什么样的身份权限来启动mysqld这个服务进程的。对于操作系统来说,每一个进程都有一个对应的"进程运行帐号",这个进程运行帐号决定了这个应用程序可以获得哪些操作系统的权限。

1. 在windows下禁止使用local system(nt authority\system)来运行mysql账户,可以考虑使用network service或者自己新建一个windows账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限

2. 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。

0×2: mysql运行账号的磁盘权限
对mysql运行帐号的磁盘权限的配置,就是在进行ACL的配置(文件夹右键->属性->安全),对于ACL的配置,我们需要牢记的是"默认禁止原则",即操作系统会默认对没有明确指示的权限设定为禁止,即假如你给一个用户授予了某个文件夹的读权限,那么它只有读权限,而不会拥有写权限(权限继承不考虑在内)。
对于mysql运行张厚啊的磁盘ACL配置,我们可以遵循以下原则

1. mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限,保证mysql的正常运行

2. 不容许给予其他目录的写入和执行权限,特别是有网站的,这可以有效防御针对mysql的提权、或者webshell提权    
    1) udf提权    
    2) 系统关键目录、注册表写入启动文件 

3. 取消mysql运行账户对于cmd,sh等一些程序的执行权限,这可以防御当mysql核心帐号被黑客获取后进一步提权    
    1) root账户被泄露
    由于对cmd、sh等关键程序进行了权限控制,黑客无法继续深入操作系统提权

0×3: Chrooting
Chroot是Unix/类Unix的一种手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。

0×4: 删除历史命令记录
历史命令记录是一种测信道数据泄漏,从某种程序上来说,"历史命令记录"就像种植在系统上的一个键盘记录rootkit,如果黑客获取到了目标服务器的webshell,就可以通过阅读"历史命令记录"来获取到大量的管理员操作记录,包括帐号和密码。
这些历史文件包括:

1. ~/.bash_history
2. ~/.mysql_history 
.. 
cat /dev/null > ~/.bash_history
cat /dev/null > ~/.mysql_history

0×5: mysql.sock安全配置
默认情况下,PHP支持使用socket方式和msyql数据库进行通信,换句话来说,这也意味着,在服务器本机可以允许无密码直接登录mysql,请看下面的一段实例代码:

<?php
        ini_set("mysql.default_socket = /var/lib/mysql/mysql.sock"); 

        $sql = "select user();";
        $res = mysql_query($sql);
        $final = mysql_fetch_array($res);
        die(var_dump($final)); 
?>

执行成功,result:

array(2) { [0]=> string(16) "apache@localhost" ["user()"]=> string(16) "apache@localhost" }

这意味着黑客在获取了目标服务器的webshell之后,可以在不知道mysql帐号密码的情况下直接从数据库中获取隐私数据。

防御的方法还是一样,针对mysql程序帐号进行磁盘ACL控制,防止mysql越权读/写/执行非mysql目录下的文件。

7. 部署SQL注入检测、防御模块

根据OWASP2013的报告显示,针对数据库的攻击方式,SQL注入依然是主要的因素,因此针对SQL Injection的攻击,除了针对应用层的代码安全审计、SDLC之外,在数据库层部署数据库防火墙也应该作为纵深防御的一个手段。

目前基于SQL注入检测、防御的的数据库防火墙大概有以下几个:

1. 安华金和数据库防火墙系统(Xsecure-DBFirewall)
2. Snort入侵检测系统
能针对指定端口进行正则特征匹配方式的SQL注入检测
3. Java/J2EE 过滤器
对于J2ee的WEB应用来说,可以在HTTP请求上部署过滤器,并将SQL注入检测规律写在过滤器中
4. druid-sql-wall开源SQL检测、阻断系统

8. mysqld安全相关启动选项

1. --local-infile[={0|1}]
如果用–local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句,防止基于注入的直接文件读取数据泄漏

2. --old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。

3. (OBSOLETE) –safe-show-database    
    1) 在MySQL 5.1以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名    
    2) 在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。

4. --safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO &#039;user_name&#039;@&#039;host_name’;这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。

5. --secure-auth
不允许鉴定有旧(pre-4.1)密码的账户。

6. --skip-grant-tables
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力,这个选项常常在发生了忘记了msyql密码的情况使用这个方式在本机"无密码登录mysql"通过执行mysqladmin flush-privileges或mysqladmin eload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。

7. --skip-name-resolve
主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost

8. --skip-networking
在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行

9. --skip-show-database
使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。

9. mysql备份策略

像mysql、sqlserver、access这种数据库都是将数据以单独文件的形式保存在磁盘上的,所以,对于数据库的备份也可以采用传统的文件备份策略。总的来说,有以下方式:

1. 本地备份
使用mysqldump进行备份非常简单,在备份数据库的时候,我们还可以同时使用管道gzip命令对备份文件进行压缩,可以采用Rsync的异地备份方式方式,将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包后,通过crontab定时备份数据:
备份数据使用命令:
#!/bin/sh
time=`date +"("%F")"%R`
$/usr/local/mysql/bin/mysqldump -u root -p111 database_backup | gzip > /home/zhenghan/mysql/mysql_backup.$time.gz
# crontab -l
# m h  dom mon dow   command00 00 * * * /home/zhenghan/mysql/backup.sh
恢复数据使用命令:
gzip -d mysql_backup.\(2014-06-17\)00\:00.gz
mysql_backup.(2014-06-17)00:00#mysql –u root -p111 < /home/zhenghan/mysql/mysql_backup.\(2014-06-17\)00\:00

2. 网络备份

3. MySQL本身自带的mysqldump备份
使用mysqldump可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(schema)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。

4. 直接复制数据库文件的备份形式
直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行以下SQL语句:FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。


相关学习资料

http://drops.wooyun.org/tips/2245

http://www.cnblogs.com/siqi/archive/2012/11/21/2780966.html

http://hi.baidu.com/liveinyc/item/08d5e71cfb2872416926bb84

http://blog.chinaunix.net/uid-16728139-id-3683449.html

http://linux.chinaunix.net/techdoc/database/2008/01/14/976546.shtml

http://www.cnblogs.com/yuwensong/archive/2013/03/26/2981965.html

http://hi.baidu.com/xmflycat/item/7567e3c37c43ba57bcef6951

http://www.jb51.net/article/30319.htmhttp://hi.baidu.com/schyman/item/cd0884f5cb85af49922af2b8  

android 图片解码显示流程

$
0
0

问题来源

android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一帧图像,然而 android 其实是可以显示 gif 动画的,在浏览器里打开 gif 动画,就能够正常加载显示。

Gallery 查看图片

gallery 实现了 Gallery/src/com/android/camera/ViewImage.java   
                        ImageViewTouchBase newView =
                                mSlideShowImageViews[mSlideShowImageCurrent];
                        newView.setVisibility(View.VISIBLE);
                        newView.setImageRotateBitmapResetBase(bitmap, true);
                        newView.bringToFront();

通过自己实现的  ImageViewTouchBase 装载图片并显示

ImageViewTouchBase 继承自 framework 的 ImageView
package com.android.camera;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.ImageView;

abstract class ImageViewTouchBase extends ImageView {

framework 处理图片

ImageView 是 android 图片框架实现通用图片处理显示类:
可以显示 resource 里面的图片,
    public void setImageResource(int resId) {
        if (mUri != null || mResource != resId) {
            updateDrawable(null);
            mResource = resId;
            mUri = null;

            final int oldWidth = mDrawableWidth;
            final int oldHeight = mDrawableHeight;

            resolveUri();

            if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
                requestLayout();
            }
            invalidate();
        }
    }

我们在 gallery 里面打开的图片调用是通过 uri 传过来的,
    public void setImageURI(Uri uri) {
        if (mResource != 0 ||
                (mUri != uri &&
                 (uri == null || mUri == null || !uri.equals(mUri)))) {
            updateDrawable(null);
            mResource = 0;
            mUri = uri;

            final int oldWidth = mDrawableWidth;
            final int oldHeight = mDrawableHeight;

            resolveUri();

            if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
                requestLayout();
            }
            invalidate();
        }
    }

android 会解析 uri 得到目标文件路径
        } else if (mUri != null) {
            String scheme = mUri.getScheme();
            if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
                try {
                    // Load drawable through Resources, to get the source density information
                    ContentResolver.OpenResourceIdResult r =
                            mContext.getContentResolver().getResourceId(mUri);
                    d = r.r.getDrawable(r.id);
                } catch (Exception e) {
                    Log.w("ImageView", "Unable to open content: " + mUri, e);
                }
            } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)
                    || ContentResolver.SCHEME_FILE.equals(scheme)) {
                InputStream stream = null;
                try {
                    stream = mContext.getContentResolver().openInputStream(mUri);
                    d = Drawable.createFromStream(stream, null);
                } catch (Exception e) {
                    Log.w("ImageView", "Unable to open content: " + mUri, e);
                } finally {
                    if (stream != null) {
                        try {
                            stream.close();
                        } catch (IOException e) {
                            Log.w("ImageView", "Unable to close content: " + mUri, e);
                        }
                    }
                }
        } else {
                d = Drawable.createFromPath(mUri.toString());
            }

我们点击 gallery 的图片会产生包含 content 的 uri:
I/ActivityManager( 1304): START u0 {dat= content://media/external/images/media/21 cmp=com.android.gallery/com.android.camera.ViewImage (has extras)} from pid 1706

然后通过 Drawable 从 inputstream 里面解析创建 Drawable 对象
    public static Drawable createFromStream(InputStream is, String srcName) {
        Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
        try {
            return createFromResourceStream(null, null, is, srcName, null);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
        }
    }

后面的流程就是交给 skia 解析然后获得一个 bitmap 并返回了。 skia 的 decode 可以自动识别 steam 里面的数据流创建相应的 decoder。

问题答案

framework 是通用的图片显示处理,最后只返回了一个 bitmap ,所以 gif 只能处理第一帧图像了,但是 browser 是从新实现了图像显示接口,有专门针对 gif 的显示处理,所以可以显示动画。


作者:jingxia2008 发表于2014-6-19 15:04:25 原文链接
阅读:0 评论:0 查看评论

【spring】springmvc接收请求参数的方法

$
0
0
     控制器的请求处理方法的签名可以将任何事物作为参数,我们可以将HttpServletRequest、HttpServletResponse、 String或者数字参数传递进来,这些参数可以对应请求中的查询参数、cookie值、HTTP请求头的值或其他一些可能的选项。

     下面一些例子来说明
  1. 使用@RequestParam绑定请求参数值
    @RequestMapping(value="/method1")  
        public String method1(  
                @RequestParam(value="userName",required = false) String userName,  
                @RequestParam("pwd") String pwd){  
            return "methodSignature";  
        }
     

  2. 使用@CookieValue绑定请求中的Cookie值
    @RequestMapping(value="/method2")  
        public String method2(  
                @CookieValue(value="sessionId",required=false)String sessionId){  
            return "methodSignature";  
        } 
     

  3. 使用@RequestHeader绑定请求报文头的属性值
    @RequestMapping(value="/method3")  
        public String method3(  
                @RequestHeader("Accept-Encoding") String encoding,  
                @RequestHeader("Keep-Alive") long keepAlive){  
            return "methodSignature";  
        }
     

  4. 使用@PathVariabl获取路径中传递参数
    public ModelAndView helloWorld(
                  @PathVariable String id, 
                  @PathVariable String str) {  
            System.out.println(id);  
            System.out.println(str);  
            return new ModelAndView( " /helloWorld " );  
    }  
     

  5. 使用表单对象绑定请求参数值
    @RequestMapping(value="/method4")  
        public String method4(User user){  
            return "methodSignature";  
        } 
     
  6. 使用Servlet API对象作为入参
    • 同时使用HttpServletRequest、HttpServletResponse、HttpSession 
      @RequestMapping(value="method5")  
          public void method5(
                    HttpServletRequest request,
                    HttpServletResponse response,
                    HttpSession session){  
              String userName = WebUtils.findParameterValue(request, "userName");  
              response.addCookie(new Cookie("userName",userName));  
          }
       
    • 使用Servlet原生API接口,如WebRequest和NativeWebRequest等 
      @RequestMapping(value="method6")  
          public String method6(WebRequest request){  
              String userName = request.getParameter("userName");  
              return "methodSignature";  
          } 
       
    • 使用IO对象作为入参 
      如java.io.InputStream/java.io.Reader 及java.io.OutputStream/java.io.Writer 
      @RequestMapping(value="method7")  
          public void method7(OutputStream os) throws IOException{  
              Resource res = new ClassPathResource("/image.jpg");//读取类路径下的图片文件  
              FileCopyUtils.copy(res.getInputStream(), os);  
          }  
       
    • 使用其他类型的参数
      java.util.Locale/java.security.Principal
      也可以通过Servlet的HttpServletRequest的getLocale()及getUserPrincipal()  
      @RequestMapping(value="method8")
      public String method8(Locale locale,Principal principal){  
              return "methodSignature";  
          }  
       
      以上转自 :http://blog.csdn.net/jingyuan_/article/details/9465415
                        http://blog.csdn.net/yaerfeng/article/details/23658391



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



常用推荐算法

$
0
0

 

       在推荐系统简介中,我们给出了推荐系统的一般框架。很明显,推荐方法是整个推荐系统中最核心、最关键的部分,很大程度上决定了推荐系统性能的优劣。目前,主要的推荐方法包括:基于内容推荐、协同过滤推荐、基于关联规则推荐、基于效用推荐、基于知识推荐和组合推荐。

一、基于内容推荐

基 于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器学习的方法从关于内容的特征描述的事例中得到用户的兴趣资料。在基于内容的推荐系统中,项目或对象是通过相关的特征的属性来定义,系统基于用户评价对象 的特征,学习用户的兴趣,考察用户资料与待预测项目的相匹配程度。用户的资料模型取决于所用学习方法,常用的有决策树、神经网络和基于向量的表示方法等。 基于内容的用户资料是需要有用户的历史数据,用户资料模型可能随着用户的偏好改变而发生变化。

基于内容推荐方法的优点是:
 1)不需要其它用户的数据,没有冷开始问题和稀疏问题。
 2)能为具有特殊兴趣爱好的用户进行推荐。
 3)能推荐新的或不是很流行的项目,没有新项目问题。
 4)通过列出推荐项目的内容特征,可以解释为什么推荐那些项目。
 5)已有比较好的技术,如关于分类学习方面的技术已相当成熟。

缺点是要求内容能容易抽取成有意义的特征,要求特征内容有良好的结构性,并且用户的口味必须能够用内容特征形式来表达,不能显式地得到其它用户的判断情况。

二、协同过滤推荐

协 同过滤推荐(Collaborative Filtering Recommendation)技术是推荐系统中应用最早和最为成功的技术之一。它一般采用最近邻技术,利用用户的历史喜好信息计算用户之间的距离,然后 利用目标用户的最近邻居用户对商品评价的加权评价值来预测目标用户对特定商品的喜好程度,系统从而根据这一喜好程度来对目标用户进行推荐。协同过滤最大优 点是对推荐对象没有特殊的要求,能处理非结构化的复杂对象,如音乐、电影。

协 同过滤是基于这样的假设:为一用户找到他真正感兴趣的内容的好方法是首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用户。其基本 思想非常易于理解,在日常生活中,我们往往会利用好朋友的推荐来进行一些选择。协同过滤正是把这一思想运用到电子商务推荐系统中来,基于其他用户对某一内 容的评价来向目标用户进行推荐。

 基于协同过滤的推荐系统可以说是从用户的角度来进行相应推荐的,而且是自动的,即用户获得的推荐是系统从购买模式或浏览行为等隐式获得的,不需要用户努力地找到适合自己兴趣的推荐信息,如填写一些调查表格等。

 和基于内容的过滤方法相比,协同过滤具有如下的优点:
1) 能够过滤难以进行机器自动内容分析的信息,如艺术品,音乐等。
2) 共享其他人的经验,避免了内容分析的不完全和不精确,并且能够基于一些复杂的,难以表述的概念(如信息质量、个人品味)进行过滤。
3) 有推荐新信息的能力。可以发现内容上完全不相似的信息,用户对推荐信息的内容事先是预料不到的。这也是协同过滤和基于内容的过滤一个较大的差别,基于内容的过滤推荐很多都是用户本来就熟悉的内容,而协同过滤可以发现用户潜在的但自己尚未发现的兴趣偏好。
4) 能够有效的使用其他相似用户的反馈信息,较少用户的反馈量,加快个性化学习的速度。

虽然协同过滤作为一种典型的推荐技术有其相当的应用,但协同过滤仍有许多的问题需要解决。最典型的问题有稀疏问题(Sparsity)和可扩展问题(Scalability)。

三、基于关联规则推荐

基 于关联规则的推荐(Association Rule-based Recommendation)是以关联规则为基础,把已购商品作为规则头,规则体为推荐对象。关联规则挖掘可以发现不同商品在销售过程中的相关性,在零 售业中已经得到了成功的应用。管理规则就是在一个交易数据库中统计购买了商品集X的交易中有多大比例的交易同时购买了商品集Y,其直观的意义就是用户在购 买某些商品的时候有多大倾向去购买另外一些商品。比如购买牛奶的同时很多人会同时购买面包。

算法的第一步关联规则的发现最为关键且最耗时,是算法的瓶颈,但可以离线进行。其次,商品名称的同义性问题也是关联规则的一个难点。

四、基于效用推荐

基 于效用的推荐(Utility-based Recommendation)是建立在对用户使用项目的效用情况上计算的,其核心问题是怎么样为每一个用户去创建一个效用函数,因此,用户资料模型很大 程度上是由系统所采用的效用函数决定的。基于效用推荐的好处是它能把非产品的属性,如提供商的可靠性(Vendor Reliability)和产品的可得性(Product Availability)等考虑到效用计算中。

五、基于知识推荐

基 于知识的推荐(Knowledge-based Recommendation)在某种程度是可以看成是一种推理(Inference)技术,它不是建立在用户需要和偏好基础上推荐的。基于知识的方法因 它们所用的功能知识不同而有明显区别。效用知识(Functional Knowledge)是一种关于一个项目如何满足某一特定用户的知识,因此能解释需要和推荐的关系,所以用户资料可以是任何能支持推理的知识结构,它可以 是用户已经规范化的查询,也可以是一个更详细的用户需要的表示。

六、组合推荐

由 于各种推荐方法都有优缺点,所以在实际中,组合推荐(Hybrid Recommendation)经常被采用。研究和应用最多的是内容推荐和协同过滤推荐的组合。最简单的做法就是分别用基于内容的方法和协同过滤推荐方法 去产生一个推荐预测结果,然后用某方法组合其结果。尽管从理论上有很多种推荐组合方法,但在某一具体问题中并不见得都有效,组合推荐一个最重要原则就是通 过组合后要能避免或弥补各自推荐技术的弱点。

在组合方式上,有研究人员提出了七种组合思路:
1)加权(Weight):加权多种推荐技术结果。
2)变换(Switch):根据问题背景和实际情况或要求决定变换采用不同的推荐技术。
3)混合(Mixed):同时采用多种推荐技术给出多种推荐结果为用户提供参考。
4)特征组合(Feature combination):组合来自不同推荐数据源的特征被另一种推荐算法所采用。
5)层叠(Cascade):先用一种推荐技术产生一种粗糙的推荐结果,第二种推荐技术在此推荐结果的基础上进一步作出更精确的推荐。
6)特征扩充(Feature augmentation):一种技术产生附加的特征信息嵌入到另一种推荐技术的特征输入中。
7)元级别(Meta-level):用一种推荐方法产生的模型作为另一种推荐方法的输入。

 七、主要推荐方法的对比

各种推荐方法都有其各自的优点和缺点,见表1。

 

表1 主要推荐方法对比
推荐方法
优点
缺点
基于内容推荐
推荐结果直观,容易解释;
不需要领域知识
稀疏问题;新用户问题;
复杂属性不好处理;
要有足够数据构造分类器
协同过滤推荐
新异兴趣发现、不需要领域知识;
随着时间推移性能提高;
推荐个性化、自动化程度高;
能处理复杂的非结构化对象
稀疏问题;
可扩展性问题;
新用户问题;
质量取决于历史数据集;
系统开始时推荐质量差;
基于规则推荐
能发现新兴趣点;
不要领域知识
规则抽取难、耗时;
产品名同义性问题;
个性化程度低;
基于效用推荐
无冷开始和稀疏问题;
对用户偏好变化敏感;
能考虑非产品特性
用户必须输入效用函数;
推荐是静态的,灵活性差;
属性重叠问题;
基于知识推荐
能把用户需求映射到产品上;
能考虑非产品属性
知识难获得;
推荐是静态的


已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



检查表单输入域的值是否发生变化

$
0
0

场景:
一个form表单中,有很多个输入域,在编辑页面,如果用户没有对输入域的值进行修改,则用户点击保存时,提示表单内容未更改,无需提交保存

 

实现:
//设置一js变量;
var needSave = false;
//为所有输入域绑定change事件
$("input[type='text']").change( function() {
alert(this.name+"值改变了!");
  needSave = true;
});
//执行保存时
if(needSave){
//执行保存
}else{
alert("表单内容未发生改变,无需提交保存!");
}



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



解决Android SDK Manager 更新、下载慢以及待安装包列表不显示

$
0
0

问题描述:

    Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示

 

解决方法:

第一步:修改hosts文件

修改后的hosts 文件内容为:

 

复制代码
127.0.0.1 localhost
#Google主页
203.208.46.146 www.google.com
#这行是为了方便打开Android开发官网 现在好像不VPN也可以打开
74.125.113.121 developer.android.com
#更新的内容从以下地址下载
203.208.46.146 dl.google.com
203.208.46.146 dl-ssl.google.com
****************************************
复制代码

 

如图:

 

第二步、在Android SDK Manager的Tool->Option选项中把https的资源获取方式强制换成http协议获取的方式。如图:



已有 0人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



广告商12招隐秘销售技巧

$
0
0

译者: ECHO98原文地址: wired.com

每当你从啤酒货架旁走过,喜力便在和你玩视觉游戏。下次你在百威和荷兰啤酒之间犹豫不决时, 那就花点时间看看后者的商标吧。起初你可能发现不了什么特别之处,但和其他字母比较过后,你会发现喜力(Heineken)中的三个英文字母“e” 略微向后倾斜,底部弯曲,像咧着无牙的嘴巴冲着你笑。“本来打印字体冷冰冰的毫无人情味,但把字母e稍微移动一下,就给人在微笑的感觉,”马克·安德鲁斯说。他是阿姆斯特丹一名创意总监和心理学家。“而且这在人和品牌之间建立了一种完全不同的关系。”

这是一个欢乐、奇特的人文商标,喜力希望该标志能促使人们在一堆啤酒品牌中选择他们家的啤酒。该品牌的策略很微妙。以至于你可能都没有特别在意过,而这正是其关键所在。现如今,身边各色各样的视觉提醒,诱使我们买这个或刺激我们做那个,而大多数时候我们却对此浑然不觉。

01_-Heineken

在他的新书《隐秘的劝说》( Hidden Persuasion)里,安德鲁斯和社会心理学家马泰斯·范 ·莱欧文和里克·巴伦探索了33条广告商在兜售其产品时采用的最隐秘的策略。如安德鲁斯所称的,这些隐秘的劝说,是广告效率背后的驱动力量,而且它们比人们想象的更常见。


“人们认为大多数时候他们所做的决定和选择是清醒而理性的,符合他们的意愿、利益和动机,”安德鲁斯解释道。“事实上,在日常生活中我们大部分的决策都是在一种无意识的层面上做出来的,这就意味着我们很容易向那些在我们无意识层面产生影响的劝说企图缴械投降。”

这些隐秘的劝说,是广告背后的一股驱动力量,而且它们远比你想象的更常见。

我们人类需要各种各样的东西。有些是无形的,如:安全、健康、融入社会的愿望。其他的便是实物,如:闪耀的汽车、鞋子、汉堡包。广告商的工作便是确保我们会买这些东西,并寻找最佳销售策略。利用人们天性中的弱点,广告商有很多方法来控制我们的行为。详见下文,以及在上面的幻灯片中展示的一些最有效的技巧。

拟人化

我们所举的喜力例子便是运用拟人化方法销售商品的实例。其中的思路很简单:产品越趋人物化,我们感觉到与它的联系就越多。人们在接触到类似于毯子、比基尼和卡通人物等事物时,趋向于在一开始便将其拟人化。

“我们往往将自己的想法和感情添加到产品中去,想象着我们的体验感受,”安德鲁斯解释道。这反过来会让我们移情于啤酒瓶或清洁产品等类似物品。“我们越喜欢广告中的产品,对其产生“感觉”,我们就越有可能与之建立联系,从而购买该产品。”

可信度

你看到的每一条广告中出现的面孔都是基于众多标准精心挑选出来的。其中一个标准便是,,面孔的可信度。人们凭借自己所见不自觉地对事物做出判断,结果是有些人看起来比其他人更值得信赖。除了一些明显的体征,比如一副令人毛骨悚然的胡子,像脸部的宽高比(两侧颧骨边缘的间距和上嘴唇与眉毛间距比)也能引导人们对该人的可信度做出判断。脸型较长的人被认为比脸宽的人更可靠,正如人们认为拥有棕色眼睛的人比蓝色眼睛的人更可靠。

Trustworthy_02

稀缺性

如果你曾在Kayak上订过机票,你肯定看过这样的小提醒说“这个价格的票只剩1张了!” 对于同样的产品,因害怕要支付更高价格或缺货会促使你迅速下单买票。

其实,这种担心错过的恐惧也延伸到买东西上了。安德鲁斯说,这部分归因于深植于我们思想中的观念,即昂贵的东西往往稀缺(如黄金、钻石)。稀缺性也暗示着别人也喜欢这个产品(图例:你好,社会证据)。安德鲁斯写道,稀缺技巧十分管用的最后一个原因是,它提醒我们:自由选择的机会很快就会消失了。

社会证据

astroturfing Inner-pages_spreads-52 copy


广告商可使用的最有效的策略之一是利用人们缺乏社会安全感。这很说得过去:我们看过的医生、选择的发型师、吃饭的餐厅等大多数都是朋友推荐的,而我们也更有可能买那些获得我们知道的或者崇拜的人认可的产品。

“产品获得的认可越多,我们也越可能喜欢上它,” 安德鲁斯说。看看脸谱及其滚雪球似得“点赞”效应。即使只是一些简单说说,如“十有八九人们选择泰德”或“多数人喜欢万德面包”,却会出乎意料地影响大众行为,安德鲁斯补充道。对个人也是如此。

认可抗拒

让你买东西的最好方法是让你相信你不必非得买它。广告商已经掌握了这门逆反心理艺术,并使其为己所用。事实上,没人喜欢被告知该做什么。“没人喜欢被人劝说的感觉,” 安德鲁斯解释道。这也是为什么广告商会试图让你相信,你还有其他的选择。透明度、或一个品牌承认其自身缺点是他们采取的方法之一。另一种就便是像这样说:“你可以选择其他真空吸尘器”或者“我知道你可能对此有异议,但是。。。。。。”通过迎合消费者不想被劝说的心理,事实上广告商正在说服你喜欢他们的品牌。

《隐秘的劝说》现已出版。亚马逊上只剩下一本了。开个玩笑。


使用DNSCrypt解决DNS污染问题

$
0
0

  DNSCrypt是OpenDNS发布的加密DNS工具,可加密DNS流量,阻止常见的DNS攻击,如重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。DNSCrypt支持Mac OS和Windows,是防止DNS污染的绝佳工具。

  DNSCrypt使用类似于SSL的加密连接向DNS服务器拉取解析,所以能够有效对抗DNS劫持、DNS污染以及中间人攻击。

  DNSCrypt的Windows客户端版运行后,会自动在状态栏显示服务状态,并自动修改DNS服务器地址为127.0.0.1,通过本地加密的方式安全连接OpenDNS,这样,本地所有的DNS请求都会加密进行从而绕过DNS污染,最终顺利解析到正确IP地址,根据我的测试,这个工具可以一劳永逸地解决所有DNS污染问题,包括此次 针对Dropbox的DNS污染

使用DNSCrypt解决DNS污染问题

  DNSCrypt官方介绍页面: http://www.opendns.com/about/innovations/dnscrypt/

  DNSCrypt下载地址: http://shared.opendns.com/dnscrypt/packages/windows-client/DNSCryptWin-v0.0.6.exe

  DNSCrypt MAC版源码Windows版源码

评论《使用DNSCrypt解决DNS污染问题》的内容...

相关文章:


微博: 新浪微博 - 微信公众号:williamlonginfo
月光博客投稿信箱:williamlong.info(at)gmail.com
Created by William Long www.williamlong.info

网页设计的关键!版式设计之图版率

$
0
0

sissi:在页面设计中,除了文字之外,通常都会加入图片或是插图等视觉直观性的内容。表示这些视觉要素所占面积与整体页面的之间比率的就是图版率。简单说来,图版率就是页面中图片面积的所占比。这种文字和图片所占的比率,对于页面的整体效果和其内容的易读性会产生巨大的影响。

文章参考自《版面设计的原理》 《版式设计原理》,更多好书,戳: 《设计师图书导航》

图版率高低的区别:同样的设计风格下,图版率高的页面会给人以热闹而活跃的感觉,反之图版率低的页面则会传达出沉稳、安静的效果。提高图版率可以活跃版面,优化版面的视觉度。但完全没有文字的版面也会显得空洞,反而会削弱版面的视觉度。

580-580-1.jpg

如果页面的整体全部都是图片的时候,图版率就是100%。反之如果页面全是文字,图版率就是0%。

580-2.jpg

有时在没有图像素材的情况下,但因为页面性质的需要,页面又需要呈现出图版率高的效果。那么,该如何进行设计呢?

一. 通过对页面底色的调整,取得与提高图版率相似的效果,从而改变页面所呈现出来的视觉效果。

3.jpg

580-4.png

二.如果素材图像尺寸小,却不想让图版率变低。可以通过色块(相近色或是互补色)的延伸或是图像的重复来组织页面结构,避免这种素材资源不足的情况。

采用和图片相同大小的色块可以保持界面的统一性与简洁性,而且这样的排版会造成一种错觉,使用户觉得有底色的方框整体视乎是一张图片。而原本小尺寸的素材图在背景色的映衬下也似乎变成了一张很大的图。这种重复排列、添加变化的方法有效地避免了页面的单调和无趣。

580-5.jpg

580-6.jpg
580-7.jpg

三.版式的强节奏设计也能间接优化页面的图版率

合理的利用排版的节奏感以及跳跃率(文字和图片的跳跃率,是指版面中最大标题和最大的图与最小正文字体和图片大小之间的比率)。在版面设计中,图片或是文字的跳跃率可以获得较高的注意力,让无趣的版面充满活力。另外,排版层次丰富,也可以区分文章主次信息,让浏览更加轻松,并且提高版面的视觉度。

580-8.jpg

580-9.jpg
580-580-10.png

四.增加页面中的图形也可以改善图版率低的问题

无论是数字、序号、角标、图标,甚至是视觉处理后的标题文字,都能提高页面的视觉度,并给用户留下活跃生动的印象。同时,图形作为一种更直观的传达信息的方式,也使人一眼就能快速获取信息,从效率上优于用 文字表达时的逐行扫描。

图标

图标的设计让浏览和交互操作更加方便。图与文的搭配可以降低阅读的疲劳感,也增强了排版的设计节奏感。

580-580-11.jpg

580-580-12.jpg

580-580-13.png

数字

对数字的视觉处理也能起到类似插图的装饰效果,成为页面上的视觉要素,同时增强页面的设计感。

14.jpg

580-580-15.png

序号

页面中的序号既有引导阅读顺序的功能,也可以作为图片起到页面的装饰作用。另外,通过对序号的突出设计,可以让布局更清晰灵活。即便是毫无规律的排版,也可以通过清晰的序号找准阅读的轨迹。

16.jpg

580-580-17.png

标题文字的处理

如果页面中没有图片和插图,那么通过对文字及其颜色的处理,也可以使之起到与视觉要素相近的作用。下面的例子中,对于标题文字都进行了视觉加工,起到了整体页面的装饰效果。借助对这种文字大小、颜色、形状的灵活运用,来突出页面的重点,避免视觉上的单调感。

580-580-18.png

580-580-19.jpg

文章参考:《版面设计的原理》 《版式设计原理》

原文地址: isux.tencent

免费软件如何赚钱?

$
0
0

        近来,有朋友问我,免费软件是如何赚钱,例如超级课程表这类的,当时,我也没讲清楚,因为我发现其实我也不是那么清晰的知道,所以我特意关注了这个问题,最后得到了如下结果。

 免费软件想挣钱首先要有以下几个前提:

1、稳定的用户数或是增长;
2、有独特的软件理念或是想法;
3、用户的受众范围广;
4、不是流氓软件。
其实上面几点归纳一下就是只要是用户认可的软件就没有问题;

再说如何赚钱:
1、通过免费软件自身打造品牌,通过品牌效应来完成市场的推广;(也就是免费软件有名后,自然会有用户出钱让你定制或是开发软件)
2、通过软件市场占有率来可引广告商的赞助;
3、通过资本运作将产品作为核心,成立公司,扩充市场份额,进行商业化运作;
4、可引投资进行战略投资,完成第一桶金的积累,然后规划产品的未来及走向;
5、被行业领导企业进行收购或是并购,到时候考虑的只是谈判的技巧问题;
6、建立创业团队,对产品进行运营,并且可以开拓更多的商业化产品。


作者:u010359885 发表于2014-6-19 21:58:28 原文链接
阅读:99 评论:0 查看评论

什么吃掉了你的执行力?在浮躁中求解

$
0
0

编者按:“职责越多,执行力越弱?”本文作者为移动创作及阅读应用“ 汤圆”市场部钱婧(微信:gracetiantang),她通过书写来理清思绪,或许不失为好的方法。

执行力也是一个颇具争议的名词,几路观点各执一词,有说执行力差是执行者的能力问题,也有说执行力差是管理者目标不明确导致。

之所以开这个话题,是因为我正直面日渐减弱的执行力这个伤脑筋的问题。按说曾经是个强执行力的人,为什么反而在工作了五、六年后变的如此浮躁。为此翻来覆去一整夜,分析原因,寻求解决方法。

其实解决“执行力减弱”问题的过程,也是一个对自己执行力的考验。

通过单一路径完成单一目标时,执行力爆棚

回顾自己几个执行力超强的时期,刚毕业时一家公司转了几个岗,初入时做编辑,工作任务很明确——写稿子。一天三篇,写完发给主管审,有些会被打回修改。

然后转做市场,目标也很简单——签合同。顶着烈日扫街,一家家商户陌拜,说明资源,拿到折扣,留下合同,搞定。那时候还没有团购,没有LBS,没有O2O,商户还挺好搞定。一个下午扫掉一条街拿下半数也不难,边玩儿着边把工作干了。

再然后执行落地活动,大规模的高尔夫球赛,明星和慈善,富豪和赞助商,忙忙碌碌一个月协调各方面关系事无巨细连晚会主持人吃什么都折腾到位。完全摸着石头过河,目的也很明确,把活动不出纰漏的做完。

在运营商做全网线上活动的时候,上级安排好项目,预算,大概方式。出方案协调合作方做设计做网页搞定技术开发再到活动的总结,这么反复循环做了一年,从一开始手忙脚乱常加班到半夜,到临离职前游刃有余基本和加班说再见。目标是:活动按时上下线,争取多些内外宣传资源,数据做好看了最好,不好看也没什么关系。

在经历这些工作的时候,get一堆乱七八糟的技能。文能提笔写文案,武能带队自驾游,逼到没法子还能打开PS做个简单设计,客串主持做个礼仪小姐神马的跟万精油似的哪缺了就上哪儿补位去。虽然偶有创造性的点子和与人周旋的技巧,但大多数时是在心无旁贷按照一套或别人规定或自己摸索的流程在走,写方案,协调内外部,自行解决困难或找到对的人寻求帮助。

那三年大量琐碎或重复的执行工作,算是一个强执行的人。归结原因几点:

1、目标单一:完成一场活动,上线一个页面,签署一个合同,写好一篇稿子。

2、执行路径明朗:各公司自有流程,遵循内部规则,解决外部突发情况,顺着轨迹走,用心点基本没问题。

3、用脑子工作:沟通技巧和寻求问题解决方法的技巧,是看一个人是否具备自我成长能力的关键。死磕不一定就有效果,有时候遇上南墙换一条路走更好。找到对的人点播两句比自己想破脑袋的用处要大。

4、领导的指示明确:回答只有行或者不行,哪里不行,应该怎么改。对或者不对,哪里不对,为什么不对。没有出现过:我也知道哪儿不好,但是就是觉得不够好。这样的说辞。

职责越多,执行力越弱

再后来有机会进入创业团队,一人顶着数个职能辗转穿梭。和媒体讲故事做PR,和渠道做关系拿资源,和同行打交道谈合作,还兼着社会化媒体的运营,投资人关系,客服运营等各种琐事,按标准逻辑,每一件单拆出来都是一个部门。

按说肩负这么多职能应该会非常忙,可实际情况是,脑子很忙,手很清闲。事物繁杂到没有办法静下心来去写一篇文案,做一个规划。屏幕右下角的QQ不间断的各种闪烁迎接新的对话,三分钟查看一次微博看看有没有人在互动,被约着辗转各种饭局沙龙交换名片寒暄交流。

如此一年,执行力被吃的连渣都不剩。是的,有很长一段时间我觉得自己很无能。看似做了很多,实际没有在任何一个领域深入的扎下去。没有过硬的媒体关系,对渠道的各项政策也不尽了解,同行间至多落个人脉广的虚名,社会化媒体的运营也三天打渔两天晒网根本没有坚持下来。

这和性格关系很大,本身就是个喜欢追逐新鲜感的人,注意力难集中,也没有意识到深入一个领域对自己的职业规划来说很重要。还有各种外部因素等等等等。这些都是借口,就不一一罗列了,当你想解决一个问题的时候,没有任何借口能阻挡的了。

当然,意识到问题的存在,意识到想要解决问题,是写这一篇文章的动机所在。我喜欢写作,敲字的过程帮助自己更深入的思考,更理性的分析,一篇文章写完,至少理清思路。

根本原因之想太多,做太少

我没有很相信天道酬勤,也不是非常迷信天分这种说法,但对懒是人类通病这事儿深信不疑。执行力弱也可以解释为一种懒。

于工作,

我想通过PR造社会化写作的势,吸引自媒体人正反观点评论,引入国外对标产品,再顺势推出自家产品;

我想通过社会化媒体坚持的发布同一属性的内容,聚拢一批目标用户;

我想通过和渠道的各种合作拿到资源提升客户端安装量;

我想把身边有故事的人都拉拢进汤圆;

我想把植根于心的情怀注入到这个品牌中……

于自己,

我想写一本书把自己过往的旅行经历揉进一个完整的故事中传递价值观和生活态度;

我想可以熟练的使用英语,侃侃而谈;

我想再瘦一点儿,再漂亮一点儿,再有气质一点儿;

我想看很多很多书;

我想向身边的朋友传递正能量,然后一起变得更好……

脑袋瓜里在想好多好多事情,倒是于自己的那些目标相对单一,实现路径也清晰,无非就是阅读健身早睡保持好心态,坚持码字。于工作的,一种莫名的处女座式完美主义弄的自己反复纠结缺乏坚持,说白了就是怕,怕失败。

再去看,于工作的这些目标,每一个都好大,很虚,似乎没有可量化的指标。而心里又很清晰,最终落到的那个量化指标无非是注册用户数、活跃度和留存率三个方面。

如果单纯的想要达到注册用户数,疯狂搞渠道见效最快,与之配套的就是疯狂的做预算。既希望低成本运作,又想要进来的都是目标用户,剑走偏锋的赌,赌一百次或许赢一次,也有可能在赢面翻开之前筹码尽失。

那么现在,来想办法解决问题

面对执行的日益减弱,两种人给我两种说法:

1、补齐你的短板,沉下去做;

2、继续发挥你思维活跃的长处,找到强执行的人来实现你的想法。

综合两种建议,评判当下现状,解决问题的方式还是得从自己最认可的路径出发。我开始重组曾经完成过的那些相对复杂的项目,他们被一层一层的拆解成小到一个文案的完成目标,排列出时间计划先后顺序,从deadline倒推到任务启动的时间,评估需要各部门配合的子目标,留出机动时间。好像一切都变得简单化了。

社会化媒体运营:

1、选择平台

2、确定内容方向和平台目标(提供服务OR提供内容)

3、日复一日坚持发布优质内容OR提供优质服务

4、在3的基础上,洞察可推广的机会

社会化媒体,尤其微信公号的运营不是一个一蹴而就的过程,对内容的坚持,对调性的控制,还有运气是不是适时而至都会成为生死命脉。此刻我能做的是选好平台和内容的定位,找到有耐性坚持又对内容稍有敏感的人去做。降低控制欲,把控方向即可,不要把自己丢进耗费大量时间的筛选内容的事务型工作中。

PR造势

1、选定主话题

2、围绕主话题设置几个子话题

3、选定希望发布的官方媒体

4、选定希望邀请参与讨论的自媒体

5、写稿(备用,如果媒体愿意自己写,那是极好的)

6、制定发布时间计划

7、逐个媒体公关

8、按照计划发布,如有突发状况,随机应变

在人人都是自媒体的现在,PR的方向很难掌控,对结果的预判也没有那么准确。对于小团队来说,能造成失控的,就是一场好的PR营销。被夸也好被骂也行,最怕的就是没人知道。蓄势。积累媒体关系,定期发布一些稿件做铺垫。PR是一个别人觉得我很擅长,但自知并不熟悉的领域。迄今接到不下十个工作邀请是跟PR相关,问起原因,一朋友回答:你是我们理想的公关形象。我只能说,我真的不熟。

市场渠道:

1、基础上架工作

2、根据现有数据甄选最适合自家产品的优质渠道

3、研究渠道运营合作的活动规则,制定计划

4、商务跟进,争取能以内容运营为切入点,开展更深入的合作(类似我们现在跟360合作的微阅读专区)

5、根据数据进行文案、配图及活动合作的优化

6、榜单、关键词这种,基本每月可以固定下来做

7、把渠道数据和评论的监控作为日常工作开展

按说渠道现在其实没太多捷径可走,人情换资源的事情依然存在,只是你会发现如果从头建立关系还不如利益的交换来的效率高。 而性价比最高的关系建立法则,就是帮他完成指标,让他知道跟你合作有钱赚。

渠道方面另有一篇文章详细阐述,这篇就不多说了。今天跟一个同做渠道的姑娘聊天,她说:在花钱口上的人才能体会这种预算在手心里抖和不敢妄动的感觉。但你不花,你就永远没感觉,花几十万就知道了。女人应该会很享受这种花钱的快感的。

很多人都觉得做市场多好,撒钱就行了。我只能呵呵呵,有时候花钱比赚钱难你造嘛?花出去的钱得预测到能收回来的效果,有没有看过那个天猫运营砸了20万在直通车结果一单没成被老板打进医院的段子?

品牌运营:

1、明确定位。纠结了很久给我们这个产品做了“故事社区”这样的定位,期许它可以承载起链接读者和作者的重任。始终不希望它只是成为PC端网文的无线端延伸。

2、守住底线。不作恶,不利用暴力色情的内容揽用户。

3、价值主张:有故事的人。你、我、他,三百六十五行,只要活在这个世界上,只要有思想,必定都有属于自己的故事。

4、不断push,在每一个品牌触点,每一次对外界的对话中不断push这样的品牌主张。

关于品牌,也很值得单独开文来写一写。建立品牌的过程需要耐得住寂寞和非议,熬过去了就是没边际的溢价空间。关于网文这个市场,我其实一点儿都不懂。穿越玄幻耽美,这样的文章内容除了暴富了一些人,打发了一些人的无聊时间,对社会的贡献价值几何?而大量的受众是青少年,他们像上瘾一样的追着小说、游戏,然后潜移默化的被植根一些幻想,真的好么?

这篇文章已经很长了,今天的目标是完结掉它,所以就不再发散了多说了。写到现在,也基本明确了下阶段要重点去做的事情。今天跟老板很严肃的说:我决定七月只关注渠道,付费的渠道推广。这一个月能摸清楚什么渠道适合我们,单个用户成本多少费用就是有收获。

除非注明,本站文章均为原创或编译,转载请注明: 文章来自 36氪

36氪官方iOS应用正式上线,支持『一键下载36氪报道的移动App』和『离线阅读』立即下载!

快速找到应用软件Hosts的方法

$
0
0

  早先我曾经介绍过一个《 快速找到Google可用Hosts的方法》,这个方法其实可以用于几乎所有Web网站的Hosts寻找方法,不过对于本地应用软件被屏蔽,这个方法就无效了,那么对于本地应用软件(例如Dropbox),如何快速找到其可用Hosts呢,今天我就介绍一下通用的快速找到本地应用软件可用Hosts的方法。

  基本思路是,通过Sniffer嗅探器来监控本地应用的网络连接情况,然后整理其访问域名,找到这些域名的真实IP,将这些IP添加到Hosts文件即可。

  我使用的是一个名为DNSQuerySniffer的嗅探工具,该工具能够实时显示本地电脑的DNS查询记录,对于每一个DNS解析查询,显示以下信息:主机名,端口号,查询ID,请求类型,请求响应时间,响应代码等记录,并返回的DNS记录的内容。

  以Dropbox软件为例,先关闭其他没用的客户端软件,打开DNSQuerySniffer,然后运行Dropbox,记录下其访问过的域名。使用一个Ping工具找出这个域名对应的ip地址。

快速找到应用软件Hosts的方法

  找到可用IP后,就可以添加这个IP到Hosts文件里了,先关闭“电脑管家”、“360安全卫士”这类工具,然后编辑C:\Windows\System32\drivers\etc\hosts文件,在文件结尾添加一行“可用IP地址 目标域名”即可。

快速找到应用软件Hosts的方法

  之后如果“电脑管家”、“360安全卫士”等工具检测hosts文件提供风险,只需信任这个文件并将其添加到白名单即可。

  域名添加到Hosts文件中,DNSQuerySniffer就不会再检测到该域名的解析,然后继续运行Sniffer嗅探器和应用软件,一个一个找出所有的无效域名,然后手动将每个域名都添加到Hosts文件即可。

  此方法是通用的寻找本地应用软件可用Hosts的方法,适合所有本地应用软件域名解析错误导致无法运行等问题。

评论《快速找到应用软件Hosts的方法》的内容...

相关文章:


微博: 新浪微博 - 微信公众号:williamlonginfo
月光博客投稿信箱:williamlong.info(at)gmail.com
Created by William Long www.williamlong.info
Viewing all 15843 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>