【css】屏蔽谷歌浏览器中input获得焦点时边框为橘红色

在谷歌浏览器中,当在input输入框中输入内容时,就会出现橘红色的边框。也就是说input获得焦点边框就会成橘红色。如何来屏蔽它?

先看下如下截图:

可以通过css来修改outline属性即可,请看代码:

.class(自定义样式):focus { outline: none;}

【技术新闻】每位开发人员都应铭记的10句编程谚语

所谓谚语,就是用言简意赅、通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情。也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己。

1. 无风不起浪

别紧张,这也许只是一场消防演习

 

代码设计是否糟糕,从某些地方就可以看出来。比如:

  • a. 超大类或超大函数
  • b. 大片被注释的代码
  • c. 逻辑重复
  • d. If/else嵌套过深

程序员们通常称它们作代码异味(Code Smell),但是就我个人认为“代码警报”这个名字更为合适一些,因为它有更高的紧迫感的含义。根本问题处理不当,终将引火烧身。

译注:Code Smell中文译名一般为“代码异味”,或“代码味道”,它是提示代码中某个地方存在错误的一个暗示,开发人员可以通过这种smell(异味)在代码中追捕到问题。

2. 预防为主,治疗为辅

好吧,我相信了!

20世纪80年代,丰田公司的流水作业线因为它在缺陷预防方法上的革新变得出了名的高效。每个发现自己的部门有问题的成员都有权暂停生产。这个方法意在宁可发现问题后马上暂定生产、解决问题,也不能由其继续生产而导致更棘手且更高代价的修复/更换/召回后的问题。

程序员总会做出生产率就等同于快速编码的错误臆断。许多程序员都会不假思索地直接着手代码设计。可惜,这种Leeroy Jenkins式鲁莽的做法多会导致软件的开发过程变得很邋遢,拙劣的代码需要不断的监测和修改——也可能会被彻底地替换。最终,生产率所涉及到的因素就 不仅仅是写代码所消耗的时间了,还要有调试的时间。稍不留神就会“捡了芝麻丢了西瓜”。(因小失大。)

译注:Leeroy Jenkins 行为:WOW游戏中一位玩家不顾大家独身一人迎敌,导致灭团。

3. 不要孤注一掷 (过度依赖某人)

一个软件开发团队的公共要素(bus factor)是指那些会影响整个项目进程的核心开发人员的总数。比如某人被车撞了或某人生孩子或某人跳槽了,项目可能就会无序,甚至会搁置。

译注: bus factor 即指公共要素,比喻了开发过程中的一些共同因素。如果挤上 bus 的 factor 越多,bus 就越不稳定,所以要控制好 bus factor ,以免问题发生。

换句话说,如果你的团队突然失去了一个主力成员,你会怎么办?业务依旧进行还是戛然而止?

很不幸,大多数软件团队都陷入了后一种情况。这些团队把他们的开发员培养成了只会处理他们自己专业领域的“领域专家”。起初,这看起来是一个比较合理的方法。它 对汽车制造装配生产线很适用,但是为什么对软件开发团队就不行呢?毕竟,想让每个成员都掌握所编程序的细微差别也不太可能,对吧?

问题是开发人员不容易轻易替换掉。虽然当每位成员都可用时,“抽屉方法”很有效,但如果当“领域专家”突然因人事变动、疾病或突发事故而无法工作时,抽屉 方法立马土崩瓦解。(所以,)软件团队有一些看似多余实则重要的后备力量是至关重要。代码复查、结对编程和共有代码可用成功营造一个环境,在这个环境中, 每位开发人员至少表面上是熟悉自己非擅长领域之外的系统部分。

4. 种瓜得瓜,种豆得豆

《The Pragmatic Programmer | 程序员修炼之道》一书中有这样一段话解释“破窗理论”:不要留着“破窗户”(低劣的设计、错误的决策或者糟糕的代码)不修。发现一个就修一个。如果没有足够的时间进行适当的修理,就先把它保留起来。或许你可 以把出问题的代码放到注释中,或是显示“未实现”消息,或用虚拟数据加以替代。采取一些措施,防止进一步的恶化。这表明局势尚在掌控之中。

我们见过整洁良好的系统在出现“破窗”之后立马崩溃。虽然促使软件崩溃的原因还有其他因素(我们将在其他地方接触到),但(对“破窗”)置之不理,肯定会更快地加速系统崩溃。

