【技术新闻】程序员的时间都去了哪儿?

如果你认为软件工程师将所有时间都花在了构思巧妙算法和令人惊叹的图形例程,然后将这些转化为优雅紧凑的代码上,那你就错了。

据Electric Cloud的一份数据报告显示,开发者近 20% 的时间可能花在了….“等”上:等代码编译完成;等测试流程跑完;等同事帮他们买可乐和零食…..

当然,最后一个是搞笑的。不过,来自 Electric Cloud 的调查报告的确表明:软件工程师花在“等待”上的时间,基本同“脑暴和合作”持平 (如下图)。

自然,等待的形式多种多样,有些程序员会利用等待的时间规划下一个项目或者修正 Bug,具体的情况因人而异。但无论如何,真正花在纯等待上的时间,肯定比调查的结果要少。

“这个结果让我颇感意外” Electric Cloud 营销总监 Ashish Kuthiala 表示,“在我做软件工程师时,有很多开会的时间,我宁愿拿去编程。开会浪费了我不少时间。但我并未意识到,工程师其实在等待测试和 build 完成上,也浪费了不少时间。”

是否有方法缩短甚至避免等待情况的发生呢?可以说,只要编译和测试存在时延,软件工程师便会有借口。而不出所料,Electric Cloud 也推出了一项服务,通过将测试、部署代码等过程自动化的方式,尽可能缩减程序员等待的时间。目前也有些开源软件提供类似的功能。

身为程序员的你,是在等待中读到这篇文章的吗?

Jhonse技术博客说明:

来源于: http://www.36kr.com/p/202957.html

 

 

【php】parse_str函数的使用

网上资料如下:

定义和用法

parse_str() 函数把查询字符串解析到变量中。

语法

parse_str(string,array)
参数 描述
string 必需。规定要解析的字符串。
array 可选。规定存储变量的数组名称。该参数指示变量存储到数组中。

提示和注释

注释:如果未设置 array 参数,由该函数设置的变量将覆盖已由同名变量。

注释:php.ini 中的 magic_quotes_gpc 设置影响该函数的输出。如果已启用,那么在 parse_str() 解析之前,变量会被 addslashes() 转换。

例子

例子 1

<?php
parse_str("id=23&name=John%20Adams");
echo $id."<br />";
echo $name;
?>

输出:

23
John Adams

例子 2

<?php
parse_str("id=23&name=John%20Adams",$myArray);
print_r($myArray);
?>

输出:

Array
(
[id] => 23
[name] => John Adams
)

【php】http_build_query的用法

(PHP 5)

http_build_query — 生成 url-encoded 之后的请求字符串描述string http_build_query ( array formdata [, string numeric_prefix] )

使用给出的关联(或下标)数组生成一个 url-encoded 请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。

例子 1. http_build_query() 使用示例

<?php 
$data = array('foo'=>'bar', 
              'baz'=>'boom', 
              'cow'=>'milk', 
              'php'=>'hypertext processor'); 
echo http_build_query($data); 
/* 输出: 
       foo=bar&baz=boom&cow=milk&php=hypertext+processor 
*/ 
?>

 

例子 2. http_build_query() 使用数字下标的元素

<?php 
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor'); 
echo http_build_query($data); 
/* 输出: 
       0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor 
*/ 
echo http_build_query($data, 'myvar_'); 
/* 输出: 
       myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor 
*/ 
?>

 

例子 3. http_build_query() 使用复杂的数组

<?php 
$data = array('user'=>array('name'=>'Bob Smith', 
                            'age'=>47, 
                            'sex'=>'M', 
                            'dob'=>'5/12/1956'), 
              'pastimes'=>array('golf', 'opera', 'poker', 'rap'), 
              'children'=>array('bobby'=>array('age'=>12, 
                                               'sex'=>'M'), 
                                'sally'=>array('age'=>8, 
                                               'sex'=>'F')), 
              'CEO'); 
