普通用户使用su切换为超级用户(即root用户),但是使用su的缺点之一是必须要先告知超级用户的密码。
sudo使普通用户不需要知道root的密码即可获得权限。在Ubuntu系统中,管理员可以给普通用户授予某些sudo的权限。在普通用户需要获取特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该使用者自己的密码(以确认当前是该使用者本人),回答正确后系统即会将该命令的进程以root的权限执行。sudo默认会在15分钟之内记住你的密码,超时以后,你如果再次执行sudo才会提示输入密码。
注:以root权限运行GUI程序(例如 Update Manager), 可以使用gksudo(Kubuntu使用 kdesudo)。
在Ubuntu中,root的帐号密码默认是被冻结的。在过去,使用root用户带来了许多问题。因为root用户可以做任何事,如果日常中以root身份工作是危险的,有可能无意中敲入一条错误的命令导致系统崩溃,例如不小心清空/usr或者/bin文件夹(可能是他们认为自己不需要这些程序)。理智的做法是,你只需要拥有一定的权限,“做你仅该做的”。在某些情况下,只能是root用户才能运行,但大部分时间拥有一个普通用户的权限就足够了。
由于sudo不需要超级用户的密码,Ubuntu利用sudo使普通用户取代超级用户作为管理帐号。请记住,当sudo询问密码时,要求的是你自己的用户密码,而不是root用户的密码。
(1)用户不需要记住多余的密码(例如root用户的密码),“知道你仅该知道的”。
(2)避免默认root登录后,用户可以做任何事。你在执行主要的修改前会有密码提醒,可以让你有缓冲的余地来修正错误。
(3)所有sudo的执行,将被记录在/var/log/auth.log的日志里面,方便追踪。
(4)骇客在入侵的时候,首先尝试破解的是root帐号,一般他们不知道实际的用户名是什么。然而root的帐号密码是被冻结的,那么攻击就变得没有意义了。
(5)如果你有一个桌面版的电脑或者服务器,出于安全考虑,你不希望每个人都拥有root权限。sudo刚好能够提供一个恰到好处的安全策略。
(6)root帐号的密码不需要向普通用户公开,即使他们需要执行超级用户权限的任务。
(7)sudo的密码默认会保持一段时间,可以设置为0s,或者执行sudo -k销毁密码保持,确保下次运行sudo的时候需要输入密码。那么你暂时离开一个执行sudo的终端,就不用担心造成安全隐患。
2.使用sudo的不足
(1)如果你以root身份登录,执行任何命令,都不会被要求输入密码。因为系统假
具有一个直观的、可扩展的条件查询API是Hibernate的特色。
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list();
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();
约束可以按逻辑分组。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list();
List cats = sess.createCriteria(Cat.class) .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull("age") ) .add( Restrictions.eq("age", new Integer(0) ) ) .add( Restrictions.eq("age", new Integer(1) ) ) .add( Restrictions.eq("age", new Integer(2) ) ) ) ) .list();
Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.sqlRestriction("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) ) .list();
{alias}占位符应当被替换为被查询实体的列别名。
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。
Property age = Property.forName("age"); List cats = sess.createCriteria(Cat.class) .add( Restrictions.disjunction() .add( age.isNull() ) .add( age.eq( new Integer(0) ) ) .add( age.eq( new Integer(1) ) ) .add( age.eq( new Integer(2) ) ) ) ) .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) .list();
你可以使用org.hibernate.criterion.Order来为查询结果排序。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list();
List cats = sess.createCriteria(Cat.class) .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc() ) .addOrder( Property.forName("age").desc() ) .setMaxResults(50) .list();
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") ) .createCriteria("kittens") .add( Restrictions.like("name", "F%") ) .list();
注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。
接下来,替换形态在某些情况下也是很有用的。
List cats = sess.createCriteria(Cat.class) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Restrictions.eqProperty("kt.name", "mt.name") ) .list();
(createAlias()并不创建一个新的 Criteria实例。)
Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用ResultTransformer。
List cats = sess.createCriteria(Cat.class) .createCriteria("kittens", "kt") .add( Restrictions.eq("name", "F%") ) .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP) .list(); Iterator iter = cats.iterator(); while ( iter.hasNext() ) { Map map = (Map) iter.next(); Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS); Cat kitten = (Cat) map.get("kt"); }
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .setFetchMode("mate", FetchMode.EAGER) .setFetchMode("kittens", FetchMode.EAGER) .list();
这个查询可以通过外连接抓取mate和kittens。 查看第 19.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。
Cat cat = new Cat(); cat.setSex('F'); cat.setColor(Color.BLACK); List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .list();
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。
你可以自行调整Example使之更实用。
Example example = Example.create(cat) .excludeZeroes() //exclude zero valued properties .excludeProperty("color") //exclude the property named "color" .ignoreCase() //perform case insensitive string comparisons .enableLike(); //use like for string comparisons List results = session.createCriteria(Cat.class) .add(example) .list();
你甚至可以使用examples在关联对象上放置条件。
List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .createCriteria("mate") .add( Example.create( cat.getMate() ) ) .list();
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。
List results = session.createCriteria(Cat.class) .setProjection( Projections.rowCount() ) .add( Restrictions.eq("color", Color.BLACK) ) .list();
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list();
在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。
你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用
枫冰叶子要求甘露回答一个问题,否则不让他离开,可惜甘露绞尽脑汁未果,希望你来帮他解决,助他完成大业。
问题是这样的:给你一个小数x,让你算出小数点后第n位是什么,(1 <= n <= 6)
每行输入一个小数(输入数据保证一定是a.b的形式,为了简单化问题,没有循环小数的情况)
然后跟一个n,表示小数点后第几位
3 1.234 1 2.345 2 3.456 3
2 4 6
//题目本身不难,但是又陷阱,我很不幸的没有考虑全,因为输入的数可能会不含小数,而且求的小数位可能比实际要长= =
#include <stdio.h>
#include <string.h>
int main()
{
int n,m,len,flag,i;
char str[100];
scanf("%d%*c",&n);
while(n--)
{
scanf("%s%d",str,&m);
len = strlen(str);
if(!strstr(str,"."))//如果不含小数,即后面小数全是0
{
printf("0\n");
continue;
}
for(i = 0;i<=len;i++)//找到小数点
{
if(str[i] == '.')
break;
}
if(m>len-i-1)//判断要求的位是否比有效小数长
printf("0\n");
else//输出小数
printf("%c\n",str[i+m]);
}
return 0;
}