简而言之,好的代码会促生好的代码,糟糕的代码也会促生糟糕的代码。别低估了惯性的力量。没人想去整理糟糕的代码,同样没人想把完美的代码弄得一团糟。写好你的代码,它才更可能经得住时间的考验。

译注:《程序员修炼之道》,作者Andrew Hunt / David Thomas。该书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视――即根据需求,创建用户乐于接受的、可工作和易维护的 代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动 态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。

译注:破窗理论(Broken Window theory):是关于环境对人们心理造成暗示性或诱导性影响的一种认识。“破窗效应”理论是指:如果有人打坏了一幢建筑物的窗户玻璃,而这扇窗户又得不到及时的维修,别人就可能受到某些暗示性的纵容去打烂更多的窗户。发现问题就要及时矫正和补救。

5. 欲速则不达

经理、客户和程序员正日益变得急躁。一切都需要做的事,都需要马上就做好。正因如此,快速修复问题变得非常急迫。

没时间对一个新功能进行适当的单元测试?好吧,你可以先完成一次测试运行,然后你就可以随时回来继续测试它。

当访问Y属性时,会不会碰到奇怪的对象引用错误?无论怎样,把代码放到try/catch语句块中。我们要钓到大鱼啦!

是不是似曾相识呢?这是因为我们在以前已经都做到了。并且在某些情况下、它是无可非议的。毕竟,我们有最后期限,还得满足客户和经理。但不要过于频繁操 作,否则你会发现你的代码不稳定,有很多热修复、逻辑重复、未测试的方案和错误处理。最后,你要么是把事情草草做完,要么是把事情好好做完。

6. 三思而后行

“敏捷开发”这个词最近被频繁滥用,经常被程序员用来掩饰他们在软件开发过程中的糟糕规划/设计阶段。我们是设计者,看到产品朝正当方向有实质进展,我们理应高兴。但意外的是,UML图和用例分析似乎并不能满足我们的愿望。所以,在不知自己做什么的情况下或者不知自己身处何处时,我们开发人员经常就稀里糊涂地写代码了。

这就好比你要去吃饭,但你根本没有想好去哪里吃。因为你太饿了,所以你迫不及待地找个餐馆,定个桌位。然后你上车开车后沿途在想(找地方吃饭)。只是,这样会耗费更多的时间,因为你要过较多的U型弯道,还在餐馆前停车,也许最后因等待时间过长而不吃了。确切地说,你最后应该能找到地方吃饭,但你可能 吃的饭并不是你想吃的,并且这样花费的时间,可能比你直接在想去的餐馆订餐所花的时间更长。

7. 如果你惟一的工具是一把锤子,你往往会把一切问题看成钉子

看见了吧?我早就说过动态记录在这个项目中很有效

程序员有一种倾向,当一谈到他们工具时,其视野就变狭窄了。一旦某种方法在我们的一个项目上“行得通”,我们就会在接下来所有的项目上都用到它。学习新东 西仿佛是一种煎熬,有时候甚至会心神不定。从始至终都在想“如果我用之前的方法做、这个就不会这么麻烦了”。一定要摒弃这种想法,按我们所知道的去做,即使那不是最完美的解决方法。

坚持自己所知很简单,不过从长远的角度讲,选择一个适合这项工作的工具要容易得多。否则,就会与你的职业生涯格格不入。

8. 沉默即赞同

我什么都没看见!没看见!

“破窗理论”与”变成惯性理论”有着宏观的联系。

编程社区就好像一个现实社区。每个作品都是一个开发者的缩影。糟糕的代码发布的越多,就越容易反映现状。如果你不去努力编写优秀、整洁和稳定的代码,那你每天都将和糟糕的代码相伴了。

同样地,如果你看到别人写出了糟糕的代码,你就要跟这个人提出来。注意,这时候机智就应该用上场了。一般情况下,程序员都愿意承认他们在软件开发中还是有不懂的地方,并且会感谢你的好意。互相帮助对大家都有利,而对问题视而不见,只会使问题一直存在。

9. 双鸟在林,不如一鸟在手

如果可以讨论系统架构和重构,那么就差找个时间把事情做完。为了使正常运作的东西更加简洁而做改动,权衡改动的利弊很重要。当然了,简洁是一个理想目标, 但总会有可以通过重构改进的代码。在编程世界中,为了代码不过时,会频繁简单改动代码。但有时候你又必须保证代码对客户有价值。那么,你面临一个简单窘 境:你不能一石二鸟。你在重构旧代码上所发时间越多,你编写新代码的时间就越少。在及时改进代码和维护程序之间,也需要找到平衡点。

