December 2nd, 2010

利用53端口的OpenVPN蹭网

      验证53端口是否开放有个最简单的办法,直接nslookup几个域名,看返回结果。如果能正确返回的话则说明53端口是开放的。

      只要主机/VPS支持,搭建OpenVPN的过程其实非常简单,Linode的这篇搭建OpenVPN的知识库教程写的太好了,不差于网上许多牛人的Blog,更别说那些转发来转发去不标注出处的抄袭了。

  1. 安装OpenVPN
  2. 生成各种密钥
  3. 配置服务器和客户端的configure文件
  4. 修改IPv4流的转发和配置iptables
  5. 建立连接,查log监控

      感谢中国移动、中国联通、中国电信,感谢那些提供通过Web验证来计费上网的宿舍。ISP们,乃们颤抖了吧。

Tags: , , ,

November 25th, 2010

Simplenote API Proxy in PHP

  长久以来我一直在寻找一款能够在Android、Windows、Linux桌面,或者Web之间进行简单文字同步的工具,随手写一两行plain text,以进行备忘,提高工作效率,节省时间。Evernote非常不错,但是没有Linux桌面支持是硬伤。后来发现了Simplenote这个服务。

  Simplenote提供的是非常简洁高效的文字同步服务,所需要关注的只有标题、文本、标签、时间等等,几乎没有什么冗余的元素,而且支持Android、iPhone、Web等许多客户端,并且开放API,这些正是我所需要的。然而可惜Simplenote的服务架设在Google App Engine上,同时大量的客户端在同步的时候使用的是https来进行请求,这在景德镇是访问不能够的事情。可是我实在非常喜欢这么一款服务。

  借助@yegle同学的twip思想,我花了点时间用php写了一个Simplenote的API Proxy,托管在了github上。因为加入Simplenote的API Group需要提交申请,他们的工作效率太低了直到我写完才给我通过,进去后才发现原来Simplenote已经发布了v2版的API,不过貌似我接触的几个客户端都是用的是旧的v1版。其他列在TODO list中的东西有https/http适配、如何处理cookie这两个个问题。先不管了,用apktool修改了Android上的一个Simplenote客户端AndroNoter,然后修改了Firefox的插件QuickFox Notes,都改用我自己搭建的代理访问,它工作起来真像一个charm!

Simplenote

  恩,如果有一款Android上的4*4的Widget就更好了,直接离线显示一篇text就可以了。不知道是否有时间折腾,最近太忙了。

Tags: , , ,

November 11th, 2010

REST简介

  明天的讲座PPT。

  Ruby on Rails是目前对REST风格支持最好的框架。不过话说回来,我不太看好这个框架,除非Ruby把吃内存过大的问题从根本上解决掉,否则部署的成本会非常高昂,事实为证:我们实验室的VPS扩到1024M内存,才勉强支撑起一个大型的和几个小的Rails应用,之前512M的时候根本吃不消。

Tags: ,

September 5th, 2010

如何监听飞信消息并转发为邮件

  本文适用于满足以下条件的读者:日常使用的是电信或者联通的手机,没有移动手机号,并且重度依赖邮件,或者手机终端支持email/push的同学(android和iphone最给力了)。

  众所周知,飞信是中国移动旗下一款超级得力的产品,平时有个班长通知什么的,很多都是使用飞信来通知的,方便、及时,而且对方不在线的话可以直接发送到移动手机上,甚至阿土伯说现在小学生的老师发个作业要求什么的都用飞信发给家长。这一点曾经让我等电信/联通用户困扰不已,现在好了,levin同学写了一个开源的基于GTK+2.0的ofetion,我使用他的fetion库写了一个命令行下的监听飞信消息并且转发邮件的小工具。

  思路很简单,无非就是先登录验证用户名密码(视情况决定是否需要加挂http代理),然后起一个进程,每隔180s向移动的飞信服务器发送一个keep alive的包,另外主进程实时来监控是否接收到新的消息。如果有新的消息过来,则判断其消息类型,剔除掉ACK等系统消息,将真正的飞信消息通过sendmail发送邮件给指定地址。有一点需要注意,一旦接收到这种真正的飞信消息时,需要发出一个ACK包,以确认自己收到,不然对方的客户端会认为这边未收到消息,然后显示发送不成功。

  因为levin同学写的代码可读性比较强,所以我修改的时候没有遇到太多麻烦。下周开始自己和给阿土伯试用,哈哈,这回再也不怕没法收班长通知了。

