2013年11月30日星期六

archive存储引擎注意事项

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
archive存储引擎注意事项  阅读原文»

archive存储引擎注意事项
分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:

阅读更多内容

2013年11月29日星期五

多层架构+MVC+EF+AUTOFAC+AUTOMAPPER - 我佛慈悲纠结

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
多层架构+MVC+EF+AUTOFAC+AUTOMAPPER - 我佛慈悲纠结  阅读原文»

  最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友。


一、目录

 1、多层架构+MVC+EF+AUTOFAC+AUTOMAPPER;

 2、MVC中验证码的实现(经常用,记录备用)

二、正文

 多层架构中等以上规模以上的系统用得比较多,此demo功能不多,出于抱着学习的态度搭建了一个多层架构,并加入现在很流行的依赖倒转(autofac)、对象映射工具(automapper)。

 话说没图你说个J8,先上框架图:

  Model层中Entity存放数据库实体,使用code first,ViewModel存放界面展示模型。DAL层中IDAO存放接口,EFDAO实现IDAO。BLL结构与DAL类似,接口+实现。WEB层就是我们的UI层了,在这个框架中,WEB层使用MVC。什么,MVC不就是多层架构嘛,怎么还把它放Web层呢?MVC并不等同于多层架构,有这样疑问的同学,请在园内搜索相关文章。Infrastructure层是我们的基础设施层,我把一些常用的工具类封装后放入其中,方便其它地方调用。

  IDao中定义了一个公共基类,基类中定义所有子类都会用到的查询方法:

1 namespace YTJWGL_IDao
2 {
3 public interface IBaseDao<T>
4 {
5 #region 查询普通实现方案(基于Lambda表达式的Where查询)
6 /// <summary>
7 /// 获取所有Entity
8 /// </summary>
9 /// <param name="exp">Lambda条件的where</param>
10 /// <returns></returns>
11 IEnumerable<T> GetEntities(Func<T, bool> exp);
12
13 /// <summary>
14 /// 计算总个数(分页)
15 /// </summary>
16 /// <param name="exp">Lambda条件的where</param>
17 /// <returns></returns>
18 int GetEntitiesCount(Func<T, bool> exp);
19
20 /// <summary>
21 /// 分页查询(Linq分页方式)
22 /// </summary>
23 /// <param name="pageNumber">当前页</param>
24 /// <param name="pageSize">页码</param>
25 /// <param name="orderName">lambda排序名称</param>
26 /// <param name="sortOrder">排序(升序or降序)</param>
27 /// <param name="exp">lambda查询条件where</param>
28 /// <returns></returns>
29 IEnumerable<T> GetEntitiesForPaging(int pageNumber, int pageSize, Func<T, string> orderName, string sortOrder, Func<T, bool> exp);
30
31 /// <summary>
32 /// 根据条件查找
33 /// </summary>
34 /// <param name="exp">lambda查询条件where</param>
35 /// <returns></returns>
36 T GetEntity(Func<T, bool> exp);
37
38

2013年11月28日星期四

pam_env.so

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
pam_env.so  阅读原文»

用户名:d伪装d 文章数:40 评论数:6
访问量:5192:4952:484:3 注册日期:2011-02-25



OS version:Red Hat Enterprise Linux Server release 6.4
Kernel version:2.6.32-358.el6.x86_64


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

准备工作:


[root@Zhai ~]# env | grep pam_env_test1
[root@Zhai ~]# env | grep pam_env_test2
[root@Zhai ~]# env | grep pam_env_test3
[root@Zhai ~]# env | grep pam_env_test4
[root@Zhai ~]# su - pam_test1
[pam_test1@Zhai ~]$ env | grep pam_env_test1
[pam_test1@Zhai ~]$ env | grep pam_env_test2
[pam_test1@Zhai ~]$ env | grep pam_env_test3
[pam_test1@Zhai ~]$ env | grep pam_env_test4

验证1:


[root@Zhai ~]# vi /etc/pam.d/su

auth required pam_unix.so
account required pam_unix.so
session required pam_env.so conffile=/etc/security/pam_env.conf

[root@Zhai ~]# vi /etc/security/pam_env.conf

pam_env_test1 DEFAULT=Zhai_kang
pam_env_test2 DEFAULT="Zhai_kang 2013"
pam_env_test3 DEFAULT="Zhai_kang 201311" OVERRIDE=${pam_env_test1}
pam_env_test4 DEFAULT=zhai_kang:201311\

082241560.jpg

验证2:


[root@Zhai ~]# cat /etc/security/pam_env.conf

pam_env_test1 DEFAULT=Zhai_kang
pam_env_test2 DEFAULT="Zhai_kang 2013"
pam_env_test3 DEFAULT="Zhai_kang 201311" OVERRIDE=${pam_env_test1}
pam_env_test4 DEFAULT=zhai_kang:201311\

[root@Zhai ~]# vi /etc/environment

pam_env_test4="----Zhai_kang V----"
pam_test5="Kang_Zhai 2013"

[root@Zhai ~]# vi /etc/pam.d/su

auth required pam_unix.so
account required pam_unix.so
session required pam_env.so conffile=/etc/security/pam_env.conf envfile=/etc/environment readenv=1

082427129.jpg

验证3:


[root@Zhai ~]# cat /etc/security/pam_env.conf

pam_env_test1 DEFAULT=Zhai_kang
pam_env_test2 DEFAULT="Zhai_kang 2013"
pam_env_test3 DEFAULT="Zhai_kang 201311" OVERRIDE=${pam_env_test1}
pam_env_test4 DEFAULT=zhai_kang:201311\

[root@Zhai ~]# cat /etc/environment

pam_env_test4="----Zhai_kang V----"
pam_test5="Kang_Zhai 2013"

[root@Zhai ~]# vi /etc/pam.d/su

auth required pam_unix.so
account required pam_unix.so
session required pam_env.so conffile=/etc/security/pam_env.conf envfile=/etc/environment readenv=1 user_envfile=.pam_environment user_readenv=1

[pam_test1@Zhai ~]$ vi .pam_environment

编程乐趣:C#实现12306自动登录(2013年11月27)  阅读原文»

编程乐趣:C#实现12306自动登录(2013年11月27)

依然使用IE9的捕获参数,做了一个12306的登录功能。参照了网上童鞋们的做法。
其他都和前面几篇读取余票、票价一样,不过登录要用到证书的问题,这个参考了一个网上的例子。
不过12306会随时变化,下面的登录不一定一直都能成功。如果12306有变化,大家可以根据变化对代码做修改。总之使用的方法不变,就是捕获参数和url,然后自己补充参数。
效果如下:
SouthEast
项目名称:Test12306AutoLogin;
环境:.net 4.0,Visual studio 2010;
项目图:
SouthEast
直接贴代码了。
核心代码如下,
信任证书代码:

   public class Messenger      {          public Messenger()          {          }          public void Register(string message, Action callback)          {              this.Register(message, callback, null);          }          public void Register<T>(string message, Action<T> callback)          {              this.Register(message, callback, typeof(T));          }          void Register(string message, Delegate callback, Type parameterType)          {              if (String.IsNullOrEmpty(message))                  throw new ArgumentException("'message' cannot be null or empty.");              if (callback == null)                  throw new ArgumentNullException("callback");              this.VerifyParameterType(message, parameterType);              _messageToActionsMap.AddAction(message, callback.Target, callback.Method, parameterType);          }          [Conditional("DEBUG")]          void VerifyParameterType(string message, Type parameterType)          {              Type previouslyRegisteredParameterType = null;              if (_messageToActionsMap.TryGetParameterType(message, out previouslyRegisteredParameterType))              {                  if (previouslyRegisteredParameterType != null && parameterType != null)                  {                      if (!previouslyRegisteredParameterType.Equals(parameterType))                          throw new InvalidOperationException(string.Format(                              "The registered action's parameter type is inconsistent with the previously registered actions for message '{0}'.\nExpected: {1}\nAdding: {2}",                              message,                              previouslyRegisteredParameterType.FullName,                              parameterType.FullName));                  }                  else                  {                      // One, or both, of previouslyRegisteredParameterType or callbackParameterType are null.                      if (previouslyRegisteredParameterType != parameterType)   // not both null?                      {                          throw new TargetParameterCountException(string.Format(                              "The registered action has a number of parameters inconsistent with the previously registered actions for message \"{0}\".\nExpected: {1}\nAdding: {2}",                              message,                              previouslyRegisteredParameterType == null ? 0 : 1,                              parameterType == null ? 0 : 1));                      }                  }              }          }          public void NotifyColleagues(string message, object parameter)          {              if (String.IsNullOrEmpty(message))                  throw new ArgumentException("'message' cannot be null or empty.");              Type registeredParameterType;              if (_messageToActionsMap.TryGetParameterType(message, out registeredParameterType))              {                  if (registeredParameterType == null)                      throw new TargetParameterCountException(string.Format("Cannot pass a parameter with message '{0}'. Registered action(s) expect no parameter.", message));              }              var actions = _messageToActionsMap.GetActions(message);              if (actions != null)                  actions.ForEach(action => action.DynamicInvoke(parameter));          }          public void NotifyColleagues(string message)          {              if (String.IsNullOrEmpty(message))                  throw new ArgumentException("'message' cannot be null or empty.");              Type registeredParameterType;              if (_messageToActionsMap.TryGetParameterType(message, out registeredParameterType))              {                  if (registeredParameterType != null)                      throw new TargetParameterCountException(string.Format("Must pass a parameter of type {0} with this message. Registered action(s) expect it.", registeredParameterType.FullName));              }              var actions = _messageToActionsMap.GetActions(message);              if (actions != null)                  actions.ForEach(action => action.DynamicInvoke());          }          private class MessageToActionsMap          {              internal MessageToActionsMap()              {              }              internal void AddAction(string message, object target, MethodInfo method, Type actionType)              {                  if (message == null)                      throw new ArgumentNullException("message");                  if (method == null)                      throw new ArgumentNullException("method");                  lock (_map)                  {                      if (!_map.ContainsKey(message))                          _map[message] = new List<WeakAction>();                      _map[message].Add(new WeakAction(target, method, actionType));                  }              }              internal List<Delegate> GetActions(string message)              {                  if (message == null)                      throw new ArgumentNullException("message");                  List<Delegate> actions;                  lock (_map)                  {                      if (!_map.ContainsKey(message))                          return null;                      List<WeakAction> weakActions = _map[message];                      actions = new List<Delegate>(weakActions.Count);                      for (int i = weakActions.Count - 1; i > -1; --i)                      {                          WeakAction weakAction = weakActions;                          if (weakAction == null)                              continue;                          Delegate action = weakAction.CreateAction();                          if (action != null)                          {                              actions.Add(action);                          }                          else                          {                              // The target object is dead, so get rid of the weak action.                              weakActions.Remove(weakAction);                          }                      }                      // Delete the list from the map if it is now empty.                      if (weakActions.Count == 0)                          _map.Remove(message);                  }                  // Reverse the list to ensure the callbacks are invoked in the order they were registered.                  actions.Reverse();                  return actions;              }              internal bool TryGetParameterType(string message, out Type parameterType)              {                  if (message == null)                      throw new ArgumentNullException("message");                  parameterType = null;                  List<WeakAction> weakActions;                  lock (_map)                  {                      if (!_map.TryGetValue(message, out weakActions) || weakActions.Count == 0)                          return false;                  }                  parameterType = weakActions[0].ParameterType;                  return true;              }              readonly Dictionary<string, List<WeakAction>> _map = new Dictionary<string, List<WeakAction>>();          }          private class WeakAction          {              internal WeakAction(object target, MethodInfo method, Type parameterType)              {                  if (target == null)                  {                      _targetRef = null;                  }                  else                  {                      _targetRef = new WeakReference(target);                  }                  _method = method;                  this.ParameterType = parameterType;                  if (parameterType == null)                  {                      _delegateType = typeof(Action);                  }                  else                  {                      _delegateType = typeof(Action<>).MakeGenericType(parameterType);                  }              }              internal Delegate CreateAction()              {                  // Rehydrate into a real Action object, so that the method can be invoked.                  if (_targetRef == null)                  {                      return Delegate.CreateDelegate(_delegateType, _method);                  }                  else                  {                      try                      {                          object target = _targetRef.Target;                          if (target != null)                              return Delegate.CreateDelegate(_delegateType, target, _method);                      }                      catch                     

阅读更多内容

2013年11月27日星期三

javascript获取元素的计算样式 - 成奈川

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
javascript获取元素的计算样式 - 成奈川  阅读原文»

使用css控制页面有4种方式,分别为行内样式(内联样式)、内嵌式、链接式、导入式。

行内样式(内联样式)即写在html标签中的style属性中,如<div style="width:100px;height:100px;"></div>

内嵌样式即写在style标签中,例如<style type="text/css">div{width:100px; height:100px}</style>

链接式即为用link标签引入css文件,例如<link href="test.css" type="text/css" rel="stylesheet" />

导入式即为用import引入css文件,例如@import url("test.css")

如果想用javascript获取一个元素的样式信息,首先想到的应该是元素的style属性。但是元素的style属性仅仅代表了元素的内联样式,如果一个元素的部分样式信息写在内联样式中,一部分写在外部的css文件中,通过style属性是不能获取到元素的完整样式信息的。因此,需要使用元素的计算样式才获取元素的样式信息。

用window对象的getComputedStyle方法来获取一个元素的计算样式,此方法有2个参数,第一个参数为要获取计算样式的元素,第二个参数可以是null、空字符串、伪类(如:before,:after),这两个参数都是必需的。

来个例子,

<style type="text/css">

#testDiv{

  border:1px solid red;

  width: 100px;

  height: 100px;

  color: red;

}

</style>

<div id="testDiv"></div>

var testDiv = document.getElementById("testDiv");

var computedStyle = window.getComputedStyle(testDiv, "");

var width = computedStyle.width;  //100px

var height = computedStyle.height;  //100px

var color = computedStyle.color;  //rgb(255, 0, 0)

注:获取到的颜色属性都是以rgb(#,#,#)格式返回的。

这个时候如果用testDiv.style来获取样式信息,如testDiv.style.width肯定是为空的。

getComputedStyle方法在IE8以及更早的版本中没有实现,但是IE中每个元素有自己的currentStyle属性。

so,来个通用的

var testDiv = document.getElementById("testDiv");

var styleInfo = window.getComputedStyle ? window.getComputedStyle(testDiv, "") : testDiv.currentStyle;

var width = styleInfo.width;  //100px;

var height = styleInfo.height;  //100px;

var color = styleInfo.color;  // rgb(255, 0, 0)

最后要注意一点,元素的计算样式是只读的,如果想设置元素样式,还得用元素的style属性(这个才是元素style属性的真正用途所在)。


本文链接:http://www.cnblogs.com/ArthurPatten/p/3446878.html,转载请注明。

oracle 10g 学习之oracle管理(3) - szyuxueliang  阅读原文»

怎样将预先写好的sql脚本执行?

select * from employees;→107条记录

利用 Oracle 企业管理器连接数据库服务器

点击打开以下界面:

此时已经连接成功了

用 Oracle 企业管理器进行数据库安全管理用户管理

创建之后就可以使用该用户进行客户端登录了

当使用该账号进行对数据库某种操作的时候是需要权限的,比如,我们创建一张表需要创建表的权限,所以我们分配给该用户创建表的权限

但是创建表需要空间,我们创建用户默认使用USERS表空间,所以我们分配表空间

Oracle 的(资源限制)概要文件

l 为了控制系统资源的使用, 可以利用资源限制概要文件.

l 资源限制概要文件是 Oracle 安全策略的重要组成部分, 利用资源限制概要文件可以对数据库用户进行基本的资源限制, 而且还可以对用户的口令进行管理.

l 使用资源限制概要文件可以限制下列资源的使用

  • 每个会话或每个语句的 CPU 时间(以百分之一秒计)
  • 每个用户的并发数据库会话
  • 每个会话的最大链接事件和空闲时间(以分计)
  • 可供多线程服务器会话使用的最大的服务器内存.

l 使用资源限制概要文件可以对每个指定此概要文件的用户账号进行一下设置

  • 允许用户连续输入错误口令的次数, 在此之后 Oracle 将锁定账户
  • 口令的过期时间(以天计)
  • 允许用户使用一个到期口令的天数, 这之后 Oracle 将锁定账号
  • 是否检查一个账号口令的复杂性, 以防止账号使用明显的口令

Oracle 数据库的默认概要文件

l 每个 Oracle 数据库都有一个默认的资源概要文件, 名为 DEFAULT

l 当创建一个新的数据库用户且不对用户分配一个特定的概要文件时, Oracle 自动给用户分配数据库的 DEFAULT 概要文件. 默认时,数据库 DEFAULT 概要文件的所有资源限制设置为无限制的.

模式(schema)

l 模式: 组织相关数据库对象的一个逻辑概念, 与数据库对象的物理存储无关. 一个模式只能属于一个数据库用户, 而且模式的名称与用户的名称相同.可以理解为模式就是账户

l Oracle 数据库的每个用户都拥有唯一的模式. 默认情况下, 用户所创建的所有模式对象都保存在自己的模式中.在 Oracle 数据库中模式与用户账号为一一对应的关系

l 如果要从一个模式中引用另一个模式中的对象, 可以使用 点表示法. 不同模式中的对象名可以重复.

Itcast 要访问 scott 用户的 emp 表,

scott.emp

模式对象和非模式对象

l 能包含在模式中对象成为模式对象.

l Oracle 数据库中有许多类型的对象, 但不是所有的对象都可以组织在模式中. 可以组织在模式中的对象有: 表, 索引, 触发器等.

l 有一些不属于任何模式的数据库对象, 称为非模式对象. 如: 表空间, 用户账号, 角色, 概要文件等.

用户的默认表空间

l 表空间是数据库的逻辑存储设备, 它把数据库信息组织成物理存储空间.

l 表空间由数据文件组成.用户的各种模式对象(如表, 索引, 过程, 触发器等) 都是放在表空间中.

l 对每个数据库用户, 都可以设置一个默认表空间. 当用户创建一个新的数据库对象(如表), 并且不明确地为此对象指定表空间时, Oracle 会把所创建的这个新数据库对象存放到用户默认的表空间中.

l 如果不给用户指定默认表空间, 则用户的默认表空间为 USERS 表空间.

用户的临时表空间

l 一般, SQL 语句在完成任务时需要临时工作空间. 例如:一个用来连接和排序大量的查询需要临时工作空间来存放结果. 除非另外指定, 一般情况下, 用户的临时表空间是 TEMP 表空间.

l 若数据库中没有创建 TEMP 表空间, 则用户的临时表空间为 SYSTEM 表空间.

l 因为 SYSTEM 表空间是用来保存数据库系统信息(数据库自身信息的内部系统表和视图 ---- 数据字典; 所有 PL/SQL 程序的源代码 ---- 包括函数, 触发器等)的. 如果用户大量使用此表空间存储自己的数据, 将会影响系统的执行效率. 因此一般不建议用户使用 SYSTEM 表空间

权限管理

l 在为一个 Oracle 数据库系统创建用户之后, 这些用户既不能与数据库服务器连接, 也不能做任何事情, 除非他们具有执行特定数据库操作的权限.

l Oracle 中的数据库访问权限类型共有两种:

  • 系统权限: 一种功能很强的权限, 他向用户提供了执行某一种或某一类型的数据库操作的能力. (比如创建表)
  • 对象权限: 控制用户是否能在特定数据库对象(如表, 视图或存储过程) 上执行特定类型的操作.(比如在某张表查询数据的权限)

常用的系统权限

使用系统权限

开发人员一般需要 create table, create view 和 create type 系统权限.

常用的对象权限

修改用户的系统权限

利用角色进行权限管理

l 数据库应用程序所需要的系统权限和对象权限很多. 为了使 ”安全管理” 成为比较容易的工作, 可以利用角色

l 角色(role): 系统权限和对象权限的一个集合. 可以将角色授予 用户, 被授予角色的用户会自动拥有角色所具有的权限. 如果修改了角色所拥有的权限, 则被授予角色的用户的权限也会随之自动修改.

给角色权限

将角色授予用户


本文链接:http://www.cnblogs.com/yxlblogs/p/3446788.html,转载请注明。

阅读更多内容

2013年11月26日星期二

÷°,×ó°

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
÷°,×ó°  阅读原文»

以感恩的心离职,站好最后一班岗

说起离职,心中还是泛起一阵阵忧伤和感叹!也许是我熟悉了这里的环境,工作和同事,也许是我对公司的那种感情,恋恋不舍的感情。来公司已经整整2年零1个月了,那时的我显的特别稚嫩,懂的很少,记得当时Shell脚本都不会写,是公司给我了工作,学习和成长的机会。年初公司还给我加25%的薪资,这也是公司对我工作的极大肯定。也许这些原因就是我恋恋不舍的缘由吧。
我面试的下家是国内知名的专业人力资源服务机构,无论是对自己今职业后发展还是自己能力的培养都是很好的机会。我决定离职去新公司发展,首先给我的leader发离职申请,这是其中的一段:"非常感谢公司在这2年多时间里给我提供了一个工作和学习的平台,也很感谢张sir对我的栽培和培养。我在公司里学到了很多知识,分析问题和解决问题的能力也得到了很大的提升,思想和视野都开阔了好多,在我们公司的2年多工作经历让我受益非浅"。我是10月4号提的离职申请,在11月06号正式离开公司,11月9号正式入职新公司,在这短短1月的时间里,我有很多事情要做,每天要站好最后一班岗。

第一:我要重新整理公司的文档资料,包括IDC和公司机房的资产信息,机柜信息,服务器用户名密码,网站拓扑图,网站部署及更新流程等文档,因为之前下架过一些服务器,公司也上线过新网站,整个信息变动很大。
第二:为公司招聘合适的接班人,这个是最难的。首先我得考虑稳定性,不能干一半年就闪人。这个对公司和个人都是损失,对公司来讲要花精力招聘人,培养人,对个人来讲在一半年根本都没有熟悉公司的业务,学不到什么核心的东西。其次要招聘技术水准差不多的人,技术太薄弱,出了问题解决不了,技术太好,工资也要的很高,公司聘请不起。最后就招聘一个基础理论比较好,上进心强,1-2年工作经验的应聘者吧。
第三:希望应聘者能早到公司一周左右,好好培训几天,希望能起到引导的作用,嘿嘿,毕竟在工作经验和能力上面都很欠缺的,很多的都是在虚拟机上面操作的。在这里,平台,环境,资源都有了,更多的希望他能好好努力,快速成长。

最后无论我们走到哪里,在哪里工作,都要学会以感恩的心面对一切,感谢曾经给你机会的公司,感谢曾经帮助过你的同事,还要感谢一路默默支持的亲人和朋友。这个世界不缺少机会,而是缺少抓住机会的勇气。和我一样为了梦想,背井离乡,努力奋斗的年轻人,加油,努力!做技术就要多学新东西,多做笔记,多写博客,古人云:"艺多不压身,盐多菜不坏"就是这个道理!

本文出自 "朴实的追梦者" 博客,请务必保留此出处http://sfzhang88.blog.51cto.com/4995876/1331576

ósessoná°ˇ°  阅读原文»

大规模网站sesson会话保持思路及实践配置

大规模网站sesson会话共享思路及实践配置[老男孩培训内部资料分享]

可以直接用memcached来作PHP的session.save_handler解决sesson共享问题

1. 安装memcached服务端软件
略,见老男孩培训相关视频教程或谷歌搜下安装。
注意:memcached用libevent来作事件驱动,所以要先安装libevent。

2. 安装memcache客户端件
略,见老男孩培训相关视频教程或谷歌搜下安装。

3. 真正配置的开始
修改配置文件,在php.ini中全局设置:

web集群session共享存储设置:
默认php.ini中session的类型和配置路径:
#session.save_handler = files
#session.save_path = "/tmp"
修改成如下配置:
session.save_handler = memcache
session.save_path = "tcp://10.0.0.18:11211"
提示:
1)10.0.0.18:11211 为memcached数据库缓存的IP及端口。
2)上述适合LNMP,LAMP环境。
3)memcached服务器也可以是多台通过hash调度。

4、用memcached来存储session特点:
优点:
1)读写速度上会比普通files时快很多。
2)可以解决多个服务器共用session的难题。
缺点:
1)session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题。
2)单点,部署多台,也无法数据同步。通过hash算法分配依然有sesson丢失的问题。

