【discuz】为文章审核添加提示功能

discuz自带的审核功能中,缺少一个提示功能,虽然发布文章确实可以限制审核,但是管理员不通过后台查看审核内容,就不会发现文章审核信息。所以就在前台首页的用户信息中的【提示】显示出来,方便管理员审核内容。

还是根据之前的方法而言,通过发布文章的POST链接: portal.php?mod=portalcp&ac=article

找到需要修改的文件:./source/module/portal/portal_portalcp.php

发现如下代码:

require_once libfile('function/portalcp');//被调用的函数文件
require_once libfile('portalcp/'.$ac, 'include');//真正操作的文件

然后再找到文件: ./source/include/portalcp/portalcp_article.php

发现提交的代码:

if(submitcheck("articlesubmit", 0, $seccodecheck, $secqaacheck)) {...

这就好办了,只需要在文章操作数据库之后添加提示功能就可以解决了。

在提示信息中,需要获得对应文章的ID,方便管理员可以直接访问该文章。于是在如下代码之后:

$aid = DB::insert('portal_article_title', $setarr, 1);

刚好添加文章数据之后返回了对应文章的ID。

接下来就实现提示功能:

/************************************/
        /*Jhonse修改点*/
        /*用户提示功能对应的数据表为:pre_home_notification*/
        /*1. 添加提示信息数据*/
        /*2. 更新提示数目
        /*提示数目对应的数据表为: pre_common_member newprompt字段*/
        /************************************/
        /*添加提示信息数据*/
        //文章为审核状态
        if($article_status == 1){

            $JMess = "<div style=\"padding:10px;\"><h3>".文章审核."</h3>您好! "."用户".$_G['username']."发布了一篇文章【".$setarr['title']."</i></b></a>】,【<a href=\"admin.php?frames=yes&action=moderate&operation=articles&dateline=all\" style=\"color:red;\" ><b><i>请审核...</i></b></a>】.</div>";

            $jarr = array(
                    'uid'=>'1',
                    'type'=>'system',
                    'new'=>'1',
                    'author'=>'jhonse',
                    'note'=>$JMess,
                    'dateline'=>TIMESTAMP,
                    'from_id'=>$aid,
                    'from_idtype'=>'aid'
                    );
            DB::insert('home_notification', $jarr, 1);

            /*更新提示数目*/
            DB::query('UPDATE '.DB::table("common_member")." SET newprompt=newprompt+1 WHERE uid = 1");

            /*****************************************/
        }

效果:

【discuz】对活动版块的积分扣除功能进行修改以及修复参加人数功能

之前有【对活动版块的报名人数进行修改】,当时没有考虑到积分处理的问题。现在刚好遇到此问题,就此解决下。首先对应discuz自带的积分功能而言,只能扣除一个人的积分,加入报名的人数大于1的时候就不起作用了。还有一个对于要扣除积分的帖子,没有一个选择项,可扣除,可以不扣除的功能。我们就来一步一步实现以上功能。

第一步: 先对于活动版本添加一个可扣除可以不扣除的选项

在后台->全局->站点功能->活动主题添加选项

第二步: 设置活动帖子需要扣除积分

第三步:看看就之前设置好的效果

说明:支付方式要设置为默认选中第一个。

代码如下:

jhonse(".lb input.pr").eq(0).attr("checked","checked");

第四步: 修改代码,来判断支付方式,并实现积分扣除(参加活动人数)

通过post链接就可以找到要修改的文件为:/source/module/forum/forum_misc.php

首先要找到扣除积分的代码:

checklowerlimit(array('extcredits'.$_G['setting']['activitycredit'] => '-'.$activity['credit']));//检测积分是否足够

updatemembercount($_G['uid'], array($_G['setting']['activitycredit'] => '-'.$activity['credit']), true, 'ACC', $_G['tid']);//更新积分数据
				

大家可以查看这两个函数的代码

checklowerlimit函数在./source/function/function_credit.php

updatemembercount函数在./source/class/class_credit.php

其实这两个函数都是调用了class_credit类的方法来操作积分的。

然后就扣除积分的位置之上来判断支付方式

                       /*开始判断支付方式*/
			$jdata = unserialize($ufielddata);

			/*获得支付方式*/
			$jpaytype = $jdata['userfield']['field7'];

			if($jpaytype == "华高币"){

				/*获得参加人数*/
				$jjoinnumstr = $jdata['userfield']['field8'];

				/*转换为整形*/
				$jjoinnumint = intval($jjoinnumstr);

				/*将需要支付的华高币转换为整形*/
				$jcredit = intval($activity['credit']);

				/*获得总华高币*/
				$jtotle = $jjoinnumint * $jcredit;

				/*覆盖原来所需要支付的华高币值*/
				$activity['credit'] = strval($jtotle);

				checklowerlimit(array('extcredits'.$_G['setting']['activitycredit'] => '-'.$activity['credit']));

				updatemembercount($_G['uid'], array($_G['setting']['activitycredit'] => '-'.$activity['credit']), true, 'ACC', $_G['tid']);

			}else if($jpaytype="现金"){

				//不操作

			}

先看看是怎样的一个效果:

扣除积分成功!

第五步: 布局已通过界面

效果图如下:

代码如下:

支付方式代码:

                                                        <!--{if $apply[ufielddata]}-->
								<!--{loop $apply[ufielddata] $applyIInfo}-->
									$applyIInfo[field7]
								<!--{/loop}-->
							<!--{else}-->
								{lang no_informations}
							<!--{/if}-->

华高币代码:

首先要得到总扣掉的华高币:

在source/include/thread/thread_activity.php文件中

while($activityapplies = DB::fetch($query)) {
	$activityapplies['dateline'] = dgmdate($activityapplies['dateline'], 'u');
	if($activityapplies['verified'] == 1) {
		$activityapplies['ufielddata'] = unserialize($activityapplies['ufielddata']);
		if(count($applylist) < $_G['setting']['activitypp']) {

			/*********************************/
			/*Jhonse修改点*/

			$activityapplies['jtotle'] = intval($activity['credit']) * intval($activityapplies['ufielddata']['userfield']['field8']) ;

			/**********************************/

			$activityapplies['message'] = preg_replace("/(".lang('forum/misc', 'contact').".*)/", '', $activityapplies['message']);
			$applylist[] = $activityapplies;
		}
	} else {
		if(count($applylistverified) < 8) {
			$applylistverified[] = $activityapplies;
		}
		$noverifiednum++;
	}

}

然后在调用总数变量

                                                      <!--{if $apply[ufielddata]}-->
								<!--{loop $apply[ufielddata] $applyIInfo}-->
									<!--{if $applyIInfo[field7] == "现金"}-->
										0
									<!--{else}-->
										- $apply[jtotle]
									<!--{/if}-->
								<!--{/loop}-->
							<!--{else}-->
								{lang no_informations}
							<!--{/if}-->

第六步: 在报名界面中当支付方式是现金的时候就用JQuery来隐藏扣除积分的提示

代码如下:

jhonse(".lb input.pr").each(function(index){

			jhonse(this).click(function(){

				if(index == 0){

					jhonse("p.xi1").show();

				}else{

					jhonse("p.xi1").hide();

				}

			});

		});

第七步: 当积分不够的时候,允许选择【现金】可以报名

选中现金的时候,隐藏积分提示,然后显示提交按钮

html代码:

<!--{if $_G['setting']['activitycredit'] && $activity['credit'] && checklowerlimit(array('extcredits'.$_G['setting']['activitycredit'] => '-'.$activity['credit']), $_G['uid'], 1, 0, 1) !== true}-->
					<p class="xi1">{$_G['setting']['extcredits'][$_G['setting']['activitycredit']][title]} {lang not_enough} {$activity['credit']}</span> <a href="plugin.php?id=hrg_pay:hrg_pay_cz" style="color:blue;">【充值】</a></p>
					<div class="jhgbbz" style="display:none;">
						<input type="hidden" name="jxj" value="1" />
						<input type="hidden" name="activitysubmit" value="true">
						<em class="xi1" id="return_activityapplies"></em>
						<button type="submit" class="pn pnc"><span>{lang submit}</span></button>
					</div>
				<!--{else}-->
					<input type="hidden" name="activitysubmit" value="true">
					<em class="xi1" id="return_activityapplies"></em>
					<button type="submit" class="pn pnc"><span>{lang submit}</span></button>
				<!--{/if}-->

js代码:

jhonse(".lb input.pr").each(function(index){

			jhonse(this).click(function(){

				if(index == 0){

					jhonse("p.xi1").show();

					jhonse(".jhgbbz").hide();

				}else{

					jhonse("p.xi1").hide();

					jhonse(".jhgbbz").show();

				}

			});

		});

第八步:完毕!

【技术新闻】13个坏习惯让IT工作者过度劳累

你的工作是不是总也做不完?是不是经常加班?有时候这一切很可能是由坏习惯造成的……

1.QQ、MSN、Gtalk,一个都不少。

由于聊天对象与聊天内容的不可控制性,使用即时通讯软件是降低工作效率的罪魁祸首。有调查显示,使用即时通讯软件,工作效率会降低20%.

2.“总想多看一点点”——忘记上网的目的。

本想查找工作资料,结果在网页上发现《哈利波特7》出来了;再点进去,又在网页底端看到自己喜欢的明星跟某某又传出了绯闻……点着点着,就忘记自己要上网做什么了。

3.长期不擦拭电脑屏幕和鼠标。

电脑屏幕已经糊了厚厚的一层灰尘,每次都要瞪大眼睛去看,费力去猜屏幕污点下面的字是什么;鼠标点起来已经非常费力了,反应也迟钝得像八十岁的老汉。这些都间接地影响了工作效率。

4.长期不清理电脑系统。

防火墙的防御力是有限的。长期不清理电脑系统的后果就是,内存被一些潜藏的垃圾程序给占用了,直接影响了电脑的运行速度。电脑运行慢了,也就降低了工作效率。

5.长期不整理办公桌胡文件。

办公桌胡文件杂乱的后果就是,想找东西的时候却找不到。以前,有调查公司专门对美国200家大公司职员做了调查,发现公司职员每年都要把6周时间浪费在寻找乱放的东西上面。

6.长期不整理电子邮件胡通讯录。

想给客户发个邮件,却记不得E-mail地址,于是在电子邮箱中一通乱找,却发现自己的邮箱早已被垃圾邮件搞得汪洋一片。想搜什么都变得很困难。再返回一堆堆名片中去找,就又陷入了第5个坏习惯。

7.不适时保存文件。

尽管现在电脑的性能越来越高,死机现象越来越少,可是,意外地碰掉电脑插头、程序操作不当从而造成电脑关机、死机,总是不可避免的,如果不适时保存文件,那么文件就很可能会丢失,前功尽弃。

8.“不磨刀误了砍柴工”。

工作之前,不做充分的计划、准备。行动之后,才发现要么是工具准备得不充分,只得停下工作再去找文件、资料;要么工作做到一半,才发现偏离了预定的方向,只得重新开始,前功尽弃。

9.梦想电脑有“三头六臂”。

在同一时间,一个网页打不开,一个程序在等待,为了节约时间,就只好再打开其他网页。结果同一时间,十几个窗口同时打开着,电脑就变得“老态龙钟”,一动不动。什么都干不成。

10.不会充分利用等待时间。

打开一个软件,电脑迟迟没有反应,于是坐在电脑旁干等;打开一个网页,迟迟显示不出来,又打开新的网页,又是一阵干等;要打印文件,发现打印机里排着队的文件有好多,只好继续等待……一天的工作中,光是耗在电脑上的等待时间就很可观,如果不充分利用这些等待间隙的话,那自己的工作时间只好额外延长了。

11.“耻于下问”。

现在,电脑出现的病症越来越离奇。不是每个人都是电脑高手。身为IT圈中人,似乎像别人请教就显得自己太不专业了。于是就上网查找解决方案。结果,在垃圾信息的汪洋大海中奋力拼搏,折腾半天,才化解问题,浪费了工作的宝贵时间。如果问问身边人,可能几秒钟就解决问题了。

12.过分崇拜科技。

IT人很容易就会陷入科技崇拜。如果有新软件、新系统发布,IT人一定是最早尝试的。不管自己的电脑能不能撑起Vista,一定要给电脑装上。电脑负荷不了,只好不断罢工。工作也会因之延误。

Jhonse技术博客说明:

来源于51cto

【android】调用系统自带的拨号器功能

首先先布局简单的界面:

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="填写手机号码:" />
    <EditText 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@id/edit"
        />
    <Button 
        android:id="@id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       	android:text="拨号"
        />

</LinearLayout>

然后在.java文件中添加【拨号】按钮的点击事件,以及获得编辑框对象

代码如下:

private EditText m_edit; 
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        m_edit = (EditText)this.findViewById(R.id.edit);
        
        Button m_button = (Button)this.findViewById(R.id.button);
        
        m_button.setOnClickListener(new jButtonClickListener());
        
    }
	
	public class jButtonClickListener implements View.OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			
			
			
		}

