2016年12月12日星期一

Git批量添加文件的三种方法及其区别(Stack Overflow转载)

git add -A is equivalent to git add .; git add -u.
The important point about git add . is that it looks at the working tree and adds all those paths to the staged changes if they are either changed or are new and not ignored, it does not stage any 'rm' actions.
git add -u looks at all the already tracked files and stages the changes to those files if they are different or if they have been removed. It does not add any new files, it only stages changes to already tracked files.
git add -A is a handy shortcut for doing both of those.
You can test the differences out with something like this (note that for Git version 2.x your output for git add . git status will be different):
git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me
Summary:
  • git add -A stages All
  • git add . stages new and modified, without deleted
  • git add -u stages modified and deleted, without new

2016年12月7日星期三

PHP判断字符串包含的文字类型

不多说,直接上代码。


补充知识点: 正则式后面的u表示模式字符串将被以UTF-8字符模式对待。在匹配中文的时候必须带上,只有这样才能正确匹配中文字符。

js的encodeURI()函数

在使用JavaScript向PHP传值的时候,一定要记得要进行预处理。也就是使用encodeURI()函数。今天就因为这个浪费了很多时间查错,小记一下作为警示。

2016年12月5日星期一

PHP如何动态地获取文件的扩展名

如题,今天在做brandpronounce这个项目的时候需要把down到的图片和brand结合起来,但是图片扩展名各不相同,导致无法一起使用相同的后缀链接,要转换图片格式又嫌麻烦,在尝试了很多种方法都无果之后,采用了以下效率比较低的方案。

首先使用scandir()函数把imgs文件夹下的图片罗列出来,放在一个foreach()循环中,使用pathinfo()把每次取得的文件名和brand名进行比对,如果一致就返回这个文件名。

值得一提的是pathinfo()的第二个参数指定了返回什么内容,PATHINFO_BASENAME是返回带后缀名的完整文件名,而PATHINFO_FILENAME则是返回不带后缀名的版本。


2016年12月2日星期五

2016年11月28日星期一

MySQL中单列索引和复合索引的区别

单列索引,顾名思义也就是只有一个字段的索引列。 
组合索引,又称复合索引,两个或更多个列上的索引被称作复合索引。对于复合索引,他们都遵循左侧原则,也是就是说一个查询可以只使用复合索引最左侧的一部份。
例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 。

Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;
bin 是二进制, a 和 A 会别区别对待.
例如你运行:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容。

一、官方文档说明
 当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。
     utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘?'等于‘ss'。
     utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。
     对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

     utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

二、简短总结
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。

2016年11月25日星期五

CSS如何指定元素高度为100%

在CSS中,如果你设置一个元素的width为100%,那么它会自动占据全屏宽度,于是你很自然的想到如果给height也设置100%,它就会占据全屏高度。
然而事实是并不会,答案源自于HTML计算元素高度的方法。

Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度。如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度。
但是高度的计算方式完全不一样。事实上,浏览器根本就不计算内容的高度,除非内容超出了视窗范围(导致滚动条出现)。或者你给整个页面设置一个绝对高度。否则,浏览器就会简单的让内容往下堆砌,页面的高度根本就无需考虑。
因为页面并没有缺省的高度值,所以,当你让一个元素的高度设定为百分比高度时,无法根据获取父元素的高度,也就无法计算自己的高度。换句话说,父元素的高度只是一个缺省值:height: auto;。当你要求浏览器根据这样一个缺省值来计算百分比高度时,只能得到undefined的结果。也就是一个null值,浏览器不会对这个值有任何的反应。

那么,如果想让一个元素的百分比高度height: 100%;起作用,你需要给这个元素的所有父元素的高度设定一个有效值。
考虑如下代码
<html>
<head>
...
</head>
<body>
 <div class="test">
  ...
 </div>
</body>
</html>
如果想让test占据全屏高度,那么你需要给它所有的父元素指定有效值,也就是body元素和html元素。
如下所示。
html {
 height: 100%
}

body {
 height: 100%
}
这样,代码就能生效了。