5、大规模企业解决思路:
2)可以用其他的持久化系统存储sessons,例如:redis,ttserver,替代memcached。
3)高性能高并发场景,cookies效率比session要好很多,因此,大网站都会用cookies解决会话共享问题。
4)有初级运维网友通过牺牲LB的负载均衡的策略实现,例如:lvs -p,nginx ip_hash等,这些不是好的方法。

相关博文:http://oldboy.blog.51cto.com/2561410/1323468

本文出自 "老男孩linux运维" 博客,请务必保留此出处http://oldboy.blog.51cto.com/2561410/1331316

阅读更多内容

我的草图——界面功能介绍 - 框兴秀泽

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
我的草图――界面功能介绍 - 框兴秀泽  阅读原文»

主界面

登录软件后进入主界面,主界面的效果图如下

主界面主要包括有:菜单栏、页面区域、元件区域、工作区域


菜单栏

菜单栏如下图所示,左边有菜单项:文件、项目、帮助,右边有操作按钮:打开、下载、预览


文件菜单项
文件菜单项展开如下图所示

文件菜单的子菜单项功能如下:
新建:新建项目
打开:打开本地项目文件
下载到本地:当前项目保存到本地文件
导出\导出图片:当前项目导出为图片文件包

文件菜单项
项目菜单项展开如下图所示