最后将获得的号码传送给拨号器。

先看下拨号器的Intent过滤代码以及权限代码

/*
		 * 拨号器过滤属性
		 * <intent-filter>
		 * <action android:name="android:intent.action.CALL" />
		 * <category android:name="android.intent.category.DEFAULT" />
		 * <data android:scheme="tel" />
		 * </intent-filter>
		 * 权限
		 * android:permission="android.permission.CALL_PHONE"
		 * */

通过这些属性我们就可以对应的创建Intent来调用

String PhoneNum = m_edit.getText().toString();
			
			Intent m_intent = new Intent();
			
			m_intent.setAction("android.intent.action.CALL");
			
			//m_intent.addCategory("android.intent.category.DEFAULT");
			
			m_intent.setData(Uri.parse("tel:" + PhoneNum));
			
			startActivity(m_intent); //说明: 此方法内部会自动为Intent添加类别: android.intent.category.DEFAULT
			

创建完Intent之后,还需要对应的加上访问权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

这样就可以直接实现拨号功能了,请看效果图:

【技术新闻】一个华为人辞职创业后的几个反思

作者是一个在华为工作 6 年的华为人,2 年前,抱着做大事业的愿景,作者与几个朋友离开华为,希望能闯出一个路子来创业。

时隔两年,笔者的创业经历就像是一出狗血剧,各种电视剧里的经典桥段都发生在他身上。笔者将两年来创业过程中的种种反思汇总为以下 14 点,希望能给有志创业或者正在创业中的朋友们一些启发。

