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

JQUERY仿百度谷歌智能提示

$
0
0

  若使用jquery智能提示,则主要使用Ajax动态调用后台。
  仿百度谷歌智能提示,说实话,本篇博客仿的不太缜密,有待继续完善。
  仿百度谷歌智能提示,思路主要如下:
  1.后台根据前台传递的参数进行匹配,提供数据列表。
  2.前台美观智能展示选择数据列表
  
  声明:此篇博客的后台是假数据,没有搭建数据库进行匹配。
  
  来一张目前功能截图:
  鼠标控制:
  
  键盘控制:
  
  选中之后:
  
 思路:【重点前台】
  1.  监听输入框值变化,然后动态生成显示列表【仿】
  2.  显示列表中绑定各种事件(鼠标移近、移除、单击【仿】
  3.  文本框聚焦以及失焦状态【仿】
  4.  文本框单击状态【仿】
  5.  文本框对方向键的控制【仿】
 详细的说明都在js注释中。
 
 后台servlet代码:
package com.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        response.setContentType("text/xml;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String key = request.getParameter("key");
        	System.out.println(key+"----------->");
            StringBuilder results = new StringBuilder();
            results.append("<results>");
            results.append("<result key='a1' count='07' ></result>");
            results.append("<result key='a2' count='11' ></result>");
            results.append("<result key='a3' count='18' ></result>");
            results.append("<result key='a4' count='19' ></result>");
            results.append("<result key='a5' count='21' ></result>");
            results.append("<result key='a6' count='31' ></result>");
            results.append("<result key='a7' count='41' ></result>");
            results.append("<result key='a8' count='51' ></result>");
            results.append("</results>");
            out.print(results.toString());
        out.flush();
        out.close();
	}
}
  模拟访问代码:
package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AccessServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	 String jspkey=request.getParameter("key");
	 System.out.println("jsp..param..key..."+jspkey);
	 PrintWriter ps=response.getWriter();
	 ps.println("successful,you put the key is "+jspkey);
	}
}
  前台QUERY代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><style type="text/css">

#kw1 {
	width: 529px;
	height: 20px;
	padding: 11px 7px 7px;
	font: 16px arial;
	border: 1px solid #b8b8b8;
	outline: none
}

.btn {
	width: 105px;
	height: 40px;
	padding: 0;
	padding-top: 2px;
	border: 0;
	background-position: -464px -42px;
	background-color: #e6e6e6;
	cursor: pointer;
	font-size: 16px
}
.showresult{
   border: 1px solid #b8b8b8;
   padding: 11px 7px 7px;
   width: 529px;
   margin-left:100px;
   display:none;
   font: 16px arial;
}
.showresultnew{
   border: 1px solid #b8b8b8;
   padding: 11px 7px 7px;
   width: 529px;
   margin-left:99.9px;
   display:block;
   font: 16px arial;
}
input::-ms-clear{display:none;}
</style><script type="text/javascript" src="JS/jquery-1.4.2.min.js"></script></head><script type="text/javascript">
var line = 0;
var oldvalue=$("#kw1").val();//保留最初的输入值
$(function(){
	    // 38 上  40下 13 回车
	  $("#kw1").keydown(function(){
		  if(event.keyCode==13){
			  //若选择的结果与最初输入的结果一致则
			  //模糊匹配框收起来,是通过css样式显示隐藏控制,并且把显示结果的div清空,每次都再重新创建
			  hideresult();
			  clearresult();
			  if($("#kw1").val()==""){
				  alert("warning,the key can't be empty");
				  return;
			  }
			  //随意的查询url,模拟百度或谷歌搜索具体的东西
			  $.get("access",{key:$("#kw1").val()},function(responseinfo){
				  $("#responseinfo").html(responseinfo);
			  });
		  }else if(event.keyCode == 40){  //方向键下移
              $("table tbody tr").eq(line)
                  .css("backgroundColor", "gray") 
                  .css("color", "white");  //这是选中状态、白字蓝底
              $("table tbody tr").eq(line < 0 ? 0 : line - 1)
                  .css("backgroundColor", "white")
                  .css("color", "black");  //非选中状态、 黑字白底
              if(line==$("table tbody tr").length){
            	  $("#kw1").val(oldvalue);
            	  line=0;
            	  return;                //若下移键移动到最后一个,那么搜索框中的值恢复成原来的输入值,类似百度谷歌
            	                         //若下移键移动到最后一个,那么把下次line值从头再来,即line=0
            	                         //注意必须有个return,否则程序继续前进,显示结果有误
              }else{
            	  line=line+1;          //若下移键没有移动到最后一个,那么记录下一个line值
              }
              $("#kw1").val($("table tbody tr").eq(line-1).find("td").eq(0).html());//搜索框中值跟着下移键选择而变化,类似百度谷歌
          }else if(event.keyCode==38){  //方向键上移
        	  if(line==0){                       //若上移到第一个,那么搜索框中的值恢复到原来的输入值,类似百度谷歌
                  $("table tbody tr").eq(line)
                  .css("backgroundColor", "white")  //其实就是把已经选中的记录恢复成非选中状态,否则变成搜索框值=原来值,但是第一条依然处于选中状态
                  .css("color", "black");
            	  $("#kw1").val(oldvalue);
            	  line=$("table tbody tr").length;  //若上移到第一个,那么把下移line值变成table最后一个tr,即line=table tr .length
            	  return;
        	  }else{
        		  line=line-1;
        	  }
              $("table tbody tr").eq(line)
                  .css("backgroundColor", "gray")
                  .css("color", "white");           //选中状态
              $("table tbody tr").eq(line > $("table tbody tr").length ? 0 : line + 1)
                  .css("backgroundColor", "white")
                  .css("color", "black");          //非选中状态

              $("#kw1").val($("table tbody tr").eq(line).find("td").eq(0).html());//搜索框中值跟着下移键选择而变化,类似百度谷歌
          }
	  });
	  //确定搜索、button事件
	  $("#su1").click(function(){
		  if($("#kw1").val()==""){
			  alert("warning,the key can't be empty");
			  return;
		  }
		  $.get("access",{key:$("#kw1").val()},function(responseinfo){
			  $("#responseinfo").html(responseinfo);
		  });
	  });
	  //不断监听文本框事件,注意:必须写input,否则ie11不执行,以为propertychange不兼容导致的
	  $("#kw1").bind("input propertychange", function(){
		  oldvalue=$("#kw1").val();
		  clearresult();
		  if($("#kw1").val()==""){
			  //模糊匹配框收起来
			  hideresult();
		  }else{
			  showresult();//显示框
			  //动态生成table
			  dymictable();
	  }
	  });
	  //文本框失去焦点
	  $("#kw1").blur(function(){
		  //模糊匹配框收起来
          hideresult();
		  clearresult();
	  });
	  //文本框focus事件
	 $("#kw1").focus(function(){
		  clearresult();
		  //若文本框没有内容,则模糊匹配框收起来,否则显示模糊匹配结果
		  if($("#kw1").val()==""){
			  //模糊匹配框收起来
			  hideresult();
		  }else{
			  //显示模糊匹配框
			  showresult();
			  //动态生成table
			  dymictable();
			  }
	  });
	  //文本框点击事件,类似百度、谷歌
	  $("#kw1").click(function(){
		  clearresult();
		  //若文本框没有内容,则模糊匹配框收起来,否则显示模糊匹配结果
		  if($("#kw1").val()==""){
			  //模糊匹配框收起来
			  hideresult();
		  }else{
			  //显示模糊匹配框
			  showresult();
			  //动态生成table
		      dymictable();
			  }
	  });
	  
});
/**
 * 清空div中显示后台结果的table,程序中每次都是重新创建生成的
 */
function clearresult(){
	$("#showresult").html("");
	line=0; //主要是用来控制方向键选择记录的
}
/**
 * 通过css来隐藏查询的结果,并且程序中每次都是重新创建生成查询结果的
 */
function hideresult(){
	 $("#showresult").removeClass("showresultnew");
	 $("#showresult").addClass("showresult");
}
/**
 * 通过css来显示查询的结果,并且程序中每次都是重新创建生成查询结果的
 */
function showresult(){
	  $("#showresult").removeClass("showresult");
	  $("#showresult").addClass("showresultnew");
	  clearinfo();//清空界面返回提示信息
}
/**
 * 动态生成table,显示结果
 */
function dymictable(){
	  var d_table=$("<table id='testtable' width='100%'</table>")//动态显示结果
	  .attr("cellspacing","0");
	  $.get("testinstant.do",{key:$("#kw1").val()},function(xml){
	        $(xml).find("results result").each(function(){
	        	var d_key=$(this).attr("key");
	        	var d_count=$(this).attr("count");
	        	var d_tr=$("<tr></tr>").css("cursor","pointer").mouseover(function(){
	        		$(this).css("backgroundColor", "gray").css("color", "white");
	        	}).mouseout(function(){
	        		$(this).css("backgroundColor", "white").css("color", "black");
	        	}).mousedown(function(){ //鼠标选中,则银行显示框以及直接搜索,类似百度谷歌
	        		$("#kw1").val(d_key);
	        		//收缩
	                hideresult();
	                clearresult();
	                //直接搜索,类似百度谷歌
	  			    $.get("access",{key:$("#kw1").val()},function(responseinfo){
					  $("#responseinfo").html(responseinfo);
				  });
	        	});
	        	var d_td_key=$("<td></td>")
	        	.attr("width","20%")
	        	.attr("style","text-align:left")
	        	.html(d_key);
	        	var d_td_count=$("<td></td>")
	        	.attr("width","80%")
	        	.attr("style","text-align:right")
	        	.html("查询出个数:"+d_count+"记录");
	            d_tr.append(d_td_key);
	            d_tr.append(d_td_count);
	            d_table.append(d_tr);
	            $("#showresult").append(d_table);
	        });
  });
}
/**
 * clear response info
 */
function clearinfo(){
	$("#responseinfo").html("");
}</script><body>
自动搜索框:
<input name="wd" id="kw1"  type="text" maxlength="100"  ><input class="btn" id="su1" type="button" value="搜搜" ><span id="responseinfo"></span><div id="showresult" class="showresult"></div></body></html>
  至于web.xml配置servlet就不再赘述了,下载代码测试,欢迎拍砖。



作者:llhhyy1989 发表于2014-7-1 20:16:09 原文链接
阅读:0 评论:0 查看评论

解除 Linux 系统的最大进程数和最大文件打开数限制

$
0
0

ulimit用于shell启动进程所占用的资源

1、类别:

shell内建命令

2、语法格式:

ulimit [-acdfHlmnpsStvw] [size]

3、参数介绍:

-H 设置硬件资源限制.

-S 设置软件资源限制.

-a 显示当前所有的资源限制.

-c size:设置core文件的最大值.单位:blocks

-d size:设置数据段的最大值.单位:kbytes

-f size:设置创建文件的最大值.单位:blocks

-l size:设置在内存中锁定进程的最大值.单位:kbytes

-m size:设置可以使用的常驻内存的最大值.单位:kbytes

-n size:设置内核可以同时打开的文件描述符的最大值.单位:n

-p size:设置管道缓冲区的最大值.单位:kbytes

-s size:设置堆栈的最大值.单位:kbytes

-t size:设置CPU使用时间的最大上限.单位:seconds

-v size:设置虚拟内存的最大值.单位:kbytes

-u number:设置用户最大进程数 (max user processes)

4、Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:

ulimit -u 10000

5、对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。将每个进程可以打开的文件数目加大到4096,缺省为1024。

ulimit -n 4096 

6、其他建议设置成无限制(unlimited)的一些重要设置是:

数据段长度:ulimit -d unlimited

最大内存大小:ulimit -m unlimited

堆栈大小:ulimit -s unlimited

CPU 时间:ulimit -t unlimited

虚拟内存:ulimit -v unlimited

7、解除 Linux 系统的最大进程数和最大文件打开数限制:

    

1)vi /etc/security/limits.conf,添加如下的行

*   soft noproc   11000
*   hard noproc   11000
*   soft nofile   4100
*   hard nofile   4100

 说明:* 代表针对所有用户

noproc 是代表最大进程数

nofile 是代表最大文件打开数

 

2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:

a、vi /etc/ssh/sshd_config

把 UserLogin 的值改为 yes,并把 # 注释去掉

b、重启 sshd 服务:  

 /etc/init.d/sshd restart

 

 

3)、修改所有 linux 用户的环境变量文件:

vi /etc/profile

ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited

 

        4)、生效         

source   /etc/profile

 

 



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


ITeye推荐



如何评价 Android L?

$
0
0
首先,向那些不完全为了利益,而是为了“让这个世界更美好、推动这个世界发展“的公司点个赞。

我认为之前最让Google焦头烂额的,是面对iOS7的压力。iOS7力推扁平化,并在推出后半年内得到了93%的安装率-我还记得6月2号Cook在WWDC上嘲讽Android的时候的表情。iOS7的恐怖之处在于什么呢?人们按序就班的按照iOS7-Design Resources来一笔一划的做设计,我们回头看看Android,在Android上,按照Android设计规范来设计的应用,真的只能叫一个应用,你很难看到亮点,如果我让你举出一个好用的邮箱软件,可能除了Gmail,很难找出第二个应用。甚至还有部分应用采取了iOS+Android的设计出现在Android机器上,你就知道,设计师面对这个系统的时候,有多么的无奈了。人们抑制不住心里Do something innovate,就像你要求一个有创造力的、随性的人每天朝九晚五的去上班一样,你是在抹杀创造力。

面对iOS7的成功,Google压力一定是巨大的。他的很多产品是以工程师思想去做设计,去做产品,所以很多工程师出身的人可能会觉得非常好用,但总觉得少了点什么—少了点什么呢?细腻的感情。细腻的感情是什么呢?你用iOS系统,打开设置或者任何界面,在内容边界的时候向下拉,是可以拉的,但是已经没有任何内容呈现了—系统给你反馈,它到头了。Android是怎么表现呢?蓝光提示。就像漆黑的夜里,你在一个原始森林里,不断的寻找出去的路,走到一个地方,前面有人用强光手电筒幌你的眼,”嘿,哥们,站住,这里不准通行“。就是这种感觉。
我们来说说L,说说Material。定语是,我认为这是Google出的指向性最强的、最统一的、应该在出现的时候出现的东西。他恰好的避开了iOS7,并让iOS7陷入了一个尴尬的处境—iOS8已经发布了,需要再弥补东西,就到9了。

Material回到了最原始的拟物化设计,回归到了大自然。所有的动态交互你会觉得非常自然。但是为什么自然?说不出来,就是觉得舒服。我认为,material很多交互设计,概括的说,就是大自然的规律。渐变的效果,想想原始森林里的花开的时候,想想蛇蜕皮的时候,都是线状叠加,而不是突然发生的。比如这个, Meaningful Transitions Hierarchical-Timing里的For example这个效果,就是我们所说的线性渐变效果。

通过L,我们应该看到一些变化,Google正在从一个工程师做产品的方向,慢慢到了“一个产品应有的样子”。工程师们将变得更具有审美,也更感性,而不是觉得有没有交互都一样,只要结果一样就OK。我认为,Google这次所做的改变,会影响到非常深远的未来,并潜移默化。或者我们这样说,不是工程师变得更加感性,而是更多感性的人会参与进来,开始写代码,未来人人都会有自己的应用。你有一个好的idea,自己就可以实现,无需找工程师。相比人人都是产品经理,我觉得人人都是程序员来得更靠谱一点。前提是这些Make world better的公司,联手推动程序的开发,让开发变的像搭积木一样简单—别说天方夜谭,想想这几年主流语言的变迁和进化。十年后,你在咖啡厅里能看到一个演员为投资人演示自己的粉丝App,在地铁里看到一个学生用自己做的App解决作业问题,一个小姐用自己的App对客户进行排序,就在未来。

这是一个好的开始。

— 完 —
本文作者: 吴岸城

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