echo http_build_query($data, 'flags_'); 
/* 输出:(为了可读性对其进行了折行) 
       user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956& 
       pastimes[0]=golf&pastimes[1]=opera&pastimes[2]=poker&pastimes[3]=rap& 
       children[bobby][age]=12&children[bobby][sex]=M&children[sally][age]=8& 
       children[sally][sex]=F&flags_0=CEO 
    注意:只有基础数组中的数字下标元素“CEO”才获取了前缀,其它数字下标元素(如 
    pastimes 下的元素)则不需要为了合法的变量名而加上前缀。 
*/ 
?>

 

例子 4. http_build_query() 使用对象

<?php 
class myClass { 
   var $foo; 
   var $baz; 
   function myClass() { 
    $this->foo = 'bar'; 
    $this->baz = 'boom'; 
   } 
} 
$data = new myClass(); 
echo http_build_query($data); 
/* 输出: 
       foo=bar&baz=boom 
*/ 
?>

 

Jhonse技术博客说明:

来源于: zhjahch

【thinkphp】查询方式

普通查询方式

a、字符串
		$arr=$m->where("sex=0 and username='gege'")->find();
	b、数组
		$data['sex']=0;
		$data['username']='gege';
		$arr=$m->where($data)->find();
		注意:这种方式默认是and的关系,如果使用or关系,需要添加数组值
		$data['sex']=0;
		$data['username']='gege';
		$data['_logic']='or';

 

表达式查询方式

$data['id']=array('lt',6);
		$arr=$m->where($data)->select();
		EQ 等于
		NEQ不等于
		GT 大于
		EGT大于等于
		LT 小于
		ELT小于等于
		LIKE 模糊查询
			$data['username']=array('like','%ge');
			$arr=$m->where($data)->select();
		NOTLIKE
			$data['username']=array('notlike','%ge%'); //notlike中间没有空格
		    $arr=$m->where($data)->select();

			注意:如果一个字段要匹配多个通配符
			$data['username']=array('like',array('%ge%','%2%','%五%'),'and');//如果没有第三个值,默认关系是or关系
			$arr=$m->where($data)->select();
		BETWEEN
			$data['id']=array('between',array(5,7));
			$arr=$m->where($data)->select();
			//SELECT * FROM `tp_user` WHERE ( (`id` BETWEEN 5 AND 7 ) )
			$data['id']=array('not between',array(5,7));//注意,not 和 between中间一定要有空格
			$arr=$m->where($data)->select();
		IN
			$data['id']=array('in',array(4,6,7));
			$arr=$m->where($data)->select();
			//SELECT * FROM `tp_user` WHERE ( `id` IN (4,6,7) )

			$data['id']=array('not in',array(4,6,7));
			$arr=$m->where($data)->select();
			//SELECT * FROM `tp_user` WHERE ( `id` NOT IN (4,6,7) )

 

区间查询

$data['id']=array(array('gt',4),array('lt',10));//默认关系是 and 的关系
		//SELECT * FROM `tp_user` WHERE ( (`id` > 4) AND (`id` < 10) ) 

		$data['id']=array(array('gt',4),array('lt',10),'or') //关系就是or的关系

		$data['name']=array(array('like','%2%'),array('like','%五%'),'gege','or');

 

统计查询

count //获取个数
		max   //获取最大数
		min   //获取最小数
		avg   //获取平均数
		sum   //获取总和

 

SQL直接查询

a、query 主要数处理读取数据的
		成功返回数据的结果集
		失败返回boolean false
		$m=M();
		$result=$m->query("select *  from t_user where id >50");
		var_dump($result);
	b、execute 用于更新个写入操作
		成功返回影响行数
		失败返回boolean false
		$m=M();
		$result=$m->execute("insert into t_user(`username`) values('ztz3')");
		var_dump($result);

 

【thinkphp】CURD介绍

读取数据

对数据的读取 Read
	$m=new Model('User');
	$m=M('User');
	select
	$m->select();//获取所有数据,以数组形式返回
	find
	$m->find($id);//获取单条数据
	getField(字段名)//获取一个具体的字段值
	$arr=$m->where('id=2')->getField('username');

 

创建数据

对数据的添加 Create
	$m=new Model('User');
	$m=M('User');
	$m->字段名=值
	$m->add();
	返回值是新增的id号

 

删除数据

$m=M('User');
	$m->delete(2);               //删除id为2的数据
	$m->where('id=2')->delete(); //与上面效果相同,也是删除id为2的数据
	返回值是受影响行数

 