1、不要把创业代替就业

我这两年,感觉到周围的朋友,尤其是越来越多的华为朋友们,开始了创业的想法。其实,适合创业的人应该并不多,他们大多数并不是有个好路子或者好前景,才去创业,恰恰相反,是在公司不顺,想创业。

这个是大问题。

一年前,在我创业最艰难的时刻,有个朋友,从华为跳出来后在上海一个公司在代表处主任,给我电话说想创业,我问为啥,他说:“太受气了!”“你是主任还受气,你有没有想过创业后受不受气?”我也了解他,我说,等你出次差就花接近一万元的时候,就知道心疼了。

2、要有足够的现金储备

创业的人有几个特点,第一就是打了鸡血,大家的情绪高亢,信心百足,仿佛发财在即,觉得 1 年内收支平衡,以后就是数钱了。都没想到的是,困难就在眼前出现了:公司现金不够了。很简单,大家都没有自己开过公司,估计都乐观。创业的团队要做好在 2 年内哪怕一分不挣,也不会丝毫影响心情和家庭生活的准备。

我有个技术出身的朋友也出来创业了,把自己在研发的几年积累都拿出来买了点设备,就没剩啥了。做个小软件,没人买。开始的 9 个月都乐观,后来,就着急了。

创业以后,可没人往卡上打工资啊。