此问题还有 12 个回答,查看全部。
延伸阅读:
那些没有 Google 账户的人都是如何使用 Android 手机的?
Google 打算怎么处理 Chrome for Android?

提高Axure设计效率的10条建议

$
0
0

Axure 是创建软件原型的快速有力的工具。上手很容易,但是,其中存在一个危险。这款软件是如此的直观以至于很多用户可以在没有接受过任何正式培训的情况下进行使用。他们可能不知道的是他们可能没有以恰当的方式来使用 Axure。

作为一位有经验的用户体验设计师,我很少在画一页的时候第一次就能把它设计正确。大部分时候,我要经历5到10次的反复迭代(iterations)。当你的用户体验设计是用来作为敏捷项目(agile project)的蓝图,那你可能需要在项目周期内跟上整个项目。有时候,这些变化将会影响到十几页或是更多的设计页。正是在这种情况下,Axure 的一些不太明显的特征可以为设计师节省巨大的时间。

我一般在团队中的工作是创建线框图和原型。为此,我会使用Axure 中的「共享项目」功能(在Axure 7中叫做「团队项目」)。能多人实时协同设计一个项目是我最喜欢Axure 的地方,但它的确要求简洁的和结构化的工作方式。毫无疑问,你将会发现别人正在你设计过的设计稿上工作,或者你正在别人的设计稿上工作。我已经把这些使用Axure的准则记在了心里,因为那是我现在工作的工具,而且我相信这些建议也同样适用于其它软件工具。

从长远角度来看,我认为我提出的这10条建议是节约时间的重要方法(crucial techniques)。这种工作方式并不总是在短期内体现它的优势,但是它确实可以比正常情况更加具有灵活性(But it does allow for optimal flexibility further down the line.)。

一、用一个控件就可以完成的事永远不要用两个控件

我看到的最浪费时间的行为是 Axure 的初级和高级用户都在使用不必要的控件。我发现自己仍然在犯这个错误,所以必须不断提醒自己这是第一条准则。每一个你添加到项目中的控件,当在未来需要改变时都要耗费更多的工作时间。所有这些工作在经过十次迭代后会逐渐增加。举个简单的例子,两个在视觉上完全一样的对象怎样能够用不同的方式被建立起来呢?

1

 

上面两个例子说明了一种情况,即有些人使用一个文本标签加一个按钮这种分离式的控件。当这个人想对整个对象添加 OnClick 事件的时候,他们有两种选择。第一个方法是在整个部件上添加一个热区,这种方法使得三个控件都需要被维护。第二种方法是为每一个元素添加一个 OnClick 的交互事件,这种方法使得两个交互动作需要被维护。

当部件需要被修改的时候,这两种方式都会花费不必要的时间。一个更为简单的方法是通过在矩形框上添加文字的方式来创建对象。

2

那么你的文字可以使用「对齐和填充」工具栏进行调整位置。你现在只有一个控件需要维护而且只需要一个交互事件。

3

二、不要复制对象,而是把对象转成母版

当我发现自己处在一个设计阶段的后期且我们需要改变每一页主导航的时候,我体验了巨大的喜悦。不是因为我喜欢一大堆(a big pile of)的重复性工作,而是因为我所要做的仅仅只是编辑单个母版,然后很快(presto)整个项目就被更新了。

为主导航使用母版似乎是相当平淡无奇的,但是创建一个母版是值得的,当你使用任何操作超过一次的时候。无论何时你发现自己一直在复制和粘贴一组控件,永远记住,创建一个母版可能是更好的选择。

5

创建了母版后,例如上面的产品展示图 "tile" ,如果你决定改变按钮上的文字为 "Buy now" ,你将只需要编辑一次,然后发现模板中的每个实例都发生了改变。

6

记住,不要把太大的组合对象变成母版。越是大的组合对象,越是有可能需要在母版的很多地方做出修改。把一些母版和另外一个母版合并起来一般会是更好的办法。当你只需要在一个母版中做些改变的时候这种方法就变得很方便。也就是说一些元素一直被包含而其它一些元素一直要变化,比如下图:

7这个基础母板没有包含价格的信息,但是它可以结合另外一个母版来为所有的产品展示图创建新的母版。

8

三、在创建母版之前要设置好样式(Place Styles)

母版对于创建需要重复利用的元素是很好的,但它们不允许变化。一个母版的每个实例都是一模一样的。这个时候样式来了。假设你有一个按钮需要被复制到多个页面,但在按钮上的标签需要修改,样式可以帮你很容易地完成。每个按钮的属性可以通过样式去设置,你需要做的就是修改文本标签。

12

 

按钮的作用往往是增加鼠标悬停等相关事件。在 Axure 中,这些事件往往通过使用动态面板来创建。不同的状态被放置在不同的动态面板和脚本中。然而,使用这种方法你将要进入每个动态面板的状态来修改这个按钮。

一个更快的方式来处理按钮的事件是使用「交互样式」对话框。使用这个功能,仅仅需要为不同的事件状态设置不同的样式(With this feature, simply set different styles for each behavior state),然后只需要复制按钮和设置大小一次。

10

11

提示:可以在按钮上使用在 Axure 7中介绍的「自动适应宽度」的功能。如果你在样式中使用了左右填充的功能,你要修改的是仅仅是按钮的文本,然后按钮的大小会自动适应。

11-1

四、保持项目的组织性和命名的清晰性

Axure提供了许多选项来保持项目的组织性。你放置在页面上的每个元素都拥有独一无二的命名。页面可以被命名然后组织成一个树状结构。例如母版可以被命名然后在文件夹中排序等等。但是为什么要花费力气来给每个对象一个清晰的命名呢?

1)保持东西的组织性

当你有一个精心制作的网页,然后你想通过动态面板来创建一个交互,你将不得不通过一长列表的元素来找到你想要的那个。你可以使用搜索框——但这只是在你已经考虑周到地为你的项目命了名的情况下。

2)允许团队成员介入

可能像我一样,你在团队中,你的项目总是会发生意料之外的事情。你或你的同事可能会生病或意外地必须工作在另一个项目中。至关重要的地方是这个项目建立得非常清晰以至于他人可以顺利地介入然后接管事务。由其他人添加的交互事件可以完成得特别复杂。

3)可以和第三方分享

一般我参与的项目中,我的线框图至少需要和10位同事分享。有些人会坐在我桌旁,然后我可以指导他们。其他人,我们永远不会见面,然后我不知道他们对线框图的理解情况。理想状态下,一个原型应该是清晰易懂不需要解释的(viewable autonomously)。

我会做如下的事情来完成任务。

1)创建一个登录页面

12

 

2)给页面一个独一无二的、可以自我解释的命名

如果页面的命名是清晰的而且说明了每个页面的内容,那么这个原型将更容易理解。人们也会在以后的交流中使用这些名称。举个例子,如果一位平面设计师基于你的设计做出了一份样稿(comp),他们可能像你一样为页面使用相同的命名。如果一个页面的名称不是独一无二的,那么将会出现一个页面有两个不同的名字。

3)创建最常见的流程图

大多数的人不把设计页做成树状结构,他们喜欢根据活动流程图来设计。你可以在 Axure 中创建流程图来反应重要的用户流程,并且链接到相关页面。然后你会提供额外的方式浏览原型。(流程图上的名称是基于那些站点地图的名称。因此,你是否命名清楚就变得很重要了。)
13

 

五、养成使用全局辅助线和网格的习惯

Axure 允许用户创建两种辅助线:一种是局部辅助线,只存在于一个页面上,一种是全局辅助线,存在于全部的页面上。辅助线可以使用「创建辅助线」对话框来设置。例如,如果你设置了一个960px 的网格,然后再在不同的页面定位元素就变得容易多了。与此同时,你的团队成员将在一个共享项目中看到这些全局辅助线。

14

 

使用网格可以帮助你保持设计的整洁和结构化。我经常设置我的网格是10×10px ,然后以10的倍数的尺寸来创建我的对象。例如,60×20像素的按钮,而不是55×18像素。当你把这些对象放在网格上的时候,一切变得更容易对齐了,而且可以满足你的任何强迫症。当然,允许那些需要不同尺寸的特殊对象偏离网格。

提示:在Axure 7中,你可以为移动端和网页端建立不同的全局辅助线。下面是我喜欢用的一个移动端网格的应用实例:

15

 

六、不要忘记导入功能

在大多数项目中,人们制作的元素对其他项目也都是有用的。不需要重新发明轮子,而是重复使用那些在过去工作中使用过的元素。许多基础的东西在整个项目中都要保持一致,例如样式,辅助线和母版。虽然复制粘贴一个项目从这一个 .rp 文件到另一个 .rp 文件是可以的,但并不是所有的信息都会在。当你粘贴一个具有独特风格的按钮,样式并不会跟着一起粘贴过去。

重复使用元素的最好方法就是使用超强的导入功能。这使您可以导入页面和母版,还有样式和辅助线。

16

提示:创建一个「母的」.rp 文件来导入新的项目,在那儿你可以保持标准的母版。

七、要保留网页的旧版本

我经常发现自己需要回到一个项目的一个旧版本。在过去的日子里,我经常需要在Visio中创建线框图,管理有很多页面的项目是困难的,所以我最终会丢失页面。

在Axure中,追踪旧版本是容易的。仅仅是创建一个命名为 "Bin" 的文件夹(或者在Axure 6.5 或更早的版本中创建一个页面)。

17

 

把旧版本的页面放在那儿,以便于当你需要及时返回去的时候能很容易找到。当需要导出的时候,只要选择部分就行了,不需要全选页面。这样的话,你可以向您的客户分享一个简洁的版本,而且旧版本任然可以被直接访问。

18

八、不要设计不必要的交互动作

Axure 的初始用户通常对Axure 可以很轻松地将交互动作添加到原型中留下深刻印象。一开始的时候,我忍不住对我创建的每一页添加交互动作。然而,在许多情况下,我可以清楚地传达设计而不需要任何交互——仅仅是静态图像。现在,我只会对下面这些问题当中有一个回答"Yes"的时候才增加交互动作。

1. 「我确实要交互动作才能明确无误地表达我的设计吗?」

如果你提供的仅仅是静态图像而没有交互元素的时候,你的设计会被错误理解吗?这可能是一个需要依赖于一定的动画才能被理解的情况。

2. 「从长远角度来看,这个交互设计节省时间吗?」

创建一个元素的交互会比展示不同页面的不同状态更快吗?比如,创建和维护一个交互式网页的标签会比为每个页面创建多个标签更容易。

3. 「我需要说服某些人一些交互元素的概念吗?」

我拿出了一个我认为是问题的最佳的解决方案,但我知道这个方案很难被推进发展,那么我需要别人支持我的想法。我发现做交互原型可以帮助我传播想法。

但是,如果所有这些问题的答案是否定的,那么我宁愿去创建仅仅显示一个交互元素不同状态的多个版本。

九、要使用字体图标(Icon Font)而不是图片

另一个简单的但经常被忽视的保持 Axure 项目可管理性的方式是使图片的数量最小化。在一个原型中想要改变一个图片的颜色,你就不得不经过好几个步骤。你需要打开一个图片编辑器,对图片进行更改,再导出一个新的位图,最后导入您的 Axure 项目。

另一个选择是使用一个字体图标。一,你可以在 Axure 中改变颜色和图标的比例。一个很棒的基本的字体图标资源站是  http://copypastecharacter.com/ ,它的图标在很多平台上都能立即使用。

19

 

对于字体图标,你可以在一个按钮上添加一个图形,但是任然需要听从第一条建议。

十、在浏览器或是设备上预览原型

如果设计师得知他们的原型在 Axure 中和在浏览器中看到的不一样时,他们会感到沮丧的。尤其是文字的间距和位置不一样。更糟糕的是,它们在不同的浏览器中显示得也不一样。为避免差错,你需要在浏览器中不断地预览你的原型,如果是移动端原型则在设备上预览。

即使你永远不能消除 Axure 和浏览器之间所有的差异,下面有一些减小差异的方法。

文字环绕

下面是文字如何环绕:

20

 

下面显示浏览器如何文本换行:

21

 

为了防止文本框从环绕变成到了下一行,请确保你的文本框有足够的冗余空间。最安全的方法就是给文本框可能需要的足够大的空间。因此,如果将来你需要编辑这个文本,你将不需要改变文本框的大小,它将使用文字环绕的方式。

垂直间距

垂直间距可以看出浏览器和 Axure 之间的不同。你可以在 Axure 里微调间距,直到你发现文本在浏览器中看起来很好,但是这是相当努力然后换来了一个不确定的结果。确定文本位置的唯一方法就是要么 break up the copy into chunks ,要么把文字转换成图形。不幸的是,第一个选择打破了第一条建议,然而有时候它是不可避免的。

总结

从短期来看,这些建议很少能显示出效果,但是从长远来看,它有很多好处。也许更重要的是,缩短工作时间能使你工作更快乐。

我希望这些建议像对我一样对你们也是有帮助的。我相信,有人会认为其他的一些规则会更重要,我们很乐意听到它们,所以请在下面的评论框发表您的想法。

如果你还没有 Axure 的话,试试 Axure 7 测试版。一些变化真的有助于保持工作的组织性。

最后一点:这些规则,像任何其他的规则一样,是用来被打破的。不要让它们影响你的工作。聪明的设计师们,我们需要知道何时打破规则。

本文由 @沈晓马 原创翻译,转载请注明出处并保留本文链接

原文地址: The Ten Commandments Of Efficient Design In Axure


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

TokuMX使用小计

$
0
0

最近因为工作的缘故,接触了 TokuMX,尝试下来感觉不错,值得介绍给大家。

事情的起因是要解决MongoDB的问题。系统中需要保存程序输出的运行信息,这类信息比程序语言的log更高级,比明确的操作日志更低级,却是某些时候发现问题的关键证据,所以必须保存下来。因为其格式不规范,又需要方便检索,综合下来文档型NoSQL的MongoDB是比较好的选择。

但是选择MongoDB就必然会面对磁盘消耗的问题。我们拿到的数据大概是这样的:每天的数据量不到200万条,平均数据的大小不超过4k,但MongoDB存一个月的数据就需要接近40G,最近三个月的数据则需要接近100G。限于原有硬件环境,只能保存最近三个月的数据,但业务又需要保存至少一年的数据,所以必须另想办法。

最终我们选定的方案是TokuMX。它是一款开源的、高性能的MongoDB发布(distribution),在提供与MongoDB完全兼容的客户端、API的同时,号称可以减少90%的存储空间,同时提供20倍的性能提升。我也了解到,已经有一些生产系统在使用TokuMX,反馈不错。

经过我的测试,用MongoDB需要102G的数据,采用默认的zlib压缩方式导入TokuMX之后,只有481MB,同时,导入速度大大提高(至少有10倍的提高),而查询性能没有降低。这个对比是我不敢想像的,直接解决了现在的问题。

对着这份数据,我不免好奇TokuMX究竟使用了怎样的技术?就我现在的了解,减少磁盘空间占用主要是在存储层使用了压缩方式(TokuMX宣称,如果不使用压缩,TokuMX的磁盘占用也比MongoDB少10%左右)。这种思路不稀奇,5.x版本的MySQL,如果设定file_format为Barracuda,也可以直接对表做压缩,同时不影响外部操作;提高写入速度则值得一提,原来TokuMX的做法是使用 分形树索引(Fractal Tree Index),替代了所谓“已经有40年历史的B树索引”。

所谓“分形”,大略来说,指的是“事物的每一部分都近似整体缩小后的形状”。TokuMX的分形树索引,严格说起来更像“B树 + 批量写入”的技巧,与B树的不同在于,分形树的每个内部节点都带有自己的缓冲区,它存储尚未落实(pending)到叶子节点的数据,默认情况下写入只会到缓冲区,缓冲区填满之后会把所有的写操作刷(flush)下去。

Screen Shot 2014-07-01 at 8.44.02 PM

我顺手翻译了 TokuMX的一篇介绍文章,供大家参考。

参考资料:http://www.percona.com/live/london-2013/sessions/fractal-tree-indexes-theory-practice