更新数据

$m=M('User');
	$data['id']=1;
	$data['username']='ztz2';
	$m->save($data);             
	返回值是受影响行数

 

【thinkphp】输出和模型使用

ThinkPHP 3.2 的输出

a、通过 echo 等PHP原生的输出方式在页面中输出
	b、通过display方法输出
		想分配变量可以使用assign方法
	c、修改左右定界符
		休要修改配置文件中的配置项
		'TMPL_L_DELIM'=>'<{', //修改左定界符
		'TMPL_R_DELIM'=>'}>', //修改右定界符

 

ThinkPHP 3 的模型使用

需要在方法中通过new Model(表名)的形式操作数据库
		$m=new Model('User');
		$arr=$m->select(); 
	'DB_TYPE'=>'mysql',   //设置数据库类型
	'DB_HOST'=>'localhost',//设置主机
	'DB_NAME'=>'thinkphp',//设置数据库名
	'DB_USER'=>'root',    //设置用户名
	'DB_PWD'=>'',        //设置密码
	'DB_PORT'=>'3306',   //设置端口号
	'DB_PREFIX'=>'tp_',  //设置表前缀
	也可以使用DSN方法进行配置
	'DB_DSN'=>'mysql://root:@localhost:3306/thinkphp',//使用DSN方式配置数据库信息
	如果两种方式同时存在,以DSN方式为优先

	还有一种简单实用模型的方式
	M() 等效为 new Model();
	$m=M('User');
	$arr=$m->select();

	使用模型的实例可以对数据进行操作,操作的工作一般就是对数据库进行 增删改查 CURD
	
	增 -C Create $m->add()
	删 -D Delete $m->delete()
	改 -U Update $m->save()
	查 -R Read   $m->select()

 

其它

a、模板可以遍历数组
	<volist name='data' id='vo'>
			<{$vo.id}>----<{$vo.username}>-----<{$vo.sex}><br/>
		</volist>
	b、我们可以开启调试功能中的page_trace
		1.开启调试功能
			//3.开启调试模式
			define('APP_DEBUG',true);
		2.我们需要设置配置文件,开启页面trace
			'SHOW_PAGE_TRACE'=>true,//开启页面Trace

 

【thinkphp】MVC模式和URL访问

MVC模式

M -Model 编写model类 对数据进行操作
V -View  编写html文件,页面呈现
C -Controller 编写类文件(UserAction.class.php)

 

ThinkPHP的MVC对应的目录

M 项目目录/应用目录/Lib/Model
V 项目目录/应用目录/Tpl
C 项目目录/应用目录/Lib/Action

 

url的4种访问方式

                1.PATHINFO 模式 
		http://域名/入口文件/模块名/方法名/键1/值1/键2/值2
		2.普通模式
		http://域名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
		3.REWRITE模式
		http://域名/模块名/方法名/键1/值1/键2/值2
		4.兼容模式
		http://域名/入口文件?s=模块名/方法名/键1/值1/键2/值2

 

【thinkphp】thinkphp3.1.2基本介绍

ThinkPHP核心文件的说明:

        ├─ThinkPHP.php     框架入口文件
	├─Common 框架公共文件
	├─Conf 框架配置文件
	├─Extend 框架扩展目录
	├─Lang 核心语言包目录
	├─Lib 核心类库目录
	│  ├─Behavior 核心行为类库
	│  ├─Core 核心基类库
	│  ├─Driver 内置驱动
	│  │  ├─Cache 内置缓存驱动
	│  │  ├─Db 内置数据库驱动
	│  │  ├─TagLib 内置标签驱动
	│  │  └─Template 内置模板引擎驱动
	│  └─Template 内置模板引擎
	└─Tpl 系统模板目录

 

项目目录的文件说明:

                Home 前台应用文件夹
		├─Common 项目公共文件目录
		├─Conf 项目配置目录
		├─Lang 项目语言目录
		├─Lib 项目类库目录
		│  ├─Action Action类库目录
		│  ├─Behavior 行为类库目录
		│  ├─Model 模型类库目录
		│  └─Widget Widget类库目录
		├─Runtime 项目运行时目录
		│  ├─Cache 模板缓存目录
		│  ├─Data 数据缓存目录
		│  ├─Logs 日志文件目录
		│  └─Temp 临时缓存目录
		└─Tpl 项目模板目录

 