项目菜单的子菜单项
预览:预览当前项目
属性:打开当前文件属性

帮助菜单项
帮助菜单项展开如下图所示

帮助菜单的子菜单项


示例教程:打开示例教程标签页
快捷键说明…:显示快捷键说明
关于MyMockup:显示关于窗体

大湿教我写程序(3)之自动补全(�丝没有春天)篇 - 微软高级php工程师  阅读原文»

一、女神也爱玩撸码

“在么,亲。”

“在!在!有,有事么”(我真睡醒了么!垂涎了好久的女神呀!高中同学,高一向她表白,"我想找个170以上的",高二等我长到170了“我想找个175的”,高三下血本买了双内增高“我喜欢178以上的,有安全感”)

三分钟后....

"没事也可找我的."擦,我TM怎么这么不争气,不是发过誓等她主动跟我讲话的时候就送她一个字:滚!

"有个网页不会做,你可不可以帮人家弄一下呀."

"弄,一定给你弄得妥妥的."

"坏死了,需求我离线发给你了,这个就靠你了啊."

"恩,靠我,靠我就对了"

QQ头像又黑掉了...

需求还好嘛.就是写一个采购单的录入界面而已.

二十分钟后收工,离线发送。

"亲,你好快呀,我先看看有没有问题哈,有问题还要麻烦你哦"