请转给交管局长:中国的车祸为什么多?

$
0
0
    请转给交管局长:中国的车祸为什么多? 

    ?牧童 ?2014年6月3日 ?坐而论道 ?534 ?评论关闭 

    

    最近,一个好久不见的大学同学车祸去世, 他的小孩才3岁. 参加完葬礼, 想起小孩子挂满泪珠的小脸,  彻夜难寐.

    上百度一搜索,发现中国的车祸死亡率已经连续10多年保持世界第一. 我们以世界3%的汽车保有量,  制造了全球16%的死亡人数. 中国已经成为世界上开车最危险的地方.

    大多数网友都把车祸多的原因归咎为中国司机素质低,开车不规矩. 我强烈反对这种”素质论”.  本人在中国出生,长大, 大学毕业后去美国读硕士, 在美国考的车牌, 后由于工作原因,跑了不少国家, 在香港,日本,意大利,墨西哥,泰国, 菲律宾都开过车.  我认为中国的车祸多, 最主要的原因是整个交通管理的理念落后.

    我从来不觉得美国人的素质比中国人高很多。你看过新奥尔良风灾的照片吗?美国的大兵是带着冲锋枪去灾区救援的。如果他们不带枪,当地就会有人打砸抢。汶川地震时解放军有带枪吗?

    我国城市每万辆车死亡率是美国的17.8倍,我们的素质会比他们差17.8倍吗?“素质论”掩盖了车祸多的真正原因,也撇清了交管部门的责任。

    要拯救我们身边将要在车祸中丧生或受伤的亲人和朋友,  最可行和最快的方法是改革中国的交通管理的理念和体系. 交通管理和工厂管理一样,本质上是一门科学. 中国的工厂可以引进国外先进的管理经验,  为什么交通管理不能引进别人的经验?

    以下是我在国外和国内开车的一些体会, 供大家参考:

    1) 在美国学车的时候, 教车师傅第一课就告诉我, 后方45度左右的地方是左右后视镜的盲点.  如果超车后换线,必须要略转一下头, 以眼角的余光确保盲点位置没有车才能换线. 如果你跟在别人的车后面,最好不要长时间呆在前车的盲区,  以免对方看不见你而突然转向。

    这个盲区,所有欧美国家的司机都知道. 我问过南美和东南亚等所谓”第三世界国家”的朋友,他们也都知道,  并且很惊讶我问他们这个问题. 在他们看来,这就跟天是蓝的, 草是绿的一样,每个人都应该知道。

    在中国, 我们交学费去驾校学车,教车师傅有教过你盲点吗? 没有, 因为他们的师傅也没有教过他们.  我们只能自己从车祸中以血的代价来领会。

    2) 中国的交通要改善,驾校是第一个要动刀的地方。我再说两个例子:

    a.  在美国超车后换线,师傅会告诉你,在后视镜中看到了后车的前轮才可以换线。这种方法可操作性很强。但在中国没有人教这个,偶而有师傅教的话也只是说50米或60米。在后视镜中你怎么能知道50米有多远呢?

    b. 关于远光灯,所有的美国司机都知道,起雾时不要打远光灯,因为反而看不清楚;

    另外,不到万不得已不要乱开远光灯,如果你干扰了对面车司机的视线,撞到你了是自己倒霉。

    中国的教车师傅不教这些, 他们老是强调要眼明手快,好像只有反应快才能在路上活下来.  基本的安全知识反而不教。

    3)在美国, 如果高速公路上发生车祸, 交/警至少在200米以外就在地上放置冷光蜡烛(防风),  提醒你换线, 冷光蜡烛连成一条长长的火光斜线, 后方的司机有非常足够的时间避开故障区.

    而在中国,交警顶多在几十米开外放一个荧光的警示牌, 等你看到了, 离故障车也就剩下几秒钟的反应时间.  三角标志和雪糕筒都是很不科学的装备,天黑的时候不够显眼,体积又太大,交警和司机都不可能带太多。直接放在路中间的话容易造成车祸,放在路边又容易被忽视。强烈建议中国的交管部门研究和引进西方的冷光蜡烛。体积小,不占地方,使用方便,直接扔在路上就行,万一不小心碾过了一两个也不用刹车。

    如果我们也采取欧美一样的故障警示方式, 每年能救下多少人命? 别的地方我不知道,在广东,  这几年仅在京珠高速和虎门大桥上因为故障处理车追尾就牺牲了5位交警。

    4)在中国,交管部门喜欢在车道中的隔离带建花坛,  有些地方甚至连高速公路的隔离带也有花坛。这种做法全世界只有中国有。为什么别的国家不搞? 别人是有道理的。花坛建在路中间容易让司机分神, 用隔离栏最实用,还便宜.  另外,花坛需要定时修剪和浇水. 在维护的时候,停在路边的园林车, 还有缓慢行驶的洒水车都很容易造成追尾。要美化市容,花坛可以建在路边。如果中间一定要种花草,  能不能采用不需修剪和免浇水的品种?

    5)我回国已经10年了,在国内也开了10年车。我跟普通的中国司机一样,偶尔图方便也会犯犯规,比如双黄线左转等等。但在国外就不敢。我觉得我的个人素质没变(普通人一个),之所以在国内乱开车,在国外小心谨慎,是因为国外违规的成本远比国内高。以我在美国开车的经验为例,感觉上每违规10次,至少会被交警逮到1次。有一次在三藩市郊外,凌晨两点在65英里的高速上开到80英里也被警车拦住罚款。美国的交警大都是流动执法,会从任何一个地方冒出来,让你不敢心存侥幸。反观国内,我们的交警很喜欢呆在十字路口。很多地方还让交警站在十字路口指挥交通。我一直没想明白,路口不是有交通灯吗?红灯停,绿灯走,清楚直白,为什么还要交警做复杂的动作去发相同的指示?中国交警编制增加的速度远远跟不上车辆,有限的警力还是应该用在刀刃上,十字路口还是交给红绿灯吧。

    6)最后我想强调一个观点,交通管理和其他领域的管理一样,是一门科学,需要以科学的态度去研究。美国有科研人员研究了全美事故率最高的10个十字路口,发现了一个普遍问题,这些十字路口的交通灯都不够高,不够多。如果前面是个货车,跟在后面的车就看不见交通灯变化,容易造成追尾。**按他们的研究对交通灯进行改良后,发现第二年事故减少了15%。如果这个研究结果正确的话,90%的中国红绿灯都有改善的空间,而且一改马上就能见效。这样每年能挽救多少人命,减少多少损失?这些成果别人都已经研究好了,都是公开发表的,不用专利费,我们只要拿来就可以了,为什么不做?国家每年这么多代表团出访,每年花这么多钱去引进技术,比如高铁。为什么没有人肯花时间去研究别人交通管理的先进经验?

    最后我想说的是,我的专业和工作和交通没有半点关系。我对交通管理的理解是一个普通驾驶者的粗浅理解。但我强烈反对以司机“素质差”来解释中国交通管理的落后。素质差的是我们交通的管理者,差的是管理的理念,而不是司机。

    如果我们每个人都认为中国的司机素质低,该死,***就没有做好工作的压力了。驾校发财了,交通局长升官了,我们自己很开心地给自己扣上“素质低”的帽子,最后还要把自己的命搭上。

    我们已经是“世界第一”了,该到改变的时候了。如果每一个人都置身事外,下一个出车祸的,可能就是我和你。

    (作者:网上转载很多,都没有注明出处。向原作者致谢。)

应试教育为何摧残人脑 短论之一

$
0
0
为什么应试教育摧残人脑?我们长期以来有这样的感受,但我现在要谈的是这一感受的心理学论证,至少,是我从心理学研究找到的论据。十几年前,《科学美国人》“脑科学”专号里有一篇关于“REM”(快速眼球转动)睡眠的研究报告。2000年,我在《读书》连载发表的纪念文章“释梦百年”里介绍过人类的睡眠周期,可以参阅。快速眼球转动的睡眠,是有梦的睡眠——我在那篇文章里也介绍了关于梦境的分类和科学研究,斯坦福大学梦研究室的“意识清醒的梦”研究报告,以及荣格的“有文化意义的”梦境的研究。REM sleep,普遍见于哺乳动物。我们知道,小白鼠走迷宫的能力远超人类。《科学美国人》1998年的那篇研究报告说,实验员连续几天剥夺小白鼠的快速眼球转动睡眠,小白鼠完全丧失了走迷宫的能力。究其原因,因为哺乳动物的脑,在快速眼球转动睡眠阶段,将白天生活中学到的“vital knowledge”从短期记忆转移到长期记忆里。记住,这个短语很关键,“生命攸关的知识”,例如小狮子扑咬猎物的技能,如果这类技能不能保存在长期记忆里,哺乳动物个体将难以生存。

人类比较高级,人类的脑不仅将生存竞争的生命攸关的知识从短期记忆转移到长期记忆中,而且获得了从理性脑的层次判断任一项知识是否“值得”转移到长期记忆的能力。典型的例子就是日常生活中我们查询一个电话号码,然后拨打电话,然后就忘记了这个电话号码,以后要用的时候,还要查询这个电话号码,但大多数人仍不会长期记住这个电话号码。甚至最重要的亲友的电话号码,如果手机有快捷键保存,我们也不愿意将这些知识保存在长期记忆里。总而言之,经济学原理,天下没有免费午餐。如果我们不愿轻易将短期记忆的内容转入长期记忆,那么一定是因为长期记忆很贵。

于是对人脑而言,何种知识进入长期记忆,往往取决于“意义”。只有那些被认为有意义的知识才保存在长期记忆里。坐在我的行为经济学课堂里的北京大学医学院的许多同学,他们当中的一名佼佼者是曾军,他告诉我,对他们而言,中国经济研究中心的课程根本不算什么困难,因为在医学院,期末考试期间同学相互询问的是:今天你背了几斤书?而在朗润园里,同学们相互只能询问:你复习了曼昆那本书的第八章吗?显然,医学院的同学远比我们中国经济研究中心的同学有更强的记忆力。但曾军立即补充:考试结束,我们立刻就忘记了这些知识的绝大部分,因为反正在毕业实习的医院里,可能被分配到任何一个不相干的科室,实习期满,又可能调入另一科室,总之对考试用到的知识绝不能当真。这就是意义,不能当真的知识没有意义,不值得保存在长期记忆里。

如果你是老师,并且你每年都挖空心思构想往年没有见过的期末考题,你就明白为什么学生在考试期间背诵的知识大多早已不是有意义的知识。应试教育在长期演变中逐渐成为红卫兵在文革期间激烈批判旧教育制度时描述的那样:“分、分,学生的命根,考、考,老师的法宝。”究其理由,学校之所以存在,是因为知识的极强烈的规模经济效益。一名教师可为许多(原则上无限多的)学生讲授同样的知识,而知识本身的真理性并不因为知道的人多就有所改变。可是学习的效果如何?通常,一名医生的诊治效果,短期内可由患者是否康复来判断。如果一名医生经手治死了许多患者,他很可能是一名糟糕的医生,当然他也很可能是一位医学权威,擅长于最难治的病。但是教育的效果孰优孰劣,短期很难判断,长期可以判断,例如,几十年之后,一名学生回顾自己的人生,可以认为最重要的一些知识来自童年的一位教师。学校之所以必须有考核,就是因为要缓解上述的矛盾。老师讲完了一门课程,学校要考核学生以推测老师的教学效果。如果一位老师的学生大多数不能有令人满意考试成绩,学校很可能解聘这位老师。理由很简单,天下没有免费午餐。

大致而言,应试教育的漫长演化,将老师与学生的关系塑造为典型的博弈关系(老师的法宝和学生的命根)。理性的学生,只能追求以最小努力得到预先设定的成绩,或以预先准备支付的努力获得尽可能高的分数。而理性的教师,只能追求以最小努力通过考试呈现出学生成绩的标准正态分布从而通过学校对教师的考核。如果学校发现某一教师呈交的考试成绩的正态分布远远偏离该校考试成绩正态分布的标准形状,很可能,学校将调查这位教师是否营私舞弊或玩忽职守。请你们写出标准的老师行为的数学模型,出现在考卷里的题目大致必须满足怎样的条件。结论是:这些考题通常不应是考生在往年考题里见过的。那么,世界上存在这样的不能重复见到的知识吗?如果存在,这样的知识必须是无意义的。

自古以来,生活和知识原本是融合的。中国的应试教育传统,汉代很弱,若从唐宋开始计算,至少千年的历史。这场千年博弈的严肃性,从历代对科场弊案的严厉惩罚即可确认。那时因科场弊案流放宁古塔的,常常是整个家族,或是要犯斩首,族人流放。凡长期而言重要却难以监督的行为,在中国历史上,总是以保甲连坐的方式惩罚。当然,这也是斯坦福大学经济学家格雷夫的研究结论。千年之后,生活和知识不再是融合的。首先因为现代生活需要太多现代知识,以致非有学校不可。其次因为学校考试演变为上述结局,故而考试所需的知识大多不重要而重要知识大多不考。

国外知名 IT 企业是如何做测试的?

$
0
0
那篇文章实在是……只能说作者没有见过优秀的QA……

微软(至少是Windows部门)的开发测试人员比例是1:1,有例外情况,比如人员流动之类,或者产品需要,最悬殊的情况不会超过2:1。微软的测试(SDET)会负责测试用例的开发、执行和测试框架的搭建。我之前所在的team,除了unit test由开发(SDE)来写之外,其它的测试用例都是SDET的工作,包括functional test、end to end test、stress / load test和performance test,采集code coverage,以及测试过程中所用到的各种相关工具。Windows部门内部(其它部门也有,只是不同的工具而已)有统一的工具来按需求定期执行上述测试,所有的测试用例几乎都是自动化的,不排除有少量的难以自动化的例子。SDET会在测试执行完之后分析结果,有问题有立即file bug。

至于Google,(至少是Ads部门)开发测试人员比例是10:1。Google的开发(SWE)兼职写测试用例,而测试(SET)专心做测试工具。测试的范围和上述的差不多,只是上述的多数工作都由SWE来完成。

这种差异是由于两家公司的产品线的不同造成的。微软的产品都是离线的,比如Windows和Office,一旦卖出去就收不回来了,在十几二十年前还没有互联网的时候,软件的质量只能在销售之前的就确保。于是微软需要大量的测试人员来保证产品质量。而Google不同的是,它的多数产品都是在线服务,在线服务(比如Google Search、Youtube之类)基本一周可以更新两次,在极端情况下见到过某些组天天更新的,这样即使有bug,也能及时修复。所以Google没有必要在产品刚发布的时候就有很高的质量,质量可以慢慢提升,于是测试的压力就不太大。

— 完 —
本文作者: Shuhai

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

此问题还有 17 个回答,查看全部。
延伸阅读:
互联网产品如何进行测试?
软件测试有哪些前景?

微信企业号,微信平台再次拓展边界

$
0
0

business

波士顿大学管理学院副教授马歇尔·范·阿尔斯蒂尼(Marshall Van Alstyne)曾经提到产品公司和平台公司的不同定义(翻译来自 iWeekly 的仇烨):

如果你生产价值,那么这就是一个典型的产品公司。而现在有一些新的系统,价值是在公司之外创造的,这就是一个平台公司。苹果可以在其应用商店中获得他人创意的 30% 收入。我将平台定义为一个公布的标准,让其他人可以接入这个平台,当然还包括管理模式,也就是谁能获得什么。

从这个定义来看,自推出微信公众号那一天起,微信不光是一个拥有上亿用户的移动 IM 应用,而是一个亿级平台。目前来说,这个平台拥有两类玩家,一类是媒体(包括自媒体),一类是企业、个体户。而从阿尔斯蒂尼的定义出发,平台公司的价值是在公司以外创造的,那么“扩张”就是平台公司的本能。