[UPDATE 2010/12/09]:谢谢同学们关注,我把基于openfetion 2.0.2版的openfetion-notify代码托管在github的这里了,有需要的同学自己去试试吧,已经能正常工作,但是还非常ugly,希望能有时间改改。最近太忙了,Sigh。

Tags:

August 25th, 2010

加油!

  真开心,mm终于过来北京读研究生了。趁下班休息时间,骑自行车左拐右拐去了mm的医院,哈哈,好久没骑这么远了,单程12公里,历时将近40分钟,路过地安门的时候还情不自禁的哼起了One Night In Beijing。。。。战胜了好几年异地的不便与困难,终于可以走到一起了,虽然现在一个在二环西北,一个在东南,但是怎么说,想见面也很快就能见到了,有什么事情也互相帮忙照应,方便多了。

  平时mm和我上班都挺忙的,每天都期待周末快快到来,然后就可以一起玩一下或者只是简单的吃顿饭看场电影压压马路逛逛街也是很幸福的。

  恩,祝愿我们的爱情和事业都加油!

bupt_to_bjhmoh

Tags: , , ,

August 14th, 2010

Android与我的Daily Life

  实验室同学问我为什么喜欢Android,怎么说呢,我觉得它特别可折腾,我俨然已经把它当成一台电脑来折腾了,更不必说它是如何融入我的日常生活的。照搬小学弟sayisee同学的创意,我也做了一个自己的android的timeline或者说waterfall,也算梳理一下每天的android生活吧。

timeline

  本文参加的是“首届 Google 暑期大学生博客分享大赛——2010 Android 篇”比赛。再次说明,这个timeline创意不是我想出来的,如果同学们觉得这个创意很不错,就请去sayisee同学的大学生乱弹琴博客那里留言帮他顶起支持他吧,谢谢。

Tags: ,

June 29th, 2010

实验室服务器被黑记(上)

  早晨上班一到实验室,weekface告诉我说实验室的那台服务器貌似出问题了。他之前写过一个crontab脚本来每天执行一次备份任务,结果今天上去一查,已经不执行好久了,然后查crontab -l,他的那句任务竟然消失不见了,取而代之的指向了一个莫名其妙的脚本。

  我立刻上去看,因为从没遇到这种情况,首先想到的会不会是实验室有同学上来动过,于是问了一下,房间里知道root密码的一共就四个同学,依次询问都说没有动。一边问着,一边看那个脚本的内容,立刻懵了,里面是一些很难阅读的shell命令,这才意识到不妙,出事了。然后查当前在线用户,结果who命令竟然返回的是空!接着last,我靠last也被替换了。赶紧去拔了网线,已经很明显了,我们服务器被黑了。

  接下来一步一步去查找蛛丝马迹。who、last命令已经直接被替换了,root用户的.bash_history已经被我们这几天的新操作给覆盖掉,/var/log/secure也被清空,很干净嘛。然后看crontab修改记录,时间是Jun 27 17:27:21,这时上个周日,这个时间我们都没人上来动过服务器,所以判断这个时间就是被黑的时间。原来已经这么久了我们都没发现,真汗。。。然后查看是否有什么损失,服务器上在跑的服务有http、mysql、svn、ftp这几个,这几个服务都没有被添加账号,其实就我们做东西的这水平,真没什么值得别人费尽周折来偷窥甚至偷窃的。即便如此,还是心有余悸。

  那个神秘的脚本是窥视所有破坏的关键,比较长,改天再分析。跟weekface反思,本来这台服务器跑的centos版本很低了,应该有很多漏洞,并且我们的防范意识一直不强,root密码仅仅是一个10位的纯英文,很容易就被暴力破解了,而且shell的roo密码还跟mysql的root密码是一样的,再而且吧,当时我为了能够回宿舍后,ssh远程回实验室继续干活(唉,一言难尽哇),还把这台服务器的22端口从路由器上映射了出去……这不是自己找着被人黑么……