3、市场调研是成功前提,没有准确的调研就是失败

开始创业时,市场很大。创业以后,市场很小。我们对市场大小的估计都是自己的判断,来自不踏实的调研。市场调研不是用百度和谷歌去搜索,不是 IDC 报告。做行业调研,是从销售进展的角度,从签合同的角度,一步一步推演出来的。

4、 团队重要,好团队卖面条至少能挣钱,差团队在黄金面前先打起来

之前看余世维的培训,他第一条说:要学会和合伙人王佐断臂。我当时想,怎么首先说这个?现在想,人家真正是自己开了 20 家公司。创业过程中,合伙人问题是最大的问题,在利益面前,你曾经所熟悉的人会让你很吃惊。

5、对于不熟悉的行业,做好交学费的准备

当大家都决定创业的时候,只想到了成功,甚至有人说将来在深圳科技园旁边哪个酒店摆几桌都想到了。就是没人想:要是输了呢?华为所熟悉的行业,都是大投入大产出的,我们整不起。选了个偏门生意,但是,我们熟悉吗?没有。在这个时候,如果仅仅凭一些网络文摘去判断市场大小,在起步时就已经输了一半以上了。

6、不要动不动把华为那一套搬出来

小公司是做事的,拿个项目先挣钱生存下来。天天想着的应该是这个几个人的小团队怎么发展,而不是一有机会就给上游公司老板灌输华为思想。

7、股东之间要有高度的默契

想创业的时候,碰见哪几个人,想了哪几件事,对于后来的结果是至关重要的。人遇对了,事找对了,创业就成功一半了。反之,在起步的时候已经可以预见后面的结果了。

创业,是把几个人的未来都绑在了一起,大家都在冒风险了。这个时候,可否共舟共济?可否肝胆相照?如果这个做不到,就有点难度了。如果大家本身就不是很熟知,也没有处过很多事,这个合伙就危险了。

8、利益分配模式是否明确

一般创业公司内部的利益分配都不明确,等到有钱进来了,谁话语权大就听谁的。那么,大家会去抢话语权,都不去做事了。按照股份分配只是一个方面,除了股份,还有销售奖励,那么拿多少来做销售奖?拿多少拿来做股份分红?不做销售的人想让分红的比例大些,做销售的人想让销售比例大些。一开始没有分配好,后来便会引来争吵。

其实,钱也没有多少,大家在虚拟的利益面前都现了形,这是创业必过的一关。

9、产品

产品是自己研发还是代理别人的?如果自己研发的,和竞争对手比怎么样?如果代理别人的,进价如何?我们就吃了亏,进价不是个确定的数字,而是上游公司老板承诺,大家共分利润,抛去生产成本,大家对分。生产成本是多少?很低很低。给个例子,物料成本+产品折旧等等,算算大概是几块钱,而他们也口头承认大约是几块钱,我们觉得利润不错。后来,等上了这船了,再看看船老大的脸色?那就不是几块钱,是几十块钱了。一个产品单价就是卖 100,刨掉 30,剩 70,对半的利润是 35,再刨掉项目运作成本,已是微利经营了。

本来是个专业市场,做的人不多,我们想靠着销售的能力去拿下,因为上游公司也弱,没有独立开拓市场的决心和能力,这本来是挺好的事情。花了半年时间,有了突破,拿了单子,去算账的时候,船老大的算盘珠子一阵啪啦,就只剩一点了。如果有市场,将来也是他的,因为客户信息他都有。