二、重湿AV之旅(此AV非彼AV详情请见上一篇博客《大湿教我写程序(2)之走向AV之路》)

"亲,还有两个小问题耶,采购单录入界面的表头上的供应商要可以自动补全,自动补全用户体验会好很多,客户会感觉很人性化。那个东东我把要求用标出来的你看看哈,可能有点难哦。"

"这东西对我来说就不叫个事儿,包在我身上."

这东西以前好像用过,自动补全的,ajaxcontroltoolkit,里面有CascadingDropDown控件.

引用一下ajaxcontroltoolkit,拉一个CascadingDropDown出来,关联一下文本框.然后写一个webservice,里面提供一个方法给它调用。OK,解决了。

看一下好像不对,女神要求的下拉框里有两列,一列是编码,一列是名称。这个只能显示一列。达不到要求呀,查了一遍属性没办法。

“大雄”

“大湿”

“死了啊”

“网速有点慢,我把快播的端口号限一下啊。”

“搞什么呀,又有什么问题了,我这刚准备陶冶一下情操你就。。。”

“恩,需求你看下,这个下拉框怎么搞。”

“教学视频看了这么多AV技术还是没学到家呀,典型的AV技术应用嘛。”

"AV技术我知道呀,用ajax去visit后台数据我知道怎么去抓。关键是怎么在前台展现呢?"

“苍老师用外语教的每一句话你都记得那么清楚,我上周刚教你的动态加载菜单(详情请见《大湿教我写.net通用权限框架(1)之菜单导航篇》)不就是讲的怎么动态构造html么?

前端说穿了其实很简单,不管多绚丽的界面都还是由那些最基本的html元素拼起来的。”

“好啦,讲半天还是得自己写,滚吧滚吧”

经他这么一说其实我心里也已经有了大致思路。

1、从后台把数据抓取出来

根据前台传过来的条件返回10条记录供界面显示

/// <summary>
/// 自动补全(显示10行)
/// </summary>
/// <param name="where">条件</param>
/// <param name="param">参数化</param>
/// <returns></returns>
public DataTable autocomplete(StringBuilder where, SqlParam[] param)
{
StringBuilder strSql
= new StringBuilder();
strSql.Append(
"SELECT TOP 10 Supplier_ID,Code,ShortName,ValueAddRate FROM Base_Supplier WHERE 1=1");
strSql.Append(
"AND DeleteMark =0 AND IsVisible = 0");
strSql.Append(
where);
strSql.Append(
" ORDER BY CreateDate");
return DataFactory.SqlDataBase().GetDataTableBySQL(strSql, param);
}