10. 能力越大,责任越大

毫无疑问,软件已成为我们生活中一个既基本又重要的一部分。正因如此,开发优秀软件格外重要。乒乓球游戏中的Bug是一回事,航天飞机导向系统或者航空交通管制系统中的Bug是另外一回事。Slashdot曾发表一文,讲述了单单Google News的一个小失误使一家公司股票蒸发11.4亿美元。这些例子便说明了我们正行使着多大的权利。你今天写的代码,无论你是否有意,说不定有朝一日在重要的应用程序中派上用场,这想想都令人害怕。编写正确合格的代码吧!

译注:Slashdot是一个资讯科技网站。

Jhonse技术博客说明:

来源于:伯乐在线-jobbole.com

【wordpress】开启Gzip压缩

最近博客打开的速度特慢,本来一直以为是服务器的问题,最后在站长工具中查询了下,发现没有开启Gzip压缩功能。原来Gzip压缩之后也可以提速。学习了,先看下如何来设置开启Gzip压缩.

1. 通过修改index.php文件开启Gzip压缩

在根目录下的index.php 中找到:
define(’WP_USE_THEMES’, true);
在后面加上:
ob_start(‘ob_gzhandler’);

这样就可以开启。

2. 通过.htaccess启用Gzip压缩

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/css A604800
</IfModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css image/gif image/jpeg image/png application/x-javascript
</IfModule>

3. 通过php.ini 启用Gzip压缩

在php.ini中增加以下代码来开启gzip。
zlib.output_compression_level = number

其中number为1—9的值,1的压缩比率最低, 建议取5。

4. 安装gzippy插件开启Gzip压缩

效果图:

【JQuery】网站如何做到完全不需要jQuery

jQuery是现在最流行的JavaScript工具库。

据统计,目前全世界57.3%的网站使用它。也就是说,10个网站里面,有6个使用jQuery。如果只考察使用工具库的网站,这个比例就会上升到惊人的91.7%。

虽然jQuery如此受欢迎,但是它臃肿的体积也让人头痛不已。jQuery 2.0的原始大小为235KB,优化后为81KB;如果是支持IE6、7、8的jQuery 1.8.3,原始大小为261KB,优化后为91KB。

这样的体积,即使是宽带环境,完全加载也需要1秒或更长,更不要说移动设备了。这意味着,如果你使用了jQuery,用户至少延迟1秒,才能看到网页效果。考虑到本质上,jQuery只是一个操作DOM的工具,我们不仅要问:如果只是为了几个网页特效,是否有必要动用这么大的库?

2006年,jQuery诞生的时候,主要用于消除不同浏览器的差异(主要是IE6),为开发者提供一个简洁的统一接口。相比当时,如今的情况已经发生了很大的变化。IE的市场份额不断下降,以ECMAScript为基础的JavaScript标准语法,正得到越来越广泛的支持。开发者直接使用JavScript标准语法,就能同时在各大浏览器运行,不再需要通过jQuery获取兼容性。

下面就探讨如何用JavaScript标准语法,取代jQuery的一些主要功能,做到jQuery-free。

一、选取DOM元素

jQuery的核心是通过各种选择器,选中DOM元素,可以用querySelectorAll方法模拟这个功能。

var $ = document.querySelectorAll.bind(document); 

这里需要注意的是,querySelectorAll方法返回的是NodeList对象,它很像数组(有数字索引和length属性),但不是数组,不能使用pop、push等数组特有方法。如果有需要,可以考虑将Nodelist对象转为数组。

myList = Array.prototype.slice.call(myNodeList); 

二、DOM操作

DOM本身就具有很丰富的操作方法,可以取代jQuery提供的操作方法。

尾部追加DOM元素。

// jQuery写法  
$(parent).append($(child));  
 
// DOM写法  
parent.appendChild(child) 

头部插入DOM元素。

// jQuery写法  
$(parent).prepend($(child));  
 
// DOM写法  
parent.insertBefore(child, parent.childNodes[0]);

删除DOM元素。

// jQuery写法  
$(child).remove();  
 
// DOM写法  
child.parentNode.removeChild(child);

三、事件的监听

jQuery的on方法,完全可以用addEventListener模拟。

Element.prototype.on = Element.prototype.addEventListener; 