入口文件: index.php代码的实现:

<?php
    //1. 确定应用名称 Home
   define('APP_NAME','Home');
   //2.  确定应用路径
  define('APP_PATH','./Home/');
  //3.  应用核心库
  require './ThinkPHP/ThinkPHP.php';
?>

说明: 之后的thinkphp基础总结来自于[赵桐正]老师的视频.

【JQuery】按比例调整图片高度/宽度

对于文章的详细内容而言,就需要考虑到图片的显示问题,当图片的宽度和高度大或者小的时候,该如何处理,即尽量不让失真。这样就想到了用JQuery来控制其比例,也就是说按比例来显示即可。

代码如下:

$(document).ready(function() {
    $('.post img').each(function() {
    var maxWidth = 600; // 图片最大宽度
    var maxHeight = 2000;    // 图片最大高度
    var ratio = 0;  // 缩放比例
    var width = $(this).width();    // 图片实际宽度
    var height = $(this).height();  // 图片实际高度
 
    // 检查图片是否超宽
    if(width > maxWidth){
        ratio = maxWidth / width;   // 计算缩放比例
        $(this).css("width", maxWidth); // 设定实际显示宽度
        height = height * ratio;    // 计算等比例缩放后的高度
        $(this).css("height", height);  // 设定等比例缩放后的高度
    }
 
    // 检查图片是否超高
    if(height > maxHeight){
        ratio = maxHeight / height; // 计算缩放比例
        $(this).css("height", maxHeight);   // 设定实际显示高度
        width = width * ratio;    // 计算等比例缩放后的高度
        $(this).css("width", width);    // 设定等比例缩放后的高度
    }
    });
});

说明: 此方法来源于WordPress大学网

还有一个问题就是当不是内容页的图片(大小没有规定),当是图文展示的页面的时候(大小规定了),那该如何处理?思考中…

【php】header函数中Content-Type类型小结

在使用header函数的时候,总在为要输出图片、excel等等文件而为Content-Type类型发愁,现在来小结下Content-Type类型,以便下次所需:

<?php 
$mimetypes = array( 
'ez' => 'application/andrew-inset', 
'hqx' => 'application/mac-binhex40', 
'cpt' => 'application/mac-compactpro', 
'doc' => 'application/msword', 
'bin' => 'application/octet-stream', 
'dms' => 'application/octet-stream', 
'lha' => 'application/octet-stream', 
'lzh' => 'application/octet-stream', 
'exe' => 'application/octet-stream', 
'class' => 'application/octet-stream', 
'so' => 'application/octet-stream', 
'dll' => 'application/octet-stream', 
'oda' => 'application/oda', 
'pdf' => 'application/pdf', 
'ai' => 'application/postscript', 
'eps' => 'application/postscript', 
'ps' => 'application/postscript', 
'smi' => 'application/smil', 
'smil' => 'application/smil', 
'mif' => 'application/vnd.mif', 
'xls' => 'application/vnd.ms-excel', 
'ppt' => 'application/vnd.ms-powerpoint', 
'wbxml' => 'application/vnd.wap.wbxml', 
'wmlc' => 'application/vnd.wap.wmlc', 
'wmlsc' => 'application/vnd.wap.wmlscriptc', 
'bcpio' => 'application/x-bcpio', 
'vcd' => 'application/x-cdlink', 
'pgn' => 'application/x-chess-pgn', 
'cpio' => 'application/x-cpio', 
'csh' => 'application/x-csh', 
'dcr' => 'application/x-director', 
'dir' => 'application/x-director', 
'dxr' => 'application/x-director', 
'dvi' => 'application/x-dvi', 
'spl' => 'application/x-futuresplash', 
'gtar' => 'application/x-gtar', 
'hdf' => 'application/x-hdf', 
'js' => 'application/x-javascript', 
'skp' => 'application/x-koan', 
'skd' => 'application/x-koan', 
'skt' => 'application/x-koan', 
'skm' => 'application/x-koan', 
'latex' => 'application/x-latex', 
'nc' => 'application/x-netcdf', 
'cdf' => 'application/x-netcdf', 
'sh' => 'application/x-sh', 
'shar' => 'application/x-shar', 
'swf' => 'application/x-shockwave-flash', 
'sit' => 'application/x-stuffit', 
'sv4cpio' => 'application/x-sv4cpio', 
'sv4crc' => 'application/x-sv4crc', 
'tar' => 'application/x-tar', 
'tcl' => 'application/x-tcl', 
'tex' => 'application/x-tex', 
'texinfo' => 'application/x-texinfo', 
'texi' => 'application/x-texinfo', 
't' => 'application/x-troff', 
'tr' => 'application/x-troff', 
'roff' => 'application/x-troff', 
'man' => 'application/x-troff-man', 
'me' => 'application/x-troff-me', 
'ms' => 'application/x-troff-ms', 
'ustar' => 'application/x-ustar', 
'src' => 'application/x-wais-source', 
'xhtml' => 'application/xhtml+xml', 
'xht' => 'application/xhtml+xml', 
'zip' => 'application/zip', 
'au' => 'audio/basic', 
'snd' => 'audio/basic', 
'mid' => 'audio/midi', 
'midi' => 'audio/midi', 
'kar' => 'audio/midi', 
'mpga' => 'audio/mpeg', 
'mp2' => 'audio/mpeg', 
'mp3' => 'audio/mpeg', 
'aif' => 'audio/x-aiff', 
'aiff' => 'audio/x-aiff', 
'aifc' => 'audio/x-aiff', 
'm3u' => 'audio/x-mpegurl', 
'ram' => 'audio/x-pn-realaudio', 
'rm' => 'audio/x-pn-realaudio', 
'rpm' => 'audio/x-pn-realaudio-plugin', 
'ra' => 'audio/x-realaudio', 
'wav' => 'audio/x-wav', 
'pdb' => 'chemical/x-pdb', 
'xyz' => 'chemical/x-xyz', 
'bmp' => 'image/bmp', 
'gif' => 'image/gif', 
'ief' => 'image/ief', 
'jpeg' => 'image/jpeg', 
'jpg' => 'image/jpeg', 
'jpe' => 'image/jpeg', 
'png' => 'image/png', 
'tiff' => 'image/tiff', 
'tif' => 'image/tiff', 
'djvu' => 'image/vnd.djvu', 
'djv' => 'image/vnd.djvu', 
'wbmp' => 'image/vnd.wap.wbmp', 
'ras' => 'image/x-cmu-raster', 
'pnm' => 'image/x-portable-anymap', 
'pbm' => 'image/x-portable-bitmap', 
'pgm' => 'image/x-portable-graymap', 
'ppm' => 'image/x-portable-pixmap', 
'rgb' => 'image/x-rgb', 
'xbm' => 'image/x-xbitmap', 
'xpm' => 'image/x-xpixmap', 
'xwd' => 'image/x-xwindowdump', 
'igs' => 'model/iges', 
'iges' => 'model/iges', 
'msh' => 'model/mesh', 
'mesh' => 'model/mesh', 
'silo' => 'model/mesh', 
'wrl' => 'model/vrml', 
'vrml' => 'model/vrml', 
'css' => 'text/css', 
'html' => 'text/html', 
'htm' => 'text/html', 
'asc' => 'text/plain', 
'txt' => 'text/plain', 
'rtx' => 'text/richtext', 
'rtf' => 'text/rtf', 
'sgml' => 'text/sgml', 
'sgm' => 'text/sgml', 
'tsv' => 'text/tab-separated-values', 
'wml' => 'text/vnd.wap.wml', 
'wmls' => 'text/vnd.wap.wmlscript', 
'etx' => 'text/x-setext', 
'xsl' => 'text/xml', 
'xml' => 'text/xml', 
'mpeg' => 'video/mpeg', 
'mpg' => 'video/mpeg', 
'mpe' => 'video/mpeg', 
'qt' => 'video/quicktime', 
'mov' => 'video/quicktime', 
'mxu' => 'video/vnd.mpegurl', 
'avi' => 'video/x-msvideo', 
'movie' => 'video/x-sgi-movie', 
'ice' => 'x-conference/x-cooltalk', 
); 
?>