2、动态拼接要显示的内容

确实像大湿所有的那样,这个下拉自动填充框确实是由表格和字符组成。

在上一篇博文里已经讲了ajax如何调用后台方法,这里就不再重复。

抓取到供应商数据后进行一次遍历循环地拼接<tr>

<td>内容</td>

..............

</tr>

拼接好了以后就放入到div中根据Supplier_Name这个控件的位置加载出来。

然后选定了内容的时候再将选中的内容写入Supplier_Name控件中

Supplier_Name失去焦点时隐藏掉div.

//供应商自动补全
function SupplierAutocomplete() {
$(
"#Supplier_Name").bind("keyup", function (e) {
if (e.which != 13 && e.which != 40 && e.which != 38) {
var parm = "action=autocomplete&search=" + escape($(this).val());
Load_Supplier(parm);
}
}).focus(
function () {
var parm = "action=autocomplete&search=" + escape($(this).val());
Load_Supplier(parm);
$(
this).select();
});
function Load_Supplier(parm) {
getAjax(
'../../WMSBase/SysSupplier/Supplier_List.aspx', parm, function (data) {
var json = eval("(" + data + ")");
var html = "";
for (var i = 0; i < json.JSON.length; i++) {
var list = json.JSON;
html
+= "<tr>";
html
+= '<td style="display: none;">' + list.SUPPLIER_ID + '</td>';
html
+= '<td style="width: 100px;">' + list.CODE + '</td>';
html
+= '<td style="width: 200px;">' + list.SHORTNAME + '</td>';
html
+= '<td style="display: none;">' + list.VALUEADDRATE + '</td>';
html
+= "</tr>";
}
//点击事件回调
autocomplete("Supplier_Name", "300px", "300px", html, function (r) {
var array = new Array();
array
= r.split('≌');
$(
"#Supplier_ID").val(array[0]);
$(
"#Supplier_Name").val(array[2]);
VALUEADDRATE
= array[3];
});
});
}
//上,下键盘回调
autocompletekeydown("Supplier_Name", function (r) {
var array = new Array();
array
= r.split('≌');
$(
"#Supplier_ID").val(array[0]);
$(
"#Supplier_Name").val(array[2]);
VALUEADDRATE
= array[3];
});
}

2013年11月24日星期日

óú §°

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
óú §°  阅读原文»

用户名:myeit 文章数:14 评论数:0
访问量:795:293:164:2 注册日期:2013-11-13

智能&大数据时代, 架构师思维的十个学习步骤

智能&大数据时代,

架构师思维的十个学习步骤

By 高ㄌ谩/span>

架构师的第一步:学习两种抽象视角(Abstraction View)

l第一种抽象视角:架构师基于<变与不变分离>的视角,寻找<万变不离其宗>的宗,其宗(架构)的不变性带来简单性;让人们能透过掌握简单来驾驭复杂(多变),落实了架构师的职责。

l第二种抽象视角:架构师基于<形与内涵分离>的视角,由于不同内涵之间的<变与不变分离>已经由第一种视角所抽象了。这个视角可从内涵中抽像出共同之形,也可以(无中生有地)创造一种(Form)来容纳内涵(包括变与不变部分)由于我们常常拿船运业的集装箱(Container)来比喻<造形>;而拿形形色色的货品来比喻其(集装箱)内涵(Content)。所以上述的第二种视角,又称为<集装箱式>抽象视角。

架构师的第二步:关心下层的变动自由度(没钱就改版,改版就有钱)

架构像什么? 有两种常见的比喻。

l架构像房子的地基:由于地基要稳定,上层房子才不会倒塌;因此这项比喻让架构师认为架构要稳定,上层的业务应用材会稳定可靠。

l架构像一棵树的树干:由于树根必须不断成长,拥有随环境而变动的自由度和活力;才能有效吸收更多水分和养分。这项比喻让架构师关心底层模块(Module)的变动自由度。具有活力的树根和树干,才能有效之撑上层业务应用的蓬勃发展。

架构师的第三步:<系统架构控制力>支撑<商业竞争话语权>

软件系统就像一个国家的军队,商业模式就像一个国家的实力。

l架构师的职责就是要在一个系统架构体系中,替自己公司的软件系统(或模块)在架构体系中,取得制高点、取得控制力。

l一个企业,如果在系统架构体系中,处于弱势地位的话;我们就很容易看出,它在商业竞争中,就难以取得话语权。

l例如,曹操留给后代极高的政治智慧:挟天子以令诸侯。系统架构师也能运用这项智能,来取得系统架构体系中的控制力或主导权,来支撑该公司商业竞争的话语权或强龙地位。再如,Android架构师运用HAL驱动框架,来争取众多硬件厂商的支持,让Android取得系统控制力,支撑Google的商业强势地位。

架构师的第步:<用户体验>是让用户享受从简单中叫出复杂的满足感

架构设计就是架构师从复杂中找出简单的设计过程。架构师从复杂中得出简单,其目的是要让开发者(Developer)能从简单中反过来掌握复杂;或者让用户(User)能从简单中叫出复杂,并获得其中的满足感。明如下:

l<用户体验是是让用户享受从简单中叫出复杂的满足感>这是苹果公司乔帮主(Jobs)的名言。因为智能化设备的功能内涵愈来愈复杂,如果缺乏有效的架构师来设计出简单,而让用户直接面对复杂,用户会感到害怕;就欠缺满足感。

l在科学上也是如此。例如,牛顿从很复杂的力学中总结出了f=ma公式,大家就能从这简单公式而去掌握复杂的力学了。爱因斯坦也一样,他从复杂的规律中找出简单的E=mc^2质能互换公式,大家就能从这简单公式而去了解复杂的质能世界了。