10、市场熟不熟悉?不熟悉的市场,先准备好学费。

不熟悉的市场是一定要交学费的。这一点,很多人都心存侥幸。比如我现在就有个朋友刚出来创业,准备做金融方面的生意,自己投入也不小,他也是这么想的:我已经准备很充分了,我应该不会……

是一定会的。

由于工作历史原因,我们对于华为运营商市场和客户都不熟悉,我们本身团队也没有技术人员,也就没有选择运营商市场,没有走自主研发的道路,我们选择了一个专业市场,我们对这个市场本身就不熟悉。我们想凭借着标准的公司行为如市场调研、招聘人员、市场销售等来打开市场。

学费就开始慢慢交了。

市场调研:不熟悉,也没有内部资料,也没有内部人了解,从网络了解。事后证明,这个环节做得最差。失败的起点。

招聘人员:对行业不熟悉,不知道什么样的人是在行,刚开始招了一个人,觉得还算可以。事后证明,队友很重要。

市场销售:对于行业不熟悉,对于客户习惯、采购惯例等都不熟悉。

11、客户关系

在创业之初,有没有客户关系?有了较为可靠的客户关系再创业是最理想的。如果没有客户关系,在空白的市场上创业很不乐观,尤其是今天的市场。没有客户关系,意味着对于这个行业没有行内人,也就没有他的指导意见,也就意味着创业者根本还不懂行就开始了创业。

12、还是产品

产品质量如何?能不能稳定供应?船老大当年把他的技术吹上了天,我们不懂,只能信,还觉得发现了个聚宝盆。后来,有一大系列的产品他不能做,只能 OEM,这样就没有利润了。他说等你们量大了我再做,但是 OEM 进来的东西,问题很多,给客户感觉不好,怎么可能上量?后来我们懂行了也就知道:量大了,他也不掌握这个技术,做不出来。这都是学费。而他所擅长的产品,由于资金问题,原材料问题,不能正常供应,也是个问题。对于陌生市场,他想凭技术,我们想凭销售能力来进入,事实证明:都需要做大量的工作,需要各方面的条件,成功不是偶然的。

13、创业要看家庭是否适合

如果是已婚,这个问题可以简化为:家里是否有个适合创业的爱人。

我有个朋友,在 10 多年前,小两口卖普洱茶,他们由于起步早,挖到了第一桶金。他们开了几个茶庄,日子过得很滋润。弟妹是四川人,原来在银行当职员,很内向,没有想到的是,生活把她历练成了一个称职的老板娘。她后来掌管了茶庄生意,妹夫去做 IT 创业了,这是后话不表。这是适合创业的一对。

反之,就不行。有的女人性格坚强,有的女人性格柔弱。如果另一半不适合创业这种生活的话,那创业确实是个折磨。开始,由于大家对创业前景看好,情绪高亢,正在兴头,她们很难拦住。当进展不顺利时,回到家,新生活就开始了。埋怨,抱怨,赌气,发展到争吵。当事实越来越证明吵架有理时,吵架只会越来越升级。如果另一半不适合,创业会受影响,这是个因素,可能也不是小因素。她会直接影响决策,例如那个合伙人,他就是受了家里的影响选择了继续观望而不是辞职加入。他的食言,对于一个新起步的事业,对于一个新组建的小团队,说一点没有影响是不可能的。

14、资本介入的力量

本来没有想到,按说这个小公司开始也没有人来投资,不过倒经历了一遭。在资本面前,在金钱面前,很多人和事都会发生巨变,说是地震也不为过。

船大哥需要钱,他没有现金了,有个合伙人有点江湖关系,好似很有背景,给他介绍一个投资商,该投资商加上中间介绍人来了 8 个,现场考察了两次,大有成事的架势。这下,给我们这个小团队带来了地震。

巨款马上会到上游公司,一些产品会顺利出来,投资公司帮我们销售,前景远大了。大家摊牌吧,一些矛盾也不忍了,钱还没有见到,摊牌的事情已经快摆在桌面上了。在利益和金钱面前,什么朋友、同事、创业伙伴,都是很苍白的。

后来说好的巨资也没有了下文,这是个巨大打击。想想也是黑色幽默,几个合伙人情绪高昂的争吵,冠冕堂皇的借口,费尽心机的计算,这一切都因为有个虚幻的投资承诺。

Jhonse技术博客说明:

原文链接:http://bbs.c114.net/thread-680236-1-1.html

 

【技术新闻】安全专家说:现在到了该彻底重写Java的时候了

如果说最近的 Java 暴露出来的安全缺陷能给我带来什么警示,那就是现在是到了 Oracle 公司重写这种语言的时候了。