为了使用方便,可以在NodeList对象上也部署这个方法。

NodeList.prototype.on = function (event, fn) {  
[]['forEach'].call(this, function (el) {  
el.on(event, fn);  
});  
return this;  
}; 

四、事件的触发

jQuery的trigger方法则需要单独部署,相对复杂一些。

Element.prototype.trigger = function (type, data) {  
var event = document.createEvent('HTMLEvents');  
event.initEvent(type, true, true);  
event.data = data || {};  
event.eventName = type;  
event.target = this;  
this.dispatchEvent(event);  
return this;  
}; 

在NodeList对象上也部署这个方法。

NodeList.prototype.trigger = function (event) {  
[]['forEach'].call(this, function (el) {  
el['trigger'](event);  
});  
return this;  
}; 

五、document.ready

目前的最佳实践,是将JavaScript脚本文件都放在页面底部加载。这样的话,其实document.ready方法(jQuery简写为$(function))已经不必要了,因为等到运行的时候,DOM对象已经生成了。

六、attr方法

jQuery使用attr方法,读写网页元素的属性。

$("#picture").attr("src", "http://url/to/image"); 

DOM元素允许直接读取属性值,写法要简洁许多。

$("#picture").src = "http://url/to/image";

需要注意,input元素的this.value返回的是输入框中的值,链接元素的this.href返回的是绝对URL。如果需要用到这两个网页元素的属性准确值,可以用this.getAttribute('value')和this.getAttibute('href')。

七、addClass方法

jQuery的addClass方法,用于为DOM元素添加一个class。

$('body').addClass('hasJS'); 

DOM元素本身有一个可读写的className属性,可以用来操作class。

document.body.className = 'hasJS';  
// or  
document.body.className += ' hasJS'; 

HTML 5还提供一个classList对象,功能更强大(IE 9不支持)。

document.body.classList.add('hasJS');  
document.body.classList.remove('hasJS');  
document.body.classList.toggle('hasJS');  
document.body.classList.contains('hasJS'); 

八、CSS

jQuery的css方法,用来设置网页元素的样式。

$(node).css( "color", "red" ); 

DOM元素有一个style属性,可以直接操作。

element.style.color = "red";;  
// or  
element.style.cssText += 'color:red'; 

九、数据储存

jQuery对象可以储存数据。

$("body").data("foo", 52); 

HTML 5有一个dataset对象,也有类似的功能(IE 10不支持),不过只能保存字符串。

element.dataset.user = JSON.stringify(user);  
element.dataset.score = score;

十、Ajax

jQuery的Ajax方法,用于异步操作。

$.ajax({  
type: "POST",  
url: "some.php",  
data: { name: "John", location: "Boston" }  
}).done(function( msg ) {  
alert( "Data Saved: " + msg );  
}); 

我们可以定义一个request函数,模拟Ajax方法。

function request(type, url, opts, callback) {  
var xhr = new XMLHttpRequest();  
if (typeof opts === 'function') {  
callback = opts;  
opts = null;  
}  
xhr.open(type, url);  
var fd = new FormData();  
if (type === 'POST' && opts) {  
for (var key in opts) {  
fd.append(key, JSON.stringify(opts[key]));  
}  
}  
xhr.onload = function () {  
callback(JSON.parse(xhr.response));  
};  
xhr.send(opts ? fd : null);  
} 

然后,基于request函数,模拟jQuery的get和post方法。

var get = request.bind(this, 'GET');  
var post = request.bind(this, 'POST');

十一、动画

jQuery的animate方法,用于生成动画效果。

$foo.animate('slow', { x: '+=10px' }); 

jQuery的动画效果,很大部分基于DOM。但是目前,CSS 3的动画远比DOM强大,所以可以把动画效果写进CSS,然后通过操作DOM元素的class,来展示动画。

foo.classList.add('animate'); 

如果需要对动画使用回调函数,CSS 3也定义了相应的事件。

el.addEventListener("webkitTransitionEnd", transitionEnded);  
 
el.addEventListener("transitionend", transitionEnded);  

十二、替代方案

由于jQuery体积过大,替代方案层出不穷。

其中,最有名的是zepto.js。它的设计目标是以最小的体积,做到最大兼容jQuery的API。zepto.js 1.0版的原始大小是55KB,优化后是29KB,gzip压缩后为10KB。

如果不求最大兼容,只希望模拟jQuery的基本功能,那么,min.js优化后只有200字节,而dolla优化后是1.7KB。