l为什么说它简单呢? 理由之一是:公式的元素不超过三个,比如说,牛顿力学公式里只有Fma三个元素;爱因斯坦的公式也一样,只有Emc三个元素。蔚脑�睾凸�造形)s含O檠}的群�/span>

l同样地,EIT造形的要素,也刚好就是三个简单的元素和造形却蕴含极为复杂的内涵,简单而优雅的接口<I>带给开发者和用户享受掌握复杂的满足感。

架构师的第步:创意爱上限制,即需求检验设计

无论是移动应用、物联网等都涉及愈来愈多的系统组合与创新。而软件开发愈来愈仰赖架构设计,所以架构师们亟需要去学习和领悟创意型的架构设计模式。新模式中,最传神的隐喻是,谷歌公司副总Marissa Mayer提倡的

"创意爱上限制"(Creativity lovesConstraint)

她说:"创新来自愿景与限制的互动"(Innovation is born from the interactionbetween constraint and vision)。限制迫使架构师重新审视愿景(Vision)从不同观点切入,寻找新事物;同时也让其聚精会神、厘清思路;非常具有创新性。这引导出架构设计的两个观点:

l观点1:架构来自需求。其意味着,基于需求而设计。也就是传统的Rewquirement-based架构设计。

l观点2:架构基于愿景(Vision)的引导,来自架构师的创意其意味着,基于愿景而设计,需求用来检验架构。一旦创意设计<爱上>了需求的限制,架构(设计)自然心甘情愿地满足需求(限制)

既然是观点,本身就没有对错。架构师同时拥有多个观点,常常会带来更多创意的。

架构师的第六步:练习假设性思维然後"Mappingfrom vision to reality"

愿景是对未来成功情境的想象,含有浓厚的假设性(梦想)。基于假设情境而设计,常常让许多人感到不安。由于,架构师的职责是设计一个有效架构,既能支撑业主的愿景(Vision),又能满足现时环境(Reality)的需求限制。也就是,架构师要找出一条从愿景映射到现实的一条连线(Mapping from vision to reality),让其它团队成员能依循这条线而去实现该假设性愿境(梦想),于是梦想成真了。在迈向智能化的大数据时代,熟练假设性思维是很关键的,理由是: 阅读更多内容

逻辑回归模型(Logistic Regression, LR)基础 - 文赛平

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
逻辑回归模型(Logistic Regression, LR)基础 - 文赛平  阅读原文»

逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,更是计算广告学的核心。本文主要详述逻辑回归模型的基础,至于逻辑回归模型的优化、逻辑回归与计算广告学等,请关注后续文章。

1 逻辑回归模型

回归是一种极易理解的模型,就相当于y=f(x),表明自变量x与因变量y的关系。最常见问题有如医生治病时的望、闻、问、切,之后判定病人是否生病或生了什么病,其中的望闻问切就是获取自变量x,即特征数据,判断是否生病就相当于获取因变量y,即预测分类。

最简单的回归是线性回归,在此借用Andrew NG的讲义,有如图1.a所示,X为数据点――肿瘤的大小,Y为观测值――是否是恶性肿瘤。通过构建线性回归模型,如hθ(x)所示,构建线性回归模型后,即可以根据肿瘤大小,预测是否为恶性肿瘤hθ(x)≥.05为恶性,hθ(x)<0.5为良性。

clip_image002

图1 线性回归示例

然而线性回归的鲁棒性很差,例如在图1.b的数据集上建立回归,因最右边噪点的存在,使回归模型在训练集上表现都很差。这主要是由于线性回归在整个实数域内敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,其回归方程与回归曲线如图2所示。逻辑曲线在z=0时,十分敏感,在z>>0或z<<0处,都不敏感,将预测值限定为(0,1)。

clip_image004图2 逻辑方程与逻辑曲线

逻辑回归其实仅为在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,逻辑回归成为了机器学习领域一颗耀眼的明星,更是计算广告学的核心。对于多元逻辑回归,可用如下公式似合分类,其中公式(4)的变换,将在逻辑回归模型参数估计时,化简公式带来很多益处,y={0,1}为分类结果。
clip_image006

对于训练数据集,特征数据x={x1, x2, … , xm}和对应的分类数据y={y1, y2, … , ym}。构建逻辑回归模型f(θ),最典型的构建方法便是应用极大似然估计。首先,对于单个样本,其后验概率为:

clip_image008 那么,极大似然函数为:

clip_image010 log似然是:

clip_image012

2 梯度下降

由第1节可知,求逻辑回归模型f(θ),等价于:

clip_image014 采用梯度下降法:

clip_image016 从而迭代θ至收敛即可:

clip_image018

3 模型评估

对于LR分类模型的评估,常用AUC来评估,关于AUC的更多定义与介绍,可见参考文献2,在此只介绍一种极简单的计算与理解方法。

对于下图的分类:

clip_image020 对于训练集的分类,训练方法1和训练方法2分类正确率都为80%,但明显可以感觉到训练方法1要比训练方法2好。因为训练方法1中,5和6两数据分类错误,但这两个数据位于分类面附近,而训练方法2中,将10和1两个数据分类错误,但这两个数据均离分类面较远。

AUC正是衡量分类正确度的方法,将训练集中的label看两类{0,1}的分类问题,分类目标是将预测结果尽量将两者分开。将每个0和1看成一个pair关系,团中的训练集共有5*5=25个pair关系,只有将所有pair关系一至时,分类结果才是最好的,而auc为1。在训练方法1中,与10相关的pair关系完全正确,同样9、8、7的pair关系也完全正确,但对于6,其pair关系(6,5)关系错误,而与4、3、2、1的关系正确,故其auc为(25-1)/25=0.96;对于分类方法2,其6、7、8、9的pair关系,均有一个错误,即(6,1)、(7,1)、(8,1)、(9,1),对于数据点10,其正任何数据点的pair关系,都错误,即(10,1)、(10,2)、(10,3)、(10,4)、(10,5),故方法2的auc为(25-4-5)/25=0.64,因而正如直观所见,分类方法1要优于分类方法2。