2016年11月22日星期二

如何在CI框架中集成Smarty模板引擎

框架对于提升一个项目的开发速度的帮助还是很大的,CI也就是CodeIgniter,是一个轻量级,语法简单,但功能却十分强大的框架,而且CI的中文社区有十分完善的Documentation,比较适合E文苦手的小伙伴上手。

同样的,模板引擎也能够大大减低html文件中的重复代码量,提升代码可读性和开发效率。如果能把两者结合就更好了,基于这样的目的,本文介绍如何在CI框架中集成Smarty模板。

一、下载最新版本的Smarty文件(我用的版本是3.1.10),并Copy到CI应用目录下的libraries文件夹中。

二、在libraries文件夹中新建文件Cismarty.php

三、在你的APPPATH同级目录中新建template_c, configs文件夹,并确认Smarty有读写权限。(cache和views文件夹是CI自带的,所以可以不用创建,当然如果你喜欢的话也能自定义其他的目录供Smarty使用)

四、在项目的config文件夹中找到autoload.php并修改以下行。
  $autoload['libraries'] = array('Cismarty');

五、在项目的core目录新建文件MY_Controller.php
这一步是可选的,目的是让你在开发中可以直接使用类似$this->display(#), $this->assign(#)的代码。

完成啦!接下来可以做一些测试,像这样。

如果一切顺利,你就能看到‘I am using Smarty with CI!’的字样啦!

2016年11月17日星期四

PHP include()和require()的区别


一、加载失败的处理方式不同
include()即使文件不存在,加载失败,也不会导致脚本停止运行,而是抛出一个PHP Warning。
而require()如果加载失败则直接抛出一个PHP Fatal error。导致脚本停止。

二、PHP性能影响不同
include()每次执行都要对文件进行读取和评估,而require只对文件处理一次(事实上,文件内容替换了require语句)。

三、使用弹性不同
require 的使用方法如 require("./inc.php"); 。通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它变成 PHP 程式网页的一部份。
include 使用方法如 include("./inc/.php"); 。一般是放在流程控制的处理区段中。PHP 程式网页在读到 include 的档案时,才将它读进来。这种方式,可以把程式执行时的流程简单化。

顺带一提,require_once() 和 include_once()和上述两种方法的不同之处就在于它们会判断文件是否已经包含在脚本中,如果已经包含则跳过该语句。一般建议使用_once()方法,可以避免重复包含文件导致的性能损失。

2016年8月26日星期五

解决chrome抽风打开变得很慢的问题

解决方法:注册表 HKEY-CURRENT-USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lnk ,然后分别点击.link 、 OpenWithList 、 OpenWitheProgids将没有标(默认)的一栏都删除,重启电脑后就可以了,不重启不好用(win10 好像没有.link)

2016年8月24日星期三

比较简洁的冒泡排序算法实现

今天看到一个蛮有趣的冒泡算法,逻辑很清晰,忍不住记在博客里面,代码如下:

如何避免mysql警告:[Warning] Using a password on the command line interface can be insecure.

在shell中运行如下命令:

mysql_config_editor set --login-path=local --host=localhost --user=username --password
在确认过密码后,再次登录mysql时就可以键入:

mysql --login-path=local

完成!以后不管是在shell程序还是在.sh文件都可以使用以上命令来登录mysql了。

2016年8月7日星期日

jQuery中checkbox事件只触发两次的问题

今天在写一个要对checkbox进行相应的jQuery demo的时候有如下代码:
经测试发现只有前两次点击和取消有效,经过尝试多种解决方法之后,把attr改为prop有效。
更新后的代码如下:

2016年8月6日星期六

jQuery中如何动态选取元素,以及nth-child选择器的介绍

今天在做一个demo的时候要用jQuery动态创建tr添加进表格,但是在想要删除这条动态创建的tr的时候却发现什么选择器都不好使了。
在网上找了很多方法,有说用live的,有说用delegate的,自己尝试了一遍之后都不行。找来找去最后发现原来bind,live,delegate这些方法在jQuery1.9及其以上的版本已经都弃用了,取而代之的是on()方法,下面就对这个方法做一个说明,以备后用。


$(selector).on(event, childSelector, data, function, map)

参数描述
event必需,由逗号分割,必须是有效事件
childSelector可选,指定要添加事件处理程序的子元素
data可选,规定传递到函数的附加数据
function可选,规定事件发生时的处理函数
map规定事件映射{event:function, event:function..}


例如我今天做的demo:
下面简单介绍一下nth-child(in+j)的用法。
这是一个功能强大的选择器,在HTML5变成中经常使用在CSS布局上。
常用描述
:nth-child(odd)选中所有奇数行,下标从1开始
:nth-child(even)选中所有偶数行
:nth-child(in+j)对给定表达式进行运算后选定行,例如3n+2就是选定第2行,第5行..

同时,在一个nth-child选择器下面再写另一个nth-child选择器将会替换掉上面的选择器设置的效果,这样可以单独设置表头的特效。

2016年8月3日星期三

在虚拟机中运行的Ubuntu中如何给Firefox设置代理

注:以下方法在VirtualBox中证实有效,但在VMware中却没用,可能跟网络地址分配方式有关,以后有时间再深入研究下如何在VMware中实现代理。

1.在终端中键入命令 route -n 获取0.0.0.0网段的IP网关。
2.在Firefox的首选项->高级->网络->设置中设置SOCKS代理,地址就是第一步获取到的网关,端口视宿主机代理软件设置的端口而定(我自己用的是shadowsocks的默认设置,1080端口)
3.选中socks_v5和remote DNS选项。

完成


2016年8月2日星期二

如何用CSS禁止用户在HTML页面中选择文本

在CSS代码中添加如下行,对body元素进行约束。

body{
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}

同时实现了多浏览器支持。

2016年7月31日星期日

转载:Android Studio shortcuts

文章编辑整理:Android Studio 中文组 - SadieYu
Alt+回车 导入包,自动修正
Ctrl+N   查找类
Ctrl+Shift+N 查找文件
Ctrl+Alt+L  格式化代码
Ctrl+Alt+O 优化导入的类和包
Alt+Insert 生成代码(如get,set方法,构造函数等)
Ctrl+E或者Alt+Shift+C  最近更改的代码
Ctrl+R 替换文本
Ctrl+F 查找文本
Ctrl+Shift+Space 自动补全代码
Ctrl+空格 代码提示
Ctrl+Alt+Space 类名或接口名提示
Ctrl+P 方法参数提示
Ctrl+Shift+Alt+N 查找类中的方法或变量
Alt+Shift+C 对比最近修改的代码
Shift+F6  重构-重命名
Ctrl+Shift+先上键
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/  注释(// 或者 )
Ctrl+J  自动代码
Ctrl+E 最近打开的文件
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
Alt+F1 查找代码所在位置
Alt+1 快速打开或隐藏工程面板
Ctrl+Alt+ left/right 返回至上次浏览的位置
Alt+ left/right 切换代码视图
Alt+ Up/Down 在方法间快速移动定位
Ctrl+Shift+Up/Down 代码向上/下移动。
F2 或Shift+F2 高亮错误或警告快速定位
代码标签输入完成后,按Tab,生成代码。
选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
Ctrl+W 选中代码,连续按会有其他效果
选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+B 快速打开光标处的类或方法 

最常用快捷键
1.Ctrl+E,可以显示最近编辑的文件列表
2.Shift+Click可以关闭文件
3.Ctrl+[或]可以跳到大括号的开头结尾
4.Ctrl+Shift+Backspace可以跳转到上次编辑的地方
5.Ctrl+F12,可以显示当前文件的结构
6.Ctrl+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择
7.Ctrl+N,可以快速打开类
8.Ctrl+Shift+N,可以快速打开文件
9.Alt+Q可以看到当前方法的声明
10.Ctrl+W可以选择单词继而语句继而行继而函数
11.Alt+F1可以将正在编辑的元素在各个面板中定位
12.Ctrl+P,可以显示参数信息
13.Ctrl+Shift+Insert可以选择剪贴板内容并插入
14.Alt+Insert可以生成构造器/Getter/Setter等
15.Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
16.Ctrl+Alt+T可以把代码包在一块内,例如try/catch
17.Alt+Up and Alt+Down可在方法间快速移动


下面的不是很有用
18.在一些地方按Alt+Enter可以得到一些Intention Action,例如将”==”改为”equals()”
19.Ctrl+Shift+Alt+N可以快速打开符号
20.Ctrl+Shift+Space在很多时候都能够给出Smart提示
21.Alt+F3可以快速寻找
22.Ctrl+/和Ctrl+Shift+/可以注释代码
23.Ctrl+Alt+B可以跳转到抽象方法的实现
24.Ctrl+O可以选择父类的方法进行重写
25.Ctrl+Q可以看JavaDoc
26.Ctrl+Alt+Space是类名自动完成
27.快速打开类/文件/符号时,可以使用通配符,也可以使用缩写
28.Live Templates! Ctrl+J
29.Ctrl+Shift+F7可以高亮当前元素在当前文件中的使用
30.Ctrl+Alt+Up /Ctrl+Alt+Down可以快速跳转搜索结果
31.Ctrl+Shift+J可以整合两行
32.Alt+F8是计算变量值

2016年7月25日星期一

JavaScript中“||”运算符的返回值

原则上,||运算符会返回表达式中第一个为true的变量,如果表达式中的变量都为false,则返回最后一个值。

特别地,||运算符可以返回任意数据类型的变量(包括对象)。

举例说明:

<script>
     var foo = 0;
     var foo1 = false;
     var foo2 = "";
     var foo3 = NaN;
     var foo4 = null;
     var foo5 = undefined;

  alert(foo || foo1 || foo2 || foo3 || foo4 || foo5);
</script>

返回值为 undefined

<script>
var foo = 0;
var foo1 = false;
var foo2 = "";
var foo3 = NaN;
var foo4 = null;
var foo5 = "OK";

alert(foo || foo1 || foo2 || foo5 || foo3 || foo4);
</script>

返回值为 OK

2016年6月18日星期六

如何配置LAMP环境

手贱搞坏了自己的ubuntu,今天重新装了一遍之后发现对照着之前转载的那篇教程死活都配不好LAMP,在查阅了无数资料之后终于配置成功,想了想只是看别人写的教程果然还是不靠谱,于是果断决定自己写一个以备日后不时之需。


一、下载apache

sudo apt-get install apache2


二、下载mysql

sudo apt-get install mysql-server mysql-client

中途会让你设定root用户的密码,输入并确认之后即可成功安装mysql


三、下载php

这里需要说明的是我的ubuntu版本是16.04,而16.04默认的apt库中是没有php5的,会自动安装php7。

sudo apt-get install php php-curl php-mysql php-gettext php-curl libapache2-mod-php php-mbstring

完成之后,写一个文件来测试下是否成功连接数据库

sudo apt-get install vim

sudo vim /var/www/html/test.php

输入以下内容:

<?php
echo mysqli_connect('localhost', 'root', 'root') ? 'OK' : 'FAIL';
echo phpinfo();
?>

注意:php7全面取消了mysql函数库的支持,应改写为mysqli


四、下载phpmyadmin

sudo apt-get install phpmyadmin

中途会让你输入phpmyadmin的密码(不是连接的mysql的密码),输入即可

现在还不能直接在浏览器中访问phpmyadmin,有两种方法可以实现访问:

①在/var/www/html文件夹下建立一个到phpmyadmin的软连接,用法如下:
sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

补充知识:ln命令可以建立软连接和硬链接(在后面加上-s的选项即为建立软连接),两者的区别是软连接只复制文件的路径,不会占用新的磁盘空间,而硬链接会复制文件本身,也就意味着会占用更多的磁盘空间。源文件夹的内容若有改动,两者复制的文件夹内容都会随之改动。若要删除一个连接,键入
sudo rm -rf path

②将phpmyadmin自带的apache配置文件包括进apache中,用法如下:
sudo nano /etc/apache2/apache2.conf
在文件末尾添加如下行:
Include /etc/phpmyadmin/apache.conf

补充知识:nano命令是一个简易的文件编辑器,修改完毕之后键入ctrl+o保存,ctrl+x退出,如果退出时没有保存修改,会提示你是否保存,输入y或n即可,之后会要求你输入保存的文件路径和文件名,一般保持默认。

现在phpmyadmin应该可以直接访问了,需要说明,phpmyadmin对php有两个依赖,分别是php-gettext和php-mbstring,如果到这一步仍然不能访问试试看安装这两个php包。

参考链接:
https://www.unixmen.com/how-to-install-lamp-stack-on-ubuntu-16-04/

https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-04

http://www.ahlinux.com/ubuntu/23193.html

2016年6月9日星期四

在FireFox下selected属性不能正确解析的问题

今天在开发一个HTML页面的时候发现给某个option标签加上selected属性在FF下并不能被默认选中,除非用ctrl+F5强制刷新才能重新渲染。
这可能是FF团队在出于性能方面的考虑将DOM元素缓存,而当刷新的时候会优先读取缓存中的数据。
后来找到了解决办法,在selece标签内部添加autocomplete属性,并将其值设为off。

如下:
<select name="cal" autocomplete="off">

2016年6月3日星期五

C语言中的强制类型转换

可以利用强制类型转换运算符将一个表达式转换成所需类型:
例如:
(double)a       (将a转换成double类型)
(int)(x+y)      (将x+y的值转换成整型)
(float)(5%3)    (将5%3的值转换成float型)

另外,也可以强制转换为指针变量,如:
int *p = (int *)malloc(n * sizeof(int));

Java位运算符相关

~:按位取反
^:按位异或(数值不同才为1)
&:按位与
|:按位或

1.>>和>>>的区别
>>和>>>分别为算术右位移和逻辑右位移,位移的结果是运算符左边的操作数被2的幂来除,指数为运算符右边的操作数。
如:
128>>1 gives 128/2^1 = 64
256>>4 gives 256/2^4 = 16
-256>>4 gives -256/2^4 = -16

算数位移和逻辑位移的主要区别是算数位移保留符号位,由于溢出而不足的高位部分由符号位的复制来补充。而逻辑位移则不保留符号位,高位补0.

2.<<运算符
<<为算数左位移,位移的结果是左边的操作数乘以2的幂,指数为右边的操作数

2016年6月2日星期四

为什么计算机用补码存储数据。

在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示0和正整数,带符号的证书可以表示所有的整数。由于计算机中符号和数字一样,都必须用二进制数串来表示,因此,正负号也必须用01来表示。通常我们用最高的有效位来表示数的符号(当用8位来表示一个整数时,第8位即为最高有效位,当用16位来表示一个整数时,第16位即为最高有效位。)0表示正号、1表示负号,这种正负号数字化的机内表示形式就称为“机器数”,而相应的机器外部用正负号表示的数称为“真值”。将一个真值表示成二进制字串的机器数的过程就称为编码。

无符号数没有原码、反码和补码一说。只有带符号数才存在不同的编码方式。

带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换为其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的原码、反码和补码都一样,负数的反码是对原码的除符号位外的其他位进行取反后的结果(取反即如果该位为0则变为1,而该位为1则变为0的操作)。而补码是先求原码的反码,然后在反码的末尾位加后得到的结果,即补码是反码+1IBM-PC中带符号整数都采用补码形式表示。(注意,只是带符号的整数采用补码存储表示的,浮点数另有其存储方式。)

采用补码的原因或好处如下,采用补码运算具有如下两个特征:

1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。
2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
这样的运算有两个好处:
1)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)
2)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。


