sftp要比ftp安全一些,不妨升级一下,简单快捷
下载并编译安装:
配置文件示例 [etc/proftpd.conf]:
下载并编译安装:
cd /Data/tgz
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.3e.tar.gz
tar xfz proftpd-1.3.3e.tar.gz
cd proftpd-1.3.3e
./configure --prefix=/Data/apps/proftpd \
--enable-shadow \
--enable-openssl \
--enable-autoshadow \
--disable-auth-pam \
--without-pam \
--with-modules=mod_ratio:mod_readme:mod_wrap:mod_sftp \
&& make && make install
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.3e.tar.gz
tar xfz proftpd-1.3.3e.tar.gz
cd proftpd-1.3.3e
./configure --prefix=/Data/apps/proftpd \
--enable-shadow \
--enable-openssl \
--enable-autoshadow \
--disable-auth-pam \
--without-pam \
--with-modules=mod_ratio:mod_readme:mod_wrap:mod_sftp \
&& make && make install
配置文件示例 [etc/proftpd.conf]:
也许由于各种原因,你可能想清理自己的微博内容,内容太多了,没法一条一条删除,那就可以这样来清理门户:
1 先安装firefox,安装插件greasemonkey
2 到“我的微博”页面,选择greasemonkey,new user script
3 会出现新脚本对话框(第一次打开会问你用什么编辑器):
4 起名什么的就不用说了