正在猜测微信将进入哪个领域的时候,昨晚 阳淼在微信公众号上爆微信将推“企业号”,进入企业协作、企业级应用与服务领域,倒是比较意料之外的消息,但仔细想一想,其实也是情理之中。根据阳淼的报道,微信“企业号内的消息将出现在用户的信息流中”,是“优先级最高的消息”。企业号的结构是这样的,“员工可以通过自己的微信订阅企业号,下一步可以使用该目录下的各种功能模块,完成企业内部各种管理和交流。”

阳淼认为,微信“企业号”不会为现在的企业级应用构成很大的竞争压力。相反,它还会有助于企业级软件市场爆发。他认为,“微信实际上就成为大量企业级应用的市场,起到分发和连接的作用。”

目前正在企业级市场耕耘的软件公司,对微信的到来持怎样的态度呢?某位不愿意透露身份的业内人士认为,“微信推出‘企业号’,对企业级软件商来说,是一个利好消息。因为传统软件和微信并不矛盾。微信企业号其实和订阅号、服务号没有本质区别,它们都是一个 ID,ID 只是一种身份的识别,至于 ID 之下的内容,则是由第三方自己提供。订阅号沟通了媒体和读者,‘企业号’则建起起个人和企业的通道。微信不会干涉第三方对内容的创造。

他还认为,“我们以前是在微信的体系外,现在我们可以进入到这个体系里来。”

对于企业号的具体表现,上述匿名人士认为,微信企业号就是一个消息盒子,能够发送企业内的通知,各种企业应用可以会以卡片链接的形式推送给用户,用户点开后可以进入一个 HTML5 页面,完成具体的功能操作。他同时认为,微信的形态适合提供简单的企业协作功能,但对于更加复杂一些的功能,就会力有未逮。

风车是一个年轻的企业协作应用,联合创始人叶玎玎也欢迎微信推出“企业号”。他说,“乐于看到这样的事情。就算微信不推企业号,作为企业服务开发者还是会去做服务号,但是限制多,不能和企业自身的很好做结合,造成企业会有多个入口。……另外一块担心是企业信息安全问题,但是现实情况就是,大家已经在用微信做内部沟通了,现在企业里面用微信比任何一个应用都勤快。”

叶玎玎还认为,微信“用户粘性高,装机量大,虽然是面向消费者的产品,但是消费者同时也是企业里的员工,(使用微信沟通)的习惯已经不可逆转。”

在移动 IM 上进行企业协作,到底和国外流行的 Yammer 之类的协作软件有什么不同?叶玎玎认为,微信“企业号”跟“Yammer 之类的区别还是很大的,一个属于社交类,一个属于沟通类。微信即使做企业级应用服务,除非它为企业用户改变现有的形态,它会继续是一个沟通工具,能做的事情比较有限,胜在简单即时。Yammer 不一样,它是社交入手做平台,可以直接涵盖企业内所有事务,尤其是超过一百人团队。应用目的性不一样。”

除了企业软件商外,更重要的是各位在不同企业的我们,到底会被企业号如何影响。身边一个朋友这么希望“如果是微信来进行协作的话,手机上的操作不要太复杂,如果电脑版、网页版能够提供更多的支持,那就更好了。”

 

题图来自 unsplash

组织过软件汉化,写过时间管理文章,研究过个人知识管理。关注科技的发展,创投资讯、移动互联网。

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



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


一个Redis监控dashboard

原来维生素B2这么厉害!

$
0
0

原来维生素B2这么厉害!

可惜知道人的太少了!

2014-06-11

1、身体长期、严重缺乏维生素B2是导致癌症、肿瘤的根本原因。

2、各种消化道溃疡、出血、肿块、息肉、肌瘤、肝硬化也都是因为缺乏维生素B2引起的。

3、痔疮也是因为缺乏维生素B2引起的。

4、女性的宫颈糜烂也是因为缺乏维生素B2引起的。

5、通常所说的“上火”就是维生素B2短期、急剧缺乏症。

6、及时、足量补充维生素B2,这些症状都会减轻直到痊愈。

维生素B2是人体必需的一种营养物质,它是形成人体组织、器官表面的必需的一种物质,维生素B2在人体内无法储存,但人体每天又需要,所以必须每天从食物中补充,食物中以动物肝、肾、心等维生素B2的含量较高(这也说明了B2的重要性),其次是奶及其制品,禽蛋类、豆类及其制品、谷类,一般蔬菜也含有少量的维生素B2。植物当中维生素B2主要存在于谷物的皮、壳当中,在粮食加工过程中大部分都流失了。因此现代人的饮食结构导致了人体无法从食物中获取足够的维生素B2,所以大多数人都处于缺乏维生素B2的状态。

轻微缺乏维生素B2人体不会有任何感觉,但到一定程度时就会出现明显的症状,首先,在人体最薄弱的地方,通常是消化道的首尾两端,即口腔或肛门的局部,出现充血、肿胀,随后皮肤或粘膜出现溃疡,然后开始出血,这即是口腔溃疡和痔疮。如果长期缺乏维生素B2,那么人体其它部位也会出现同样的症状。

为什么缺乏维生素B2会出现充血、肿胀呢?

主要原因在于血管,构成血管壁的细胞离不开维生素B2,当缺乏维生素B2时,血管壁(主要是毛细血管,管壁本身就很薄)开始变薄,在血压的作用下,血管开始向外凸起,当局部的血管都开始鼓起时,就形成了肿块,最后血管开始裂开出血,如果发生在脑部,你猜到了吗?对,这就是脑溢血。

为什么缺乏维生素B2会出现溃疡呢?同样的道理,构成人体皮肤和粘膜的细胞也需要维生素B2,当B2缺乏时,人体无法产生出足够的皮肤和粘膜细胞,去顶替已经代谢掉的细胞,缺口就产生了,患处的皮肤或粘膜就像雪被融化了一样,由一个小点发展成一个创面,这就是溃疡,发生在食道,就是食道溃疡,发生在胃里,就是胃溃疡,发生在肠道,就是肠道溃疡,发生在女性的子宫颈,就是宫颈糜烂。溃疡面如果长时间不能愈合,就会被细菌感染,产生炎症,单纯使用消炎药,只能暂时控制细菌的繁殖,并不能使溃疡愈合。充血、肿胀长期、持续发展下去就会凸出组织、器官的表面,形成肿瘤,肿瘤发展到最后阶段,表面糜烂,反复感染、化脓,内部细胞疯狂增生,这就是――癌症。所以说,癌症是人体长期、严重缺乏维生素B2,各种组织、器官功能即将衰竭,总崩溃即将发生的征兆。这也就合理解释了为什么把癌变部位完全切除了,仍然避免不了癌症的扩散和复发,不是癌细胞扩散了,而是组织和器官相继陷入崩溃了。

知道了病因,治疗就简单多了,及时、足量补充维生素B2,红肿就会消退,溃疡面就会愈合,肿瘤会缩小甚至消失,癌症会停止恶化,逐渐好转。

维生素B2这个药极其便宜,一元一瓶,一瓶100片,再穷的人也吃得起。药瓶上标注的适应症为:用于预防和治疗维生素B2缺乏症,如口角炎、唇干裂、舌炎、阴囊炎、结膜炎、脂溢性皮炎等。很显然,这些只是缺乏维生素B2的初期症状,现代医学没有对这个问题深入研究下去:既然缺乏维生素B2能导致口唇、牙龈、舌的溃疡,那么消化道内其它地方的溃疡就与B2没有关系吗?正是在这个问题上的浅尝辄止,导致了现在癌症的泛滥。需服用维生素B2的用量,药瓶上的用法用量:口腹,成人,一次1-2片,一日3次。实践证明,当人体没有明显的症状、用来预防时,这个用量也许是可以的,但是,如果身体已经有了明显的症状,比如溃疡、痔疮、息肉、肿瘤,那么这个用量是明显不够的,必须要一次4-6片,一日3-4次,才能看到明显的效果。有些人就是因为用量不够,觉得服用维生素B2没有用,从而耽误了病情。已经住院的病人,可以要求医生在输液中加入复合维生素B(里面含有维生素B2),效果会更好。

维生素B2对人体没有任何副作用,过量的维生素B2会从尿液中直接排出体外,所以,不用担心服用过量的问题。还有个问题也必须引起重视,维生素B2见光极易分解,从而导致失效,一瓶维生素B2如果开盖后一个月还没吃完,那么剩下的药片估计就都失效了,再服用时就会觉得没用了,这时就需要重新购买,最好生产日期在半年以内的。在此,我也呼吁生产厂家,最好能在维生素B2的外面包裹一层糖衣,从而减少维生素B2见光失效的机会。

通常所说的“上火”与维生素B2有什么关系呢?辣椒、羊肉、白酒等热性食物进入人体后,会扩张毛细血管,加速血液的流动,而这会加速维生素B2的消耗,就像人跑步时肯定要比走路消耗更多的氧气一样。维生素B2被快速消耗而又得不到补充,于是就会产生牙龈肿痛、肛门肌肉充血肿胀等上火症状,只要马上服用足量的维生素B2,这样症状会很快消失。当然,吃一些凉性的食物如西瓜等,能中和身体中的热性,也有一定的效果,但最根本的因素还是维生素B2。

“十人九痔”是一个民间俗语,是指痔疮患者的发病率很高,其实也证明了缺乏维生素B2在人群中的普遍性。流行病学认为父母得了癌症,子女也易得癌症,所以癌症具有遗传性,这其实是个错误的结论。真正的原因是,父母与子女在饮食结构上具有高度相似性,父母爱吃辣的,经常上火,处于缺乏维生素B2的状态,那么子女也必定爱吃辣的,也会缺乏维生素B2,即使子女以后与父母分开了,他(她)的饮食习惯也会保留下来,所以,与父母得相同的病就不足为奇了。

为什么常吃五谷杂粮的人不易得癌症呢?

现在你应该明白了吧,其实是五谷杂粮中(主要在皮、壳上)所含的维生素B2起了作用,如果把皮和壳都去除了,效果就会大打折扣。有些人常吃复合维生素,认为自己不会缺乏维生素B2,实际上,复合维生素中所含的B2远远不能满足人的日常需求,必须单独补充维生素B2。
维生素B2,安全的“核”武器

维生素B2作用十分广泛:

1.促进发育和细胞的再生;

2.参与细胞的生长代谢;

3.与其他物质配合参与多种新陈代谢;

4.促进生长发育,维护皮肤和细胞膜的完整性;

5.预防和消除口腔生殖综合征;

6.促使皮肤、指甲、毛发的正常生长;

7.促进机体对铁的吸收,可防贫血;

8.增进视力,减轻眼睛疲劳。维生素B2又称核黄素,堪称安全的“核”武器。

注:口腔生殖综合症又称白塞氏病,以口腔溃疡、生殖器溃疡、眼炎及皮肤损害为突出表现,该病常累及神经系统、消化道、肺、肾以及附睾等器官,病情呈反复发作和缓解的交替过程。

维生素B2有3个特点:一是易被光线(特别是紫外线)破坏;二是在碱溶液中加热可被破坏,故与食物、药物同用要多加注意;三是体内储量有限,必须每天补充。

我们平时每天可通过食物或营养品补充维生素B2,如能与维生素B1、维生素B6、维生素C及叶酸一同摄入,效果更佳。部分特殊患者则可用药补充。正常情况下,维生素B2不会蓄积在体内,所以即使摄入过量一般不会中毒。

用途广泛

维生素B2作用广泛,除前面提到的促生长、防贫血、护视力等,研究还发现它有以下用途——

1.治疗心绞痛冠心病、心肌缺血及心绞痛患者,每次服维生素B2 75毫克,每天3次,用药2~3个月后,心绞痛发作频率有所降低。药理学研究证实:维生素B2因参与机体能量代谢,可改善心脏血液供应。另外,维生素B2还能抑制血小板凝聚、改善心肌缺血和缩小心肌梗死范围,改善心肌功能,在保护心脏方面大有发展前途!

2.偏头痛是由于脑细胞的能量储备减少或脑血管强烈痉挛所致。最新研究表明,大剂量补充维生素B2可使偏头痛发生频率降低、发作持续时间缩短。遵医嘱每天服维生素B2 200~400毫克,可有效地防治偏头痛,至少可减少发作的频度和程度。有偏头痛史者可用适量进行预防性应用,如能与镁剂潘南金(编者注:即门冬氨酸钾镁)合用则效果更佳。

3.改善性生活  维生素B2与性生活质量有关,特别是女性。缺少维生素B2可表现为阴道干涩、阴道黏膜充血、破溃,易患阴唇炎、阴道炎,皮肤呈鳞屑状、皮肤粗糙,外表皮脱落,渗出增多,可扩展到近大腿部……从而引起性欲减退、性冷淡及性交疼痛等。故女性(特别是生育期)应注意补充复合维生素,不仅包括维生素B2,还包括叶酸。

4.防治前列腺增生药理学研究表明,维生素B2有利尿消肿作用,有利于消除排尿不畅等症状。前列腺增生患者每天可服维生素B2 50毫克,半年后症状可改善,肥大的前列腺也会有所缩小,尤其适于前列腺肥大且伴有水肿者。

5.增强耐寒能力维生素B2与维生素E和铁剂合用,可增强人体耐寒能力。这是因为它们都能参与和增强人体能量代谢或参与人体造血过程,其综合效应是促使人体多产热而达到御寒目的。

6.此外,研究还发现维生素B2有一定的防癌和防治肾炎水肿等作用。

食补多已足够

维生素B2主要存在于奶制品、鸡蛋、瘦肉、动物肝脏等动物性食物中,素食者或动物性食物摄取不足者易致维生素B2缺乏。只要合理膳食,一般不会缺乏。

如果缺乏维生素B2,可选择奶类及其制品,动物内脏(肝、肾和心等),蛋黄,多种鱼类(特别是鳝鱼、鲫鱼等),菠菜、胡萝卜、香菇、紫菜、茄子、芹菜、番茄等蔬菜,橘子和柑橙等水果食用,一般不必额外补充。

部分严重缺乏维生素B2者,应在医生、药师指导下,补充药用级的维生素B2片,或复合维生素B片。


  青春就应该这样绽放   游戏测试:三国时期谁是你最好的兄弟!!   你不得不信的星座秘密

【哈佛商评】如何拒绝而不损害彼此关系

$
0
0

译者: myia原文地址: blogs.hbr.org

很多人都不喜欢对同事或者老板说"不"。比如说,如果老板想要将交活期限提前,或者一个团队成员需要延长期限,我们都会担心一个否定的答复会对彼此关系造成损害。这是因为拒绝常常会被人看作对抗的同义词。无论你属于尽量避免冲突那种人,还是属于对冲突有备无患的人,对方对否定答复的反应都常常不能如你所愿。

有时即使你希望尽量减少摩擦,对方仍然会尝试着把你的拒绝变成同意。因为他们很可能在过去尝过不轻易接受否定答复的甜头,或者觉得接受你的否定答复会使他看上去像一个让人随便欺负的软蛋。或者,他可能会生气,可能会和你争执,也可能会变得沉默而不发一言。这些不过是因为他一向对听到的否定答复都会这样处理。

另外,有时不同的环境也会增加你的否定答复被接受的难度。举例说,有的人在私下里能够接受一个否定的答复,但是如果是当着大家的面,她却可能会觉得丢了面子而希望你改变决定。

由于上述这种种问题,一个在拒绝的同时保证彼此关系丝毫无损的诀窍是根本不存在的。但是你可以做的,却是换一个角度来看你究竟想要达到什么目的。不要把你的回答看作是必须在冲突对抗和维系关系中二者取一。其实,还有一个中间选项:中性的拒绝。

中性的拒绝应该是语调平稳,肯定而清晰。显然,它不应该是粗暴的,对抗性的,也不应该是歉意的,犹豫的,或者充满过分的关怀。

中性语调不一定是你习惯的说话风格,但是你完全应该能够做到。中性的拒绝能够保护你和对方,避免以下否定答复有可能带来的那些对彼此关系最有破坏力的负面因素:

误导对方。如果你的拒绝不很坚定,对方很容易会认为你还有改弦更张的余地。有时如果听起来你有可能会改变主意,对方就会更努力地与你争执。这种误导对你们彼此关系的破坏要比你的否定答复本身还要更糟。

削弱否定的力度。很多时候人们喜欢避重就轻地提出拒绝理由。他们会从最不重要的事情谈起,而把最要紧的理由留到最后。可是那些不太重要的理由很容易被推翻,没有什么说服力。所以,如果你想减少对方的挫折感,而且不让对方怀疑你的诚意,最好的方法是把最重要的理由提到前面来讨论。

坚持中性的拒绝能使你的着重点对事而不对人。你应该效仿球场上裁判那种中立性裁决的榜样。一个好裁判的裁决是不受双方感情影响的。他的任务是作出决定,并且在受到挑战时能坚持原判。

你也可以直接讨论你与对方的摩擦。在这种情况下,你可以说:“我做这个决定并不容易。我也知道这对于你来说很难接受。” 你可以用自己的方式来说这句话,但说话时一定要注意保持语调平稳,肯定,清晰。如果对方仍然与你争执,请记住以下几点:

  • 不要跑题。如果你明白对方为何与你争执,你可以直截了当的指出他的顾虑:“我明白你在这件事上下了很多功夫,你怕我会阻止你。”你也可以列出你拒绝的理由:“我的工作是在许多正当的,而我们一时无法兼顾的需要之间找到平衡。这就是我的出发点。”如果这个说法会引发一些讨论,这也没有关系。一个否定的答复并不应该仅仅是一个单方面的谈话。
  • 不要改变主意。如果你的拒绝确实有充分的理由,那就不要轻易改变。比如,我知道这么一件事。有一个年轻的女孩为了一个她刚买的有故障的二手车提出仲裁。卖给她车的小伙子是个很能说的对手,他提出了很多理由来说明为什么他不需要负责修车或允许退货。那个年轻女孩耐心地听完他说的每一个理由,但在每次他说完以后,她都会这样回答:“我明白你的意思。不过本州规定如果一个车不能通过车检,那么卖方有义务负责修理费用或者退回车款。”最后卖车的小伙子不但给女孩退了钱,而且还请她吃了顿饭。
  • 不要期望过高。想维护关系的人通常希望能够在拒绝对方的同时仍能使对方感到高兴。然而,实际情况是当人们听到一个否定的答复,自然的反应是愤怒,不快,以及焦虑。如果我们试图改变要说的话以期收到一个不现实的正面反应,对方有可能不得要领,而我们则不得不把否定的答复再说一次。

以中性的口吻来说“不”并非很容易做到。要想做好,你可以事先找一个你知道会与你争执的人来练习。慢慢地你会发现,你能够轻松地给出否定的答复而不损害重要的关系。


HttpURLConnection实现断点下载

$
0
0
package cn.demo;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class BreakDown {
public static void main(String[] args) throws Exception {
String fileName = "video.avi";
String path = "http://localhost:6666/day22_cos/up/"+fileName;
String savePath = "d:/a/"+fileName;
File file = new File(savePath);
long size = file.length();
System.err.println(file.length());

URL url = new URL(path);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
//设置下载区间
con.setRequestProperty("range","bytes="+size+"-");
con.connect();
int code = con.getResponseCode();//只要断点下载,返回的已经不是200,206
System.err.println(code);
if(code==206){
InputStream in= con.getInputStream();
int serverSize = con.getContentLength();
System.err.println("服务器返回的长度:"+serverSize);
System.err.println("这次从哪开开始写:"+size);
//必须要使用
RandomAccessFile out = new RandomAccessFile(file,"rw");
out.seek(size);

byte[] b = new byte[1024];
int len = -1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
out.close();
}
}
}


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


ITeye推荐



Project Volta 让 Android 续航提升了多少?

$
0
0

project_volta

似乎每一次 Android 大升级,Google 都习惯性地发布一个“Project”,以彰显对 Android 某一问题的改进力度。比如 Jelly Bean 的“Project Butter”(黄油计划)让 Android 系统的动画切换效果达到 60fps,KitKat 的“Project Svelte” 让 Android 最低运行 RAM 降低至 512MB。

今年的 Google I/O 带来了“史上改进最大”的 Android L,伴随而来的是针对续航改进的“Project Volta”。Google 表示,真正优化之后省电模式至少可以让 Nexus 5 增加 90 分钟的续航时间。

Project Volta 究竟让 Android 续航提升了多少? Ars Technica使用两台 Nexus 5 进行了一次续航对比测试,测试尽可能保证了实验条件的精准:一台搭载 Android 4.4 KitKat,另一台搭载 Android L 预览版,亮度同时保持 200nit,保持屏幕常亮、同时更新应用,在 Wi-Fi 环境下每 15 秒刷新一次网页,直至电量耗尽为止。

1

实验结果显示,搭载 Android 4.4 的续航时间为 345 分钟,而Android L 预览版的续航时间则高达 471 分钟,续航能力提升 36%,多了两小时的使用时间。

需要提到的是,Android L 还提供了一个“电池保护”的功能,当设备电量低于 15% 时系统会自动降低设备性能、切断后台数据、调低屏幕亮度。尽管可以更进一步提升续航能力,不过测试并没有应用该功能。

“Project Volta” 对 Android 续航能力的提升源于多项措施。首先,“Project Volta”可以通过分析来发现系统资源的最大消耗者,并在节能模式下控制这些进程,从而达到节电的目的。

Google 测试发现,用户每点亮一次屏幕大约消耗 2 分钟的待机,这不仅仅源于屏幕消耗,一些应用程序或网络模块执行后台数据刷新的操作也会消耗电量。Android L 引入了新的“JobScheduler” API,使得Android 可以分批处理数据清理和日志上传等不重要的应用请求。

另外,增强的 Battery Historian 电量消耗统计跟踪器增加了大量电量追踪功能,为开发者带来了数据可视化的图标,开发者可以通过有针对性的调整来延长电池续航时间。

当然,ART 替代 Dalvik 成为 Android 的默认虚拟机也是重要原因之一,ART 可以一次性将 Android 应用编译成本地代码,减少了即时编译对计算性能的浪费,从而提高了运行效率。

题图来自: Androidbeat

新媒介的拥趸,相信“ 媒介即讯息 ”,关注媒介技术的力量。

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



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


在数据分析、挖掘方面,有哪些好书值得推荐?

$
0
0
2014.2.1更新,由于经常接到私信要求在这个书单之内再推荐两三本,每个人的行业背景也不一样,所以就把下面的书单归类整理一下。

入门读物:
  1. 深入浅出数据分析 (豆瓣) 这书挺简单的,基本的内容都涉及了,说得也比较清楚,最后谈到了R是大加分。难易程度:非常易。
  2. 啤酒与尿布 (豆瓣) 通过案例来说事情,而且是最经典的例子。难易程度:非常易。
  3. 数据之美 (豆瓣) 一本介绍性的书籍,每章都解决一个具体的问题,甚至还有代码,对理解数据分析的应用领域和做法非常有帮助。难易程度:易。
  4. 数学之美 (豆瓣) 这本书非常棒啦,入门读起来很不错!
数据分析:
  1. SciPy and NumPy (豆瓣) 这本书可以归类为数据分析书吧,因为numpy和scipy真的是非常强大啊。
  2. Python for Data Analysis (豆瓣) 作者是Pandas这个包的作者,看过他在Scipy会议上的演讲,实例非常强!
  3. Bad Data Handbook (豆瓣) 很好玩的书,作者的角度很不同。
适合入门的教程:
  1. 集体智慧编程 (豆瓣) 学习数据分析、数据挖掘、机器学习人员应该仔细阅读的第一本书。作者通过实际例子介绍了机器学习和数据挖掘中的算法,浅显易懂,还有可执行的Python代码。难易程度:中。
  2. Machine Learning in Action (豆瓣) 用人话把复杂难懂的机器学习算法解释清楚了,其中有零星的数学公式,但是是以解释清楚为目的的。而且有Python代码,大赞!目前中科院的王斌老师(微博: 王斌_ICTIR)已经翻译这本书了 机器学习实战 (豆瓣) 。这本书本身质量就很高,王老师的翻译质量也很高。难易程度:中。我带的研究生入门必看数目之一!
  3. Building Machine Learning Systems with Python (豆瓣) 虽然是英文的,但是由于写得很简单,比较理解,又有 Python 代码跟着,辅助理解。
  4. 数据挖掘导论 (豆瓣) 最近几年数据挖掘教材中比较好的一本书,被美国诸多大学的数据挖掘课作为教材,没有推荐Jiawei Han老师的那本书,因为个人觉得那本书对于初学者来说不太容易读懂。难易程度:中上。
  5. Machine Learning for Hackers (豆瓣) 也是通过实例讲解机器学习算法,用R实现的,可以一边学习机器学习一边学习R。

稍微专业些的:
  1. Introduction to Semi-Supervised Learning (豆瓣) 半监督学习必读必看的书。
  2. Learning to Rank for Information Retrieval (豆瓣) 微软亚院刘铁岩老师关于LTR的著作,啥都不说了,推荐!
  3. Learning to Rank for Information Retrieval and Natural Language Processing (豆瓣) 李航老师关于LTR的书,也是当时他在微软亚院时候的书,可见微软亚院对LTR的研究之深,贡献之大。
  4. 推荐系统实践 (豆瓣) 这本书不用说了,研究推荐系统必须要读的书,而且是第一本要读的书。
  5. Graphical Models, Exponential Families, and Variational Inference (豆瓣) 这个是Jordan老爷子和他的得意门徒 Martin J Wainwright 在 Foundation of Machine Learning Research上的创刊号,可以免费下载,比较难懂,但是一旦读通了,graphical model的相关内容就可以踏平了。
  6. Natural Language Processing with Python (豆瓣) NLP 经典,其实主要是讲 NLTK 这个包,但是啊,NLTK 这个包几乎涵盖了 NLP 的很多内容了啊!

机器学习教材:
  1. The Elements of Statistical Learning (豆瓣) 这本书有对应的中文版: 统计学习基础 (豆瓣) 。书中配有R包,非常赞!可以参照着代码学习算法。
  2. 统计学习方法 (豆瓣) 李航老师的扛鼎之作,强烈推荐。难易程度:难。
  3. Machine Learning (豆瓣) 去年出版的新书,作者Kevin Murrphy教授是机器学习领域中年少有为的代表。这书是他的集大成之作,写完之后,就去Google了,产学研结合,没有比这个更好的了。
  4. Machine Learning (豆瓣) 这书和上面的书不是一本!这书叫:Machine Learning: An Algorithmic Perspective 之前做过我带的研究生教材,由于配有代码,所以理解起来比较容易。
  5. Pattern Recognition And Machine Learning (豆瓣) 经典中的经典。
  6. Bayesian Reasoning and Machine Learning (豆瓣) 看名字就知道了,彻彻底底的Bayesian学派的书,里面的内容非常多,有一张图将机器学习中设计算法的关系总结了一下,很棒。
  7. Probabilistic Graphical Models (豆瓣) 鸿篇巨制,这书谁要是读完了告诉我一声。
  8. Convex Optimization (豆瓣) 凸优化中最好的教材,没有之一了。课程也非常棒,Stephen老师拿着纸一步一步推到,图一点一点画,太棒了。


— 完 —
本文作者: 肖智博

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

此问题还有 24 个回答,查看全部。
延伸阅读:
数据分析/挖掘工作的疑惑?
国内有哪些数据分析 数据挖掘的牛人

html5 canvas 详细使用教程

$
0
0

导航


  • 前言
  • 基本知识
  • 绘制矩形
  • 清除矩形区域
  • 圆弧
  • 路径
  • 绘制线段
  • 绘制贝塞尔曲线
  • 线性渐变
  • 径向渐变(发散)
  • 图形变形(平移、旋转、缩放)
  • 矩阵变换(图形变形的机制)
  • 图形组合
  • 给图形绘制阴影
  • 绘制图像(图片平铺、裁剪、像素处理[不只图像、包括其他绘制图形])
  • 绘制文字
  • 保存和恢复状态(context)
  • 保存文件
  • 结合setInterval制作动画
  • 结语、demo下载

 

前言


     <canvas></canvas>是html5出现的新标签,像所有的dom对象一样它有自己本身的属性、方法和事件,其中就有绘图的方法,js能够调用它来进行绘图 ,最近在研读《html5与css3权威指南》下面对其中最好玩的canvas的学习做下读书笔记与实验。

     温馨提示:以下所有实验请使用最新版的opera

顶部

 

基本知识


    context:一直觉得这个翻译成“上下文”真够蛋疼的,context是一个封装了很多绘图功能的对象,获取这个对象的方法是   

        var context =canvas.getContext("2d");

        也许这个2d勾起了大家的无限遐想,但是很遗憾的告诉你html5还只是个少女,不提供3d服务。

   

    canvas元素绘制图像的时候有两种方法,分别是

        context.fill()//填充

        context.stroke()//绘制边框

   

    style:在进行图形绘制前,要设置好绘图的样式

        context.fillStyle//填充的样式

        context.strokeStyle//边框样式

   

    context.lineWidth//图形边框宽度

   

    颜色的表示方式:

         直接用颜色名称:"red" "green" "blue"

         十六进制颜色值: "#EEEEFF"

         rgb(1-255,1-255,1-255)

         rgba(1-255,1-255,1-255,透明度)

 

     和GDI是如此的相像,所以用过GDI的朋友应该很快就能上手

顶部

 

绘制矩形  context.fillRect(x,y,width,height)  strokeRect(x,y,width,height)


     x:矩形起点横坐标(坐标原点为canvas的左上角,当然确切的来说是原始原点,后面写到变形的时候你就懂了,现在暂时不用关系)

     y:矩形起点纵坐标

     width:矩形长度

     height:矩形高度

View Code
复制代码
 1  function draw21(id) {
 2             var canvas = document.getElementById(id)
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             //实践表明在不设施fillStyle下的默认fillStyle=black
 7             context.fillRect(0, 0, 100, 100);
 8             //实践表明在不设施strokeStyle下的默认strokeStyle=black
 9             context.strokeRect(120, 0, 100, 100);
10 
11             //设置纯色
12             context.fillStyle = "red";
13             context.strokeStyle = "blue";
14             context.fillRect(0, 120, 100, 100);
15             context.strokeRect(120, 120, 100, 100);
16 
17             //设置透明度实践证明透明度值>0,<1值越低,越透明,值>=1时为纯色,值<=0时为完全透明
18             context.fillStyle = "rgba(255,0,0,0.2)";
19             context.strokeStyle = "rgba(255,0,0,0.2)";
20             context.fillRect(240,0 , 100, 100);
21             context.strokeRect(240, 120, 100, 100);
22         }
复制代码

顶部

 

清除矩形区域 context.clearRect(x,y,width,height)


     x:清除矩形起点横坐标

     y:清除矩形起点纵坐标

     width:清除矩形长度

     height:清除矩形高度

View Code
复制代码
 1       function draw22(id) {
 2             var canvas = document.getElementById(id)
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             //实践表明在不设施fillStyle下的默认fillStyle=black
 7             context.fillRect(0, 0, 100, 100);
 8             //实践表明在不设施strokeStyle下的默认strokeStyle=black
 9             context.strokeRect(120, 0, 100, 100);
10 
11             //设置纯色
12             context.fillStyle = "red";
13             context.strokeStyle = "blue";
14             context.fillRect(0, 120, 100, 100);
15             context.strokeRect(120, 120, 100, 100);
16 
17             //设置透明度实践证明透明度值>0,<1值越低,越透明,值>=1时为纯色,值<=0时为完全透明
18             context.fillStyle = "rgba(255,0,0,0.2)";
19             context.strokeStyle = "rgba(255,0,0,0.2)";
20             context.fillRect(240, 0, 100, 100);
21             context.strokeRect(240, 120, 100, 100);
22             context.clearRect(50, 50, 240, 120);
23         }
复制代码

