Monthly Archives: August 2012

Freenet 匿名网络

Zhuotong Nan (giscn@msn.com)

前些天知道Freenet是在一个技术论坛上,有人提出一种基于p2p的实现,但有人指出,p2p无法解决用户以及数据的分布式管理。有人给了freenet这个链接。这两天初步了解了一下Freenet,被其中的一些设计所吸引。以下的内容是很简要的一点关于freenet的描述,懂技术的人是可以从中看出很多东西来。

Freenet是为匿名、更安全的浏览、发布、共享文件和聊天的网络平台。通过一些p2p(点对点)的专门设计,Freenet可以不必象传统网络一样担心其传递的信息被审查,也提高了其安全性,不易被攻击。而且,Freenet支持一种叫 darknet 模式,这种模式只允许连接到朋友(或者朋友的朋友的朋友……)可信用户机器上,从而间接连接到互联网上。

加入Freenet的节点间的通信是加密的,并且通过专门的路由设计,使得请求数据节点以及请求内容都被保护。

这种非集中式的设计面临的一个难题是数据的存储。Freenet的每个用户除了需要贡献一部分网络带宽(这是p2p应用都必须付出的,每个节点都尽可能从邻近的节点处获取可用的数据),还需要提供一部分的硬盘存储。Freenet上的数据不存储在中央服务器,而是分解下来放到每用户的硬盘上,当然这种数据是加密的,用户是不能通过反向工程了解其数据内容。当然用户数量很大时,这种存储方式也可以保证数据不丢失。然而,一些过旧的没人感兴趣的数据会自动被丢弃。聊天室、网站、搜索等各种功能都是建立在这种分布式的数据存储上面。

Freenet开发后,在中国和中东国家被用于回避这些国家的网络审查。不管这个是不是作者最早的目的,Freenet中间蕴含的一些设计理想是相当出色的。其作者2000年发布的学术论文 Freenet: A Distributed Anonymous Information Storage and Retrieval System 大概是2000年被引用次数最多的文章,并且有很多新的想法是受到Freenet的启发而产生。

网址:https://freenetproject.org (在国内可能受屏蔽)

当前最新版本是 0.75 build 1407, 发布于2012年4月14日。

我在想,这种分布式数据存储对于gis这种海量地图遥感数据处理,有没有什么启发呢。

AHK实现07073.com批量淘号

本文实现一个较为复杂的自动化流程,从多Web页面中提取到我们需要的信息。

要求

具体需要实现的完整流程描述如下:

1. 访问 http://fahao.07073.com/19547.html,截图如下:

Image(5)

Image(6)

2. 点击每一个 “淘号”,如果没有登录,即提示登录,如果已经登录,则在一个弹出的iframe里显示一个号码,截图如下:

Image(7)

我们需要把这个号码得到。

3. 每页25个号码,一共74页,第一页url为 http://fahao.07073.com/19547.html,第二页为http://fahao.07073.com/19547-2.html,第三页为 -3,类推。

简单的方法恐怕不行,我们需要一种更为合理的方法。

实现

先看一下点击淘号时发生了什么,每点击,其实是调用一个叫activate()的javascript函数,参数是8位的数字id。这个函数把 id组装到类似下面的url里,

http://fahao.07073.com/?action=sumtao&id=15721753

其中 15721753便是其中的id。通过访问此url,返回iframe里的内容,iframe里的号码以"XX4670t6XF21783"的形式表达,前2个是XX打头,其后是13位或字母或数字。

因此我们的实现流程就简单了,分为四步,1. 根据页面pattern下载全部的74个网页的内容,存在本地;2. 利用规则表达式提取到id;3. 利用id组装合适的url,再次把全部的iframe 下载到本地;4. 对全部的iframe进行分析,提取礼包号码。

其中,几个规则表达式的pattern可以表示为,

id: "activate(d{8})"

礼包号: "value=""w{15}"""

对应与流程,实现为4个ahk脚本。

dl_all_pages.ahk,下载全部页码的网页内容,保存在pages目录下,命名为 页码.html,如9.html表示第9页的内容,70.html表示第70页的内容。其中使用了ahk自带的 urldownloadtofile函数。

; Author: Zhuotong Nan (giscn@msn.com)
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
pg :=74
;download all pages
loop,%pg%
{
pageurl_pat = http://fahao.07073.com/19547-%A_Index%.html
urldownloadtofile,%pageurl_pat%,pages%A_Index%.html
}

find_ids.ahk,从74页内容html文件中提取到全部的id,保存在ids.txt文件里。id以分号(;)分隔。

; find ids
ids :=""
outfile_ids := "ids.txt"
loop,pages*.html
{
fileread,file_cont,pages%a_loopfilename%
;parse "activate(16492748)" from file_cont
startpos :=1
loop
     {
     pos :=regexmatch(file_cont,"activate(d{8})","",startpos)    
     startpos := pos+17
     if pos=0
          break
     id:=substr(file_cont,pos+9,8)
     ids = %id%;%ids%
     }
}
fileappend,%ids%,%outfile_ids%