5 选择ok后,添加如下代码:
6 然后,刷新页面就会自动开始删除了,自动刷新页面删除,直到全部删除完
7 然后取消此脚本即可,否则以后访问此页面继续会执行此脚本
附上delete_all_status.js的代码:
//code from www.aslibra.com
//by hqlulu@gmail.com
var total = 0;
var done = 0;
function delete_id( mid ){
$.ajax({
type: "POST",
url: "http://"+window.location.hostname+"/mblog/delete.php?rnd="+Math.random(),
dataType:"text",
data:{mid:mid},
success: function(obj){
done ++;
if( done == total){
window.location.reload();
}
}
});
}
function delete_start(){
if(typeof( $ ) != "undefined" ){
total = $("#feed_list li").length;
if(total){
$("#feed_list li").each(function(e){
delete_id($(this).attr("id").substr(4));
//return false;
});
}
}else{
//alert("wait for jquery");
setTimeout(delete_start, 500);
}
}
delete_start();
1 先安装firefox,安装插件greasemonkey
2 到“我的微博”页面,选择greasemonkey,new user script
3 会出现新脚本对话框(第一次打开会问你用什么编辑器):
4 起名什么的就不用说了
5 选择ok后,添加如下代码:
// ==UserScript==
// @name clearMe
// @namespace delete all status
// @include http://weibo.com/1967156965/profile
// ==/UserScript==
//注意,前面的注释别复制,复制后面的到你的编辑器注释后
var rnd = Math.random();
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://www.weibodi.com/static/js/jquery.min.js?v='+rnd;
head.appendChild(script);
var script2= document.createElement('script');
script2.type= 'text/javascript';
script2.src= 'http://www.weibodi.com/static/js/del_all_status.js?v='+rnd;
head.appendChild(script2);
// @name clearMe
// @namespace delete all status
// @include http://weibo.com/1967156965/profile
// ==/UserScript==
//注意,前面的注释别复制,复制后面的到你的编辑器注释后
var rnd = Math.random();
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://www.weibodi.com/static/js/jquery.min.js?v='+rnd;
head.appendChild(script);
var script2= document.createElement('script');
script2.type= 'text/javascript';
script2.src= 'http://www.weibodi.com/static/js/del_all_status.js?v='+rnd;
head.appendChild(script2);
6 然后,刷新页面就会自动开始删除了,自动刷新页面删除,直到全部删除完
7 然后取消此脚本即可,否则以后访问此页面继续会执行此脚本
附上delete_all_status.js的代码:
//code from www.aslibra.com
//by hqlulu@gmail.com
var total = 0;
var done = 0;
function delete_id( mid ){
$.ajax({
type: "POST",
url: "http://"+window.location.hostname+"/mblog/delete.php?rnd="+Math.random(),
dataType:"text",
data:{mid:mid},
success: function(obj){
done ++;
if( done == total){
window.location.reload();
}
}
});
}
function delete_start(){
if(typeof( $ ) != "undefined" ){
total = $("#feed_list li").length;
if(total){
$("#feed_list li").each(function(e){
delete_id($(this).attr("id").substr(4));
//return false;
});
}
}else{
//alert("wait for jquery");
setTimeout(delete_start, 500);
}
}
delete_start();
先看看服务器的文件:
upload.php 最简单的文件处理:
在adobeAir里面,建立一个上传的流程:
注:pictureFile是一个文件对象
upload.php 最简单的文件处理:
<?php
$tempFile = $_FILES['pic']['tmp_name'];
$fileName = $_FILES['pic']['name'];
$fileSize = $_FILES['pic']['size'];
move_uploaded_file($tempFile, $fileName);
echo "Uploaded $fileName";
$tempFile = $_FILES['pic']['tmp_name'];
$fileName = $_FILES['pic']['name'];
$fileSize = $_FILES['pic']['size'];
move_uploaded_file($tempFile, $fileName);
echo "Uploaded $fileName";
在adobeAir里面,建立一个上传的流程:
//文件上传
function callback_for_upload_progress(event) {
var loaded = event.bytesLoaded;
var total = event.bytesTotal;
var pct = Math.ceil( ( loaded / total ) * 100 );
air.trace('Uploaded ' + pct.toString() + '%');
}
function callback_for_upload_finish(event) {
air.trace(event.data); // output of server response to AIR dev console
}
function upload_file( pictureFile ){
var url = "http://www.aslibra.com/tmp/php/weibo/upload.php";
var variables = new air.URLVariables();
variables.op = 'upload';
// set params for http request
var tmpRequest = new air.URLRequest(url);
tmpRequest.method = air.URLRequestMethod.POST;
tmpRequest.contentType = 'multipart/form-data';
// assigning variables to request
tmpRequest.data = variables;
air.sendToURL(tmpRequest);
// attach events for displaying progress bar and upload complete
pictureFile.addEventListener(air.ProgressEvent.PROGRESS, callback_for_upload_progress);
pictureFile.addEventListener(air.DataEvent.UPLOAD_COMPLETE_DATA, callback_for_upload_finish);
// doing upload request to server
pictureFile.upload(tmpRequest, 'pic', false);
}
function callback_for_upload_progress(event) {
var loaded = event.bytesLoaded;
var total = event.bytesTotal;
var pct = Math.ceil( ( loaded / total ) * 100 );
air.trace('Uploaded ' + pct.toString() + '%');
}
function callback_for_upload_finish(event) {
air.trace(event.data); // output of server response to AIR dev console
}
function upload_file( pictureFile ){
var url = "http://www.aslibra.com/tmp/php/weibo/upload.php";
var variables = new air.URLVariables();
variables.op = 'upload';
// set params for http request
var tmpRequest = new air.URLRequest(url);
tmpRequest.method = air.URLRequestMethod.POST;
tmpRequest.contentType = 'multipart/form-data';
// assigning variables to request
tmpRequest.data = variables;
air.sendToURL(tmpRequest);
// attach events for displaying progress bar and upload complete
pictureFile.addEventListener(air.ProgressEvent.PROGRESS, callback_for_upload_progress);
pictureFile.addEventListener(air.DataEvent.UPLOAD_COMPLETE_DATA, callback_for_upload_finish);
// doing upload request to server
pictureFile.upload(tmpRequest, 'pic', false);
}
注:pictureFile是一个文件对象
一个小问题:如何把一个人的所有微博下载回来?
有几个方式是容易想到的:
1 一个一个链接另存为,用迅雷不行,没有身份验证信息
2 用php的curl写一个登录程序,自动登录,自动访问抓取,如果不能自动登录,则白费
3 建立一个代理服务器,按规则保留访问过的内容,自动打开要采集的一系列网页,稍微复杂了些
4 给页面添加脚本,执行脚本抓取,ajax功能很好用,jquery还顺便分析了内容,比php分析要简单
5 通过api访问
拿新浪微博为例,所有的方式都可行:
第一个是简单些,有人力又不嫌麻烦那就挺好。
第二个规则变化比较多,登录过程跳来跳去,跟着做也是没有问题的,况且登录流程没有验证,倒是可行的。
第三个要比较熟悉服务器规则才行,不太好实施。
第四个如果熟悉脚本,那不妨试试了,有跨域的问题,数据提交比较麻烦些。
第五个受api限制,比如只能读取200条。
阿权想说的是第四个,这个方式很有趣:
1 往页面添加脚本,改变页面的行为,也就是说你可以做任何一个事情,比如你在网页里面发出一个ajax请求下载同域名下的数据,这个很容易理解。
2 下载完成后,分析页面数据,jquery很方便
3 get方式传递出去你要的信息,这个不需要ajax也可以,比如放一个img什么的
这个最好的方式是 firefox加上Greasemonkey了,对页面新建一个脚本,然后就基本随便你操作了,比如:
my.js里面就是看你想做什么了,那可就是在当前域名下的操作了
有几个方式是容易想到的:
1 一个一个链接另存为,用迅雷不行,没有身份验证信息
2 用php的curl写一个登录程序,自动登录,自动访问抓取,如果不能自动登录,则白费
3 建立一个代理服务器,按规则保留访问过的内容,自动打开要采集的一系列网页,稍微复杂了些
4 给页面添加脚本,执行脚本抓取,ajax功能很好用,jquery还顺便分析了内容,比php分析要简单
5 通过api访问
拿新浪微博为例,所有的方式都可行:
第一个是简单些,有人力又不嫌麻烦那就挺好。
第二个规则变化比较多,登录过程跳来跳去,跟着做也是没有问题的,况且登录流程没有验证,倒是可行的。
第三个要比较熟悉服务器规则才行,不太好实施。
第四个如果熟悉脚本,那不妨试试了,有跨域的问题,数据提交比较麻烦些。
第五个受api限制,比如只能读取200条。
阿权想说的是第四个,这个方式很有趣:
1 往页面添加脚本,改变页面的行为,也就是说你可以做任何一个事情,比如你在网页里面发出一个ajax请求下载同域名下的数据,这个很容易理解。
2 下载完成后,分析页面数据,jquery很方便
3 get方式传递出去你要的信息,这个不需要ajax也可以,比如放一个img什么的
这个最好的方式是 firefox加上Greasemonkey了,对页面新建一个脚本,然后就基本随便你操作了,比如:
var rnd = Math.random();
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://www.aslibra.com/path/to/jquery.js?v='+rnd;
head.appendChild(script);
var script2= document.createElement('script');
script2.type= 'text/javascript';
script2.src= 'http://www.aslibra.com/path/to/my.js?v='+rnd;
head.appendChild(script2);
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://www.aslibra.com/path/to/jquery.js?v='+rnd;
head.appendChild(script);
var script2= document.createElement('script');
script2.type= 'text/javascript';
script2.src= 'http://www.aslibra.com/path/to/my.js?v='+rnd;
head.appendChild(script2);
my.js里面就是看你想做什么了,那可就是在当前域名下的操作了
ssh账号代理上网是很常见的,尤其是翻越障碍物的时候很实用。
ssh账号是可以登录linux系统的,如果只是上网用,那就需要最小化权限,有两个方式:
1 /bin/false
2 自定义脚本
输入字符后会退出,不会产生系统操作
ssh账号是可以登录linux系统的,如果只是上网用,那就需要最小化权限,有两个方式:
1 /bin/false
useradd -s /bin/false yourUser
#登录时使用这样的:
ssh -D 7070 -N yourUser@hostname
#登录时使用这样的:
ssh -D 7070 -N yourUser@hostname
2 自定义脚本
cat /bin/tunnel.sh
#!/bin/sh
echo "##########"
echo " welcome !"
echo "##########"
read x
exit
useradd -s /bin/tunnel.sh yourUser
ssh -D 7070 yourUser@hostname
#!/bin/sh
echo "##########"
echo " welcome !"
echo "##########"
read x
exit
useradd -s /bin/tunnel.sh yourUser
ssh -D 7070 yourUser@hostname
输入字符后会退出,不会产生系统操作
阿权收集了519751条微博,并且对这些数据进行了来源分析。
调查用户量为7163名用户,大部分是蔡文胜的粉丝,小部分是阿权的粉丝
分享给大家,看看微博用户都用哪些客户端在发微博:
前99名为:
调查用户量为7163名用户,大部分是蔡文胜的粉丝,小部分是阿权的粉丝
分享给大家,看看微博用户都用哪些客户端在发微博:
前99名为:
| 排名 | 来源 | 数量 | 比例 |
| 1 | 新浪微博 | 299776 | 57.68% |
| 2 | iPhone客户端 | 37533 | 7.22% |
| 3 | S60客户端 | 34821 | 6.7% |
| 4 | UC浏览器 | 32337 | 6.22% |
| 5 | 新浪微博手机版 | 28421 | 5.47% |
| 6 | Android客户端 | 18261 | 3.51% |
| 7 | Kjava客户端 | 9578 | 1.84% |
| 8 | 微博AIR | 3996 | 0.77% |
| 9 | 新浪微群 | 3726 | 0.72% |
| 10 | iPad客户端 | 3482 | 0.67% |
| 11 | Weico.iPhone版 | 2972 | 0.57% |
| 12 | 诺基亚5230 | 2436 | 0.47% |
| 13 | 关联博客 | 1854 | 0.36% |
| 14 | 新浪网内容分享 | 1832 | 0.35% |
| 15 | 新浪博客 | 1753 | 0.34% |
| 16 | 短信 | 1632 | 0.31% |
| 17 | FaWave | 1385 | 0.27% |
| 18 | Wing微博2010 | 1243 | 0.24% |
| 19 | IE9正式版 | 1226 | 0.24% |
| 20 | 微博开放平台接口 | 1140 | 0.22% |
| 21 | 优酷网连接分享 | 1106 | 0.21% |
| 22 | 彩信 | 989 | 0.19% |
| 23 | 活动 | 983 | 0.19% |
| 24 | WM客户端 | 856 | 0.16% |
| 25 | 诺基亚5233 | 854 | 0.16% |
| 26 | 手机新浪网 | 745 | 0.14% |
| 27 | 黑莓手机客户端 | 657 | 0.13% |
| 28 | 街旁网分享足迹 | 641 | 0.12% |
| 29 | 微访谈 | 639 | 0.12% |
| 30 | 投票 | 598 | 0.12% |
| 31 | 诺基亚 | 577 | 0.11% |
| 32 | 微盘 | 502 | 0.1% |
| 33 | 嘀咕分享足迹 | 455 | 0.09% |
| 34 | 未通过审核应用 | 437 | 0.08% |
| 35 | YiBo.Android版 | 433 | 0.08% |
| 36 | Follow5 | 430 | 0.08% |
| 37 | 土豆连接分享 | 424 | 0.08% |
| 38 | 摩托罗拉智能手机 | 392 | 0.08% |
| 39 | 真心话 | 392 | 0.08% |
| 40 | WP_Tsina | 383 | 0.07% |
| 41 | 博客挂件 | 365 | 0.07% |
| 42 | MSN机器人 | 359 | 0.07% |
| 43 | 时光机 | 348 | 0.07% |
| 44 | LG手机客户端 | 342 | 0.07% |
| 45 | 淘宝网 | 322 | 0.06% |
| 46 | 虾米音乐 | 300 | 0.06% |
| 47 | 魅族M9手机 | 291 | 0.06% |
| 48 | 求收养 | 287 | 0.06% |
| 49 | 切客网 | 273 | 0.05% |
| 50 | 美图秀秀 | 270 | 0.05% |
| 51 | ZAKER | 270 | 0.05% |
| 52 | 丫丫网开心测试 | 245 | 0.05% |
| 53 | 分享按钮 | 245 | 0.05% |
| 54 | 加网分享按钮 | 242 | 0.05% |
| 55 | VeryCD电驴共享 | 235 | 0.05% |
| 56 | 玛撒网 | 232 | 0.04% |
| 57 | 享拍微博通 | 226 | 0.04% |
| 58 | 微博通 | 225 | 0.04% |
| 59 | 诺基亚N8 | 221 | 0.04% |
| 60 | 诺基亚C5_03 | 210 | 0.04% |
| 61 | Android口袋微博 | 205 | 0.04% |
| 62 | SinaTair | 198 | 0.04% |
| 63 | 谷奥网 | 182 | 0.04% |
| 64 | 头像趣 | 180 | 0.03% |
| 65 | QQ阅读 | 176 | 0.03% |
| 66 | wing微博炫彩版 | 160 | 0.03% |
| 67 | 联想乐Phone | 152 | 0.03% |
| 68 | 微淘网 | 152 | 0.03% |
| 69 | Coriander | 150 | 0.03% |
| 70 | 美图看看 | 141 | 0.03% |
| 71 | 微博征婚 | 136 | 0.03% |
| 72 | 美图秀秀iPhone版 | 135 | 0.03% |
| 73 | 定时showone | 135 | 0.03% |
| 74 | 索尼爱立信XPERIA | 134 | 0.03% |
| 75 | RSS自动同步助手 | 131 | 0.03% |
| 76 | MoWriter黑莓客户端 | 128 | 0.02% |
| 77 | 中粮美好生活 | 117 | 0.02% |
| 78 | 定时V | 113 | 0.02% |
| 79 | MTK客户端 | 112 | 0.02% |
| 80 | 微博大管家 | 111 | 0.02% |
| 81 | 美图秀秀超能力 | 109 | 0.02% |
| 82 | 新浪微团 | 108 | 0.02% |
| 83 | 新浪乐库 | 106 | 0.02% |
| 84 | 新浪免费邮箱 | 106 | 0.02% |
| 85 | NBA直播 | 106 | 0.02% |
| 86 | 图览微博 | 105 | 0.02% |
| 87 | 酷6网分享 | 104 | 0.02% |
| 88 | 育儿网 | 104 | 0.02% |
| 89 | 新浪科技 | 104 | 0.02% |
| 90 | QQ助手 | 102 | 0.02% |
| 91 | BuzzSync | 101 | 0.02% |
| 92 | 新浪新闻中心 | 99 | 0.02% |
| 93 | Xweibo官网 | 98 | 0.02% |
| 94 | GTALK机器人 | 98 | 0.02% |
| 95 | iPhone微博助手 | 95 | 0.02% |
| 96 | 音悦台 | 94 | 0.02% |
| 97 | 测测20年后的你 | 93 | 0.02% |
| 98 | 新浪河南个人中心v1.0 | 92 | 0.02% |
| 99 | 爱分享 | 91 | 0.02% |
引用
在配置文件httpd.conf里查找“CustomLog”一行,整行修改为
CustomLog “|bin/rotatelogs.exe -l E:/logs/access%Y-%m-%d.log 86400″ common
意思是让日志每隔24小时会滚一次,会滚后日志名为“access年-月-日.log”,保存路径为“E:\logs”这样日志就可以按天存入不同的文件中了,另外也可以配合计划任务删除N天之前的日志文件。
同样错误日志也可以使用这样的方法,查找“ErrorLog”一行,整行修改为
ErrorLog “|bin/rotatelogs.exe -l E:/logs/errorlog.%Y-%m-%d-%H_%M_%S.log 86400
同样是每天会滚日志,日志文件名“errorlog.年-月-日-小时_分钟_秒.log”。
由上可以看出%Y表示当前年份,%m表示当前月份以此类推就可以灵活运用保存为需要的文件名。
上面的例子里,日志格式使用的是通用日志模式(common),当然也可以使用组合日志模式(Combined),只需要把上面代码最后的“common”修改成“Combined”。
这种格式与通用日志格式类似,但是多了两个 %{header}i 项,其中的header可以是任何请求头。这种格式的记录形如:
192.168.0.2 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 http://www.huaxiren.cn/index.php "Mozilla/4.08 [en] (Win98; I ;Nav)"
配置完成后保存httpd.conf,重新启动Apache服务器,日志就会从重启Apache的时刻开始每隔一天回滚日志。
值得一提的是在配置了rotatelogs回滚后在windows进程里会多出几个rotatelogs.exe和cmd.exe进程,无须担心,这是rotatelogs在工作。
CustomLog “|bin/rotatelogs.exe -l E:/logs/access%Y-%m-%d.log 86400″ common
意思是让日志每隔24小时会滚一次,会滚后日志名为“access年-月-日.log”,保存路径为“E:\logs”这样日志就可以按天存入不同的文件中了,另外也可以配合计划任务删除N天之前的日志文件。
同样错误日志也可以使用这样的方法,查找“ErrorLog”一行,整行修改为
ErrorLog “|bin/rotatelogs.exe -l E:/logs/errorlog.%Y-%m-%d-%H_%M_%S.log 86400
同样是每天会滚日志,日志文件名“errorlog.年-月-日-小时_分钟_秒.log”。
由上可以看出%Y表示当前年份,%m表示当前月份以此类推就可以灵活运用保存为需要的文件名。
上面的例子里,日志格式使用的是通用日志模式(common),当然也可以使用组合日志模式(Combined),只需要把上面代码最后的“common”修改成“Combined”。
这种格式与通用日志格式类似,但是多了两个 %{header}i 项,其中的header可以是任何请求头。这种格式的记录形如:
192.168.0.2 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 http://www.huaxiren.cn/index.php "Mozilla/4.08 [en] (Win98; I ;Nav)"
配置完成后保存httpd.conf,重新启动Apache服务器,日志就会从重启Apache的时刻开始每隔一天回滚日志。
值得一提的是在配置了rotatelogs回滚后在windows进程里会多出几个rotatelogs.exe和cmd.exe进程,无须担心,这是rotatelogs在工作。