顶部

 

 圆弧context.arc(x, y, radius, starAngle,endAngle, anticlockwise)


    x:圆心的x坐标

    y:圆心的y坐标

    straAngle:开始角度

    endAngle:结束角度

    anticlockwise:是否逆时针(true)为逆时针,(false)为顺时针

    ps:经过试验证明书本上ture是顺时针,false是逆时针是错误的,而且无论是逆时针还是顺时针,角度都沿着顺时针扩大,如下图:

 

View Code
复制代码
 1         function draw0(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null) {
 4                 return false;
 5             }
 6             var context = canvas.getContext('2d');
 7             context.beginPath();
 8             context.arc(200, 150, 100, 0, Math.PI * 2, true);
 9             //不关闭路径路径会一直保留下去,当然也可以利用这个特点做出意想不到的效果
10             context.closePath();
11             context.fillStyle = 'rgba(0,255,0,0.25)';
12             context.fill();
13         }
复制代码

一不小心画了小日本的国旗...赶紧调下颜色和大小,绿色倒是挺合适的~

顶部

 

路径  context.beginPath()    context.closePath()


    细心的朋友会发现上面的画圆并不单单是直接用arc还用到了context的 beginPath   和closePath方法,参考书不愧是参考书,例子给得太简单了,实话说一开始我凌乱了,耐心下来做了几个实验才舒缓蛋疼的心情

    实验代码如下,通过分别注释closePath 和beginPath看fill stoke 和fill stroke结合下画出来的两个1/4弧线达到实验效果

View Code
复制代码
 1   function draw23(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null) {
 4                 return false;
 5             }
 6             var context = canvas.getContext('2d');
 7             var n = 0;
 8            
 9             //左侧1/4圆弧
10             context.beginPath();
11             context.arc(100, 150, 50, 0, Math.PI/2 , false);
12             context.fillStyle = 'rgba(255,0,0,0.25)';
13             context.fill();
14             context.strokeStyle = 'rgba(255,0,0,0.25)'
15             context.closePath();
16             context.stroke();
17 
18             //右侧1/4圆弧
19             context.beginPath();
20             context.arc(300, 150, 50, 0, Math.PI/2 , false);
21             context.fillStyle = 'rgba(255,0,0,0.25)';
22             context.fill();
23             context.strokeStyle = 'rgba(255,0,0,0.25)';
24             context.closePath();
25             context.stroke();
26         }
复制代码

    实验结果如下:

 

 得出的结论有:*号为重点

    1、系统默认在绘制第一个路径的开始点为beginPath

    *2、如果画完前面的路径没有重新指定beginPath,那么画第其他路径的时候会将前面最近指定的beginPath后的全部路径重新绘制

    3、每次调用context.fill()的时候会自动把当次绘制的路径的开始点和结束点相连,接着填充封闭的部分

    ps:书本的结论是   如果没有closePath那么前面的路劲会保留,实验证明正确的结论是 如果没有重新beginPath那么前面的路劲会保留

    ps1:如果你真心凌乱了,那么记住每次画路径都在前后加context.beginPath()   和context.closePath()就行

顶部

 

 绘制线段 context.moveTo(x,y)  context.lineTo(x,y)


    x:x坐标

    y:y坐标

    每次画线都从moveTo的点到lineTo的点,

    如果没有moveTo那么第一次lineTo的效果和moveTo一样,

    每次lineTo后如果没有moveTo,那么下次lineTo的开始点为前一次lineTo的结束点

View Code
复制代码
 1     function draw8(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             //context.beginPath();
 7             context.strokeStyle = "rgb(250,0,0)";
 8             context.fillStyle = "rgb(250,0,0)"
 9             //实验证明第一次lineTo的时候和moveTo功能一样
10             context.lineTo(100, 100);
11             //之后的lineTo会以上次lineTo的节点为开始
12             context.lineTo(200, 200);
13             context.lineTo(200, 100);
14             context.moveTo(200, 50);
15             context.lineTo(100,50);
16             context.stroke();
17         }
复制代码

    下面给出书本的例子,一朵绿色的菊花,涉及数学,不多解析,有兴趣的自己研究

View Code
复制代码
 1   function draw1(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             context.fillStyle = "#EEEEFF";
 7             context.fillRect(0, 0, 400, 300);
 8             var n = 0;
 9             var dx = 150;
10             var dy = 150;
11             var s = 100;
12             context.beginPath();
13             context.fillStyle = 'rgb(100,255,100)';
14             context.strokeStyle = 'rgb(0,0,100)';
15             var x = Math.sin(0);
16             var y = Math.cos(0);
17             var dig = Math.PI / 15 * 11;
18             for (var i = 0; i < 30; i++) {
19                 var x = Math.sin(i * dig);
20                 var y = Math.cos(i * dig);
21                 context.lineTo(dx + x * s, dy + y * s);
22             }
23             context.closePath();
24             context.fill();
25             context.stroke();
26 
27         }
复制代码

  顶部

 

绘制贝塞尔曲线(贝济埃、bezier) context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y) 

绘制二次样条曲线 context.quadraticCurveTo(qcpx,qcpy,qx,qy)


    cp1x:第一个控制点x坐标

    cp1y:第一个控制点y坐标

    cp2x:第二个控制点x坐标

    cp2y:第二个控制点y坐标

    x:终点x坐标

    y:终点y坐标

 

    qcpx:二次样条曲线控制点x坐标

    qcpy:二次样条曲线控制点y坐标

    qx:二次样条曲线终点x坐标

    qy:二次样条曲线终点y坐标

 

View Code
复制代码
 1         function draw24(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null) {
 4                 return false;
 5             }
 6             var context = canvas.getContext("2d");
 7 
 8             context.moveTo(50, 50);
 9             context.bezierCurveTo(50, 50,150, 50, 150, 150);
10             context.stroke();
11             context.quadraticCurveTo(150, 250, 250, 250);
12             context.stroke();
13         }
复制代码

下面给出书本的例子,一朵扭曲的绿色菊花...编书这哥们对菊花情有独钟啊- -

View Code
复制代码
 1         function draw2(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null) {
 4                 return false;
 5             }
 6             var context = canvas.getContext("2d");
 7             context.fillStyle = "#EEEFF";
 8             context.fillRect(0, 0, 400, 300);
 9             var n = 0;
10             var dx = 150;
11             var dy = 150;
12             var s = 100;
13             context.beginPath();
14             context.globalCompositeOperation = 'and';
15             context.fillStyle = 'rgb(100,255,100)';
16             var x = Math.sin(0);
17             var y = Math.cos(0);
18             var dig = Math.PI / 15 * 11;
19             context.moveTo(dx, dy);
20             for (var i = 0; i < 30; i++) {
21                 var x = Math.sin(i * dig);
22                 var y = Math.cos(i * dig);
23                 context.bezierCurveTo(dx + x * s, dy + y * s - 100, dx + x * s + 100, dy + y * s, dx + x * s, dy + y * s);
24             }
25             context.closePath();
26             context.fill();
27             context.stroke();
28         }
复制代码

关于贝塞尔曲线可以参考百度百科和 http://blog.csdn.net/zhangci226/article/details/4018449这篇文章

  顶部

 

 线性渐变 var lg= context.createLinearGradient(xStart,yStart,xEnd,yEnd)

 线性渐变颜色lg.addColorStop(offset,color)


    xstart:渐变开始点x坐标

    ystart:渐变开始点y坐标

    xEnd:渐变结束点x坐标

    yEnd:渐变结束点y坐标

 

    offset:设定的颜色离渐变结束点的偏移量(0~1)

    color:绘制时要使用的颜色

 

给出书本偏移量的解析图,从图可以看出线性渐变可以是两种以上颜色的渐变

View Code
复制代码
 1         function draw25(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext('2d');
 6             var g1 = context.createLinearGradient(0, 0, 0, 300);
 7 
 8             g1.addColorStop(0, 'rgb(255,0,0)'); //红  
 9             g1.addColorStop(0.5, 'rgb(0,255,0)');//绿
10             g1.addColorStop(1, 'rgb(0,0,255)'); //蓝
11 
12             //可以把lg对象理解成GDI中线性brush
13             context.fillStyle = g1;
14             //再用这个brush来画正方形
15             context.fillRect(0, 0, 400, 300);  
16         }
复制代码

  顶部

 

径向渐变(发散)var rg=context.createRadialGradient(xStart,yStart,radiusStart,xEnd,yEnd,radiusEnd)

径向渐变(发散)颜色rg.addColorStop(offset,color)


    xStart:发散开始圆心x坐标

    yStart:发散开始圆心y坐标

    radiusStart:发散开始圆的半径

    xEnd:发散结束圆心的x坐标

    yEnd:发散结束圆心的y坐标

    radiusEnd:发散结束圆的半径

 

    offset:设定的颜色离渐变结束点的偏移量(0~1)

    color:绘制时要使用的颜色

书本并没有给出发散偏移量的图,特地画了幅:

下面给出两个实验

 

View Code
复制代码
 1         function draw26(id) {
 2             //同一个圆心画球型
 3             /*var canvas = document.getElementById(id);
 4             if (canvas == null)
 5                 return false;
 6             var context = canvas.getContext('2d');
 7             var g1 = context.createRadialGradient(200, 150, 0, 200, 150, 100);
 8             g1.addColorStop(0.1, 'rgb(255,0,0)');  
 9             g1.addColorStop(1, 'rgb(50,0,0)');
10             context.fillStyle = g1;
11             context.beginPath();
12             context.arc(200, 150, 100, 0, Math.PI * 2, true);
13             context.closePath();
14             context.fill();*/
15           
16             //不同圆心看径向渐变模型
17             var canvas = document.getElementById(id);
18             if (canvas == null)
19             return false;
20             var context = canvas.getContext('2d');
21             var g1 = context.createRadialGradient(100, 150, 10, 300, 150, 50);
22             g1.addColorStop(0.1, 'rgb(255,0,0)');
23             g1.addColorStop(0.5, 'rgb(0,255,0)');
24             g1.addColorStop(1, 'rgb(0,0,255)');
25             context.fillStyle = g1;
26             context.fillRect(0, 0, 400, 300);
27    
28         }
复制代码

  顶部

 

  图形变形


1、平移context.translate(x,y)

    x:坐标原点向x轴方向平移x

    y:坐标原点向y轴方向平移y

2、缩放context.scale(x,y)

    x:x坐标轴按x比例缩放

    y:y坐标轴按y比例缩放

3、旋转context.rotate(angle)

    angle:坐标轴旋转x角度(角度变化模型和画圆的模型一样)

View Code
复制代码
 1         function draw5(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5 
 6 
 7             var context = canvas.getContext("2d");
 8             context.save(); //保存了当前context的状态
 9             context.fillStyle = "#EEEEFF";
10             context.fillRect(0, 0, 400, 300);
11 
12             context.fillStyle = "rgba(255,0,0,0.1)";
13             //平移 缩放 旋转  1 2 3        
14             context.translate(100, 100);
15             context.scale(0.5, 0.5);
16             context.rotate(Math.PI / 4);
17             context.fillRect(0, 0, 100, 100);
18 
19 
20             context.restore(); //恢复到刚刚保存的状态,保存恢复只能使用一次
21             context.save(); //保存了当前context的状态
22             context.fillStyle = "rgba(255,0,0,0.2)";
23             //平移 旋转 缩放 1 3 2
24             context.translate(100, 100);
25             context.rotate(Math.PI / 4);
26             context.scale(0.5, 0.5);
27             context.fillRect(0, 0, 100, 100);
28 
29             context.restore(); //恢复到刚刚保存的状态
30             context.save(); //保存了当前context的状态
31             context.fillStyle = "rgba(255,0,0,0.3)";
32             //缩放 平移 旋转 2 1 3 
33             context.scale(0.5, 0.5);
34             context.translate(100, 100);
35             context.rotate(Math.PI / 4);
36             context.fillRect(0, 0, 100, 100);
37 
38             context.restore(); //恢复到刚刚保存的状态
39             context.save(); //保存了当前context的状态
40             context.fillStyle = "rgba(255,0,0,0.4)";
41             //缩放 旋转 平移  2 3  1 
42             context.scale(0.5, 0.5);
43             context.rotate(Math.PI / 4);
44             context.translate(100, 100);
45             context.fillRect(0, 0, 100, 100);
46 
47             context.restore(); //恢复到刚刚保存的状态
48             context.save(); //保存了当前context的状态
49             context.fillStyle = "rgba(255,0,0,0.5)";
50             //旋转 平移 缩放  3 1 2 
51             context.rotate(Math.PI / 4);
52             context.translate(100, 100);
53             context.scale(0.5, 0.5);
54             context.fillRect(0, 0, 100, 100);
55 
56             context.restore(); //恢复到刚刚保存的状态
57             context.save(); //保存了当前context的状态
58             context.fillStyle = "rgba(255,0,0,1)";
59             //旋转 缩放 平移   3 2 1 
60             context.rotate(Math.PI / 4);
61             context.scale(0.5, 0.5);
62             context.translate(100, 100);
63             context.fillRect(0, 0, 100, 100);
64 
65             //实验表明应该移动的是坐标轴
66             //实验表明缩放的是坐标轴比例
67             //实验表明旋转的是坐标轴
68             //综合上述,因此平移 缩放 旋转 三者的顺序不同都将画出不同的结果
69         }
复制代码

由于(平移,缩放,旋转)和(平移,旋转,缩放)一样

     (缩放,选装,平移)和(旋转,缩放,平移)一样

所以实验结果只能看到“4”中情况,其实是有两种情况被覆盖了

下面给出平移,缩放,旋转先后顺序不同,坐标轴的变化图

  顶部

 

矩阵变换 context.transform(m11,m12,m21,m22,dx,dy)


    所谓的矩阵变换其实是context内实现平移,缩放,旋转的一种机制

    他的主要原理就是矩阵相乘

    额,要讲解这个可以另开一个篇幅,庆幸的是已经有人做了总结,可以参考下面这篇文章

     http://hi.baidu.com/100912bb_bb/item/90c4a7489518b0fa1281daf1

    我们需要了解的是

    context.translate(x,y) 等同于context.transform (1,0,0,1,x,y)或context.transform(0,1,1,0.x,y)


    context.scale(x,y)等同于context.transform(x,0,0,y,0,0)或context.transform (0,y,x,0, 0,0);

 

    context.rotate(θ)等同于  

    context.transform(Math.cos(θ*Math.PI/180),Math.sin(θ*Math.PI/180),

    -Math.sin(θ*Math.PI/180),Math.cos(θ*Math.PI/180),0,0)

    或

    context.transform(-Math.sin(θ*Math.PI/180),Math.cos(θ*Math.PI/180),

    Math.cos(θ*Math.PI/180),Math.sin(θ*Math.PI/180), 0,0)

 

 顶部

 

图形组合 context.globalCompositeOperation=type


    图形组合就是两个图形相互叠加了图形的表现形式,是后画的覆盖掉先画的呢,还是相互重叠的部分不显示等等,至于怎么显示就取决于type的值了

    type:

        source-over(默认值):在原有图形上绘制新图形

        destination-over:在原有图形下绘制新图形

        source-in:显示原有图形和新图形的交集,新图形在上,所以颜色为新图形的颜色

        destination-in:显示原有图形和新图形的交集,原有图形在上,所以颜色为原有图形的颜色

        source-out:只显示新图形非交集部分

        destination-out:只显示原有图形非交集部分

        source-atop:显示原有图形和交集部分,新图形在上,所以交集部分的颜色为新图形的颜色

        destination-atop:显示新图形和交集部分,新图形在下,所以交集部分的颜色为原有图形的颜色

        lighter:原有图形和新图形都显示,交集部分做颜色叠加

        xor:重叠飞部分不现实

        copy:只显示新图形

    文字看得人眼花缭乱,特意画图一张:回头一看惊觉打错字,图片的原型为圆形,你懂的- -

以下为实验代码