Tags: , ,

June 16th, 2010

如何建立android的C/C++交叉编译环境

  Android的底层是纯粹的linux内核,可以简单的理解为上面跑了个Dalvik Java虚拟机而已。因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。

  很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。

  有两种方式获取交叉编译所需的工具链:git下prebuilt这个project或者直接去下载NDK,我这里arm-eabi的版本是最新的4.4.0。

1
git clone git://android.git.kernel.org/platform/prebuilt.git

  然后创建一个helloworld.c文件。

1
2
3
4
5
6
//// root@delleon:~/android/myapp# cat helloworld.c
#include <stdio.h> 
int main() { 
  printf("HelloWorld!n"); 
  return 0; 
}

  接下来创建Makefile文件。注意修改其中的NDK_DIR和SDKTOOL为自己的目录,修改APP为自己的待编译程序主文件名。另外注意自己的arm-eabi的版本,若有变化则也需要修改。

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
#### root@delleon:~/android/myapp# cat Makefile 
APP=helloworld
 
NDK_DIR := ~/android/android-ndk-r4
NDK_HOST := linux-x86
SDKTOOL := ~/android/android-sdk-linux_86/tools
 
TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/bin/arm-eabi-
CC := $(TOOLCHAIN_PREFIX)gcc
CPP := $(TOOLCHAIN_PREFIX)g++
LD := $(CC)
 
COMMON_FLAGS := -mandroid -ffunction-sections -fdata-sections -Os -g 
	--sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
	-fPIC 
	-fvisibility=hidden 
	-D__NEW__
 
CFLAGS := $(COMMON_FLAGS)
 
CFLAGS += -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG
 
CFLAGS += -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0 -Bdynamic
 
CPPFLAGS := $(COMMON_FLAGS) 
	-fno-rtti -fno-exceptions 
	-fvisibility-inlines-hidden 
 
LDFLAGS += --sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm 
LDFLAGS +=  -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc   
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc 
LDFLAGS += -L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/arm-eabi/lib 
LDFLAGS += -nostdlib -lc -llog -lgcc 
	--no-undefined -z $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o 
 
OBJS += $(APP).o 
 
all:    $(APP) 
 
$(APP):    $(OBJS) 
	$(LD) $(LDFLAGS) -o $@ $^ 
 
%.o:    %.c 
	$(CC) -c $(CFLAGS) $< -o $@ 
 
%.o:    %.cpp 
	$(CPP) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ 
 
install: $(APP) 
	$(SDKTOOL)/adb push $(APP) /data/local/bin/$(APP) 
	$(SDKTOOL)/adb shell chmod 755 /data/local/bin/$(APP) 
 
run: 
	$(SDKTOOL)/adb shell /data/local/bin/$(APP) 
 
clean: 
	@rm -f $(APP).o $(APP)

  最后直接make,然后make install进手机里看一下吧。通过adb shell和手机里的Terminal等软件执行的结果是一样的。

toolchain

  后记:还有一个叫Codesourcery的工具链,下载下来有130多M,我使用它来编译helloworld时无误但是放到手机上则运行不起来。不想细究了,我认为NDK提供的工具链已经非常优秀。感兴趣的朋友可以自己试试Codesourcery。

Tags: , , , , , ,