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

tigase代码框架解读

$
0
0

以下内容由 [五四陈科学院]提供

  • 在java下实现的xmpp开源实现,除了openfire外,tigase是另一个牛逼的项目。

  • 实际的实验室压力下,50万人同时在线的单机,tigase的gc情况要优于openfire,而且openfire的网络层代码借鉴了不少tigase的。

下面的内容,在解剖tigase过程中所写,使用的版本是:5.2.1 (2014年7月份)。

组件

tigase就是一个大组件框,里面所有东西基本都是组件组成的。session manager、message router、c2s connection manager…全部是组件。

ServerComponent接口是一个最小化接口,但是要去写很多代码,tigase提供了许多的现成的代码,减少去从零实现这个接口的过程。

比如extends AbstractMessageReceiver可以直接生成一个处理消息的组件。只需要实现一个processPacket方法。实现getDefaults方法,可以对系统变量进行处理。实现setProperties方法,可以去设置一些要用的变量。

多线程

processPacket方法,可以把逻辑扔到不同的cpu上去运行,以发挥服务器多核的优势。processingThreads方法返回用多少个cpu来处理。

在重写processingThreads的同时,需要重写hashCodeForPacket方法,确保同一个用户的数据,在同一个cpu上处理,以确保不出现消息乱序。

定时器

可以重写everySecond everyMinute everyHour的逻辑,以达到定时器的作用。

还可以重写另外两个方法来指定固定时间完成的任务:

addTimerTask(TimerTask task, long delay, TimeUnit unit);

addTimerTask(TimerTask task, long delay);

重写initializationComplete方法,tigase会在特定的时间里来调用,具体说,就是在所有准备工作做完了后,多半这里用来启动连接之类的。

统计信息

复写getStatistics,用StatisticsList来保存统计信息。

组件的生命周期

一个组件按照下面的过程被调用:

  • 组件被加载,使用无参的public构造函数创建一个实例。
  • setName
  • start
  • getDefaults
  • setProperties
  • initializationCompleted 最后被调用,一般用来启动socket连接。

ConnectionManager

ConnectionManager是继承自AbstractMessageReceiver(前面的可以省去代码的组件实现方式)的抽象类,比如c2s组件就是继承了它。

如果你extend这个类,你需要知道数据来源于哪里:如果来源于MessageRouter,那么abstract void processPacket(Packet packet)方法会被调用; 如果来源于网络连接,那么abstract Queue processSocketData(XMPPIOService serv)方法会被调用。

架子

  • ComponentRegistrator:本身是一种组件,专用于注册各种组件。registr –> addComponent
  • MessageReceiver:本身是一种组件,专用于收消息。也叫Router,因为消息内容在此类组件中流动。
  • XMPPService:本身是一种组件,专用于显示serviceDiscovery时的名称啥的。大作用没有。

  • AbstractMessageReceiver:高级一点的组件,基于MessageReceiver、XMPPService,同时实现了很多细节,还搞了多个线程搞收和发。

启动

  • messageRouter的setConfig,进入ConfiguratorAbstract-AbstractComponentRegistrator的addComponent。
  • 再回到ConfiguratorAbstract的componentAdded,然后是setup(component)。
  • component.setProperties进入messageRouter的setProperties。
  • comp.initializationCompleted()启动了connectionManager的各种socket。

网络

  • connectionManager同时协调ConnectionOpenThread与SocketThread。
  • ConnectionOpenThread脱离上述组件,属于网络层实现,操作selector。它负责Selector.open。
  • IOService提供线程安全的call方法,XMPPIOService继承它,保存了连接信息,每个连接一个IOService。
  • SocketThread在实例化时,会启动多个线程,同时盯住selector。负责将每个确定的IOService进行数据处理。
  • 实现ConnectionOpenListener接口accept方法接收SocketChannel,组装IOService,交由SocketThread处理。
  • ConnectionManager用ConcurrentHashMap记录了所有的连接。

零碎

  • AbstractMessageReceiver.addPacket 往自己的in_queue里加数据,是阻塞的,如果满了会出事。
  • AbstractMessageReceiver.addPacketNB 往自己的in_queue里加数据,非阻塞的,和上一个的区别在于,一个是put一个是offer到queue。
  • AbstractMessageReceiver.addPackets 来一堆数据。
  • 所有in_queue里的数据,会被processPacket方法所处理。
  • 对应有addOutPacket。
  • 所有out_queue里的数据,都默认扔给parent的in_queue,没有parent就扔到自己的in_queue。
  • 所有in_queue的数据,都由processPacket具体的实现来处理。

想快点找到作者也可以到Twitter上留言: @54chen
或者你懒得带梯子上墙,请到新浪微博: @54chen

phonegap开发app中踩过的那些坑

$
0
0

把遇到的问题列出来,如果有解决方案的,偶也会写下来,如果大家有更好解决方法的,欢迎留言噢

 

phonegap 2.9无法触发deviceready事件

亲们可以看下控制台有木有报错,如果有提示cordova_plugins.json 404 (Not Found) ,就在www目录下新建个空文件,命名为cordova_plugins.json就好了,cordova初始化的时候会请求这个文件,但po主还没发现这个文件有啥用,但是没有这个文件的话,cordova初始化失败,自然不会触发deviceready事件。

stackoverflow上关于这个问题有讨论, http://stackoverflow.com/questions/16095757/what-is-the-cordova-plugins-json-file-for-cordova-is-requesting-it-at-initializ

 

phonegap拍照回调慢

刚遇到这个问题的时候,po主很崩溃,在三星S4上都这么慢,那没戏了啊,经过调试,发现慢是图片大小的问题

代码如下,标红的是重点,将拍出来的照片压缩到640宽,速度就飞一般了。