dl_wl3hao.ahk,根据id号,下载全部的iframe,iframe里包括需要的礼包号码,每个id下载过来的内容保存在以id命名的txt里,放在nos目录下。

id_file :="ids.txt"
fileread,file_cont,%id_file%
;http://fahao.07073.com/?action=sumtao&id=15721753
loop,Parse,file_cont,;
{
urldownloadtofile,http://fahao.07073.com/?action=sumtao&id=%a_loopfield%,nos%a_loopfield%.txt
}

find_wl3_gifts.ahk,根据iframe内容,利用规则表达式得到需要的信息。保存在gifts.txt里,每行一个礼包号。

; find wl3 gift no
gifts :=""
outfile_gifts := "gifts.txt"
loop,nos*.txt
{
fileread,file_cont,nos%a_loopfilename%
;parse value="XX4670t6XF21783" from file_cont
pat:= "value=""w{15}"""
pos :=regexmatch(file_cont,pat)    
gift:=substr(file_cont,pos+7,15)
gifts = %gift%`r`n%gifts%
}
fileappend,%gifts%,%outfile_gifts%

最终的gifts.txt 如下图所示。

Image(8)

结论

本文演示了如何从一个比较复杂的多网页批量提取需要的数据。利用了一些基本的网络函数,和规则表达式。使用AHK实现。有关AHK的更多介绍可以参阅其官方网站,google, autohotkey即可找到。

尼泊尔ICIMOD同事来兰访问

前两天icimod朋友过来新疆,路经兰州,参观了实验室,晚上在W家小坐,我拿了一个莫高干红给他们喝,说这是兰州的local wine, famous grape wine brand in China,当然也有黄河啤酒这样的local beer,忽悠了一通,主客高兴,我喝的都差不多了。同事们回赠了2件有icimod标记的尼泊尔手工造的T裇,一张喜马拉雅山的帆布油画,以及一张selected publications from ICIMOD的光盘,并热诚邀请我去尼泊尔访问,一直鼓吹他们的需要7天徒步才能到达的base camp at Mt Everest,听的心里痒痒的。

IMG-20120815-00010

8/15/2012

ThinkPad x220 更换硬盘及数据迁移

Zhuotong Nan (giscn@msn.com)

原x220 4286-CTO 是320GB 7mm硬盘。已经没有空间了。买了一块500GB的日立 Hitachi Z7K500 (7200转)7mm硬盘。我此前写过一个x200更换硬盘并迁移数据的帖子。那里面描述的方法肯定是可以用的。但这次尝试另一种更为简便的方法。

1. 笔记本里原硬盘的数据必要备份。以免万一。

2. 拆硬盘的视频可以看这里,从2分05秒开始。准备后十字螺丝刀。

IMG-20120815-00009

3. 用Orico 6628 series 的tool free dual bay hard drive dock 进行盘对盘clone。注意,源盘和目标盘一定不要弄错了,所以在切换为clone模式,按下start前务请确认没有错。

IMG-20120815-00007IMG-20120815-00008
*一定注意源盘(source)和目标盘(target),不要放错。源盘要放原笔记本里的盘,目标盘是新的500G盘。

4. 开始clone,指示灯为闪红,大约需要30分钟。结束的时候有三声鸣音,指示灯变蓝后为合适了。

5. 把新盘装进x220。重启。

6. 进disk management,把未分配的空间并入原盘(my option),或者建新盘。如果built-in功能不好用,建议用acronis的相关工具。

7. 扩展后的结果如下图。

Image(4)

一切OK。

系统栏里网络图标持续显示无连接的问题

Author: Zhuotong Nan (giscn@msn.com)

好像是更新完bluetooth后,系统栏里的网络图标就坏了,无论有无连接,都是显示没有连接的图标Image

在adpaters列表里禁止了 Wireless Network Connection,再插拔有线网络,发现图标显示正常。但加上无线网络后,就仍然一直是没有连接状态(事实上无线可以连接到网络)。初步判断是无线网络驱动的问题。该无线网卡1×1 11b/g/n Wireless LAN PCI Express Half Mini Card Adapter的信息如下:

Image(1)

通过windows Update目前没有更新的驱动。

登录进lenovo的官方网站,通过查找本机型号,进而找到 wireless lan下仍然是发布5月9日的此版本(driver date是3/6)。下载过来备用。名称是7zw406ww.exe (~12MB)。注意以下的操作会丢失无线网络的配置和保存的无线密码等。

接下去,我准备移除此前的安装,具体是双击7zw406ww.exe,自动解压缩到c:driverswinwlanrtlk 目录下,双击 setup,进行安装,在安装界面选择 remove (移除)。这个操作会把此前的wlan安装去掉。

重启机器,remove操作并没有要求重启,但一定要重启才能移除干净。