下面深入分析上面所陈述的采用补码的原因(目的)。
用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits
( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001) + (10000001) = (10000010) = ( -2 ) 显然不正确.

因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应。下面是反码的减法运算:

 ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10
 (00000001) + (11111110) = (11111111) = ( -0 ) 有问题。
 ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10
 (00000001) + (11111101) = (11111110) = ( -1 ) 正确

问题出现在(+0)(-0)上,在人们的计算概念中零是没有正负之分的。

于是就引入了补码概念。负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。在补码中用(-128)代替了(-0),所以补码的表示范围为:
(-128~0~127)256个。
注意:(-128)没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下:
( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10
(00000001) + (11111111) = (00000000) = ( 0 ) 正确
 ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10
(00000001) + (11111110) = (11111111) = ( -1 ) 正确

采用补码表示还有另外一个原因,那就是为了防止0的机器数有两个编码。原码和反码表示的0有两种形式+0-0,而我们知道,+0-0是相同的。这样,8位的原码和反码表示的整数的范围就是-127~+12711111111~01111111),而采用补码表示的时候,00000000+0,即010000000不再是-0,而是-128,这样,补码表示的数的范围就是-128~+127了,不但增加了一个数得表示范围,而且还保证了0编码的唯一性。

整数和0的原码、反码和补码都相同,下面介绍手工快速求负数补码的方法。这个方法在教材的第8页已经提到了,这里再写出来以便能引起大家的注意。其方法如下:
先写出该负数的相反数(正数),再将该正数的二进制形式写出来,然后对这个二进制位串按位取反,即若是1则改为0,若是0则改为1,最后在末位加1



