算法-又一坑

对于一个软件工程师,算法重要吗?如果想混日子,应该不重要。 但是想进步,这个基础却必须打好。 君不见国外的工程师面试,数据结构和算法可是大头。 我们经常使用各种API,却不知道个中原理。即使看源码,还是容易云里雾里的。 算法,无论如何也要攻克。 所以,开个坑,学算法去。 ##传说 有一个关于高斯同学的故事,与算法有关,故事是这样的: 高斯上小学的时候,老师出了一个问题,做完就可以放学,这个问题很简单: 1+2+3+4+5+6……+100=? 结果,高斯很早就放学了。因为他会高效的算法,当其他同学一个一个算的时候,他却是这样算的。 :::java 1 +2 +3 +4 +5.....+97+98+99+100 + 100+99+98+97+95....+4 +3 +2 +1 = 101+101+101+101+101….+101+101+101+101= 101*100=10100 1 +2 +3 +4 +5…..+97+98+99+100 = 10100/2 = 5050 高斯真是个聪明的孩子,别人用的时间是O(n),他用的是O(1)。当然快了。 ##一个例子 编程的思想,除了"KISS",还需要高效,虽然现在的计算机和手持设备都足够强大了,但是还没有到为所欲为的地步,没有高效的算法,软件寸步难行。 有一个例子,计算斐波那契数,这是C语言程序设计一开始就介绍的。 :::c double fib1(int n) { if(n <= 0) return -1; if(n == 1) return 0; if(n == 2) return 1; return fib1(n - 1) + fib1(n - 2); } 算法很简单,教科书答案,但是用了递归,效率像掉进了万象深渊。为什么这么说,可以用一张图来解释。 ...

May 29, 2013

githug通关攻略

这货叫做githug,而不是大家熟悉的github,其主要目的是通过游戏的形式来让我们练习git的使用。 ##安装githug githug是ruby写的一个应用。所以先要安装ruby,然后输入 :::sh gem install githug 然后就可以在你觉得合适的目录输入githug :::sh ******************************************************************************** * Githug * ******************************************************************************** No githug directory found, do you wish to create one? [yn] y 强烈建议把git的编辑器转换为vim :::sh git config --global core.editor "/usr/local/bin/vim" ##Level 1 :::sh Level: 1 Difficulty: * A new directory, git_hug, has been created; initialize an empty repository in it 开始总是简单的,这题是如何新建一个仓库 :::sh cd git_hug git init githug ##Level 2 ...

May 3, 2013

源码编译已root的android rom

世界上所谓的root,其实就是用修改过的su,替换系统中受限制的su,达到为所欲为的效果。 这个修改过的su,由ChainsDD大神提供,慷慨地在github中开源了,由于su的权利太大,他同时提供了一个权限管理软件Superuser.apk,通常需要一并装入系统。 如果你有android系统源码,并且想编译一个原生带root的系统,可以按照以下步骤进行。 在源代码的system/extras目录,很容易可以找到su这个文件夹,这就是我们需要替换的地方,上这个网址https://github.com/ChainsDD/su-binary,下载源码替换之,编译后会在system/xbin生成su,但是程序通常会在system/bin查找su,所以我们需要在init.rc做一个链接到system/xbin/su :::sh symlink /system/xbin/su /system/bin/su 再把Superuser.apk,放到system/app里面,通常我的做法是在源码device目录的指定型号里面编写mk来达到这个目的。例如: :::sh PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/apk/Superuser.apk:system/app/Superuser.apk 编译并烧写系统,你会发现你的系统已经root了。 如果不太明白什么是root,可以到这个大神的FAQ页面:http://androidsu.com/superuser/faq/

April 29, 2013

如何在局域网搭建git服务器

在创业公司,什么东西都要自己搞定,除了开发android系统和研究内核,还要自己来搭建一个代码管理服务器。 其实搭建一个服务器非常简单,尤其只需要在局域网内搭建,网上已经提供好了我们需要的一切。 ##服务器的搭建 首先我们需要一个装有linux系统的计算机充当服务器,我这里是一台ubuntu12.04的系统。里面默认安装了perl和bash作为shell。 然后需要安装git-core,openssh-server等必备软件,在ubuntu 安装这些软件比较方便。 :::sh sudo apt-get install git-core openssh-server 创建一个叫做git的用户。创建步骤和可能出现的问题可以参见这里:http://lingavin.com/blog/2013/04/27/add-new-user/ ##gitolite3.0 安装环境后,就可以使用gitlote来搭建一个服务器了。首先是下载gitolite源码。网址是:https://github.com/sitaramc/gitolite 安装这个软件,首先要保证$HOME/bin文件夹存在,然后准备好客户机的xxx.pub文件。 这里会涉及到一个问题,什么是xxx.pub和为什么需要用这个文件。xxx.pub是客户端用sshkeygen生成的公钥。至于为什么需要初始化的时候提供这个文件,那是因为初始化后,这个提供公钥的客户机将成为gitolite的管理员,在客户机里管理各个版本库,所以需要在初始化的时候提供。 具体步骤就是: :::sh git cloen git://github.com/sitaramc/gitolite #下面这一步其实是在/home/git/bin做了一个软连接 gitolite/install -ln export PATH=/home/git/bin:$PATH gitolite setup -pk xxx.pub 完成了这几步,服务器的设置就算完成了。 ##客户端 客户端需要保证的是能够ping通服务器端,然后就是下载gitolite-admin这个仓库。命令如下: :::sh #请把host_ip替换为服务器的真实ip git clone git@host_ip:gitloite-admin.git 可以发现clone下来的版本库里面有两个文件夹,分别是conf keydir。 现在我们就通过添加一个开发者wang和添加一个仓库android4_0_3.git来演示如何操作这两个文件夹。 ###增加一个开发者 ...

April 28, 2013

ubuntu增加新用户遇到的问题

使用useradd新增用户后使用su [用户名],结果只有一个$,显然不是熟悉的bash,只好自己配了。 用root用户来改变新增用户的终端为bash :::sh sudo passwd su usermod -s /bin/bash [username] 使用echo $SHELL看看是否修改成功。 然后你想在新用户里面使用sudo,结果跳出错误xx is not in the sudoers file. This incident will be reported 这时候还是需要请出root用户来解决。 :::sh chmod u+w /etc/sudoers gedit /etc/sudoers #在root ALL=(ALL) ALL 下面添加 [username] ALL=(ALL) ALL chmod u-w /etc/sudoers

April 27, 2013