此外,jQuery本身采用模块设计,可以只选择使用自己需要的模块。具体做法参见它的github网站,或者使用专用的Web界面。

Jhonse技术博客说明: 

来源于: http://www.ruanyifeng.com/blog/2013/05/jquery-free.html

 

 

 

【php】获得XML格式的RSS数据

RSS订阅功能一直想研究下,想了解下RSS订阅的数据是如何展示的?结果一查看自己的技术博客订阅功能代码,发现是用XML格式来展示的,于是就想如何获得每一条数据的标题、链接、时间…于是自己就写了一个函数来实现,测试OK。请看代码:

/**获得XML格式的RSS数据;
	 * RSS链接;
	 * 返回值为二维数组,如果失败为null.
	 */
	private function get_rssData($url){
		
		 $fp = fopen($url,"r");
		 
		 while ( !feof($fp) ) {          
		 	
		 	$buff .= fgets($fp,4096);      
		 
		 } 
		 
		 fclose($fp);
		  
		 //建立一个 XML 解析器      
		 $parser = xml_parser_create();
		 
		 //xml_parser_set_option -- 为指定 XML 解析进行选项设置      
		 
		 xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
		 
		 xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);  
		 
		 //xml_parse_into_struct -- 将 XML 数据解析到数组$values中      
		 
		 xml_parse_into_struct($parser,$buff,$values); 
		 
		 //xml_parser_free -- 释放指定的 XML 解析器     
		 xml_parser_free($parser); 
		 
		 $is_item = 0;
		 
		 foreach ($values as $val) {     
		 	
			$tag = $val["tag"];
			
			$type = $val["type"];          
			
			$value = $val["value"];
			
			//标签统一转为小写         
			$tag = strtolower($tag); 
			
			if($tag == "item" && $type == "open"){
				
				$is_item = 1;
				
			}else if($tag == "item" && $type =="close"){
				
				$is_item = 0;
				
				$arrdata[] = $arrdatason;
				
			}else{
				if($is_item && $type == "complete"){
					$arrdatason[$tag] = $value;
				}
			}
		 }
		 return $arrdata;
	}

资料说明:

PHP XML Parser 简介

XML 函数允许我们解析 XML 文档,但无法对其进行验证。

XML 是一种用于标准结构化文档交换的数据格式。您可以在我们的 XML 教程 中找到更多有关 XML 的信息。

该扩展使用 Expat XML 解析器。

Expat 是一种基于事件的解析器,它把 XML 文档视为一系列事件。当某个事件发生时,它调用一个指定的函数处理它。

Expat 是无验证的解析器,忽略任何链接到文档的 DTD。但是,如果文档的形式不好,则会以一个错误消息结束。

由于它基于事件,且无验证,Expat 具有快速并适合 web 应用程序的特性。

XML 解析器函数允许我们创建 XML 解析器,并为 XML 事件定义句柄。

安装

XML 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

PHP XML Parser 函数

PHP:指示支持该函数的最早的 PHP 版本。

函数 描述 PHP
utf8_decode() 把 UTF-8 字符串解码为 ISO-8859-1。 3
utf8_encode() 把 ISO-8859-1 字符串编码为 UTF-8。 3
xml_error_string() 获取 XML 解析器的错误描述。 3
xml_get_current_byte_index() 获取 XML 解析器的当前字节索引。 3
xml_get_current_column_number() 获取 XML 解析器的当前列号。 3
xml_get_current_line_number() 获取 XML 解析器的当前行号。 3
xml_get_error_code() 获取 XML 解析器错误代码。 3
xml_parse() 解析 XML 文档。 3
xml_parse_into_struct() 把 XML 数据解析到数组中。 3
xml_parser_create_ns() 创建带有命名空间支持的 XML 解析器。 4
xml_parser_create() 创建 XML 解析器。 3
xml_parser_free() 释放 XML 解析器。 3
xml_parser_get_option() 从 XML 解析器获取选项设置信息。 3
xml_parser_set_option() 为 XML 解析进行选项设置。 3
xml_set_character_data_handler() 建立字符数据处理器。 3
xml_set_default_handler() 建立默认的数据处理器。 3
xml_set_element_handler() 建立起始和终止元素处理器。 3
xml_set_end_namespace_decl_handler() 建立终止命名空间声明处理器。 4
xml_set_external_entity_ref_handler() 建立外部实体处理器。 3
xml_set_notation_decl_handler() 建立注释声明处理器。 3
xml_set_object() 在对象中使用 XML 解析器。 4
xml_set_processing_instruction_handler() 建立处理指令(PI)处理器。 3
xml_set_start_namespace_decl_handler() 建立起始命名空间声明处理器。 4
xml_set_unparsed_entity_decl_handler() 建立未解析实体定义声明处理器。 3