View Code
复制代码
 1         function draw10(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null) {
 4                 return false;
 5             }
 6             var context = canvas.getContext("2d");
 7             var oprtns = new Array(
 8             "source-over",
 9             "destination-over",
10             "source-in",
11             "destination-in",
12             "source-out",
13             "destination-out",
14             "source-atop",
15             "destination-atop",
16             "lighter",
17             "xor",         
18             "copy"
19             );
20            var i = 0;//组合效果编号
21       
22            //结合setinterval动态显示组合
23            var interal = setInterval(function () {
24                if (i == 10) {
25                    i=0;
26                }
27                else {
28                    i++;
29                }
30                //蓝色矩形
31                context.fillStyle = "blue";
32                context.fillRect(10, 10, 60, 60);
33                //设置组合方式 
34                context.globalCompositeOperation = oprtns[i];
35                //设置新图形(红色圆形)
36                context.beginPath();
37                context.fillStyle = "red";
38                context.arc(60, 60, 30, 0, Math.PI * 2, false);
39                context.fill();
40           }, 1000);
41            
42         }
复制代码

 结果是动态的切换各种组合

顶部

 

给图形绘制阴影


    context.shadowOffsetX :阴影的横向位移量(默认值为0)
    context.shadowOffsetY :阴影的纵向位移量(默认值为0)
    context.shadowColor :阴影的颜色
    context.shadowBlur :阴影的模糊范围(值越大越模糊)

先来个简单的例子

View Code
复制代码
 1         function draw27(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext('2d');
 6             context.shadowOffsetX = 10;
 7             context.shadowOffsetY = 10;
 8             context.shadowColor = 'rgba(100,100,100,0.5)';
 9             context.shadowBlur = 1.5;
10             context.fillStyle = 'rgba(255,0,0,0.5)';
11             context.fillRect(100, 100, 200, 100);
12         }
复制代码

 再来个书本上的五角星的例子

View Code

  顶部

 

绘制图像 

绘图:context.drawImage

图像平铺:context.createPattern(image,type)

图像裁剪:context.clip()

像素处理:var imagedata=context.getImageData(sx,sy,sw,sh)


绘图  context.drawImage

    context.drawImage(image,x,y)

        image:Image对象var img=new Image(); img.src="url(...)";

        x:绘制图像的x坐标

        y:绘制图像的y坐标

    context.drawImage(image,x,y,w,h)

        image:Image对象var img=new Image(); img.src="url(...)";

        x:绘制图像的x坐标

        y:绘制图像的y坐标

        w:绘制图像的宽度

        h:绘制图像的高度

    context.drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh):选取图像的一部分矩形区域进行绘制

         image:Image对象var img=new Image(); img.src="url(...)";

        sx:图像上的x坐标

        sy:图像上的y坐标

        sw:矩形区域的宽度

        sh:矩形区域的高度

        dx:画在canvas的x坐标

        dy: 画在canvas的y坐标

        dw:画出来的宽度

        dh:画出来的高度

    最后一个方法可能比较拗,还是上图吧

View Code
复制代码
 1         //drawImage(image,x,y)
 2         function draw28(id) {
 3 
 4             var image = new Image();
 5 
 6             image.src = "Image/html5.jpg";
 7             var canvas = document.getElementById(id);
 8 
 9             if (canvas == null)
10                 return false;
11             var context = canvas.getContext("2d");
12             context.fillStyle = "#EEEEFF";
13 
14             context.fillRect(0, 0, 400, 300);
15             image.onload = function () {
16                 context.drawImage(image,0,0);
17             }
18         }
19 
20         //drawImage(image,x,y,w,h)
21         function draw12(id) {
22           
23             var image = new Image();
24 
25             image.src = "Image/html5.jpg";
26             var canvas = document.getElementById(id);
27 
28             if (canvas == null)
29                 return false;
30             var context = canvas.getContext("2d");
31             context.fillStyle = "#EEEEFF";
32            
33             context.fillRect(0, 0, 400, 300);
34             image.onload = function () {
35                 context.drawImage(image, 50, 50, 300, 200);
36             }
37         }
38 
39         //drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
40         function draw13(id){
41             var image = new Image();
42             image.src = "Image/html5.jpg";
43             var canvas = document.getElementById(id);
44            
45             if (canvas == null)
46                 return false;
47             var context = canvas.getContext("2d");
48             context.fillStyle = "#EEEEFF";
49           
50             context.fillRect(0, 0, 400, 300);
51             image.onload = function () {
52                 context.drawImage(image, 100, 100, 200, 150,50,50,300,200);//这里取的是实际尺寸
53             }
54         }
复制代码

三个方法的运行结果如下:

图像平铺  context.createPattern(image,type)

    type:
        no-repeat:不平铺

        repeat-x:横方向平铺

        repeat-y:纵方向平铺

        repeat:全方向平铺

类似图形组合,给出动态的切换平铺类型代码

View Code
复制代码
 1         function draw14(id) {
 2             //传统的平铺是用for循环来处理的,现在直接调用接口
 3             var image = new Image();
 4             var canvas = document.getElementById(id);
 5             if (canvas == null)
 6                 return false;
 7             var context = canvas.getContext("2d");
 8             var type = ["no-repeat", "repeat-x", "repeat-y", "repeat"];
 9             var i = 0;
10             image.src = "Image/wordslogo.jpg";
11             image.onload = function () {
12                 var interval = setInterval(function () {
13                     //每次转换平铺类型清空
14                     context.clearRect(0, 0, 400, 300);
15                     if (i >= 4) {
16                         i = 0;
17                     }
18                     var ptrn = context.createPattern(image, type[i]);
19                     context.fillStyle = ptrn;
20                     context.fillRect(0, 0, 400, 300);
21                     i++;
22                 }, 1000);
23             };
24         }
复制代码

 

图像裁剪:context.clip()

    context.clip()只绘制封闭路径区域内的图像,不绘制路径外部图像,用的时候

        先创建裁剪区域

        再绘制图像(之后绘制的图形都会采用这个裁剪区域,要取消这个裁剪区域就需要用到保存恢复状态,下面有讲)

 给出圆形和星形的裁剪代码

View Code
复制代码
 1         //图像裁剪
 2         function draw15(id) {
 3             var canvas = document.getElementById(id);
 4             if (canvas == null)
 5                 return false;
 6             var context = canvas.getContext("2d");
 7             context.fillStyle = "black";
 8             context.fillRect(0, 0, 400, 300);
 9             image = new Image();
10             image.onload = function () {
11                 drawImg(context,image);
12             }
13             image.src = "Image/html5.jpg"
14         }
15 
16         function drawImg(context, image) {
17             //圆形裁剪区
18             //createCircleClip(context)
19             //星形裁剪区
20             create5StarClip(context);
21             context.drawImage(image,0,0);
22         }
23 
24         function createCircleClip(context) {
25             context.beginPath();
26             context.arc(200, 150, 100, 0, Math.PI * 2, true);
27             context.closePath();
28             context.clip();
29         }
30 
31         function create5StarClip(context) {
32             var n = 0;
33             var dx = 200;
34             var dy = 135;
35             var s = 150;
36             context.beginPath();
37             var x = Math.sin(0);
38             var y = Math.cos(0);
39             var dig = Math.PI / 5 * 4;
40             for (var i = 0; i < 5; i++) {
41                 var x = Math.sin(i * dig);
42                 var y = Math.cos(i * dig);
43                 context.lineTo(dx + x * s, dy + y * s);
44             }
45             context.closePath();
46             context.clip();
47         }
复制代码

 

 

像素处理:

获取像素颜色数组: var imagedata=context.getImageData(sx,sy,sw,sh)

    sx:cavas的x轴坐标点

    sy:canvas的y轴坐标点

    sw:距离x的宽度

    sh:距离y的高度

可以利用context.getImageData返回的一个像素颜色数组,顺序是所取像素范围的从左到右,从上到下,数组的元素是(所有图形,包括图片,和绘制的图形)每个像素的rgba

[r1,g1,b1,a1,r2,g2,b2,a2...]

 

设置像素颜色:context.putImageData(imagedata,dx,dy,dirtyX,dirtyY,dirtyWidth,dirtyHeight) 
    对imagedata数组中的各个像素的r、g、b、a值进行修改,再调用putImageData方法进行绘制

        imagedata:修改后的imagedata

        dx:重绘图像的起点横坐标(重绘的起点和原来的图像一致的话就会把原来的图形覆盖掉,看起来就像是原来的图像变成现在的图像一样)

        dy:重绘图像的起点纵坐标

        //以下可选参数,设置重绘的矩形范围,如果缺省,默认会重绘所有的imegedata

        dirtyX:矩形左上角x轴坐标

        dirtyY:矩形左上角y轴坐标

        dirtyWidth:矩形长度

        dirtyHeight:矩形高度

 

View Code
复制代码
 1         function draw16(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             context.fillStyle = 'red'
 7             //在右下角画一个正方形
 8             context.fillRect(250,250,150,50);
 9             var image = new Image();
10             image.src = "Image/html5.jpg";
11 
12             image.onload = function () {
13                 //在左上角画一幅图片
14                 context.drawImage(image, 0, 0,200,200);
15 
16                 //实验证明imagedata取的是canvas所在范围画的图形,不止是图片
17                 //不会取该区域内是空白的canvas的像素
18                 var imagedata = context.getImageData(0, 0, 400, 300);
19 
20                 //修改imagedata
21                 for (var i = 0, n = imagedata.data.length; i < n; i += 4) {
22           
23                     imagedata.data[i + 0] = 255 - imagedata.data[i + 0]; //red;
24                     imagedata.data[i + 1] = 255 - imagedata.data[i + 1]; //green
25                     imagedata.data[i + 2] = 255 - imagedata.data[i + 2]; //blue
26                     //imagedata.data[i + 3] = 255 - imagedata.data[i + 3]; //a
27                 }
28                 context.putImageData(imagedata, 0, 0);
29             }
30         }
复制代码

顶部

 

绘制文字

填充文字:context.fillText(text,x,y)  

绘制文字轮廓 context.strokeText(text,x,y)


     text:要绘制的文字

     x:文字起点的x坐标轴

     y:文字起点的y坐标轴

     context.font:设置字体样式

     context.textAlign:水平对齐方式

          start、end、right、center

     context.textBaseline:垂直对齐方式

          top、hanging、middle、alphabetic、ideographic、bottom

     var length=context.measureText(text):计算字体长度(px)那么能不能计算高度啊,很遗憾,不能

View Code
复制代码
 1         function draw17(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             context.fillStyle = "#EEEEFF";
 7             context.fillRect(0,0,400,300);
 8             context.fillStyle = "#00f";
 9             context.font = "italic 30px sans-serif";
10             context.textBaseline = 'top';
11             //填充字符串
12             var txt="fill示例文字"
13             context.fillText(txt, 0, 0);
14             var length=context.measureText(txt);
15             context.fillText("长" + length.width + "px", 0, 50);
16             context.font = "bolid 30px sans-serif";
17             txt = "stroke示例文字";
18             length = context.measureText(txt);
19             context.strokeText(txt,0,100);
20             context.fillText("长" + length.width + "px", 0, 150);
21         }
复制代码

顶部

 

保存和恢复状态 

保存:context.save()

恢复:context.restore()


    在上面的裁剪图片提过,一旦设定了裁剪区域,后来绘制的图形都只显示裁剪区域内的内容,要“取消”这个裁剪区域才能正常绘制其他图形,其实这个“取消”是利用save()方法和restore()方法来实现的。

    context.save():调用该方法,会保存当前context的状态、属性(把他理解成游戏存档)

    context.restore():调用该方法就能恢复到save时候context的状态、属性(游戏回档)

View Code
复制代码
 1    function draw18(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             context.fillStyle = "red";
 7             context.save(); //保存了当前context的状态
 8             context.fillStyle = "black";
 9             context.fillRect(0, 0, 100, 100);
10             context.restore();//恢复到刚刚保存的状态
11             context.fillRect(0,120,100,100);
12         }
复制代码

顶部

 

保存文件  canvas.toDataURL(MIME)


      在canvas中绘出的图片只是canvas标签而已,并非是真正的图片,是不能右键,另存为的,我们可以利用canvas.toDataURL()这个方法把canvas绘制的图形生成一幅图片,生成图片后,就能对图片进行相应的操作了。

View Code
复制代码
 1         function draw19(id) {
 2             var canvas = document.getElementById(id);
 3             if (canvas == null)
 4                 return false;
 5             var context = canvas.getContext("2d");
 6             context.fillStyle = "rgb(0,0,225)";
 7             context.fillRect(0, 0, canvas.width, canvas.height);
 8             context.fillStyle = "rgb(255,255,0)";
 9             context.fillRect(10, 20, 50, 50);
10             //把图像保存到新的窗口
11             var w=window.open(canvas.toDataURL("image/jpeg"),"smallwin","width=400,height=350");
12        }
复制代码

顶部

 

结合setInterval制作动画


      基本原理就是定时清除整个canvas重新绘制,下面给出“我弹、我弹、我弹弹弹”的代码 (额、名字而已)

      小矩形在矩形区域移动,碰到矩形区域的边缘反弹

View Code
复制代码
 1        function draw20(id) {
 2            var canvas = document.getElementById(id);
 3            if (canvas == null)
 4                return false;
 5            var context = canvas.getContext("2d");
 6      
 7            var interal = setInterval(function () {
 8                move(context);
 9            }, 1);
10        }
11 
12        var x = 100;//矩形开始坐标
13        var y = 100;//矩形结束坐标
14        var mx = 0;//0右1左
15        var my = 0; //0下1上
16        var ml = 1;//每次移动长度
17        var w = 20;//矩形宽度
18        var h = 20;//矩形高度
19        var cw = 400;//canvas宽度
20        var ch = 300; //canvas高度
21 
22 
23        function move(context) {
24            context.clearRect(0, 0, 400, 300);
25            context.fillStyle = "#EEEEFF";
26            context.fillRect(0, 0, 400, 300);
27            context.fillStyle = "red";
28            context.fillRect(x, y, w, h);       
29            if (mx == 0) {
30                x = x + ml;
31                if (x >= cw-w) {
32                    mx = 1;
33                }
34            }
35            else {
36                x = x - ml;
37                if (x <= 0) {
38                    mx = 0;
39                }
40            }
41            if (my == 0) {
42                y = y + ml;
43                if (y >= ch-h) {
44                    my = 1;
45                }
46            }
47            else {
48                y = y - ml;
49                if (y <= 0) {
50                    my = 0;
51                }
52            }
53          
54        }
复制代码

顶部

 

结语


     历时一天半,本来以为可以玩转的,写下来才发现要玩转canvas还需要很多的实践,这个道理应该是适用所有的技术的,做人啊,就得谦虚点。本文如有错误,请及时留言给我纠正,希望能给正在学canvas绘图的童鞋有所帮助

作者:xiaochao062 发表于2014/7/3 14:43:55 原文链接
阅读:67 评论:0 查看评论

2014年移动端界面设计分析

$
0
0

移动互联网时代的悄然袭来改变着我们的生活方式,因此有大批设计力量涌入了移动端的设计领域中,这也说明了大家越来越重视用户在各个设备终端层面的体验。在规划产品时,往往会把PC端和移动端的产品放在同等重要的地位进行思考。然而,设备的多样性和产品形态的多样性为设计师们带来的既是更多的发挥空间,也同样是更大的挑战。这些产品在设计之间有何不同?如何规划不同平台上产品的功能?设计时有哪些差异?2014移动端的界面设计是非常值得探讨的话题。

唯一主色调

2014年,追求极简设计风格,主色调可能只是选定一种色彩,然后调整透明度或者饱和度,(说得通俗些就是将色彩变淡或则加深),从而产生新的色彩,这样能够很好的表达界面层次、重要信息,并且展现良好的视觉效果。这样的页面看起来色彩统一,有层次感。当前上线的一些移动应用都采用极少的色彩,甚至放弃所有的颜色。仅仅用一个主色调就能展现良好的视觉效果。

 