参考文献:

1 Andrew NG. Logistic Regression Classification

2 http://www.cnblogs.com/guolei/archive/2013/05/23/3095747.html

----


本文链接:http://www.cnblogs.com/sparkwen/p/3441197.html,转载请注明。

树莓派 Raspberry-Pi 折腾系列:系统安装及一些必要的配置 - ABEL  阅读原文»

入手树莓派将近一个月了,很折腾,许多资源不好找,也很乱。简单整理一下自己用到的东西,方便以后自己或别人继续折腾。

0. 操作系统下载

树莓派官方 Raspbian 系统下载:http://www.raspberrypi.org/downloads
或直接下载 http://downloads.raspberrypi.org/raspbian_latest.torrent 最新版的 BT 种子。

还有一个选择是由国人制作的超级精简版,更低内存占用:http://pan.baidu.com/share/link?shareid=167943&uk=1412008571

1. 系统安装

所谓“安装系统”其实不如说是“恢复”下载到的系统镜像到内存卡上,这个过程也没什么难度,就是看内存卡的速度,慢慢等而已。需要注意的是,市面上部分 4G 的内存卡,实际大小才 3.6G 多,会提示空间不足,所以还是直接购买 8G 吧,也差不了几块钱。
在 Windows 下可以使用 Win32 Disk Imager 进行镜像恢复,非常方便,也是树莓派官方推荐的方法。官方下载地址:http://sourceforge.net/projects/win32diskimager/

2. 通过 SSH 远程访问

老实说,我一直把树莓派定位为“一个扔在某个角落就可以自己跑得很欢的小电脑”,加上那仅有的两个 USB 口,一个插了 USB 无限网卡,另一个再拖个键盘或鼠标啥的,实在很不方便,那么最好还是能远程访问吧。
好在树莓派默认是有开启 SSH 的,但是我们系统刚安装,IP 还没设置,怎么找到它的 IP 地址呢?这时候就推荐使用另一个神器 PortScan 来找出我们的机器:

打开 PortScan 选择扫描范围,可以很方便的找出局域网中的其它机器,一般家庭中也没太多机器,找出树莓派是很容易的,如果是在公司,有很多机器的话,那么可以忽略那些有机器名的,然后剩下的一个一个尝试吧…
PortScan 下载地址:http://abel.oss.aliyuncs.com/file/PortScan.zip

3. ROOT 账号设置

如果你安装的是官方的 Raspbian 系统,那么默认的登录帐号为 pi 密码是 raspberry
为了方便折腾,建议第一时间启用 ROOT 账号吧~ 这个也很简单的,只需要执行一下两句命令即可:

// 设置 root 账号的密码,会让你输入两次新密码
sudo passwd root

// 启用 root 账号登录
sudo passwd
--unlock root

执行完之后,用 reboot 命令重启就可以用 root 登录啦。

4. 扩展可用空间

第一次用 root 登录,会自动弹出树莓派的高级设置面板(以后也可以通过 raspi-config 命令进入):

选择第一项 Expand Filesystem 扩展 SD 卡上可用的空间,不然以后会有很多大软件,不能安装(提示空间不足,例如 mysql)。
扩展之后可以通过 df -h 命令看到效果~

5. 更换软件源(apt-get sources)

树莓派的服务器实在太太太太太太慢了!会导致你安装一个几M的东西都要等大半天!肿么办!
好在树莓派官方有提供一个镜像列表:http://www.raspbian.org/RaspbianMirrors
在里面找到了几个国内的镜像,经过几番尝试,觉得来自中科大的速度非常不错~ 咱们就换成中科大的吧,镜像主页:https://lug.ustc.edu.cn/wiki/mirrors/help/raspbian

根据教程,咱们来编辑 /etc/apt/sources.list 文件。这里推荐用 nano 命令编辑,舍得去弄什么 VIM 啦。命令如下:

nano /etc/apt/sources.list

进入编辑界面,删除原有的内容,粘贴中科大提供的内容,结果如下:

然后使用 Ctrl+O 保存文件,Ctrl+X 退出编辑器。
然后执行 apt-get update 命令更新软件列表。

6. 设置静态 IP 地址

回到刚刚第二点提到的,不知道 IP 地址的问题,咱们要给树莓派设置一个静态 IP,省得 IP 变换又要重新找机器。还是用 nano 来编辑网络接口文件:

nano /etc/network/interfaces

如果你要设置的是有线网卡的 IP 地址,那么把 eth0dhcp 改成 static 然后在下一行追加 IP 信息,结果大概如下:

iface eth0 inet static
address
192.168.1.200 # 设定的静态IP地址
netmask
255.255.255.0 # 网络掩码
gateway
192.168.1.1 # 网关

如果你要设置的是无线网卡的,那么除了把 wlan0dhcp 改成 static 之外,还需要填写无线网的名称和密码,编辑后的结果大概如下:

iface wlan0 inet static
wpa
-ssid Your_Wifi_SSID
wpa
-psk Your_Wifi_Password
address
192.168.1.200 # 设定的静态IP地址
netmask
255.255.255.0 # 网络掩码
gateway
192.168.1.1 # 网关
network
192.168.1.1 # 网络地址
#wpa
-roam /etc/wpa_supplicant/wpa_supplicant.conf

▲ 注意注释掉最后一行

搞定之后,咱们用 poweroff 命令关掉树莓派,等到机器上的绿灯不闪了,把电源拔掉,再把网线拔掉,重新连接电源,稍等一会,看看是不是就通过无线网络的 IP 地址可以访问了。

最后

至此,要折腾树莓派的几个准备工作都完成了,有了这些,以后折腾也更佳方便。
由于我当初手贱没有购买面驱动的 USB 网卡,买的是一个要自己编译驱动的,所以我折腾的东西还有很多,下次专门再来说说无线网卡驱动的事吧。


本文链接:http://www.cnblogs.com/abel/p/3441175.html,转载请注明。

阅读更多内容

声明

转载有价值的IT博客,版权属原作者所有

标签

博客归档