【技术排行榜】2013年5月编程语言排行榜:UNIX下的Bash

2013年5月9日,Tiobe公司发布新一期编程语言排行榜。新一期榜单前10位没有太多的变化,只是Objective-C与C++,Ruby与JavsScript在互相交换位置罢了。今天我们要关注的是排在TOP 20后半部的一门语言——Bash。

大家先请看本期TOP20榜单

从2013年4月的编程语言排行榜我们惊异的发现Bash这门UNIX下的壳语言,竟然有了飞速的上升。从第34位最高上升到第13位。究竟这门语言有什么独特之处?

Bash的诞生

Bash这个单词的来源十分晦涩,它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。

Bash语言之父Stephen R. Bourne

Bash是大多数Linux系统以及Mac OS X v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。

Bash是Linux的敲门砖,如果不懂Bash那其他东西就不用学习了。Linux透过终端下达指令,都是通过Bash来执行。

Bash语法

用vi编辑器编辑一个hello文件如下:

#!/bin/bash  
# This is a very simple example 
echo Hello World 

这样最简单的一个 BASH 程序就编写完了。这里有几个问题需要说明一下:

一,第一行的 #! 是什么意思

二,第一行的 /bin/bash 又是什么意思

三,第二行是注释吗 

四,echo 语句

如何执行该程序呢?有两种方法:一种是显式制定 BASH 去执行:

$ bash hello 或$ sh hello(这里 sh 是指向 bash 的一个链接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)

或者可以先将 hello 文件改为可以执行的文件,然后直接运行它,此时由于 hello 文件第一行的 "#! /bin/bash" 的作用,系统会自动用/bin/bash 程序去解释执行 hello 文件的:

$ chmod u+x hello 
$ ./hello 

此处没有直接 “$ hello”是因为当前目录不是当前用户可执行文件的默认目录,而将当前目录“.”设为默认目录是一个不安全的设置。

需要注意的是,BASH 程序被执行后,实际上 Linux 系统是另外开设了一个进程来运行的。

Bash命令行参数

在使用wget的时候,我喜欢加上一个-c的参数,这样可以让wget启用断点续传功能。这里的-c就是一个命令行参数。

在写c语言的时候,我们使用字符串数组存储命令行参数,像我们所熟悉的argv[]。当然我们也需要命令行参数的个数,这存储在名为argc的整型变量中。argc和argv是约定俗成的名称,当然你可以使用自己的名称作为main函数的形参。

在编写Bash脚本的时候,也同样可以使用命令行参数。在Bash函数中也可以使用参数,特殊的是,Bash中的函数是没有参数列表的,例如function foo

这样便完成了一个函数头的定义,但是没有任何的形参名称,这是由于Bash中特殊的参数传递方法所致。

这里需要说明的是,在Bash编程中命令行参数和函数的形参都采用统一的规则。

Bash的函数规则

在Bash中,所有变量在赋值是赋值号左侧直接写变量名。而在引用变量的值时,变量名的左侧需要加上$符号。写过PHP脚本可能对此深有印象,不过PHP是赋值和引用都要写。

Bash的参数是按照位置传递的,而且自动给出变量名称,例如$1就表示第一个参数,当然$2就是第二个参数,参数之间用空格区分。这样你可以顺序写到$n(n表示一个正整数),有几个参数都可以按照顺序引用。

$0表示当前运行命令的名称,这个其实是特殊的参数,但是往往很少用到。

如果你想得到参数的个数,它保存在一个特殊名称的变量里,叫做$#。

$*和$@表示所有的参数,具体区别和其他一些特殊参数请见这里。

注:后面我们会用到一个$?参数,这表示上一条独立命令运行的结果。我们才c语言写程序的时候,常常以return 0作为程序正常退出的标志,这个0就被返回给Bash,而$?可以引用到上一个程序运行的结果。还记得Bash函数的参数和命令行参数是相同的吗?如果刚刚执行完一个Bash函数,$?里就保存着这个函数的运行结果,即return的值。

