存档

‘高级民工’ 分类的存档

求1+2+…+n

2010年12月1日 没有评论

题目:求1+2+…+n,
要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。

一种java的实现方式,主要是使用异常来控制。

public class  T{
	//存放结果
	public static int rs=0;
 
	public static int sum(int n){
		try{
			//除0错误
			int i=1/n;
		}catch (Exception e) {
			return rs;
		}
		rs+=n;
		return sum(--n);
 
	}
 
	public static void main(String[] agrs){
		System.out.println(sum(100));
	}
}
分类: 高级民工 标签: ,

Android FTP命令行客户端

2010年9月26日 2 条评论

  虽然busybox中有ftpget与ftpput两个关于FTP的命令,但其功能太单一交互性也不强。还是linux下的ftp命令好用些。
  下面是把debian中的netkit-ftp移植到android中,netkit-ftp源码:http://packages.debian.org/source/lenny/netkit-ftp
  使用NDK R4编译,在编译过程中遇到一些错误,如:getpass()函数在android中不支持,rindex()不知为何也无法使用。getpass()最后改用fgets()代替,rindex()使用strrchr()代替。

编译好的netkit-FTP:ftp
修改后的netkit-FTP源码:ftp-source

分类: 高级民工 标签: ,

android读写内存

2010年7月6日 2 条评论

 前段时间由于特殊需要想修改android的property,即使用getprop与setprop命令所操作的属性。虽然提供了setprop命令,但这个命令无法修改以ro.开头的属性。android基于linux,那么读写内存就可以通过/dev/mem这个设备文件办到。下面是一个测试,用于读写ro.secure属性的值。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <string.h>
 
#include <sys/mman.h>
#include <sys/types.h>
 
#include "ro.h"
 
#define	MEM_DEVICE	"/dev/mem"
 
 
int main()
{
	long size=1024;
	long offset=0x13400;//physical address of "ro." ,android 2.1 on emulator
	long offset_cut;
	long page_size=getpagesize();
	prop_info *data;
 
	//offset should be a multiple of the page size 
   	offset_cut=offset%page_size;
	offset-=offset_cut;
 
	//initialize
	data=init(size+offset_cut,offset);
 
	data+=offset_cut/sizeof(prop_info);
 
	printf("prop: %s=%s\n",data->name,data->value);//read
 
	memcpy(data->value,"0",1);//write
 
	printf("prop: %s=%s\n",data->name,data->value);
 
	munmap(data, size+offset_cut);
	return 1;
}
 
prop_info *init(long size,long offset)
{
	int fd;
	prop_info *data;
 
	fd=open(MEM_DEVICE,O_RDWR);
 
	if(fd<0)
 
	{
 
		printf("open file error!\n");
 
		close(fd);
		exit(-1);
 
	}
 
 
 
	data=(prop_info *)mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
 
 
	if(data == MAP_FAILED){
		printf("map failed\n");
		close(fd);
		exit(-1);
	}
	close(fd);
	return data;
 
}

编译使用NDK,复制NDK中的例子修改后即可。ro.存放区域的内存物理地址为0×13400,测试在android 2.1 on emulator下。
虽然在模拟器中测试一切正常,但放到我的milestone中就出问题,报总线错误。
在milestone中操作/dev/mem时如命令:

cat /dev/mem /sdcard/mem

会出现错误,bad address!

不知道是因为milestone锁了一些东西,还是arm读取时所谓的对齐造成的影响。希望知道的留下答案,谢过!

源码下载:download 

分类: 高级民工 标签: , ,

关闭Milestone的四个触摸键背景灯

2010年5月16日 2 条评论

晚上用milestone看小说时,屏幕下方的四个触摸键实在是太刺眼了。下面的方法可以将这四个触摸键背景灯关闭.
需要root权限,最好使用Gscript来执行这样方便些。

关闭

echo 0 >/sys/devices/platform/button-backlight/leds/button-backlight/brightness
chmod 000 /sys/devices/platform/button-backlight/leds/button-backlight/brightness

打开

chmod 644 /sys/devices/platform/button-backlight/leds/button-backlight/brightness
echo 255 >/sys/devices/platform/button-backlight/leds/button-backlight/brightness

开关LED的shell:

#! /sytem/bin/sh
mpath="/sys/devices/platform/button-backlight/leds/button-backlight/brightness"
pr=`ls -l $mpath|busybox awk '{print $1}'`
if [ $pr != "----------" ]; then
	echo 0 >$mpath
	chmod 000 $mpath
	echo "LED closed"
else
	chmod 644 $mpath
	echo 255 >$mpath
	echo "LED opened"
fi

echo到/sys/devices/platform/button-backlight/leds/button-backlight/brightness这个文件里的值其实就是LED的亮度值,可以根据需要修改。
/sys/devices/platform/ 这个目录里还有控制键盘背景灯的相关文件可以用同样的方法设置亮度。

当然如果你想更方便一点可以下载LEDshack这个app。

分类: 高级民工 标签: ,

Milestone运行debian成功

2010年5月14日 没有评论

  milestone入手快2个星期了,无意中发现一篇debian on android的文章 实现了在android中运行debian linux,说明都比较详细,按照其方法下载了其提供的压缩包,解压复制到sd卡中,但运行bootdeb却总是出错.
出现在bootdeb

mount -o loop,noatime $kit/debian.img $mnt

这句运行后报错返回:mount:can’t setup loop device:No such file or dictionary

经过测试后发现是没有ext2.ko,以及脚本创建的loop device与实际使用的不一样。

第一个问题是解决ext2,需要下载 ext2

insmod /{path}/ext2.ko

加载ext2模块

第二个问题是解决loop设备:
首先使用

losetup -f 

查看mount loop时第一个去访问的loop device
查看该loop device是否存在,如果不存在则用mknod创建一个。

最后运行bootdeb,成功启动debian

分类: 高级民工 标签: ,