接下来的问题是,如何能将减法运算转换成加法运算呢?

我们已经知道,原码表示简单直观,与真值转换容易。但如果用原码表示,其符号位不能参加运算。在计算机中用原码实现算术运算时,要取绝对值参加运算,符号位单独处理,这对乘除运算是很容易实现的,但对加减运算是非常不方便的,如两个异号数相加,实际是要做减法,而两个异号数相减,实际是要做加法。在做减法时,还要判断操作数绝对值的大小,这些都会使运算器的设计变得很复杂。而补码这种编码方式实际上正是针对上述问题的。通过用补码进行表示,就可以把减法运算化为加法运算。

在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。当将时针从10点调整到5点时有以下两种方法:
一种方法是时针逆时针方向拨5格,相当于做减法:
    1055
另一种方法是时针顺时针方向拨7格,相当于做加法:
    1071255    (MOD 12)
这是由于时钟以12 为模,在这个前提下,当和超过12时,可将12舍去。于是,减5相当于加7。同理,减4可表示成加8,减3可表示成加9,…。
在数学中,用“同余”概念描述上述关系,即两整数AB用同一个正整数M (M称为模)去除而余数相等,则称ABM同余,记作:
    AB     (MOD  M)
具有同余关系的两个数为互补关系,其中一个称为另一个的补码。当M12时,-5和+7,-4和+8,-3和+9就是同余的,它们互为补码。
从同余的概念和上述时钟的例子,不难得出结论:对于某一确定的模,用某数减去小于模的另一个数,总可以用加上“模减去该数绝对值的差”来代替。因此,在有模运算中,减法就可以化作加法来做。