Bash学习资料(繁体版)http://linux.vbird.org/linux_basic/0320bash.php#bash

Bash相关资源下载:http://www.gnu.org/software/bash/

前10名编程语言走势图

20到50名语言排行

Position Programming Language Ratings
21 MATLAB 0.591%
22 SAS 0.587%
23 Ada 0.583%
24 R 0.543%
25 ABAP 0.501%
26 COBOL 0.458%
27 Fortran 0.419%
28 Scheme 0.396%
29 Prolog 0.326%
30 Haskell 0.323%
31 Erlang 0.315%
32 Common Lisp 0.307%
33 Scratch 0.303%
34 D 0.301%
35 Scala 0.300%
36 Logo 0.282%
37 NXT-G 0.243%
38 F# 0.240%
39 Smalltalk 0.237%
40 APL 0.226%
41 Forth 0.220%
42 ActionScript 0.204%
43 ML 0.204%
44 RPG (OS/400) 0.178%
45 Awk 0.162%
46 Tcl 0.152%
47 PL/I 0.149%
48 LabVIEW 0.138%
49 Ladder Logic 0.137%
50 JScript.NET 0.136%

 

下面是第50到100的编程语言排名

(Visual) FoxPro, ABC, Agilent VEE, Algol, Alice, Apex, ATLAS, AutoLISP, bc, BlitzMax, C shell, CFML, CL (OS/400), Clarion, Clipper, Clojure, Dart, Dylan, Eiffel, Emacs Lisp, Fantom, Gambas, Go, Groovy, Heron, Icon, IDL, Informix-4GL, J, JavaFX Script, Lasso, LPC, MUMPS, Oberon, OCaml, Occam, OpenCL, Oz, Pike, PowerShell, REXX, S, sed, SPARK, thinBasic, VBScript, VHDL, WebDNA, xBase, XSLT

Jhonse技术博客说明:

来源于51cto

 

【thinkphp】模板的使用技巧

一、模板包含

<include file="完整模板文件名" />
		<include file="./Tpl/default/Public/header.html" />
		<include file="read" />
		<include file="Public:header" />
		<include file="blue:User:read" />
		<include file="$tplName" />
		<include file="header" title="ThinkPHP框架"keywords="开源WEB开发框架"/>
		在模板中变量用[变量]接受
		<include file='file1,file2' />

 

二、模板渲染

1、自动开启模板渲染 设置配置文件
			'LAYOUT_ON'=>true,//开启模板渲染
			准备一个模板渲染页面,在页面中使用{__CONTENT__}接受具体模板页面的内容
			如果在摸一个具体模板中不希望使用渲染模板,可以在页首添加{__NOCONTENT__}
	2、不开启自动模板渲染可以在每一个具体页面的页首添加
		<layout name='layout'/>
	3.使用技巧
		在渲染模板文件中也可以使用其他模板文件的内容
		<include file='Public:header'/>
		<body>
			<p>这里是渲染页面!!!</p>
			{__CONTENT__}
		</body>
	</html>

 

三、模板的继承

【thinkphp】模板中的基本语法

一、导入CSS和JS文件

1、css link
	   js  scr
		<link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/test.css'/>
		<script src='__PUBLIC__/Js/test.js'></script>
	2.import
		<import type='js' file='Js.test' /> //导入Public文件夹下面的Js目录中的test.js文件,import标签可以省略type属性,默认就是js的
		<import type='css' file='Css.test' />
		//可以更改默认文件夹 设置basepath属性
		<import type='js' file='Js.my' basepath='./Other'/>
	3.load
		//方法可以自动检测导入的文件类型
		<load href='__PUBLIC__/Js/test.js' />

 

二、分支结构

1、if	
		<if condition='$sex eq "男"'>
			男人是泥巴做的
			<else />
			女人是水做的
		</if>

		<if condition='$age lt 18'>
			未成年
			<elseif  condition='$age eq 18'/>
			青春年少
			<else />
			成年
		</if>
		>  gt
		<  lt
		== eq
		<= elt
		>= egt
		!= neq
		=== heq
		!== nheq

		<switch name='number'>
			<case value='1'>一个和尚挑水吃</case>
			<case value='2'>两个和尚台水吃</case>
			<case value='3'>三个和尚没水吃</case>
			<default/> 这里是默认值
		</switch>