这是杀毒软件 Bitdefender 的缔造者、资深软件威胁分析师、罗马尼亚人 Bogdan Botezatu 做出的结论,由于本周发现的最新的 java 缺陷,他估计会导致多于 1 亿台计算机暴露在黑客攻击的危险之中。

按 Botezatu 的说法,Oracle 的 Java 代码已经处于失控之中,这就是为什么严重的安全问题不断的出现在这种语言软件中的原因。

“Oracle 需要整理出 Java 的一些核心组件,彻底重写它们,”在一次访谈中他这样说。

一些成熟的产品,比如 Java 或 Adobe 公司的几款软件,在过去的很长的时间里已经被无数人的手动过。“这些产品变得如此庞大,被如此多的程序员维护过,导致这些软件的出品人基本上对这些软件里应该有的东西失去了控制。”Botezatu 说。

与软件缺陷的战争

Oracle 最近在对 Java 漏洞进行修补的结果证实了这位罗马尼亚安全专家的分析。

例如,2012 年 8 月份在新版的 java7 修订版 7 中,Oracle 修补了 3 个安全漏洞。就在这些补丁包发布的几个小时后,波兰安全专家、Security Explorations 公司的创始人和 CEO——Adam Gowdiak 发现了一个由这些补丁程序造成的安全漏洞。一些安全专家认为,Java 现在是年老多病,很多功能器官都要依赖其它技术手段来维持工作。

根据 Gowdiak 所说,这种编程语言里最近发现的一个还没有相关补丁包的安全漏洞也同样被认为是 2012 年 10 月份的那次安全升级的补丁包引入的。这些安全补丁包本身就不安全,它们打开了大门让自己暴露在黑客攻击下。

“现在是一个很好的重写 Java 的时机,以此来消除 bug,而不是一层一层的打补丁。”Botezatu 说。

然而,Botezatu 知道这是不可能的。“Oracle 不可能去做一些大的动作,因为这样会影响现有市场上的众多程序,”他补充道。

目前 Oracle 所面对的 Java 开发上的问题是一个所有软件生产商都在面对的问题:如何在不破坏对以前版本兼容性的前提下改进软件。

“你可以看一下 Windows Vista,看看它是如何因为一些客户的在 Windows XP 上的应用不能在 Vista 里运行而不被用户接受的。”Botezatu 解释说。

不管怎样,一些迹象显示,Oracle 真正努力解决 Botezatu 所说的这些问题。在周五,Oracle 宣布,从 9 月份的 Java8 开始,新的版本将以两年一次的频度发布。

Jhonse技术博客说明:

英文原文:It's time to rewrite Java from scratch, security expert says

原文链接:http://www.aqee.net/its-time-to-rewrite-java-from-scratch/

 

 

【photoshop】风光摄影的PS后期调色方法

后期制作后
 站在高尔夫球场的边上,看到夕阳欲落,温暖的阳光穿过树丛的枝桠,投射到毛茸茸的草地上,那种感觉好极了。

后期制作前
 但是,天地反差太大了,前期拍摄不可能一次解决问题,当时就想好了,先拍下来,后期再做处理。
 第一步 载入选区

要把亮调部分与暗调部分分别做调整,首先要分别载入相应的选区。先来做暗调的地面。
 打开通道面板,分别观察红绿蓝三个通道,草地上反差最大的是红色通道。
 选定红色通道,在通道面板最下面单击载入选区图标,红色通道选区被载入,看到蚂蚁线了。

单击RGB复合通道,回到复合通道,看到彩色图像了。
 现在载入的选区是图像中的亮调部分,而要处理的是图像中的暗调部分,因此要将选区反选过来。选择“选择反向”命令,将选区反选。
 第二步 调整地面影调

回到图层面板,需要建立相应的调整层。
 在图层面板最下面单击创建调整层图标,在弹出的菜单中选择色阶命令,建立一个色阶调整层。

在弹出的色阶面板中,按照直方图的形状设置滑标。将白场滑标向左移动到直方图右侧的起点,中间灰滑标适当向右移动一点,暗调部分的大关系有了。

感觉草地上的反差还是太弱,需要再处理得强一些。
 需要再次载入选区。
 按住Ctrl键,用鼠标单击当前调整层的蒙版图标,蒙版的选区被载入了。这与刚才从通道中载入的选区是一致的。

在图层面板最下面再次单击创建调整层图标,在弹出的菜单中选择曲线命令,创建一个曲线调整层。
 弹出曲线面板,选择直接调整工具,以草地上最亮的点为依据,按住鼠标向上移动,图像中与此相关的亮调部分被再次提亮了。再继续做,以草地上的暗点为依据,按住鼠标向下移动,图像中与此相关的暗调部分被处理得更暗了。这样一来,草地的反差加大了。
 第三步 调整天空影调
 

再来做亮调的天空,需要将天空压暗,以利于突出地面。
 首先在图层面板上关闭刚刚为调整地面而建立的两个调整层,使得图像恢复初始状态。
 再次打开通道面板,选中红色通道后单击通道面板最下面的载入选区图标,最后载入红色通道的选区。