可以看出,补码的加法运算所依据的基本关系为:
[x]+ [y]= [x+y]
补码减法所依据的基本关系式:
[x-y] =[x+(-y)]= [x]+ [-y]
至于加法运算为什么比减法运算易于实现以及CPU如何实现各种算术运算等问题,则需要通过对数字电路的学习来理解CPU的运算器的硬件实现问题的相关内容了。

总的来说,使用补码来存储数据有三个好处:
1.将减法运算化为加法运算,使计算机线路设计更为简易。
2.符号位可以参与运算,如有进位则溢出舍弃。
3.扩充了负数可表示的范围(10000000)表示-128,同时保证了0的唯一性。


转自CSDN:GLGoober

使PHP页面自动跳转的方法

有时我们需要给一个简单的PHP页面设置一个自动刷新时间,让它跳转至另一个特定页面。
可以使用一句简单的语言给这个PHP页面设置HTTP响应头。
如下:
echo '<meta http-equiv="refresh" content="3,url=index.php" >';

2016年5月21日星期六

转载:ubuntu vi/vim 基本使用方法以及LAMP环境搭建

本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!
vi编辑器是所有UnixLinux系统下标准的编 辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对UnixLinux系统的任何版本,vi编辑器是 完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

1vi的基本概念
  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1) 命令行模式command mode
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
2) 插入模式(Insert mode
  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
2vi的基本操作
a) 进入vi
  在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
   $ vi myfile

   不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 「插入模式(Insert mode)」再说吧!