三、循环结构
	1.for
		<table border='1' width='500'>
			<for start='10' end='00' name='j' step='-2' comparison='gt'>
				<tr><td>{$j}</td><td>abc</td></tr>
			</for>
		</table>

	2.volist
		<volist name='list' id='v'>
			{$v.username}<br/>
		</volist>
	3.foreach
		<foreach name='list' item='v' key='k'>
			{$k}-------{$v}<br/>
		</foreach>

 

四、特殊标签

1、比较标签
			eq或者 equal 等于 
			neq 或者notequal 不等于 
			gt 大于 
			egt 大于等于 
			lt 小于 
			elt 小于等于 
			heq 恒等于 
			nheq 不恒等于 

	2.范围标签
		in      
				<in name='n' value='9,10,11,12'>在这些数字里面<else/>不在这些数字的范围内</in>
		between
				<notbetween name='n' value='1,10'>{$n}在1-10之间<else/>{$n}不在1到10之间</between>
	3.present
		标签来判断模板变量是否已经赋值,
		<present name='m'>m有赋值<else/>m没有赋值</present>
	4.Empty
		empty标签判断模板变量是否为空,
		<empty name='n'>n为空赋值<else/>n有值</empty>
	5.Defined 
		判断常量是否已经定义
	6.Define
		在模板中定义常量
	7.Assing
		模板中变量赋值

 

五、其他标签使用

在模板中直接使用PHP代码
		<php> echo "我是赵桐正" </php>

 

【thinkphp】模板中的变量

一、变量输出

1.标量输出
		2.数组输出
				{$name[1]}
				{$name['k2']}
				{$name.k1}
		3.对象输出
				{$name:k}
				{$name->k}

二、系统变量

{$Think.get.id}

三、使用函数

{$name|strtoupper} 生成的编译后文件是 <?php echo (strtoupper($name)); ?>
		{$name|date='Y m d H:i:s',###}

四、默认值

{$name|default='这里是默认值'}

五、运算符

+ - * / % ++ --
		{$name++}

【thinkphp】视图介绍

一、模板的使用  

a、规则
		模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl)
		更换模板文件的后缀名(修改配置文件)
		'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名
	b、修改模板文件目录层次
		'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次
	c、模板主题
		'DEFAULT_THEME'=>'your',//设置默认模板主题
		需要在TPL下面新建一个your文件夹作为模板主题文件夹
		如何动态修改模板主题?
		1、在后台准备一个功能,修改config.php文件中的默认模板项
		2、通过url传递 t=主题 参数可以修改不同的模板
			'DEFAULT_THEME'=>'your',//设置默认模板主题
			'TMPL_DETECT_THEME'=>true,//自动侦测模板主题
			'THEME_LIST'=>'your,my',//支持的模板主题列表

二、输出模板内容 

a、display
		1.display中没有参数
			$this->display();
		2.可以带参数
			$this->display(本模块文件夹下的其他模板文件);
			$this->display('index2');

			$this->display(其他文件夹下的模板文件);
			$this->display('Public:error');//注意,仅仅需要在Tpl下有Public文件夹以及其中的error.html即可,不需要一定有Public模块

			$this->display(其他主题下的 文件夹下的 模板文件);//需要开启主题支持
			$this->display('my:Index:index');

			$this->display(一个url路径);
			$this->display('./Public/error.html');

			$this->display('./Public/error.html','utf-8','text/xml');

			$this->show($content);
		3.fetch方法
			获得模板文件中的内容,以字符串形式返回
			$content=$this->fetch('Public:error');
		4.show方法
			不需要模板文件,可以直接输出模板内容
				$content=$this->fetch('Public:error');
				dump($content);
				$content=str_replace('h1','i',$content);
				$this->show($content);

三、模板中的赋值  

//$this->assign('name','赵桐正');
		$this->name='赵桐正2';
		$this->display();

四、模板替换 

__PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/
__ROOT__: 会替换成当前网站的地址(不含域名) 
__APP__: 会替换成当前项目的URL地址 (不含域名)
__GROUP__:会替换成当前分组的URL地址 (不含域名)
__URL__: 会替换成当前模块的URL地址(不含域名)
__ACTION__:会替换成当前操作的URL地址 (不含域名)
__SELF__: 会替换成当前的页面URL

更换模板变量规则,修改配置项
		'TMPL_PARSE_STRING'=>array(           //添加自己的模板变量规则
		'__CSS__'=>__ROOT__.'/Public/Css',
		'__JS__'=>__ROOT__.'/Public/Js',
	),