接下去,很关键,重启成功后,跑到 device manager(设备管理器),发现wlan 设备(仍然显示为1×1之类的文字)图标角上是有问号(或者打叉)。右键 Uninstall ——十分重要!彻底把wlan设备移除掉了。

点设备管理器工具栏的 更新设备 Image(2),这时,设备列表里会找到未知的network controller,右键,Update driver(更新驱动),点Browse my computer for driver software (浏览我的计算机更新驱动),在文件夹框里填上 c:drivers,并确认 include subfolers 打勾。

Image(3)

点next下一步,安装驱动的安装。

然后再测试一下,此前出现的问题已经被 fix了。Bingo!!!!

总结一下步骤,1. 移掉此前的driver;2. 重启,在设备管理器里移掉设备,搜索新设备;3. 在设备管理器里更新未知网络设备的驱动 (没有测试用wlanrtlk下的setup安装是否可行)。里面很关键是第2点,我前面没有做第2点,一直不能修复此问题。

AHK实现批量网页数据提取

Author: Zhuotong Nan (giscn@msn.com)

AHK是很好用的在windows下实现自动化的脚本语言,对于有一定编程基础的童鞋,很快就可以上手写代码。ahk的官方网址是http://www.autohotkey.com/,其forum里有大量的他人写好的脚本。

本文实现一个从网页里自动提取数据的一个例子。

目的

从40407.com网站里自动批量得到《武林3》70区豪侠礼包代码。原始网站界面如下,

image

1. 进入http://fahao.40407.com/11417.html,点击“淘号”按钮,如果未登陆,则提示登录。登录后弹出淘号界面如下图,

image

从界面中获取以XX打头的15位代码。

2. 关闭“查看卡号”,然后重复步骤1,可以得到一系列的代码。

现在的目的是实现其自动化,并把得到的代码保存到一个文本文件(gifts.txt)里。

实现

1. 点击“我要淘号”时,本地与远程有一个通讯。利用chrome自带的inspect element的network功能(也可以用任何网络分析工具),在“我要淘号”上右键选 inspect element, 到Network tab上,这时点一下“我要淘号”执行一次通讯,Network将捕捉到通讯信息。

image

我们可以看到通讯的header。我们需要做的是模拟chrome的通讯用ahk来实现。

2. ahk有几个有用的他人写的http通讯脚本,一个叫httpquery,一个叫httprequest,都很优秀,但前者2010年后已经不再继续支持,并且不支持cookies文件头。而cookie信息是我们这个任务里的关键,否则“我要淘号”返回是要求登陆的信息。httprequest可以从这个网址下载:http://www.autohotkey.com/community/viewtopic.php?t=73040

3. 代码实现。本代码实现了自动获取500个号码。

; Author: Zhuotong Nan (giscn@msn.com)
; Date: 8/8/2012

loop, 500
{
    url := "http://fahao.40407.com/app/common.php"
    data := "a=taohao&id=11417"

    header :="Cookie: PHPSESSID=da317c26545caafa204520e4c89276c9; DedeUserID=427080; DedeUserID__ckMd5=d770e5fdd4d5a237; DedeLoginTime=1344523159; DedeLoginTime__ckMd5=2233e446322305d5; Hm_lvt_75e3d45d3ad80ecb1af209e743d1b514=1344521115290,1344521187845,1344523168489; Hm_lpvt_75e3d45d3ad80ecb1af209e743d1b514=1344523168489`nReferer: http://fahao.40407.com/11417.html`nConnection: keep-alive"
    options :=""
   
    bytes := httprequest(url, data, header, options)

    sleep 500

    ;parse gift code
    pos:=Regexmatch(data,"XXw{13}")

    if pos!=0
    {
        code := substr(data,pos,15)
        fileappend,%code%`n,gifts.txt
    }
   
    sleep 1000
   
    fileappend,%data%`n,test.html
}

#include httprequest.ahk

ESC::
exitapp

 

4. 注意httprequest有4个参数,参数1是访问的地址,参数2是上传的数据(post data)和下载过来的内容(放同一个参数里),参数3是上传的http头,响应的http头也在参数3里,参数4是选项。我们需要使用的是前3个参数。注意参数3 header的构造,不同的key-value对使用分行符(`n)来分隔。而且这里必须要增加cookie信息,这个信息可以从chrome里分析得到。传回来的数据存放在参数2,data里。

5. 使用了正则表达式,从下载过来的data 里进行pattern分析。礼包代码是以XX开头的15长度的大小写字母和数字组成。表达式为XXw{13}。

6. #include httprequest.ahk 把httprequest脚本包括进来,所以前文可以调用httprequest函数。

7. 获取的代码存放在 gifts.txt里。

image

8. 使用本代码前,必须事先用chrome (或者IE等别的浏览器,需要对应获取其cookie)登录成功。按esc键随时退出。

结论

本文演示了使用AHK从网页自动批量获取指定数据。使用了httprequest方法,其中关键是必须维持cookie信息。