b) 切换至插入模式(Insert mode)编辑文件
  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
c) Insert 的切换
  您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。
d) 退出vi及保存文件
  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)

3、命令行模式(command mode)功能键
1. 插入模式
  按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;
  按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
2. 从插入模式切换为命令行模式
  按「ESC」键。
3. 移动光标
  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
  按「ctrl+b」:屏幕往移动一页。
  按「ctrl+f」:屏幕往移动一页。
  按「ctrl+u」:屏幕往移动半页。
  按「ctrl+d」:屏幕往移动半页。
  按数字「0」:移到文章的开头。
  按「G」:移动到文章的最后。
  按「$」:移动到光标所在行的行尾
  按「^」:移动到光标所在行的行首
  按「w」:光标跳到下个字的开头
  按「e」:光标跳到下个字的字尾
  按「b」:光标回到上个字的开头
  按「#l」:光标移到该行的第#个位置,如:5l,56l
4. 删除文字
  「x」:每按一次,删除光标所在位置的后面一个字符。
  「#x」:例如,「6x」表示删除光标所在位置的后面”6个字符。
  「X」:大写的X,每按一次,删除光标所在位置的前面一个字符。
  「#X」:例如,「20X」表示删除光标所在位置的前面”20个字符。
  「dd」:删除光标所在行。
  「#dd」:从光标所在行开始删除#