别忘了回到RGB复合通道。
 回到图层面板,建立一个新的色阶调整层。在弹出的色阶面板中看到的直方图是图像中亮调部分的像素值。
 将左侧的黑场滑标向右移动到直方图左侧起点位置,将中间灰滑标稍向左移动,看到图像中天空整体暗下来了。

想把天空的暗调部分再压暗一点。
 再建立一个新的曲线调整层。(摄影后期)在弹出的面板中选中直接调整工具,在图像中最左上角较暗的天空处按住鼠标向下移动,看到曲线向下压了,天空暗下来了。

在工具箱中选渐变工具,默认黑白前景色和背景色。在天地交界的地方拉出渐变,上白下黑,把地面部分遮挡掉,保留天空调整部分。
 第四步 修饰影调色调

在图层面板上,把刚才关闭的调整暗调地面的两个调整层重新打开。
 仔细观察发现,亮调选区与暗调选区交界的地方,出现了很不舒服的灰调子影像。这是因为这些地方在操作时,亮调调整和暗调调整都起作用了。
 这部分影像需要修饰。在图层面板上单击刚才调整暗调地面的色阶调整层的蒙版,进入暗调色阶调整蒙版操作状态。

在工具箱中选画笔工具,前景色为黑,选项栏中设置较大的笔刷直径和最低的硬度参数。
 用黑画笔在天地交界处细致涂抹,把灰影调都涂抹掉。远处景物看起来舒服多了。

将工具箱中前景色设置为白色。用画笔把草地的光照效果涂抹出来。夕阳下光照的效果强烈了。

做最后的颜色修饰。
 在图层面板最下面单击创建调整层图标,在弹出的菜单中选色相/饱和度命令,建立一个新的色相/饱和度调整层。

先将饱和度提高到25左右,整个图像颜色看起来鲜艳了。

打开颜色通道下拉框,选择红色。将红色的饱和度提高适量。

再打开颜色通道下拉框,选择黄色。将黄色的饱和度提高适量。
 提高红色和黄色的饱和度后,夕阳的暖色调更突出了,草地更显得鲜嫩了。

经过这样5个调整层操作,原本比较昏暗的影调得到了根本改善。温暖的阳光洒在鲜嫩的草地上,很安详舒适的感觉。夕阳所投射的长长的树影调整后更显活泼生动。整个场景生机盎然,充满和谐。

 

【c++】缺少streams.h的解决方法

这几天在学DirectShow的开发,一个streams.h头文件折腾了好几天才搞定。简单总结一下出现缺少streams.h的解决方法和DirectShow开发环境的搭建。

开发包方面,我用的是Microsoft DirectX 9.0 SDK。

streams.h这个头文件现在在%\DX9 SDK\Samples\C++\DirectShow\BaseClasses路径下,首先要把这个路径添加到VC的Include Directories下面。TOOL–option–directories下面框里添加上streams.h的目录)。

debug版的库 strmbasd.lib在安装包\DX9 SDK\Samples\C++\DirectShow\BaseClasses\Debug_Unicode目录下
retail版的库strmbase.lib在%\Program Files\Microsoft Visual Studio\VC98\Lib目录下

因为库有两个,分别对应Debug和Release,你可以把它拷到SDK的Lib目录下,然后在工程的Debug设置和Release设置里设好库的名字就可以了,当然也可以不拷,怎么用随便你。

安装完directx sdk后,要将directx sdk的include和lib目录配置到vc的系统目录中,并且放到标准的vc目录之前,以保证编译器能拿到最新版本的源文件。

配置方法为,打开vc,选择菜单项tool、options、directories,在弹出的对话框中的show directories for中选择include files,添加配置如下(假设directx sdk安装在D:\dxsdk目录下):
D:\dxsdk\include
D:\dxsdk\samples\c++\directshow\baseclasses
D:\dxsdk\samples\c++\common\include

再在show directories for中选择 library files,添加配置如下:
D:\dxsdk\lib
D:\dxsdk\samples\c++\directshow\baseclasses\debug
D:\dxsdk\samples\c++\directshow\baseclassed\release

Jhonse技术博客说明:

来源于:http://blog.sina.com.cn/s/blog_5866e3be0100affd.html

【c++】在DirectX 3D中使用CEGUI

一、CEGUI简介
    CEGUI,为Crazy Eddie's GUI的缩写,它是一个用C++开发的面向对象的免费界面库,针对游戏开发者,提供了3D环境中的窗口及其部件的图形API。CEGUI在0.4.1之前(包括0.4.1),使用LGPL授权协议,从0.5版本开始则采用了更为宽松的MIT协议。目前使用CEGUI的项目(摘自http://www.cegui.org.uk):

Project Xenocide

BlitzMax

Plant covered GUI