navigator.camera.getPicture(function(imageData){
app.startLoading(‘正在上传图片’);

app.uploadImg(imageData,function(data){
console.log(data)

}, function(message){
console.log(‘拍照失败: ‘ + message);
}, {
quality: 75,
destinationType: Camera.DestinationType.DATA_URL,
saveToPhotoAlbum:true,
targetWidth:640,
targetHeight:1138,
correctOrientation:true

});

 

illegal access exception with localstorage

起初以为是android某些版本对localstorage的支持问题,后来发现是getItem()得到的内容是null的时候,用JSON.parse就会抛出这个异常, http://stackoverflow.com/questions/12846485/illegal-access-exception-with-localstorage-on-android-gingerbread

所以在getItem之后要加一层判断哦

 

 

iScroll事件重复执行的问题

这个po主在研究中,暂时用了个变量来控制事件只执行一次,但治标不治本, github上相关讨论

 

 

待续…

作者:xiebaochun 发表于2014-7-8 23:21:58 原文链接
阅读:77 评论:0 查看评论

基于phonegap开发app的实践

$
0
0

app开发告一段落,期间遇到不少问题,写篇文章记录一下。

为虾米要用phonegap

开发app,至少要考虑android和ios两个版本吧,android偶可以应付,ios表示完全木有接触过,于是时间成本、开发成本上去了。phonegap则解决了这个问题,而且对po主而言,用web开发的方式来搞app很爽啊有木有!

当然,用之前还是要调研下,基于phonegap的app有木有成功案例。大公司里腾讯的qq邮箱ios版,豆瓣的豆瓣音乐人都是基于phonegap。重点看了看豆瓣音乐人,很无耻的反编译了一下apk,居然代码都木有压缩过  ,正好方便了偶研究。

 

豆瓣音乐人的实践

从体验上讲,豆瓣音乐人和native的app还是有差距,首先,点击tab有明显的延迟,另外,豆瓣音乐人整个页面只有一个view,即下图中的frame(view可以理解为app的一个界面,每个app看成是由很多个视图界面组成的),视图之间的切换效果,是先在frame下面再创建一个新frame,里面是将要切换进来的视图代码,然后用css3 transform做视图切换动画,动画结束之后,把原来的frame删除。也就是,在页面中保证只存在一个frame。

这么做应该是基于性能考虑,但是牺牲了部分体验,比如一个列表,滚动到第3屏,点到列表详情,再返回,视图不是停留在点进详情页之前的位置,而是回到了顶部。

 

豆瓣音乐人其实还是以浏览为主的app,功能比较轻,而我们的app则是包含了发帖、传图片等功能,表示鸭梨很大,但值得尝试。

 

 

技术方案

整体技术方案是:

phonegap负责和底层OS通信,调用摄像头、获取网络状态等

backbone+underscore做路由以及视图渲染

iscroll做布局

css3做动画效果

 

路由及视图管理

整个app其实是个single page application(SPA),对于SPA来说,路由和视图的管理很重要,我用了backbone+underscore来做这个事情。
通过backbone的router实现不同hash值对应不同视图,视图里用到的模版用underscore。

 

app布局

典型的app布局如下图,header和footer固定,中间内容可以滚动,第一个想到的就是用position:fixed,但是po主google一下,android 2.x,ios5以下不支持position:fixed,然后po主看到了业界比较推荐的 iscroll,试了些demo,po主就决定用iscroll了。

用iscroll有以下几点好处:
1、很容易实现app的布局,而且每个视图是用的绝对定位,这样做视图切换动画的时候很方便
2、下拉刷新,上拉加载也一并实现了
3、iscroll自带左右滑动的手势功能

弊端:
1、滚动区域里图片多了,低端机卡爆- -
2、iscroll引发的“ fake click”问题
其他倒没有什么弊端了

 

视图切换

考虑到体验问题,没有采用豆瓣的做法, 其实本来我是想用angularJs而不是backbone+underscore,但是angularJs的视图切换原理也是先append一个frame,动画结束再删掉这个frame,这种做法一是无法保留原有视图的状态,第二视图渲染是需要时间的,导致动画切换时,下一个视图会有很短暂的空白时间。

所以我的做法是,多个视图并存,要展示哪个视图就加上current,并调用计算视图相对位置和滑动动画的函数。

 

 

 

屏幕大小及分辨率适配

屏幕大小:布局要自适应不同的屏幕大小,所以固定宽度神马的尽量少用,改用百分比

屏幕像素密度:主要影响到css里引用的图片,以及页面中展示的图片(即img标签的图片),豆瓣音乐人的做法是对不同密度提供不同的图片,但是po主比较懒,只针对像素密度为2的做了一套,比如有个叫icon的div,我们可以这样

.icon{
width:20px;
height:20px;
background: url(‘../images/icon.png’) no-repeat 0 0;
background-size: contain;
}

 

icon.png的大小其实是40*40,这样虽然有点浪费资源,但是减轻了工作量啊有木有 

对于页面中的img标签,提供的图片也是2倍展示宽度的,这个倒是浪费部分用户流量了- -

 

其他

dom操作和事件还是用的jquery,不要问偶为什么- -

关于开发中遇到的各种问题,请看 下一篇

 

 

 

 

参考文献

豆瓣音乐人app的PhoneGap实践

移动Web单页应用开发实践——页面结构化

 web app自适应屏幕方案探讨

作者:xiebaochun 发表于2014-7-8 23:20:17 原文链接
阅读:77 评论:0 查看评论

真正能打动你的的一些设计

$
0
0

evelCup。2012年获得红点奖,解决了杯子的摆放存在的问题,即杯口向上灰尘会进入杯子、倒扣着杯子杯口直接接触桌面。灵感来源于芭蕾舞演员角度的锥杯

设计师:Hsu Hsiang-Min、Liu Nai-Wen、Chen Yu-Hsin

香港救护车

反过来写,前面的车在后视镜中看到“救护车”三个字就是正面的了,这样可以知道后面跟着的是什么车,该避让的就避让。

你知道,当我看到这个设计我都快激动地哭出来了,最打动我的设计:

即将开始的通信技术工业化革命….欧洲一个安静的早晨,街头的街灯:

这只是晨光中一个普通的不能再普通的街灯。

但它其实并不是如表象那般简单,打开LED底罩和外罩。

你看到什么?

对,这就是划时代的射频RF技术,将笨重的基站藏入灯罩,为你提供无处不在的持久信号:

后记:BellLAB的创新技术,LightRadio,大大缩减基站单元尺寸,利用相控阵增益提供任意的覆盖功率,无线宽带变得触手可及~~~

染发剂户外广告

自然天成

我希望所有的USB接口都是这个样子:

我希望所有的水龙头都是这个样子:

我希望我能早点发现布线可以这么好看:

我希望所有的插座都可以这个样子:

我更希望这是我的家

食品包装袋的锯齿边:

这个旋转设计解决了窗口的问题

小便池上印刻的苍蝇图案,男人都懂的。真心点个赞……

印度工业设计学生MargauxRuyant设计的一个诗意的骨灰盒“POETREE”。主体由软木和陶瓷制成,将骨灰,泥土和树苗一同种下,当小树逐渐长大,软木则分解在土壤中。

其实说实话我认为这是一个“学生气”很浓的设计,但是也正因为这样,生活中生命中最温暖最平静的角落才会被关怀到。

BevelCup。2012年获得红点奖,解决了杯子的摆放存在的问题,即杯口向上灰尘会进入杯子、倒扣着杯子杯口直接接触桌面。灵感来源于芭蕾舞演员角度的锥杯,利用把手上的一个面的角度使得杯子既不会向上接灰尘也不会朝下接触到任何让你不放心的东西。

说实话这设计解决了我一直以来的心头大患啊,轻微洁癖伤不起

日本设计的一种叫间隙收纳架的小推车,不是什么高端的设计,但实在是太!有!用!了!我刚刚买了一个放在书柜和桌子中间的空隙,把小杂物都装进里面,每天推来推去好幸福~

可以放在墙角的垃圾桶

 


© 推荐 for 互联网的那点事. | 猛击下载: iPhone客户端猛击下载: Android客户端

Wink 的野心:智能家居的神经中枢

$
0
0

162f_sensors_wink_enabled_home_monitoring_device_app

智能家居能够使我们的生活更加美好。问题是,不同厂商的设备之间常常缺乏协作。目前,大型科技公司已经试图去确立标准。Google 的 Nest 开始平台化,苹果也提出了 HomeKit 的方案。不过,它们也是各怀私心,缺乏合作。现在,有一家公司试图改变这种状况。通过打造一个统一的平台,它想要使不同公司的设备之间实现互通。

这家公司是 Wink,创意众包公司 Quirky 的子公司,而其创始人 Kaufman 就是 Quirky 的 CEO。在他看来,智能家居是趋势所在,但是,消费者并不会去刻意追求它。“我不认为消费者会说,‘我要在本周末打造一个联网家庭,’” 他对 Wired 网站说。相反,他们会不断添置智能设备,直到家里的各种电器都连上互联网。这时候,他们可能需要设备之间的合作。

Kaufman 说,Wink 的目标是打造真正的联网家庭。最近,它与 15 个制造商合作,在 2000 个家得宝商店上架 60 种 Wink 平台的产品。他们与零售商合作,目的是更好地向大众普及智能家居的概念。

在 Wink 成立前,Quirky 已经制造过许多联网硬件,但是 Kaufman 意识到,如果他们重新发明所有家用电器,结果只能加剧市场的碎片化。“市场上已经有许多值得信任的品牌,制造着门锁、车库锁和百叶窗,” 他说,“我们意识到,这些已经摆在货架上的产品,需要整合起来,实现协作。”

在智能家居方面,Wink 有些领先优势,但是,它面对的竞争也在增加。Wink 想要成为智能家居的神经中枢,而这也是大型科技公司的目标所在。对此,Kaufman 却没有表现出什么担忧。

他说,苹果的 HomeKit 是一个机会,而非威胁。“HomeKit 是一个开发者平台,它使 Wink 的表现更好了,” 他说。Wink 可以用上 Siri 和 Touch ID,另外,它还能整合不兼容 HomeKit 的产品。对于 Nest,他也是同样的看法。“人们不想购买系统。他们想要购买产品,” 他说,“因此,我们的做法会胜出。”

图片来自 thinkgeek

until the day God will deign to reveal the future to man, all human wisdom is contained in these two words, Wait and Hope.

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



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


Spring/Hibernate应用性能调优

$
0
0

对于大多数典型的Spring/Hibernate 企业应用来说,应用程序的性能几乎完全取决于它的持久层的性能。

这篇文章将会对如何确认在“数据库约束”的应用前,使用7种“快速见效”的技巧来帮助我们提升应用性能。

如何确认一个应用受到“数据库约束”

为了验证一个应用程序是否受到“数据库约束”,首先在一些开发环境中做一些普遍的行为,即使用 VisualVM来监控。 VisualVM是一个搭载JDK的Java解析器,它通过调用 jvisualvm来进行命令行登陆。

登陆Visual VM后按照这样做:

  • 运行你的应用程序
  • 选择 Sampler
  • 点击 Settings复选框
  • 选择 Profile only packages,同时引入下面的包:
    • your.application.packages.*
    • org.hibernate.*
    • org.springframework.*
    • your.database.driver.package, for example oracle.*
    • Click Sample CPU

一个典型“数据库约束”应用的CPU性能分析应该像这样:

 

我们可以看到 Java进程的客户端花费了 56%的时间用来等待数据库通过网络返回结果。

这是个好的标志,它显示了是什么让数据库查询应用变慢的。 32.7%的Hibernate反射调用可以正常运行所以没什么可以改进的。

第一步优化:获得运行基线

做优化的第一步是定义一个基线运行的程序。我们需要确定一组有效的输入数据使程序通过一个类似于生产输出的典型执行类。

主要的区别在于,基线运行应该在更短的时间内运行,作为一个指导方针的执行时间,5到10分钟是一个理想的时间。

如何得到一个好的基线?

一个好的基线应该有以下特点:

  • 功能正确
  • 在类型方面输入数据类似于输出数据
  • 能在很短的时间内完成
  • 基线运行的优化可以进行推广

良好的基线能事半功倍。

怎样会得到一个糟糕的基线?

例如,在批处理调用一个通信系统的数据记录中,获取前 10 000 条记录是 错误的方法。

原因是这前10 000个数据可能是语音通话,而这些未知的错误可能是由于以短信的方式来处理导致的。大量采用这些记录会导致产生一个错误的基线,由此错误的结论就产生了。

手机SQL日志和查询计时

SQL查询的执行时间可以收集用于 log4jdbc。看这篇博客是如何使用log4jdbc收集SQL查询 – Spring/Hibernate improved SQL logging with log4jdbc

查询执行时间衡量的是Java客户端,它包括往返到数据库的网络。SQL查询日志是像这样的:

16 avr. 2014 11:13:48 | SQL_QUERY /* insert your.package.YourEntity */ insert into YOUR_TABLE (...) values (...) {executed in 13 msec}

好的语句本身也是一个不错的信息来源 –他们允许轻松地识别频繁的查询 类型。他们记录在以下这篇博客日志 – 为什么 Hibernate 做这样的 SQL 查询?

SQL日志可以找出哪些指标

SQL 日志可以回答下列问题:

  • 执行最慢的查询是什么?
  • 最常见的查询是什么?
  • 生成主键的时间量是多少?
  • 有数据可以受益于缓存吗?

如何解析SQL日志

可能对于大量日志唯一可行的选择是使用命令行工具。这种方法的优点是非常灵活的。

写一个脚本或命令后我们可以提取主要指标。只要你觉得合适任何命令行工具都是可以用的。

如果你是使用Unix命令行,bash可能是一个不错的选择。Bash也可以在Windows工作站上使用,例如使用 Cygwin,或者包括bash命令行的 Git

频繁应用 Quick-Wins

Quick-wins 能识别Spring/Hibernate应用中的常见问题并找到相应的解决方案。

Quick-win 技巧 1:减少主键生成开销

在‘insert-intensive’的进程中,主键生成策略的选择非常重要。一种常见的生成id的方法是’s用数据库序列,通常每个表进行插入数据的时候避免争用一个同一资源。

问题是如果插入50条记录,我们想避免为了获得50条记录的id而造成的网络往返对数据库的消耗,这会导致大部分时间保持Java进程挂起。

Hibernate通常是如何处理的呢?

Hibernate提供了新的优化后的ID生成器来避免这个问题。这就是序列,一个 HiLo id 生成器是在默认情况下使用的。这是HiLo序列发生器如何工作的:

  • 一旦调用一个序列和1000个(高值的)
  • 像这样来计算 50 个id的序列:
    • 1000 * 50 + 0 = 50000
    • 1000 * 50 + 1 = 50001
    • 1000 * 50 + 49 = 50049, 最低值 (50)
    • 调用更高的序列值 1001 … 等等 …

从一个序列的调用中可以看出,生产50个键可以减少很多网络传输所造成的开销。

这些新的主键优化的产生默认是基于Hibernate 4的,同时也可以在必要时将 hibernate.id.new_generator_mappings设置为false来关掉它。

为什么生成主键依旧是个问题?

问题就是,如果你宣布主键生成策略是 AUTO,优化后 仍然是关闭的状态, 这样的话您的应用程序最终会调用大量的序列。

为了确保新的优化生成器处于运行状态,保证使用 SEQUENCE策略而不是 AUTO

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "your_key_generator")
private Long id;

通过这个简单的改变,有 10%-20%的范围可以改善,这可以在基本上没有修改代码的情况下在‘insert-intensive’应用程序中采用。

Quick-win 技巧 2:使用JDBC批处理插入/更新

对于批处理程序,JDBC驱动程序通常提供优化来减少网络流量,这就是‘JDBC 批量插入/更新’。当使用这些的时候,驱动级别的插入/更新在发送到数据库前被排入队列。

当达到阈值后整个批处理队列语句一次性发送到数据库。这可以防止驱动逐条发送语句,这可以进行多网络传输。

这是工厂配置的实体管理来激活插入/更新的批处理:

<prop key="hibernate.jdbc.batch_size">100</prop><prop key="hibernate.order_inserts">true</prop><prop key="hibernate.order_updates">true</prop>

只配置JDBC批处理的大小是 不能正常工作的。这是因为JDBC驱动程序只有当接收到插入/更新完全相同的表时才会进行批处理插入操作。

如果新表收到一条插入语句,那么JDBC驱动会在开始对新表进行批处理操作前首先刷新前一张表的批处理语句。

如果使用Spring批处理的话,一个类似的功能是隐式地进行使用。这种优化可以很容易地完成 30%40%的‘insert intensive’程序,而无需改动一行代码。

Quick-win 技巧 3:定期刷新和清理Hibernate会话

当添加/修改数据库的数据时,Hibernate保持了一个已经存在的实体版本的会话,以防在会话关闭之前进行修改。

但是很多时候,一定在数据库中有匹配的插入时我们就可以安全地丢弃实体。这在Java客户机进程中释放了内存,防止长时间运行Hibernate会话所导致的性能问题。

像这样长时间运行的会话 应该尽可能被阻止,但是由于某种原因需要它们的话就应该包含内存是如何消耗的:

entityManager.flush();
entityManager.clear();

flush将触发插入新实体从而发送到数据库。 clear则从会话释放新的实体。

Quick-win 技巧 4 :减少Hibernate过多的dirty-checking

Hibernate使用内部的一种机制来保持记录修改的实体的方式就叫做 dirty-checking。这种机制 不是基于实体的equals和hashcode方法的类。

Hibernate能让dirty-checking的性能成本降至最低,dirty-check只会在需要的时候出现,但是这种机制也是有代价的,它有更多的表和列。

在应用做任何优化前,最重要的是测量使用VisualVM所耗费的dirty-checking的成本。

如何避免dirty-checking?

我们所知道的Spring事务方法是只读的,dirty-checking可以像这样来关闭:

@Transactional(readOnly=true)
public void someBusinessMethod() {
    ....
}

另一种避免dirty-checking的方式是使用Hibernate无状态会话,这在 documentation有详细描述。

Quick-win 技巧 5:搜寻 “差的” 查询计划

在最慢的查询列表里进行检查来看他们是否有良好的查询计划。最常见的“差劲的”查询计划是:

  • 全表扫描:表完全地被扫描是因为经常缺少索引或者过时的表统计。
  • 笛卡尔连接:这意味着几张表进行笛卡儿积后的结果正在进行计算。检查正在丢失的连接条件,或者可以通过将一个步骤分为几步来完成可以避免发生这个问题。

Quick-win 技巧 6:检查错误的提交时间间隔

如果你是正在做批处理,那么提交间隔会在性能结果上产生很大的影响, 能达到10-100倍甚至更多。

确认提交间隔是所预期的(通常是Spring批处理作业的100-1000倍)。参数配置错误的情况时有发生。

Quick-win 技巧 7:使用二级查询缓存

如果某些数据被确定为合格缓存,那么看看这篇博客如何设置Hibernate缓存的: Pitfalls of the Hibernate Second-Level / Query Caches

总结

为了解决应用程序性能问题,最重要的操作是收集一些指标来找到当前的瓶颈是什么。

不给定指标的话几乎不可能在有意义的时间内发现是什么导致问题发生的。

同时,许多但并非所有 ‘数据库-驱动’ 的表现缺陷可以避免在最先使用的Spring Batch框架的应用中发生。

相关文章

二手手机恢复出4万张照片

$
0
0

二手手机恢复出4万张照片
智能手机市场的繁荣,也造就了二手手机市场的兴旺,在美国很多人会通过eBay 和Craigslist 网站来出售他们使用过的手机。不过,似乎大家都没有做好数据清理工作。为了印证这个问题,杀毒公司Avast 做了一个测试,他们从eBay 上购买了20部二手Android 手机,使用基础的数据恢复软件进行处理,接着见证奇迹的时候到了,超过4万张照片从这些手机中恢复了出来,其中超过1500张是家人和孩子的照片,还有数千张是个人照片。除了照片之外,Avast 同时恢复了759封email 和短信,250个通讯地址。以及手机前机主信息等等。

讽刺的是,虽然有一部手机安装了安全软件,但恰恰是这部手机恢复出来的信息最多。通过手机信息再结合Google 搜索和Facebook 页面,Avast 的黑客很快就能找到机主各自信息,以及他曾去过的地方。甚至发现其中一名机主有一本《性骚扰指导》等。这样看上去,这些旧手机实在是太不安全了。

另一方面,一份调查显示,美国的智能手机用户只有14%安装了杀毒软件。8%的用户可以远程抹去手机里的信息。Avast 警告大家手机里的“恢复出场设定”并没有大家想象的那样完全清除。

当你在手机上删除一份文件的时候,理论上并没有真正的删除,操作系统会抹去指向这份文件的指针,知道该文件所在空间被覆盖后该文件才消失,在此之前,它都有可能恢复。Avast 的工作人员表示:“出售二手手机可以帮助人们赚得一些钱,但是却不能帮助你保护隐私。”而每天,在网络上都有约8万部二手智能手机在出售。

本次Avast 实验,具体恢复的数据,列表如下:
超过4万张图片
超过1500张关于家庭和孩子的照片
超过750张穿着内裤妹子的照片
超过250张自拍照片
超过1000个Google搜索历史记录
超过750封Email和短信
超过250个联系人信息
4个机主信息
1份完整的贷款信息

[ oioi via slashdot]

Java 8无人谈及的八大功能

$
0
0

时间戳锁

一直以来,多线程代码是服务器开发人员的毒药(问问Oracle的Java语言架构师和并行开发大师Brian Goetz)。Java的核心库不断加入各种复杂的用法来减少访问共享资源时的线程等待时间。其中之一就是经典的读写锁(ReadWriteLock), 它让你把代码分成两部分:需要互斥的写操作和不需要互斥的读操作。

表面上看起来很不错。问题是读写锁有可能是极慢的(最多10倍),这已经和它的初衷相悖了。Java 8引入了一种新的读写锁——叫做时间戳锁。好消息是这个家伙真的非常快。坏消息是它使用起来更复杂,有更多的状态需要处理。并且它是不可重入的,这意味着 一个线程有可能跟自己死锁。

时间戳锁有一种“乐观”模式,在这种模式下每次加锁操作都会返回一个时间戳作为某种权限凭证;每次解锁操作都需要提供它对应的时间戳。如果一个线程 在请求一个写操作锁的时候,这个锁碰巧已经被一个读操作持有,那么这个读操作的解锁将会失效(因为时间戳已经失效)。这个时候应用程序需要从头再来,也许 要使用悲观模式的锁(时间戳锁也有实现)。你需要自己搞定这一切,并且一个时间戳只能解锁它对应的锁——这一点必须非常小心。

下面我们来看一下这种锁的实例——

long stamp = lock.tryOptimisticRead(); // 非阻塞路径——超级快
work(); // 我们希望不要有写操作在这时发生
if (lock.validate(stamp)){
       //成功!没有写操作干扰 
}
else {
       //肯定同时有另外一个线程获得了写操作锁,改变了时间戳
       //懒汉说——我们切换到开销更大的锁吧
	
            stamp = lock.readLock(); //这是传统的读操作锁,会阻塞
       try {
                 //现在不可能有写操作发生了
                 work();

       }
       finally {
            lock.unlock(stamp); // 使用对应的时间戳解锁
       }
}

并发加法器

Java 8另一个出色的功能是并发“加法器”,它对大规模运行的代码尤其有意义。一种最基本的并发模式就是对一个计数器的读写。就其本身而言,现今处理这个问题有很多方法,但是没有一种能比Java 8提供的方法高效或优雅。

到目前为止,这个问题是用原子类(Atomics)来解决的,它直接利用了CPU的“比较并交换”指令(CAS)来测试并设置计数器的值。问题在于 当一条CAS指令因为竞争而失败的时候,AtomicInteger类会死等,在无限循环中不断尝试CAS指令,直到成功为止。在发生竞争概率很高的环境 中,这种实现被证明是非常慢的。

来看Java 8的LongAdder。这一系列类为大量并行读写数值的代码提供了方便的解决办法。使用超级简单。只要初始化一个LongAdder对象并使用它的add()和intValue()方法来累加和采样计数器。

这和旧的Atomic类的区别在于,当CAS指令因为竞争而失败时,Adder不会一直占着CPU,而是为当前线程分配一个内部cell对象来存储 计数器的增量。然后这个值和其他待处理的cell对象一起被加到intValue()的结果上。这减少了反复使用CAS指令或阻塞其他线程的可能性。

如果你问你自己,什么时候应该用并发加法器而不是原子类来管理计数器?简单的答案就是——一直这么做。

并行排序

正像并发加法器能加速计数一样,Java 8还实现了一种简洁的方法来加速排序。这个秘诀很简单。你不再这么做:

Array.sort(myArray);

而是这么做:

Arrays.parallelSort(myArray);

这会自动把目标数组分割成几个部分,这些部分会被放到独立的CPU核上去运行,再把结果合并起来。这里唯一需要注意的是,在一个大量使用多线程的环境中,比如一个繁忙的Web容器,这种方法的好处就会减弱(降低90%以上),因为越来越多的CPU上下文切换增加了开销。

切换到新的日期接口

Java 8引入了全新的date-time接口。当前接口的大多数方法都已被标记为deprecated,你就知道是时候推出新接口了。新的日期接口为Java核 心库带来了易用性和准确性,而以前只能用Joda time才能达到这样的效果(译者注:Joda time是一个第三方的日期库,比Java自带的库更友好更易于管理)。

跟任何新接口一样,好消息是接口变得更优雅更强大。但不幸的是还有大量的代码在使用旧接口,这个短时间内不会有改变。

为了衔接新旧接口,历史悠久的Date类新增了toInstant()方法,用于把Date转换成新的表示形式。当你既要享受新接口带来的好处,又要兼顾那些只接受旧的日期表示形式的接口时,这个方法会显得尤其高效。

控制操作系统进程

想在你的代码里启动一个操作系统进程,通过JNI调用就能完成——但这个东西总令人一知半解,你很有可能得到一个意想不到的结果,并且一路伴随着一些很糟糕的异常。

即便如此,这是无法避免的事情。但进程还有一个讨厌的特性就是——它们搞不好就会变成僵尸进程。目前从Java中运行进程带来的问题是,进程一旦启动就很难去控制它。

为了帮我们解决这个问题,Java 8在Process类中引入了三个新的方法

  1. destroyForcibly——结束一个进程,成功率比以前高很多。
  2. isAlive——查询你启动的进程是否还活着。
  3. 重载了waitFor(),你现在可以指定等待进程结束的时间了。进程成功退出后这个接口会返回,超时的话也会返回,因为你有可能要手动终止它。

这里有两个关于如何使用这些新方法的好例子——

  • 如果进程没有在规定时间内退出,终止它并继续往前走。
if (process.wait(MY_TIMEOUT, TimeUnit.MILLISECONDS)){
//成功 }
else {
process.destroyForcibly();
}
  • 在你的代码结束前,确保所有的进程都已退出。僵尸进程会逐渐耗尽系统资源。
for (Process p : processes) {
       if (p.isAlive()) {
             p.destroyForcibly();
       }
}

精确的数字运算

数字溢出会导致一些讨厌的bug,因为它本质上不会出错。在一些系统中,整型值不停地增长(比如计数器),溢出的问题就尤为严重。在这些案例里面, 产品在演进阶段运行得很好,甚至商用后的很长时间内也没问题,但最终会出奇怪的故障,因为运算开始溢出,产生了完全无法预料的值。

为了解决这个问题,Java 8为Math类添加了几个新的“精确型”方法,以便保护重要的代码不受溢出的影响,它的做法是当运算超过它的精度范围的时候,抛出一个未检查的ArithmeticException异常。

int safeC = Math.multiplyExact(bigA, bigB); 
// 如果结果超出+-2^31,就会抛出ArithmeticException异常

唯一不好的地方就是你必须自己找出可能产生溢出的代码。无论如何,没有什么自动的解决方案。但我觉得有这些接口总比没有好。

安全的随机数发生器

在过去几年中Java一直因为安全漏洞而饱受诟病。无论是否合理,Java已经做了大量工作来加强虚拟机和框架层,使之免受攻击。如果随机数来源于随机性不高的种子,那么那些用随机数来产生密钥或者散列敏感信息的系统就更易受攻击。

到目前为止,随机数发生算法由开发人员来决定。但问题是,如果你想要的算法依赖于特定的硬件、操作系统、虚拟机,那你就不一定能实现它。这种情况下,应用程序倾向于使用更弱的默认发生器,这就使他们暴露在更大的风险下了。

Java 8添加了一个新的方法叫SecureRandom.getInstanceStrong(),它的目标是让虚拟机为你选择一个安全的随机数发生器。如果你 的代码无法完全掌控操作系统、硬件、虚拟机(如果你的程序部署到云或者PaaS上,这是很常见的),我建议你认真考虑一下使用这个接口。

可选引用

空指针就像“踢到脚趾”一样——从你学会走路开始就伴随着你,无论现在你有多聪明——你还是会犯这个错。为了帮助解决这个老问题,Java 8引入了一个新模板叫Optional<T>。

这个模板是从Scala和Hashkell借鉴来的,用于明确声明传给函数或函数返回的引用有可能是空的。有了它,过度依赖旧文档或者看过的代码经常变动的人,就不需要去猜测某个引用是否可能为空。

Optional<User> tryFindUser(int userID) {

void processUser(User user, Optional<Cart> shoppingCart) {

Optional模板有一套函数,使得采样它更方便,比如isPresent()用来检查这个值是不是非空,或者ifPresent()你可以传递 一个Lambda函数过去,如果isPresent()返回true,这个Lambda函数就会被执行。不好的地方就跟Java 8的新日期接口一样,等这种模式逐渐流行,渗透到我们使用的库中和日常设计中,需要时间和工作量。

用新的Lambda语法打印Optional值:

value.ifPresent(System.out::print);


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


ITeye推荐




学霸演讲必备的三个PPT技巧

$
0
0

19089 - Aprender Powerpoint 2013

作为一个学生党,尤其是学生党中的学霸、学生党中的学生干部,肯定少不了要在各位同学和导师面前进行PPT演讲展示。坐在台下的导师们、女神以及几十位学渣们正眼巴巴地等着你的“精彩演讲”,关键时刻,绝对不容许出现一点错误,否则可能沦为众多学渣们茶余饭后的笑柄。不用怕,以下几个PPT使用技巧,瞬间提升学霸PPT的操控水平,学渣们多学习下吧。

1.快速定位到幻灯片

学霸在台上对着PPT做演讲,演讲到一半可能会让大家回顾下之前演讲的内容,如果PPT内容多页数多的话,翻起来比较麻烦。作为学霸,当然不能向困难屈服。学霸只要在制作PPT的时候记好幻灯片的页码即可,例如在放映幻灯片时按下数字7,然后敲一下回车,屏幕内容直接就跳转到第7张幻灯片上。另外,如果要从任意位置返回第1张幻灯片,可以同时按住鼠标左右键2秒钟左右,屏幕内容会自动跳转到第1张幻灯片。

2.PPT黑屏技巧

有时候在台上演讲完PPT的内容后,学霸需要跟台下的观众进行一些互动,这时候需要引导观众的注意力,让他们把注意力集中在自己身上,而不是关注屏幕上的内容。那么有什么办法能让大家的注意力转移到学霸身上呢?很简单,在播放PPT幻灯片的时候,只要在键盘上按一下“B”键,屏幕就会出现黑屏,暂时把屏幕内容屏蔽掉,然后台上的学霸可以尽情地与台下的观众互动。按“W”键是白屏,也有同样的效果。

Unnamed QQ Screenshot20140709173259

3.“学霸”视角:后台幻灯片演示模式

在PPT以前的版本,如果需要后台幻灯片演示,可能会用到两个显示器,操作起来相信也比较麻烦。而在Office 2013中则方便不少。在放映幻灯片时,点击鼠标右键,选择“显示演示者视图”即可进入后台幻灯片演示模式。

有什么好处呢?开启后台幻灯片演示模式后,播放给观众观看的是常规的幻灯片,而学霸眼中看到的界面如上图所示。学霸依然可以对PPT进行各项操作,每一页幻灯片的备注也会显示出来,让学霸的演讲更完美。

「假货不断」难以放心 京东再被爆有假货

$
0
0

如今人们越来越习惯直接网上购物,省时省心很是方便,不过为了保证所购物品的质量,一般来说大部分消费者会选择像例如京东,天猫和亚马逊这样有品质保证的主流电商。但这些电商真的能让消费者完全放心么?继法国 motul 法国机油以后,今天美孚官方也发布了京东卖假机油的声明。

今日头条产品思路分析

$
0
0

摘录今日头条的评论

法则之三:少即是多(摘自《感知的、几款过亿美金APP的创业法则》)

媒体是最容易被操纵的,也是最容易变成一个官僚权力纷争的名利场,它被太多外在因素干扰。而技术是一种手段,可以公正公平地让每个用户感知到自己的偏好,而且通过不断智能筛选还能提高用户的粘性和数据的多维度。我想这才是真正的互联网手段去颠覆传统媒体,当然这也是那些来自报社杂志社的在各家门户琢磨着标题党的同学们不敢想、不屑想的手法。

媒体最强调的就是调性,强调影响有影响力的人,而在移动互联网大潮中,找到屌丝用户的诉求才是夹缝中爆发的关键路径。举个用户刚需的例子,大家估计都能猜出百度搜索量最大的关键词类别吧,而各家门户都不好意思把这个分类放到自己的新闻客户端里面。而今日头条深知用户看新闻的动机和行为数据,最后专门列出了“美女”类别。这个刚需的释放不仅仅在今日头条中被用户热捧,包括“内涵段子”“节操精选”“百思不得姐”都是如出一辙,仅仅通过社会化传播就横扫大把用户。

产品思路 - 主打工具,核心是推荐算法

相比传统媒体的核心——记者、编辑、运营,今日头条主打工具,核心是机器推荐算法,也就是一款用机器推荐算法给用户推荐新闻的工具。没有复杂样式的内容,用简单的信息展现形式,展现出丰富的内容,满足用户看资讯的需求。

今日头条的特点如下:

1,不主观编辑 - 只提供客观内容,向用户展示大家都在看、用户感兴趣的内容,不替用户做主观判断。而搜狐、网易等传统媒体, 主要由编辑运营频道内容展示给用户。

“今日头条没有一个员工做内容的生产和推荐,只有少数几个人负责内容的违规审核。‘尽量减少人为干预内容’、全部交给算法来解决,是今日头条的目标。”(摘自《今日头条不会亲自做内容,只想做平台》)

2,不运营内容 - 主要内容为机器爬取或自媒体上传

招聘的运营人员都为用户运营、评论审核、内容审核。

3,用户获取内容成本低

默认展示推荐频道,根据用户的兴趣爱好展示信息

豌豆荚评论:

1.新闻类应用内容是王道,省区了用户筛选信息的成本,赞一个

2.不知道什么时候开始,手机今日头条成为习惯啦,空闲时候就爱翻一番。嗯,个性化做的挺好的。喜欢的内容都能第一时间看到。

苹果园评论:

1.从去年8月用到现在,给我推送的内容越来越符合我的阅读兴趣,任何时候打看一定有我想看的东东,基本不用上微博了。

2.从一开始就用,现在推荐的越来越精准了,很好用,加油!

3 没有复杂的新闻类型,各个频道的样式基本一致,简单、清爽。

4.好用 画面整洁利索

%2Fhome%2Fqspace%2Fdata%2Fwebmailcache%2F2%2F2612035997%2FZL3208-8m99mhvDizuA0UoZ7gyNR47_Attach%2Fwps_clip_image-28787

360手机助手用户:

1.good,方便简单,界面整洁

今日头条的界面基本为列表,无特殊内容形式,简单,清爽。默认展示给用户的是推荐频道

%2Fhome%2Fqspace%2Fdata%2Fwebmailcache%2F2%2F2612035997%2FZL3208-8m99mhvDizuA0UoZ7gyNR47_Attach%2Fwps_clip_image-25490%2Fhome%2Fqspace%2Fdata%2Fwebmailcache%2F2%2F2612035997%2FZL3208-8m99mhvDizuA0UoZ7gyNR47_Attach%2Fwps_clip_image-30037%2Fhome%2Fqspace%2Fdata%2Fwebmailcache%2F2%2F2612035997%2FZL3208-8m99mhvDizuA0UoZ7gyNR47_Attach%2Fwps_clip_image-27097

网易、搜狐等传统媒体的界面,默认展示头条/要闻,列表的展示样式丰富,对比今日头条,略显复杂,比较符合传统门户的风格。

从今日头条的招聘职位看头条的思路

从产品看,可以发现①今日头条专门招聘推进引擎基础品质提升的产品,在推荐上下工夫;②同时并重资讯类、娱乐类产品,注重基于用户数据分析的产品改进。

viewfile (2)

高级产品经理(文章推荐引擎基础品质)

职位描述:

1.深刻理解用户对推荐的需求,指出推荐改进的方向

2.制定可真实反映用户感受的评估体系,要求体系指标完善、可量化、可操作,评估结果真实可信

3.推进人工评估,对评估结果进行分析

产品经理(资讯类产品数据分析,需求调研)

职位描述:

1.对日常运营数据进行跟踪和研究,定期分析运营效果

2.分析处理用户反馈,整理用户需求,提出改进方案以及优先级

3.负责监测、整理与分析用户需求、竞品动态与行业情况;

4.协同各部门,确保产品的研发运营整体进度

从研发看,文章抓取与处理、文本分析与挖掘、数据挖掘与分析、推荐引擎是今日头条的机器推荐的技术重点;另外会根据用户的反馈,不断修正推荐参考因素。

viewfile (3)

数据抓取和处理(高级)工程师

职位描述:

负责大规模文本、图像、视频数据的抓取、抽取,去重、分类,垃圾过滤,质量识别等工作。

为业务推广、销售策略、产品方向的改进,提供数据分析支持。

文本分析与挖掘(高级)工程师

职位描述:

从事大规模互联网和UGC文本数据的分析与挖掘工作,包括分类,关键词提取,命名实体识别,聚类,主题分析,情感分析等工作。

数据分析与挖掘(高级)工程师

职位描述:

1.海量用户意图挖掘、兴趣建模的算法研发

2.新闻分析、信息提取的算法研发

数据(高级)分析师

职位描述:

1.通过数据量化评估用户对推荐系统的满意程度,发现影响用户增长和参与度的关键因素,为推荐系统的进一步改进提供参考

从运营看,今日头条的运营工作主要为信息审核、文章审核、客户端推广活动运营。

viewfile (4)

用户运营经理

职位描述:

1、通过数据分析、用户调研等方式制定运营方案

2、协调相关部门,推进实施运营方案

信息审核专员

工作职责:

1.负责新闻跟帖中违规内容审核,包括色情、广告以及违反法律法规要求的内容

2.处理用户举报,对谩骂、人身攻击、发布垃圾等内容的违规ID进行封禁

3.对用户反馈的文章错误进行核实,根据不同情况进行处理

4.营造良好社区氛围,参与社区规则的制定,不断总结问题,给产品改进提供建议

编辑

职位描述:

1.负责今日头条手机客户端的内容审核工作;

2.负责今日头条搜索引擎的数据挖掘运营;

综上,从今日头条的招聘,印证了今日头条做工具的产品主体思路。

附:网易新闻招聘的记者/编辑

%2Fhome%2Fqspace%2Fdata%2Fwebmailcache%2F2%2F2612035997%2FZL3208-8m99mhvDizuA0UoZ7gyNR47_Attach%2Fwps_clip_image-30525

传统媒体的主要工作还是内容的人工采集、运营、编辑

本文为作者:耳东善德独家投稿发布,转载请注明来自人人都是产品经理并附带本文链接


(关注更多人人都是产品经理观点,参与微信互动(微信搜索“人人都是产品经理”或“woshipm”)

银行从业者如何评价央视在 2014 年 7 月对「中行公然洗钱」的报道?是否属实?

$
0
0
今天关于这事的消息挺多的,媒体报道吐槽的是以下几点:

1、非法大额换汇,以前是地下钱庄的活,现在银行也做着和地下钱庄一样的事。
2、从找投资项目到换汇打款,银行超业务范围提供投资移民一条龙服务。
3、银行可能明知道资金来源不明,或者不知情情况下收到假的资金来源证明,会成为协助境内非法资金外流的帮凶。

报道的言辞算是很激烈的,用了洗钱、监守自盗等标题。
报道中提到的优汇通,属于出国金融的创新产品,大致功能是为投资移民等活动中外汇汇款提供渠道,报道中把这项业务写得非常神秘且毫无限制,其实内部限制还是很多的:

1、用途:仅限投资移民和海外购房。
2、客户身份:公务员及其家属不得办理,大型国企、金融从业人员从严审核。
3、单笔限额:1000万RMB
4、业务人员必须对对资金用途证明材料,和资金来源证明材料进行审核,保证其真实性。



产品原理就是以上诸位提到的跨境人民币结算啦,就是讲人民币从国内汇往境外银行分支机构,在境外进行结汇,变为外汇再进行投资或者购房。
综合以上信息列几个槽点:
1、地下钱庄所做的非法大额换汇的确是违法的,而优汇通这个产品如果严格把控,达到的目的是在一定限额内的换汇用于投资移民和海外购房。这的确超过了每人每年等值5万美元的自由结售汇额度,但通过跨境人民币来操作的话,在境内并没有发生购汇,不在外管的监管范围之内。跨境人民币是很牛啊,要推进人民币国际化就必须要放宽这条路子,只是路开了监管还没有跟上。媒体是不太了解这个概念,用到的“学名是…”,“以前是被禁止的”这样的词显然是将其视为豺狼虎豹,其实跨境人民币是个大趋势,以后一定会应用得越来越多。银行做了和地下钱庄一样的事,可能是将违法的事规范起来的第一步,曝光了倒可能是好事。
2、银行提供了投资移民一条龙服务。好吧,这就是营销,单纯来说优汇通只是一个汇款类的产品,而推广的必须是一种服务才会有市场。与其跟原本乱七八糟甚至有些是骗子工程的海外项目合作,不如自己找靠谱的上下游。的确有可以指摘的地方,但是富人能得到的服务不是我等屌丝可以理解的,就像传说中的黑卡用户可以让火车停开飞机掉头一样,投资移民一条龙也不算什么。
3、资金来源不明,导致这项业务成为洗钱工具。有一定可能这中服务的确会被用于洗钱,但基本上要建立在审核不严或者员工道德问题的前提下。就以上提到的产品规定来说,控制好资金用途,进行额度限定,并且禁止部分职业人员办理该业务,已经很好地控制了系统风险,那么剩下的反而是操作风险和道德风险比较值得关注。如果银行员工对资金来源证明材料审核不严,那么就很可能让非法资金外流,或者说员工本来就知道这钱来得不明不白,那么这事就不用多讨论了。报道中引用的员工的话显得很暧昧,“不对外宣传”、“远程操作”等等,我基本相信这是出自销售人员的原话,这种业务都是面向资产千万以上私行客户,也确实不需要大范围宣传。轻则空若悬河,重则满嘴跑火车,是不少营销人员的基本技能,把产品说的简单直接牛到无边无际是正常的,所以说员工的嘴管不住,随便一抓全是槽点。因此,私以为道德风险反而是潜在的最大问题。
同意上头日天的说法:不法分子利用正规渠道干坏事,不代表这渠道是坏的。
还有,跨境人民币的监管需要加强也是随其发展的必然趋势,这才是该新闻的另一个重点吧。

— 完 —
本文作者: 匿名用户

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

此问题还有 17 个回答,查看全部。
延伸阅读:
非应届生,金融硕士,银行从业,如何能进投行呢?
中国国有商业银行总行分行的投行部,城市商业银行的投行部,和高盛这些一流投行相比,其业务上分别有何区别?从业者的能力与之相比如何?

[JS]36个卓越的可视化数据工具(图表库)

$
0
0

如果将数据直接以文字形式展示,这样用户阅读起来是非常困难的,所以如果我们使用可视化形式来展示数据,这就会更清晰易懂。这里由smashingapps整理了36个卓越的可视化数据工具,有地图图表、有柱状图表、饼状、散点等等,是一个不错的list收集。

下面来看看这些可视化数据图表工具,或许会对你的项目带来帮助。

Ember Charts

这个图表库需要依赖Ember.js 和 d3.js,多个图表样式,柱状、饼状、散点图。

js库 图表 可视化
进入网站

Modest Maps

一个地图js插件,大小只有10KB,兼容Firefox, Chrome, Opera, iOS, Android, 和IE7-9浏览器。

js库 图表 可视化
进入网站

Flot Charts

折线类图表,使用纯JavaScript绘制的jQeruy库,重点是使用简单,外观友好。

js库 图表 可视化
进入网站

Leaflet

Leaflet 是一个开源的地图JS库,交互上比较友好。

js库 图表 可视化
进入网站

Raphael

Raphael 是一个小型的JavaScript库,图表有很多个样式,使用方法简单。

js库 图表 可视化
进入网站

Pizza Pie Charts

比萨饼图,其实就是饼状图表,效果不错。

js库 图表 可视化
进入网站

Chartkick

美丽的曲线风格图表,当然还有饼状。

js库 图表 可视化
进入网站

Cube

js库 图表 可视化
进入网站

Better World Flux

js库 图表 可视化
进入网站

Polymaps

地图类js库。

js库 图表 可视化
进入网站

Google Charts

谷歌的图表库工具,功能强大,支持HTML5生成SVG图表,简单易用,而且免费。图表风格很多,其交互效果也很漂亮,值得使用。

js库 图表 可视化
进入网站

jQplot

jQeruy图表库。

js库 图表 可视化
进入网站

Gantti

Gantti是一个简单的PHP甘特图。

js库 图表 可视化
进入网站

Smoothie Charts

一个Javascript数据图表库。

js库 图表 可视化
进入网站

Envision

Envision.js 是一个动态的HTML5可视化图表。

js库 图表 可视化
进入网站

Arborjs

Arborjs是一个可视化jQuery图形库。

js库 图表 可视化
进入网站

Manyeyes

js库 图表 可视化
进入网站

D3js

js库 图表 可视化
进入网站

Gephi

js库 图表 可视化
进入网站

Highcharts

Javascript交互图表,适合用于web项目。

js库 图表 可视化
进入网站

JavaScript InfoVis Toolkit

js库 图表 可视化
进入网站

jpGraph

JpGraph 使用PHP >= 5.1 编写的数据图表。

js库 图表 可视化
进入网站

Timeline

时间轴图表。

js库 图表 可视化
进入网站

Wolfram Alpha

js库 图表 可视化
进入网站

Cross Filter

Crossfilter 这个图表在浏览器中响应速度极快(<30毫秒)

js库 图表 可视化
进入网站

Open Layers

地图类插件

js库 图表 可视化
进入网站

Fusion Charts

js库 图表 可视化
进入网站

Raw

js库 图表 可视化
进入网站

Springy

js库 图表 可视化
进入网站

Bonsaijs

一个轻量级的图形库,可渲染出直观的SVG图形。

js库 图表 可视化
进入网站

Humble Finance

HumbleFinance 是一个HTML5数据可化图表插件,交互效果良好。

js库 图表 可视化
进入网站

Protovis

js库 图表 可视化
进入网站

Axiis

Axiis 是一个开源的可视化数据框架,提供给初学者和专业开发人员使用。

js库 图表 可视化
进入网站

TimeFlow

TimeFlow 是一个可视化时间分析工具。

js库 图表 可视化
进入网站

Paper.js

一个使用HTML5 Canvas输出的JS图表库

js库 图表 可视化
进入网站

整理自: smashingapps


Copyright ©2010-2014 ¦ RSS订阅¦ 新浪微博¦ 本文链接¦ 添加评论
交流:UI设计交流群:59300679,与500名设计师交流设计,分享素材。

九大工具助你玩转Java性能优化

$
0
0
Java性能优化工具可以帮助你改进你的Java代码。Java性能优化工具可以帮助你改进你的Java代码。

之前我写过一篇关于 5个工具帮助写出更好的Java代码的文章。合适的工具可以改进我们的代码,并且提高开发效率。在 IDR解决方案中,我们一直在找一些方法来改进我们的代码。但最近,我们在考虑改进 PDF HTML5转换器Java PDF类库代码时,发现最近我们的关注点已经开始转换到如何提升Java性能。

在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具。有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用。

NetBeans Profiler

NetBeans profiler是一个NetBeans IDE插件,主要为NetBeans IDE提供性能分析相关的功。NetBeans IDE是一个开源的集成开发环境。它很好地支持所有Java应用类型(包括Java SE、JavaFX、Java ME、Web、EJB和移动应用)的开发。

这个性能分析器包含了诸如CPU、内存和线程性能分析功能,并且提供了一些用于基本JVM监控的附加工具和功能。对于需要解决内存和性能相关问题的开发者非常有用。

JProfiler

JProfiler我之前的文章中有提及。同样,它也是一个很好的Java性能分析工具。JProfiler集CPU、内存和线程性能分析于一体,可以用于分析性能瓶颈、内存泄漏、CPU负载和解决线程相关的问题,并且支持本地性能分析(分析与JProfiler软件安装在同一台机的应用)和远程性能分析(它可以分析远程没有安装JProfiler机器上的应用),这一点对开发人员非常有用。

JProfiler由ej-technologies GmbH开发的商业授权的Java性能分析工具,主要为Java EE和Java SE应用所设计。

GC Viewer

GC viewer截图GC viewer截图

GC Viewer可以(从 主页Github)免费获取。GC Viewer是一个开源工具,可以对vmflags -verboase:gc和-Xloggc:等Java VM选项产生的数据进行可视化分析。GC Viewer可以用于计算GC(垃圾回收)相关的性能数据记录,包括吞吐、累积暂停、最长时间的暂停等等。当你想要通过改变生成大小和设置初始堆大小来调整某个特定应用的GC时,它尤其有用。

GC Viewer是一个开源工具,由Tagtraum Industries Incorporated开发。这是一个很小的初创软件咨询公司,位于罗利、北卡罗莱纳州,由成立于1999年的非盈利项目Tagtraum Industries在2004年创立。

VisualVM

VisualVM是一个由NetBeans平台派生的工具,遵循模块化的架构思想。这意味着可以通过插件方便的进行扩展。

Visual VM允许你获取Java程序的详细信息,只要它在一个Java虚拟机(JVM)上运行即可。生成的数据可以由JDK工具生成和读取,多个Java程序的所有数据和信息都可以很方便地进行查看,包括本地和远程的运行程序。同时可以保存JVM软件的数据快照,把数据保存在本地,方便以后进行查看或者和其他人一起分享。

Visual VM可以进行CPU性能分析、内存性能分析,进行GC(译者注:可以进行强制调用GC)、保存快照等。

Patty *Beta

Patty in action (图片来源于http://patty.sourceforge.net.)Patty in action (图片来源于http://patty.sourceforge.net.)

“Patty” 项目是一个开源项目,可以从 Source Forge下载。它致力于为Java 1.5.0和更高版本的虚拟机提供性能分析工具。与其他性能分析工具不同之处在于,它专注性能分析,并且允许用户在运行时开启和关闭性能分析功能。

目前Patty正处于beta版阶段,但随着更多强大的功能如方法执行、代码覆盖、线程竞争(Thread Contention)分析的加入,Patty可以用于(内存、CPU等)性能调优,并且可以将信息通过TCP/IP Socket发送到其他电脑上。Patty有着易用的GUI,可以用于分析堆。还可以在Java编译流程中的准备阶段,对应用程序运行时对class进行监测(instrument)和取消监测(de-instrument)。

JRockit——任务管理

JRockit是一个原由Appeal Virtual Machines开发的专有Java虚拟机。2002年由BEA Systems收购,之后从Sum Microsystems处转到Oracle。

Oracle的JRockit是一套完整的Java SE解决方案,包含了一个高性能JVM、性能分析、监控和排错工具。可用于预测Java程序中的延迟。

现在,JRockit打包有一系列的称为JRockit任务控制(JRockit Mission Control)的工具。这些工具包括:一个用于管理的控制台(console,译者注:此console跟终端不一样,是特指管理后台系统),进行GC数据可视化和其他的一些性能统计。它同样可以作为运行时性能分析工具Runtime Analyzer来使用,也可以分析内存问题。

Eclipse Memory Analyzer

Memory Analyzer (MAT) 可以在Eclipse IDE中找到.Memory Analyzer (MAT) 可以在Eclipse IDE中找到.

Eclipse内存分析器(Eclipse Memory Analyzer)是一个可以帮助你找到内存泄漏和减少内存损耗的Java堆分析器。它更适合作为一个分析Java堆栈和计算大小的工具集,也可以用于监测内存泄漏和反模式带来的内存损耗。

Java Interactive Profiler

JIP是一个用Java开发的高性能、低损耗性能分析器。基于 BSD许可协议发布,可以从 Source Forge下载。使用JIP的开发者可以在VM运行时开启和关闭性能分析,并且可以过滤类和包、控制输出。

Profiler4J

Profiler4j是一个专注于CPU性能分析的工具。它具有友好的用户界面,支持远程性能分析,并且支持动态修改配置。Profiler4j值得关注的特性有:基于动态字节码增强方式,这就表明它不需要任何本地的库和外部可执行文件支持。更重要的是,它完全由Java编写,可以提供图形化的调用图形信息、调用树结构、内存监控和类列表,支持细粒度配置文件。它基于 Apache License v2.0协议发布,可以从Source Forge上 下载

希望你觉得这些工具有用。

你使用什么工具来改进你的代码,请告诉我们吧!

这篇文章是我们” Java文章索引“系列的一部分。在这些文章中,我们致力于深入Java和JavaFx。看一下吧!

如果你是第一次看这个系列,或者想要在我们发布新文章和更新时,得到通知,你可以通过社交媒体来关注( Twitter, FacebookGoogle+)或者 Blog RSS

相关文章

Apache James Server 3.0-beta4 发布

$
0
0

Apache James Server 3.0-beta4 发布,Apache James Server 3.0 和 2.3.2 集成了邮件服务器,包括了高级完整的功能特性。Apache James Server 3.0 提供一个 mailet 容器,是基于 Spring 构建,慢慢转向 OSGi,支持以下协议:

Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。

James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。

James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛。


香港中文大学校长沈祖尧毕业典礼致辞:不负此生

$
0
0
不负此生
一一 香港中文大学校长沈祖尧毕业典礼致辞

今天早上我翻阅了毕业礼的典礼程序。当我见到毕业生名册上你们的名字,我按手其上,低头为你们每一位祷告。我祈求你们离校后,都能过着“不负此生”的生活。你们或会问,怎样才算是“不负此生”的生活呢?

  首先,我希望你们能俭朴地生活。我过去的三至五年间,大家完成了大学各项课程,以真才实学和专业知识好好地装备了自己。我肯定大家都能学以致用,前程锦绣。但容我提醒各位一句:快乐与金钱和物质的丰盛并无必然关系。一个温馨的家、简单的衣着、健康的饮食,就是乐之所在。漫无止境地追求奢华,远不如俭朴生活那样能带给你幸福和快乐。

  其次,我希望你们能过高尚的生活。我们的社会有很多阴暗面:不公、剥削、诈骗等等。我我吁请大家为了母校的声誉,无比庄敬自强,公平待人,不可欺负弱势的人,也不可以做损及他人或自己的事。高尚的生活是对一己的良知无悔,维护公义,事事均以道德为依归。这样高尚地过活,你们必有所得。

  其三,是我希望你们能过谦卑的生活。我们要有服务他人的谦卑心怀,时刻不忘为社会、国家以至全人类出力。一个谦卑的人并不固执己见,而是会虚怀若谷地聆听他人的言论。伟大的人物也不整天仰望山巅,他亦会蹲下来为他的弟兄濯足。

  假如你拥有高尚的情操、过着俭朴的生活、并且存谦卑的心,那么你的生活必会非常充实。你会是个爱家庭、重朋友,而且是关心自己健康的人。你不会着意社会能给你什么,但会十分重视你能为社会出什么力。

  我相信一所大学的价值,不能用毕业生的工资来判断。更不能以他们开的汽车、住的房子来作准,而是应以它的学生在毕业后对社会、对人类的影响为依归。所以诸位毕业会成为我校的代表。做个令我们骄傲的“中大人”罢!

  在21世纪,全球的大学都有如处身于十字路口,因为在历史中,大专院校从来没有增长与膨胀得像现在那么快,而又像现在一般,忘其所以、失其导向。正当全球大专学生数目不断增加的时候,人们也前所未有地对大学教育的真正意义作出了重大的质疑。

  正当在某些国家,大学被誉为推动科技与经济建设的火车头的时候,在另一些地方,大学却被诋为纵容精英主义和放任不羁的地方。那么大学教育,所为何事?

  纽曼枢机曾经这样说:“若大学课程一定要有一个实际的目的,我认为就是为了培养良好的社会公民……这种教育能给人以对自己的观点与判断的真理,给人以倡导这种观点与判断的力量。它教他客观地对待事物,教他开门见山直奔要害,教他理清混乱的思想,教他弄清复杂的而摒弃无关的。”

  认清大学的价值和本质

  我相信一所大学的价值,不能用毕业生的工资来判断。更不能以他们开的汽车、住的房子来作准,而是应以它的学生在毕业后对社会、对人类的影响为依归。

  我们也要弄清楚大学的本质:它并非纯粹是一座知识宝库,也并非单单是创意和创新的推动者。大学绝非一所职业训练学校,更万万不可沦为培育贪婪、自私、毫无道德和社会责任可言的人才的机构。大学不可能是排名榜的盲目追随者,更不可以被视为推动生产总值的引擎。

  认识并带领你的时代

  今天你们毕业了,我送你钱穆老师的一番话“认识你的时代,带领你的时代”。“你们一个人怎么样做人,怎么样做学问,怎么做事业,我认为应该有一个共同的基本条件,就是我们一定先要认识我们的时代。我们生在今天这个时代,我们就应该在今天的时代中来做人、做学问、做事业。大部分的人不能认识时代,只能追随时代,跟着这个时代跑。这一种追随时代,跟着时代往前跑的,这是一般的群众。依照中国人的话来讲,即是一种流俗。每一个时代应该有它一个理想,由一批理想所需要的人物,来研究理想所需要的学术,干出理想所需要的事业,来领导此社会,此社会才能有进步。否则不认识这个时代,不能朝向这个理想的标准来向前,此即是流俗。流俗又如何能来领导此社会?所以每一个时代,不愁没有追随此时代的流俗,而时代所需要的,则是能领导此时代的人物、学术与事业。”

  这是一个怎样的时代?

  这是一个个人主义抬头的时代:个人利益凌驾于群体福祉,个人意见往往成为唯一能接受的意见。但海纳百川,有容乃大。我们不应只顾自己的利益,不要过于自以为是,而要学会多听别人意见,考虑各方看法,协力实现梦想。

  这是一个资讯爆炸、是非难辨的时代:每日在网上流传的资讯,媒体发放的消息,为我们带来不少冲击。但事情往往不是表面看来那么简单,是非黑白往往需要仔细分析,深入了解。大学教育的目的,是培养独立思考。同学毕业后更需终身学习,有慎思明辨的能力。

  这是一个利益在前,道德在后的时代:金钱、地位、权力,已经成为世人追逐的唯一之物,道德和价值观的培育,却渐渐被人遗忘。壁立千仞,无欲则刚。但愿你们不要让利益掩盖良心,以厚德载物自许。我们所追求的,理应是较名与利更能持久的东西。

  我盼望中大毕业生能虚怀若谷,以远大眼光,包容态度,带领我们的时代。我盼望中大毕业生能恪守道德,做好本份,不要为了个人利益,埋没良知。我盼望中大毕业生能认识时代,引领潮流,不流俗、不盲从,做个对社会有贡献的人。

  知道满足,懂得感恩,贡献更多

  面前放着半杯水,你看到的杯子是半满,而非半空。你会明白世界上没有什么事是理所当然的,无论是健康、家人、爱人或者机会。你在这个年纪所拥有的一切,所获得的成就,是这个世界上许多人想也无法想像的。知道满足便会快乐。懂得感恩,你心中所念兹在兹的,就不是还想获得更多,而是贡献更多。你应努力回报社会,用你的时间、你的知识,或许有一天,是你的财富。到那时你会发现,奉献愈多,就愈富足。

  “你不会问香港可以为你做些什么,而是你可以为香港做些什么。”为自己和别人创造更多机会,献上更多关怀,你的烦恼反而减少。懂得感恩,你大概也是个包容的人。一天当父母开始双鬓斑白,记忆衰退,步履蹒跚时,你不会对他们抱怨挑剔,你会不离不弃的照顾双亲,为他们做饭洗脚。一天你有了更大的成就、更高的收入,或更高荣誉时,你也不会瞧不起老师,你会饮水思源,告诉别人他是我脚前的灯、路上的光。

  有一天我们的社会无论面对多大的困难、多少的挑战,你也不会离弃香港,不顾而去。你会尽你的责任为香港创造未来。各位,今天是值得我们庆祝并为之欣喜的大好日子,但不要忘记……这还是个应当感恩的日子。

  各位毕业同学,在我的心目中大家都是我的儿女。当我诵念你们的名字时,我默祷你们都能不负此生。
  青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟!!   你不得不信的星座秘密

基于twemproxy的redis分布式应用

$
0
0
根据以往的测试结论,单个redis的实例的内存总量最好控制在8G以内(最大不能超过20G),而实际上应用对redis的内存的需求可能会远远大于8G,因此需要一个保持redis server性能不下降,但可以有效扩充redis server的容量的方案。


twemproxy是一个恰当的选择。


简介
twemproxy,也叫nutcraker。是一个twtter开源的一个redis和memcache代理服务器。

特点
• 支持失败节点自动删除
• 支持设置HashTag
• 减少与redis的直接连接数
• 自动分片到后端多个redis实例上
• 避免单点问题
• 可以平行部署多个代理层.client自动选择可用的一个
• 支持redis pipelining request
• 支持状态监控
• 高吞吐量

部署

参考网站: https://github.com/twitter/twemproxy

核心脚本:

git clone git://github.com/twitter/twemproxy.git
autoreconf -fvi
./configure --prefix=/usr/local --enable-debug=log
make && make install


帮助文档:

Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file]
                  [-c conf file] [-s stats port] [-a stats addr]
                  [-i stats interval] [-p pid file] [-m mbuf size]

Options:
  -h, --help             : this help
  -V, --version          : show version and exit
  -t, --test-conf        : test configuration for syntax errors and exit
  -d, --daemonize        : run as a daemon
  -D, --describe-stats   : print stats description and exit
  -v, --verbosity=N      : set logging level (default: 5, min: 0, max: 11)
  -o, --output=S         : set logging file (default: stderr)
  -c, --conf-file=S      : set configuration file (default: conf/nutcracker.yml)
  -s, --stats-port=N     : set stats monitoring port (default: 22222)
  -a, --stats-addr=S     : set stats monitoring ip (default: 0.0.0.0)
  -i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
  -p, --pid-file=S       : set pid file (default: off)
  -m, --mbuf-size=N      : set size of mbuf chunk in bytes (default: 16384 bytes)


启动脚本:

./bin/nutcracker -c /usr/local/twemproxy/conf/nutcracker_test.yml -s 22222 -d -o /usr/local/twemproxy/logs/nutcracker.log


依赖包
执行过程中可能遇到依赖包不存在或者版本过低的情况,主要有m4, autoconf, automake, libtool。手动安装过程如下:

安装m4

wget http://mirrors.kernel.org/gnu/m4/m4-1.4.17.tar.gz 
tar -xzvf m4-1.4.17.tar.gz 
cd m4-1.4.17 
./configure --prefix=/usr/local
make && make install


安装autoconf

wget http://mirrors.kernel.org/gnu/autoconf/autoconf-2.69.tar.gz 
tar -xzvf autoconf-2.69.tar.gz 
cd autoconf-2.69 
./configure --prefix=/usr/local
make && make install


安装automake

wget http://mirrors.kernel.org/gnu/automake/automake-1.14.tar.gz
tar xzvf automake-1.14.tar.gz 
cd automake-1.14 
./configure --prefix=/usr/local
make && make install


安装libtool

wget http://mirrors.kernel.org/gnu/libtool/libtool-2.4.tar.gz 
tar xzvf libtool-2.4.tar.gz 
cd libtool-2.4 
./configure --prefix=/usr/local
make && make install



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


ITeye推荐



未来必热:SVG Sprite技术介绍

$
0
0

by zhangxinxu from http://www.zhangxinxu.com
本文地址: http://www.zhangxinxu.com/wordpress/?p=4264

一、Sprite技术

这里所说的Sprite技术,没错,类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。

另,本文图片甚多,爪机党继续浏览需慎重。

二、SVG Sprite与symbol元素

目前,SVG Sprite最佳实践是使用 symbol元素。 symbol元素是什么呢?单纯翻译的话,是“符号”的意思。然,这个释义并不符合这里的场景。不知大家有没有用过Flash, symbol实际上就类似于Flash中的“影片剪辑”、或者“元件”。

因此,我个人觉得, symbol应该解释为“元件”最为恰当!

那, symbol和SVG Sprite又有什么关系呢?

我们可以把SVG元素看成一个舞台,而 symbol则是舞台上一个一个组装好的元件,这这些一个一个的元件就是我们即将使用的一个一个SVG图标。

于是,对于一个集合了三个SVG图标的SVG元素的代码结构会是这样:

<svg><symbol><!-- 第1个图标路径形状之类代码 --></symbol><symbol><!-- 第2个图标路径形状之类代码 --></symbol><symbol><!-- 第3个图标路径形状之类代码 --></symbol></svg>

每一个 symbol就是一个图标元件,但是,只有上面的代码,是无法呈现类似下面的效果的:
SVG Sprite的效果图

为何?

因为,舞台上只是放置了图标,如果你不使用(use),是看不见的。就好比你女朋友买了几箱的衣服放家里,如果不穿出去,谁知道她这么土豪呢?

因此,还差一个“使用”,也就是SVG中的 <use>元素。

三、SVG中的use元素

use元素是SVG中非常强大,非常重要的一个元素,尤其在Web开发中,为何?

两点:

  1. 可重复调用;
  2. 跨SVG调用;

1. 可重复调用
你好不容易,用了几十个坐标值,好不容易绘制了一个图形,如果你想再弄一个同样造型,但位置不同的图形出来,你会怎么办?——再复制一遍代码?别说笑了,(如果真那样)SVG文件的尺寸赶得上二师兄的腰围了。

使用 <use>元素就可以,看下面的板栗:

<svg><defs><g id="shape"><rect x="0" y="0" width="50" height="50" /><circle cx="0" cy="0" r="50" /></g></defs><use xlink:href="#shape" x="50" y="50" /><use xlink:href="#shape" x="200" y="50" /></svg>

结果是(IE9+浏览器可见):

首先,注意到没有, use元素是通过 xlink:href属性,寻找要使用的元素的。 #shape对应的就是 idshape的元素。 use元素可以有自己的坐标,以及支持 transform变换,甚至可以use其他 use元素。

这里,两个 use元素使用的是同一个 g元素(组合),从而实现了图形的重复调用功能。

2. 跨SVG调用
SVG中的 use元素可以调用其他SVG文件的元素,只要在一个文档中。

紧接着上面的板栗:

<svg width="500" height="110"><use xlink:href="#shape" x="50" y="50" /></svg>

结果仍是那个图形:

而这个 跨SVG调用就是“SVG Sprite技术”的核心所在。

试想下,我们只要在页面某处载入一个充满Sprite( symbol)的SVG文件(或直接 include SVG代码),于是,在页面的任何角落,只要想使用这个图标,只要简单这一点代码就可以了:

<svg class="size"><use xlink:href="#target" /></svg>

图标尺寸CSS控制,里面只有一个仅有 xlink:href属性的 use元素,Done! 完成!

也即是说,在HTML层面,图标使用的代码成本,跟传统的CSS Sprite或者流行的 font-face几乎无异,代码简洁,而且很好维护。所有的SVG图标都在一个SVG源上。retina良好,尺寸可任意拉伸,且颜色可控,真乃Web图标的未来之星。

吹的嘴巴都干了,上个简单的demo给大家瞅瞅, 我先去给水排水~~

您可以狠狠地点击这里: SVG Sprite使用示意demo

代码如下截图:
SVG Sprite使用示意

效果为:
SVG使用的图标效果

总结下就是: symbol + use => SVG Sprite

诸位会不会觉得本文的内容快要结束了呢?

嘻嘻嘻嘻,顶多才 1/3,下面的才是重点,打起精神,走起~~

四、SVG Sprite实际应用的阻碍

两大问题:

  1. SVG图标从何而来?
  2. SVG图标如何变成symbol并整合在一起?

1个问题, SVG图标从何而来?
“远在天边近在眼前”,CSS3 font-face的逐渐升温,让很多 font-face工具诞生了。例如以前我介绍过的国外的 icomoon.io,或者国内阿里系的 iconfont.cn, 或者bootsrap 3粉们的 font-awesome

这些图标实际上都是使用SVG作为媒介的,所以,根本就不要担心“SVG图标从何而来”,这图标多的就像牛魔王身上的虱子——一抖一大把啊!

OK,如何获得呢?直接下载。拿 iconfont.cn示意,点击某一图标的下载按钮:
点击下载图标

点击下载SVG:
点击下载SVG按钮

于是,我们就得到了SVG图标啦!如果你还需要其他图标,也按照这个步骤一个一个下载下来,很简单吧~ 然后把它们放在一个文件夹中,以备后用。

下面最关键的是第 2个问题, 如何合并这些SVG到一个SVG上?同时满足使用的是 symbol标签,并可以使用裸露的 use元素(除了 xlink:href没有其他属性)调用呢?

很长很funny, 要专门独立两段,

五、关于合并:偏开发的前端看这里

这里的方法适用于偏开发的前端,一些对指令无感的妹子们,可以看下面偏设计的方法。

Github上,有个名为 svgstoregrunt插件,地址 戳这里。如果您还不了解 grunt, 可以看看这两篇我觉得不错的文章:“ 使用GruntJS构建Web程序 (1)”和“ 使用GruntJS构建Web程序 (2)”.

grunt改装的装好后,执行下面的指令,

npm install grunt-svgstore --save-dev

安装grunt-svgstore

烧个香保佑安装成功,然后你就会看到在 node_modules文件夹中一个名为 grunt-svgstore的子文件夹(如下):
grunt-svgstore文件夹

这个名为 grunt-svgstore的文件夹中有个名为 Gruntfile.js的文件,据我个人理解,这个JS是所有 grunt插件要使用的配置文件。

我在里面做了一件事情,加了这么一行代码:
加了一行代码示意

为什么要加这么行代码呢?因为 grunt-svgstore项目README.md让加的,所以我就加了

你会看到

svgstore: {

}

中有一大堆的配置什么的,这些都是用来独立测试各个API的( options对象中各个键就是API名称),让你知道此插件各个API都是干嘛用的,具体释义参见该Github项目。忍不住提一下,如果你希望SVG图标颜色可以在CSS中通过 fill控制, cleanup设置为 true.

OK, 准备工作完毕,下面来实践下。我把从iconfont.cn上下载下来的3个SVG都放在了一个名为 mytest的文件夹下,我希望这个文件夹下的SVG都整合在一起,并可以方便调用,怎么办?

svgstore: {}内部搞个自定义的配置,见下图:
自定义的配置

意思是: mytest文件夹下的所有SVG合并成一个名为 mytest.svg的大SVG文件,并放在 tmp文件夹下。

我们 cdgrunt-svgstore目录,然后在命令行工具中输入:

grunt

然后走起,再烧第2根香,保佑一切正常……
mytest走起~

然后,就可以在tmp文件夹下看到我们的小结晶—— mytest.svg,以及如何使用示意的HTML demo页面。
SVG合并的文件,以及对应的demo~

此demo页面源代码如下:

<svg xmlns="http://www.w3.org/2000/svg" style="width:0;height:0;visibility:hidden;"><symbol viewBox="0 0 1024 1024" id="iconfont-baobei"><title>iconfont-baobei</title><path fill="#272636" d="M...z" transform="translate(0, 800) scale(1, -1)"/></symbol><symbol viewBox="0 0 1024 1024" id="iconfont-bianji"><title>iconfont-bianji</title><path fill="#272636" d="M...z" transform="translate(0, 800) scale(1, -1)"/></symbol><symbol viewBox="0 0 1024 1024" id="iconfont-shangchuan"><title>iconfont-shangchuan</title><path fill="#272636" d="M...z" transform="translate(0, 800) scale(1, -1)"/></symbol></svg><svg><use xlink:href="#iconfont-baobei"></use></svg><svg><use xlink:href="#iconfont-bianji"></use></svg><svg><use xlink:href="#iconfont-shangchuan"></use></svg>

效果如下截图:
第一次成型的SVG效果图

Oh, no! 怎么有残缺,不完美,感觉不会再爱了!

淡定,小问题,貌似是这些SVG制作的时候,本身有些问题(为了font-face做的调整?),我们在illustrator中打开这些SVG, 一下子就可以看出症结所在,例如,细细的铅笔图标:
铅笔的两个角在舞台之外了

铅笔的两个角在白色的舞台之外了,正好跟上面截图少掉的两个角一致。要修复,超easy, 等比例缩放到白色舞台内就OK了,ctrl+S保存,然后重新执行下 grunt命令就好了。

然后,浏览器刷新下刚刚的demo页面,当当当当,撒花撒花~~

溢出调整后的SVG效果

以上~

六、关于合并:偏设计的前端看这里

注意: 这里的方法,就算是CSS完全不懂的设计师也可以轻松上手!

对于一些妹子,只会写些页面,对于开发、编程的感觉比减肥还难,显然,上面的偏开发需编译的工具插件对她们就很吃力。不急不急,这里有面向设计师的方法。

你需要一个犀利的软件,矢量之王,illustrator!

一步一步跟我来:

  1. 打开软件,新建一个文件,然后另存为SVG格式;
  2. 从标尺中拉出一些参考线,搞些正方形格子,我自己用的尺寸是 160*160, 矢量无尺寸,你随意;
  3. 把下载的SVG图形拖到这些格子中,缩放到合适大小。我是铺满的,这样由于对比明显,各个图标尺寸就都是一致的,CSS控制方便;
    illustrator参考线与图形缩放
  4. 这一步很关键。打开Symbols面板,在Window菜单栏中,或Shift+Ctrl+F11启用。然后,拖动格子中的SVG图形到这个面板中,就会触发新建“元件”的行为,会打开类似下面的面板:
    illustrator中新建元件的面板

    其中, name就是SVG中对应的 symbol元素的 id,因此,最好使用英文,最好易识别。下面的 type你随意,这个只要在SVG导入到Flash中使用时候才有用的,这里,我们不和Flash打交道。然后,OK, 这个图标就“元件”化了,按照同样的步骤,让3个图标都变成元件(以后可重复使用),Symbols面板会类似下面这样:
    Symbols面板截图

  5. Ctrl+S保存,合并好的SVG即出炉。我们直接在浏览器中打开此SVG,效果不错哦~
    SVG Sprite的效果图

是不是就这么结束了,太天真了。人生不如意事十之八九。我们瞅一瞅SVG的源代码,会发现, use元素居然跟小龙女一样,不干净纯洁啦——上面一大推乱七八糟的属性!
use元素上大把乱七八糟属性

难道我们要在网页中使用如此臃肿的 use元素吗?

我以小新的明义告诉你,绝对不会!

小新的名义

因为我昨晚在家折腾出了个工具,可以将illustrator生成SVG转换成web可用SVG Sprite.

您可以狠狠地点击这里: illustrator生成SVG转换成web可用SVG Sprite工具demo

上工具完整地址是:http://www.zhangxinxu.com/sp/svg.html 很好记忆,我站点 域名+sp+svg.html, spspecial的缩写,专门放工具用的。

使用很简单:

  1. 把illustrator生成SVG所有代码拷贝到第一个框框里;
  2. 点击“转换萌萌哒”按钮,适用于SVG Sprite技术的新代码就出来了(左下的框框);同时,右侧显示了如何使用该SVG Sprite在web中真实实践;
  3. 左下角还有个红色的“导出该SVG”,就是字面意思,可以自定义名称,也可使用随机名称,为空即可;

一开始的 SVG Sprite使用示意demo就是使用这个工具生成的哦~ 见下缩略图:
illustrator生成SVG转换工具使用截图

注意:此工具值适用于illustrator生成的SVG, 水平有限,其他SVG转换十有八九会跛掉。没怎么测试,如果发现此工具转换出了问题,欢迎提醒,定会及时修复。另外,生成的SVG文件会不定期清理,请勿外链。

我想想,还有没有什么问题……哦,为什么说此方法与CSS Sprite还要简单。

因为,CSS Sprite还需要在CSS中使用 background-position一个一个地定位,哦,天哪~ 如果没有工具的话,就纯粹搬砖的苦力活啊~

但是,这里的SVG Sprite的定位,你只要在illustrator中把位置放好,illustrator这个软件就自动帮你定位好了。你只要在我的工具中转换下,生成下,然后在需要使用的地方使用:

<svg><use xlink:href="#target" /></svg>

就好了,用到CSS了吗?几乎没有,除了对SVG做尺寸限制以及改变图标的颜色。OK,这点程度的东西,小白设计师也可以轻松上手。

从这一点来看,SVG又一次成为了明日之星!设计师只要在illustrator中做好图就可以了,完全没有从前那种帮重构切图的苦逼经历了,是不是要啤酒炸鸡庆祝下!

七、唯一的制约——兼容性

SVG图标必定是未来的趋势。为何现在国内依然不温不火,不对,应该是还没有开始有温度。我觉得除了技术学习滞后性,浏览器兼容性是最关键的制约,毕竟IE8目前依然是大头(33.23%, 刚在百度流量研究院看到的数据)。

如何破?按照我的心情,鸟它个毛线,我就手机上用用,不也挺好。静下来想想,不能意气用事,提一下IE7/IE8浏览器的处理方法吧~

有些标签,浏览器识别,会忽略里面一些东西。例如SVG的 desc元素,里面的内容一向不显示的。于是,对于IE7/IE8, 我们可以把对应图标的 png图片放在其中,然后IE9+等支持SVG的浏览器就会忽略之,而IE7/IE8这些不识泰山的元素就会显示图片。拿礼物这个SVG举例:

<svg class="webicon"><desc><img src="iconfont-baobei.png" width="16" height="16"></desc><use xlink:href="#liwu"/></svg>兑换礼物

于是,在IE8下,就会是这样:
IE8浏览器下效果

其他靠谱浏览器依然是这样:
SVG使用的图标效果

于是,完美兼容了。只是活脱脱多了个标签,略败兴。当然,你也可以针对IE7/IE8使用CSS Sprite技术,原理类似,只是 img标签换成其他 i之类标签显示背景图,至少HTML这块会干净很多。

八、结束语

今年4月份的时候刚介绍过“ CSS3图标图形生成技术”,如果说“ font-face图标生成技术”是热门的话,那“CSS3图标生成技术”则属于偏门,受设计制约很大,而本文介绍的“SVG Sprite图标生成”则代表了未来。

font-face在部分win系统下,字体较小的时候,锯齿问题很讨厌,苛刻的设计师无法忍受,甚至出现了响应式 font-face这样的名堂,但是,据我观察,纯正的SVG图标是没有这个问题的,而且,SVG图标具备 font-face几乎所有的优点,尺寸CSS可随意定制,颜色CSS可随意定制;且没有 font-face异步加载延时渲染问题;同时没有某些浏览器下 font-face跨域问题;更关键的是,SVG图标支持渐变,甚至彩色图标的。而 font-face实现彩色图标,要一个一个拼起来,你以为贴马赛克啊!而且,SVG中每个 path元素等可以独立控制,帅气的图标变换动画等的就是你来实现!

因此,各方面看,SVG完胜 font-face,

目前唯一的问题就是兼容成本。但是,随着浏览器的发展,SVG一定会迎来自己Web新舞台!

感谢阅读,欢迎交流,踊跃纠错,多多赞助!

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址: http://www.zhangxinxu.com/wordpress/?p=4264

(本篇完)

有话要说?点击 这里发表评论。

英国计划出台新应急法案 要求电信及互联网公司保存数据12个月

$
0
0
据外媒报道 ,日前,英国议会正打算通过一项新的应急法案,它将要求英国电信公司及互联网服务供应商将用户的通话、短信及互联网使用记录保存最长12个月的时间。而在此前,欧洲一家法院作出裁决,视电信商和ISP保存用户数据24个月为无效规定。






VPN 和 SSH 哪个比较好,为什么 VPN 比 SSH 繁荣?

$
0
0
首先,我猜你是想比较VPN和SSL. ssh是一个remote shell 是基于SSL的一种应用,尽管很多人用ssh的转发功能 但是本质上,并没有使用shell, 只是利用了sshd这个软件的SSL proxy的功能。

其次,SSL本身就是VPN的一种,称之为SSL VPN, VPN是外延更广的概念,也不能放在一起比较。

所以我猜你所说的vpn是非SSL VPN,很可能是IPsec,L2TP和PPTP这种基于GRE tunnel的VPN(也有基于其他类型的tunnel 比如ip-ip 或者根本就在tunnel里的,但典型的,是基于GRE tunnel的)。

那么接下来比较一下tunnel-based VPN和SSL VPN。

SSL VPN 的最大好处就是天生可以穿越NAT。因为SSL工作在TCP/UDP之上,有端口号,可以被NAT复用。SSL非常适合远程登陆,也就是client-gateway模式。要知道你在家里面上VPN一般来说肯定是要经过你们家路由器的NAT的,在这方面SSL有先天的优势。缺点也很明显,SSL/TCP VPN本身有TCP melt down的问题(简单的说就是性能太差),web SSL只适合与访问网站。DTLS即SSL/UDP倒是一个方向。

而tunnel-based VPN 穿越NAT需要有专门的feature,比如IPsec有NAT-T。即把数据报文包裹在UDP:4500包里面而不是简单的GRE tunnel,当然如果这么做,其实和DTLS就有点像了。tunnel VPN因为在处理包的时候只看到IP的头(顶多再看看UDP的8字节头部),而且数据通道是无状态的,因此速度特别快。我这么说并没有考虑加解密的开销,因为无论是SSL VPN还是tunnel VPN,加解密现在一般都是专门的硬件来做了。

至于面向远程用户的易用性,SSL VPN除非是client-less模式(应用并不是很多),还是要安装客户端,反而tunnel VPN在主流的操作系统上native支持。比如MAC支持IPsec,LT2P,PPTP,Andorid支持PPTP和L2TP,等等。

因此对于远程登录用户来说,现在SSL相比较Tunnel VPN并无明显优势。
但是有一个优势SSL VPN的一个分支也就是sshd proxy这种技术门槛比较低,一般的用户很容易就可以学会用sshd来搭一个转发服务器。

至于企业用户,tunnel VPN的优势就太大了。像IPSEC的企业网技术远远不是SSL VPN所能达到。比如DMVPN,GETVPN。而且企业网更注重性能。

运营商级别的就不谈了。

所以SSL的应用,现在还不能和tunnel-based VPN相比。

— 完 —
本文作者: lookwatchsee

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

此问题还有 7 个回答,查看全部。
延伸阅读:
市面上购买的VPN加速 和 SSH搭建 哪个速度快 稳定?
如何用 VPS 配置成 SSH 代理服务器?
Viewing all 15843 articles
Browse latest View live


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