5. 复制
  「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
  「#yw」:复制#个字到缓冲区
  「yy」:复制光标所在行到缓冲区。
  「#yy」:例如,「6yy」表示拷贝从光标所在的该行往下数”6行文字。
  「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
6. 替换
  「r」:替换光标所在处的字符。
  「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
7. 回复上一次操作
  「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。
8. 更改
  「cw」:更改光标所在处的字到字尾处
  「c#w」:例如,「c3w」表示更改3个字
9. 跳至指定的行
  「ctrl+g」列出光标所在行的行号。
  「#G」:例如,「15G」,表示移动光标至文章的第15行行首。
4Last line mode下命令简介
  在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。
A) 列出行号
 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。
B) 跳到文件中的某一行
 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
C) 查找字符
 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
D) 保存文件
 「w」:在冒号输入字母「w」就可以将文件保存起来。
E) 离开vi
 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi
 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
5vi命令列表
1、下表列出命令模式下的一些键的功能:
h
左移光标一个字符
l
右移光标一个字符
k
光标上移一行
j
光标下移一行
^
光标移动至行首
0
数字“0”,光标移至文章的开头
G
光标移至文章的最后
$
光标移动至行尾
Ctrl+f
向前翻屏
Ctrl+b
向后翻屏
Ctrl+d
向前翻半屏
Ctrl+u
向后翻半屏
i
在光标位置前插入字符
a
在光标所在位置的后一个字符开始增加
o
插入新的一行,从行首开始输入
ESC
从输入状态退至命令状态
x
删除光标后面的字符
#x
删除光标后的#个字符
X
(大写X),删除光标前面的字符
#X
删除光标前面的#个字符
dd
删除光标所在的行
#dd
删除从光标所在行数的#
yw
复制光标所在位置的一个字
#yw
复制光标所在位置的#个字
yy
复制光标所在位置的一行
#yy
复制从光标所在行数的#
p
粘贴
u
取消操作
cw
更改光标所在位置的一个字
#cw
更改光标所在位置的#个字

下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename
wq filename
储存正在编辑的文件为filename,并退出vi
q!
放弃所有修改,退出vi
set nu
显示行号
/?
查找,在/后输入要查找的内容
n
/?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

vi打开文件,是处于「命令行模式(command


转载声明:http://blog.sina.com.cn/s/blog_4f3b79d0010166ai.html