你可以从下面链接得到更多关于CEGUI的知识:
(1)    http://www.cegui.org.uk/wiki/index.php/Main_Page
(2)    http://sourceforge.net/projects/crayzedsgui/
(3)    http://www.cegui.org.uk/wiki/index.php/FAQ

二、CEGUI结构概览
    从上一小节中给出的链接,你可以下载CEGUI的SDK。该SDK以DLL的形式提供,下面简单介绍一下这些DLL的作用及分类:

三、在DirectX中使用CEGUI
    CEGUI是一个跨平台的图形界面库,其平台无关性是通过对平台的封装实现的。在上一节中我们分析了CEGUI的SDK结构,在其渲染子系统中提供了Windows平台上的DirectX8.1/9.0的支持,因此不难推断在自己写的程序中应该可以使用CEGUI。
3.1 CEGUI的资源组织
    CEGUI的资源目录为datafiles,其组织情况如下:

  • configs:资源配置文件
  • fonts:字体资源
  • imagesets:各种图片资源(如:皮肤图片等)
  • layouts:布局文件(可以利用CEGUILayout得到)
  • lookfeel:皮肤配置文件
  • lua_scripts:Lua脚本文件
  • schemes:xml配置文件的scheme

    我们主要关注的是layouts中的文件,这些xml文件可以由CEGUI的附带界面设计工具CEGUILayout得到。如下图所示:

3.2 程序中使用CEGUI
    在这一小节中,我将使用MFC+DirectX9.0c+CEGUI创建一个DEMO,下面仅列出一些关键代码,在文章最后给出了DEMO的源代码下载链接。如果你对在MFC或者Win32 SDK中使用DirectX 3D还不熟悉,可以参考Direct3D入门之框架的搭建一文。
(1)    创建DirectX 3D设备m_d3dDevice;
(2)    创建CEGUI::Render对象:
     

m_pCEGUIRender = new CEGUI::DirectX9Renderer(m_d3dDevice , 0);   

(3)    创建CEGUI::System对象:

    new CEGUI::System(m_pCEGUIRender);

(4)    渲染CEGUI:

	    if(m_d3dDevice) // Only use Device methods if we have a valid device.
    {
        //
        // Draw the Scene:
        //
        m_d3dDevice->BeginScene();
        m_d3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(50 , 0 , 50) , 1.0f, 0);
            /// Render Meshs
            DrawMesh();
            /// Render CEGUI
            CEGUI::System::getSingleton().renderGUI();

        m_d3dDevice->EndScene();
        m_d3dDevice->Present(0, 0, 0, 0);
    }
(5)    需要引入的头文件

	#include <CEGUI.h>
#include <CEGUIDefaultResourceProvider.h>

(6)    需要的引入库
CEGUIBase_d.lib(Debug版本)
DirectX9GUIRenderer_d.lib(Debug版本)
(7)    在程序中设置默认的资源及其路径
    必须设置资源(也就是datafiles)的路径,不然系统运行时就会出现找不到资源的异常。代码如下所示:

	    /// 初始化CEGUI的资源缺省路径
    CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
        (CEGUI::System::getSingleton().getResourceProvider());
    rp->setResourceGroupDirectory("schemes", "../datafiles/schemes/");
    rp->setResourceGroupDirectory("imagesets", "../datafiles/imagesets/");
    rp->setResourceGroupDirectory("fonts", "../datafiles/fonts/");
    rp->setResourceGroupDirectory("layouts", "../datafiles/layouts/");
    rp->setResourceGroupDirectory("looknfeels", "../datafiles/looknfeel/");
    rp->setResourceGroupDirectory("lua_scripts", "../datafiles/lua_scripts/");///< 如果没用Lua脚本就将该行注释掉
    /// 设置使用的缺省资源
    CEGUI::Imageset::setDefaultResourceGroup("imagesets");
    CEGUI::Font::setDefaultResourceGroup("fonts");
    CEGUI::Scheme::setDefaultResourceGroup("schemes");
    CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
    CEGUI::WindowManager::setDefaultResourceGroup("layouts");
    CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");///< 如果没用Lua脚本就将该行注释掉

    注意:这样设置的一个前提是datafiles存在于项目根目录下。
(8)    恢复CEGUI改变的渲染状态
    通过分析CEGUI的源代码得知,CEGUI在渲染时会改变某些渲染状态,特别是与深度有关的状态,所以必须在渲染三维物体之前打开这些状态:

	    m_d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    m_d3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

注意:
1、本项目是用vs2003开发,使用DirectX9.0c August版本,CEGUI SDK 0.5.0b-vc71。
2、将layout下的GameGUI.layout文件copy至CEGUI SDK的datafiles/layouts下
3、本项目只需要CEGUIBase_d.dll、CEGUIExpatParser_d.dll、CEGUIFalagardWRBase_d.dll、DirectX9GUIRender_d.dll(Debug版本)