多彩色风格设计

Metro 引领的多彩色风格是与唯一主色调形成对照关系的设计风格,多彩撞色更多的表现于多种纯色块的使用,就是很简单的纯颜色,只需要注意多彩配色的方式,就能得 到很好的视觉效果。多彩色拼接的设计风格,一屏式的页面排版布局,总体来说是时尚大气简洁的设计。“多彩撞色”的概念,在2014年手机端仍会继续发展。

信息框架扁平化

在设计的表现形式上我们追求界面扁平,注重通过弱化视觉效果来强化应用的功能。在移动设备上,过多的层级会使用户失去耐心而放弃对产品的使用。而且移动端上 页面小,没太多地方摆多层的tabs导航或者面包屑导航,就只剩下左上角的一个“返回”按钮作为导航了,可以一次接一次的深入,但跳转了三、四次后,再看 左上角的“返回”按钮,你已经很难判断出将会返回到哪里了。应该从信息架构角度,再进一步的去应用扁平化的设计理念,信息框架扁平化的目的是减少信息层 级,追求信息到达用户的最短距离,从根本上解决上述问题。
扁平化思想是一种让设计者在界面设计过程中减少信息层级的思想。

动态数据可视化

数据可视化设计是将枯燥繁琐的列表和文字转换为直观的饼图、扇形图、折线型、柱状图等丰富直观的设计元素,提高用户体验。而且现今数据可视化不只是静态展现 数据,用户希望通过互动及时获取数据流,若以动态效果来呈现,能多维度呈现给用户实时信息,同时能与用户形成互动,提高数据表现的趣味性。动态数据可视化 将更加强调数据转译实时更新的图形,以及动态的图形化表达。

移动端的视差效果

视差滚动是时下比较热门的网页设计技术,通过让多层背景以不同的速度移动来形成立体的运动视差效果,虽然纯属视觉效果,但不可否认在内容滚动时形成的视觉体 验非常出色!视差效果在网站中的应用并不少见,若在移动应用中,是否也能运用一些精细的视差效果,为用户带来全新的视觉体验。当用户在倾斜和移动屏幕时, 视差能让用户在屏幕上看到如3D一样的视觉效果,带来非常出色的感官体验。

分层结构

分层结构是通过动效扩展了屏幕空间,渲染出带有纵深感的层次,将操作区和内容区划分开,培养用户使用习惯,使人印象深刻,达到意想不到的效果。这种设计更专注于内容,更多的暴露信息,减少结构层级,操作高效。

迎合用户的使用习惯

迎合用户的使用习惯,主要为了让用户在操作中简单到极致。用户不喜欢经常重复性输入一些信息,如个人账号,安全信息,操作习惯,下次操作行为等,这些占用了用户完成其他重要任务的时间。尽量减少用户的输入,并且用户在输入时可以给出适当的参考。
根据用户的行为习惯,对移动应用的整体布局进行重新策划,使得简单、简单、再简单、简单到极致,通过清晰的流程和界面,让用户减少对应用的思考以及寻找的时间;让准确的色彩和表述减少用户心理斗争的时间。

提供明确的导航

导航在移动界面设计中是至关重要的,导航的主要作用在于:告诉用户,我在哪?我去过哪?我可以去哪?我怎么去哪?我去哪能干什么?等等,这些都是导航的作 用。明确的导航设计,可以增强用户的体验,让用户直接在主界面就可以看到对应子界面中的信息,减少用户盲目的操作。在任何地点都能回到主界面或退出应用, 因此导航上的每个操作对用户来说应是符合逻辑的,用户能够较容易了解它要表达的信息与情感。

主操作栏的内容不易过多

主操作栏的作用是为了把最重要的内容展示给用户,一般不超过三项。过多的内容会对用户造成干扰。因此简洁的主操作栏便于用户的使用和了解,并且减少用户发生错误选择的可能性。操作栏上的操作按钮一般用来展示最重要、常用,而且频繁使用的功能操作,比如移动端界面左上角的返回按钮。

以用户为中心

用户总是按照他们自己的方法理解和使用移动端,所以从用户的观点考虑,想用户所想,做用户所做成了设计师们的设计考量标准之一。比如用户在没联网的情况下发送信息或发表评论,相应的内容会自动保存在手机端,联网后只需重新发送即可,不需要重新输入内容。

合理的用户引导

由于手机界面的承载能力有限,产品功能的不断膨胀,必须要在用户打开应用之后告知他某些新奇的功能,引导他完成某些主要任务流程,帮助用户快速掌握应用的使 用方法,让用户快速体验到应用的乐趣,激起用户对功能的尝试欲望。引导语句必须简短,聚焦在最重要的任务上,减少用户的思考时间,让用户不至于迷失在陌生 应用中不知所措。同时也要避免接连不断的展示引导信息,这样不仅会产生短期加重记忆方面的问题,而且会让新用户觉得你的应用过于复杂,望而生畏。

拟真动态

将现实中的运动现象简化抽象,形成了移动端中一些蛮有特色的动画效果。比如天气应用中,全屏的气象动画优雅而逼真,洋洋洒洒的雪粒、悠然飘浮的云朵、划破天际的闪电传达出一种独特的表现力,给用户更完整,更真实以及更具趣味的感官体验。

尽量使用图形元素

众所周知,图形相较于文字更易于记忆和了解。最合理的方式是:“恰当的图形元素+简短的文字”,并整合到一个展示层面上,这种方式既有利于用户阅读,也可以 使多步骤的流程更直观、易懂、易记忆。采用的图形尽量简单易懂,形象具体。避免让人产生歧义的图标,因为这样反而会误导用户,损失设计交互体验。比如圆形 是最容易让人觉得舒服的形状,尤其是在充满各种方框的手机屏幕内,增加一些圆润的形状点缀,立刻就会增加活泼的气息,徒增好感。移动界面运用圆形选项按钮 来设计,让选择变得专注而明确,又不刻板老套。

总结:

移动端的设计根据不同产品的战略和具体情境,设计要进行灵活变化。其提倡的核心原则就是从用户出发,充分考虑用户的使用体验。本文对移动端界面设计进行粗浅的分析,希望给大家带来一些思考和帮助,有不足之处欢迎指正,也与诸君共勉。

作者:Anyforweb UDC中心
链接:http://design.anyforweb.com/Clients/ShtmlPages/News/newsDetail237.shtml


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

抛弃 PV,网站广告也按时间收费?

$
0
0

抛弃 PV,网站广告也按时间收费?

“同样一个品牌,曝光 1 秒和 5 秒有差别么?”

这是《金融时报》(Financial Times)数字广告总监 Jon Slade 近日提出的一个看似简单问题,他无非是想证明注意力时间对于广告的重要性。

但在在线媒体行业,衡量广告投放效果的却是另外一套指标——PV 和 UV。在广告主眼中,页面浏览量越大,意味着广告到达受众人数越广,投放效果也就越好。

近日,《金融时报》宣布了新的数字广告收费模式,将出售基于受众时间的广告,而非传统的页面浏览量和点击量。《金融时报》藉此解决广告业沉疴已久的问题,同时将深度参与受众价值提升到另一层次——该报纸表示,这些忠实读者花费在《金融时报》上的时间是其他财经网站的 6 倍。

“我们在尝试证明这样一个假设:你给受众展示品牌创意的时间越长,受众与受众产生的共鸣越多。这并非我们衡量广告价值的传统方式,我们讨论的是注意力经济。”

Jon Slade 在接受 Contently 的采访时这样说。

UPWORTHY 网站认为,相对于 PV、UV,更好的指标时注意力时间(Attention minutes),即受众点击链接到分享这个链接之间所花的时间。如果以这样的指标考量,UV 可观的 Twitter 的受众注意力时间就显然不如 YouTube、Medium 等平台了。

相对于 PV、UV,注意力时间更能反映受众对于内容的态度,但这其中显然存在一些局限性,比如较长的内容、噱头的文字和图片通常能够带来更长的注意力时间,而耗费时间短的突发新闻并不代表内容信息价值低。

我们认为,比注意力时间更好的衡量指标是参与度和沉浸度,但后者显然是个更加难以量化的标准。在这里我们或许可以参考风险投资机构 Andreessen Horowitz 对产品价值的衡量指标:

  1. 互动率(Engagement):每个公司测量产品的互动情况并不一样,但这些数据要比 PV 更能准确衡量一个网站成功与否。比如 Yelp 会使用餐馆的评论总数,YouTube 使用视频的播放次数等。
  2. 使用频率(Retention):一个重要的数据是到底有多少用户经常性地使用你的产品或者浏览你的网页。换句话说,一个 100 万下载量的应用,有多少用户在初次使用后还会再回来?如果这个数据低于 10%,那这个产品就有些失败。
  3. 关键的指标(OKM):每个公司都应该有个适用于自己的可测量指标。比如 Instagram 的指标就是用户的照片上传次数,当然把这个指标做更深度的延伸就是,用户上传照片的频率等。

本质上看,以注意力时间为广告计费的模式是一种“质量大于数量”的计费模式。从平台角度看,它更符合《金融时报》的高端定位,从广告主看,它更适合产品定位精准的投放,这是新媒体商业模式的一次里程碑式的尝试,但要得到市场的接纳恐怕不会是在一朝一夕。

本文来源: ifanr

10个我们希望成为现实的苹果专利

$
0
0

9851365_980x1200_0

苹果各种五花八门的专利一直都是媒体所关注的对象,虽然这些专利并不一定会最终成为现实,但它们至少可以帮助外界了解到一向神秘的苹果都在捣鼓些什么。不过话说回来,我们依然希望那些有趣的专利可以成为现实。下面就是10个我们最希望可以变成现实的苹果专利。

1.触觉显示屏技术:

如今的全触屏手机让盲操作变得几乎不可能,但苹果在2012年5月申请的触觉显示屏技术或许可以改变这一点。

苹果这套精密的多层系统可让OLED屏幕与多个传感器/促动器同步工作,并通过数个弹力屏幕层的彼此层叠来实现按键或物体的三维化,或是为图像(比如地质图)带来纹理感。这套系统还可以对使用者的物理触碰作出回应,并分辨手指接触屏幕时的力度是轻还是重。

9851366_980x1200_0

2.防碎玻璃:

手机在使用时难免会产生磕碰或不慎坠地,但如果苹果的这项专利成为现实,我们不必再担心由此对手机带来的损伤了。

这项防碎玻璃专利获批于2011年11月,具体方式是使用钾和钠离子来处理iPhone 4和4s所使用的铝硅酸盐玻璃。这种处理可以提高后者表面和边缘的压缩阈值,从而使其更加不易破碎。

专利当中还提到了另一个有趣的功能:在设备的屏幕玻璃和金属外壳之间放置了一个减震架。当设备的加速度计检测到机身正在坠落时,这个减震架便会立刻膨胀起来,并包裹屏幕玻璃,这样也就起到了保护的目的。

9851367_980x1200_0

3.iWallet:

虽然苹果目前正在拓展自己的Touch ID技术,来让用户可以在iPhone 5s及未来的设备上进行轻松购物,但在此之前,苹果实际上曾经设计过一个完整的数字钱包系统,可让用户在iPhone上直接控制自己的财务账户。

这项名为“iWallet”的专利在2012年3月获批。该系统可让用户轻松查看自己信用卡的完整信息,并浏览来自银行的通知和信息。此外,iWallet还具备家长控制功能,以供家长限制子女的花费。

9851368_1200x1000_0

4.虚拟购物伴侣:

早在亚马逊发布Firefly技术的数年之前,苹果就已经设计了一项名为“Products+”的专利,让用户可以扫描商店中的任意商品以获取更多信息。该功能当中还包含了某种游戏化的元素,当消费者在扫描特定物品时,系统会给予一些免费的奖励,比如iTunes音乐或商品等。

9851369_1200x1000_0

5.3D图像:

亚马逊或许先于苹果推出了首款“3D”智能手机,但苹果未来的设备或许也会具备拍摄3D图像的能力,这要多亏了他们在2012年3月获取的一项拍照专利。

虽然目前的市面上已经存在不少的3D相机,但这些设备基本上都无法捕捉到形状、表面和景深方面的足够信息。而苹果的解决方案是利用多种传感器和摄像头:一个传感器用于捕捉偏振图像,其他两个则会捕捉两种不同的非偏振图像,系统则会将这些图像相结合。

 

 

9851370_1200x1000_0

 

6.交互式全息图:

全息图的概念很早就已经流行开来,但我们能见到它的地方主要还是在科幻电影里。而苹果对于全息图也产生了兴趣:他们不仅想让用户看到全息图,还能够与之进行互动。

在2012年10月的一项专利当中,苹果描述了了一种可以将图像投影在半空中,并允许用户与之进行互动的系统。用户还可以通过一些常用的手势,比如滑动和捏拉缩放,来对图像进行控制。

9851371_1200x1000_0

7.液态金属:

苹果在2010年购买了LiquidMetal旗下液态金属的独家使用权。这是一种非常强韧的合金,因其超高的抗划伤/腐蚀性而非常适合消费类电子设备的生产。

但无论是处于何种原因,苹果目前还尚未推出一款整体采用液态金属材质的设备。而根据今年5月份公布的一项专利,苹果正在思考一种“将玻璃完整嵌入金属边框”的方式,这将会造就一部极为强韧的iPhone,至少是从结构上讲。专利称苹果会使用一种新型的显示屏玻璃,这不禁让我们想起了最近有关iPhone 6将采用蓝宝石屏幕的消息。

9851372_1200x1000_0

8.智能互动地图:

苹果的地图技术或许永远不会赶上谷歌,但在去年12月公布的一项专利展示了苹果对于其地图服务的一些不同想法。

据悉,苹果的“互动地图”解决方案将会引入一种可定制的动态涂层系统,它只会显示用户需要的内容,从而让地图不显杂乱和信息过剩。比如说,如果你触摸了地图上的一个点,苹果地图会提供不同的路线图,并显示出沿途最主要的兴趣点。

9851373_1200x1000_0

9.苹果自行车:

自行车看上去并不像是苹果感兴趣的产品类型,但2012年的一项专利展示了一架可以和苹果移动设备进行通讯的自行车。在彼此相连之后,这些移动设备的屏幕上便会显示出“速度、距离、时间、高度、心率和电量”等信息。

9851374_1200x1000_0

10.iWatch:

苹果传闻当中的iWatch智能手表是时下人们所讨论的热门话题,而这项在2月份公布的专利也引发了众人的无限遐想。

专利中的这款智能手表配备了连续、柔性的显示屏,其内部是柔性钢带,外部则由织物所包裹。这款设备和与移动设备进行通讯,其配备的太阳能面板还能够提升设备的续航。如果你认为在智能手表上加入太阳能面板有些古怪,苹果在上个月也升级了自己的太阳能专利,为其加入了多点触控和柔性显示屏,这些也都是iWatch会具备的能力。

 

10个我们希望成为现实的苹果专利,首发于 极客范 - GeekFan.net

微软中国因碳排放超标被罚款

$
0
0
官方媒体《人民日报(海外版)》报道,微软中国等五家公司因碳排放超标被罚款。它们将在两周后收到北京节能监察大队的罚单。报道称,微软(中国)有限公司去年碳排放超出配额400多吨。北京节能监察大队称,北京市是全国7个碳排放权交易试点城市之一,按照相关规定,北京市行政区域内重点排放单位的二氧化碳排放实行配额管理。重点排放单位在配额许可范围内排放二氧化碳,其现有设施碳排放量应当逐年下降。如果碳排放量超出配额许可范围,企业可在碳交易市场购买其他单位节约出来的碳排放配额,以此达到二氧化碳排放总量控制的目的。中国是世界最大的碳排放国,配额制和碳交易是减少碳排放的措施之一,曾被批评变成了商机,反而造成了破坏。目前北京碳排放市场成交均价为每吨67.12元,假设按此价格计算罚金,微软需要支付数万罚款。






Viewing all 15843 articles
Browse latest View live


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