Jun 28
对字符指针数组使用qsort排序时,strcmp强制类型转换后不能直接用于qsort, 需要进一步的纠结的。包装……
p.s. 对于字符串数组char a[100][100]; 就可以用strcmp。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int (*cmp_func)(const void *, const void *);

int strcmp_for_qsort(const void *a, const void *b)
{
    char *x = *(char **)a, *y = *(char **)b;
    return strcmp(x, y);
}

void quicksort(void *p, int num, unsigned size, cmp_func cmp)
{
    int i, j;
    char *pos, *t = (char *) malloc(size);
    if (t == NULL) exit(1);
    for (i = 0; i < num; i++)
    {
        for (j = 0, pos = (char *)p; j < num - 1; j++, pos += size)
        {
            if (cmp(pos, pos + size) > 0)
            {
                memcpy(t, pos, size);
                memcpy(pos, pos + size, size);
                memcpy(pos + size, t, size);
            }
        }
    }
    free(t);
}

int main()
{
    char *pos[5] = {"a", "c", "e", "b", "d"};
    //qsort(pos, 5, sizeof(pos[0]), strcmp_for_qsort); // in stdlib
    quicksort(pos, 5, sizeof(pos[0]), strcmp_for_qsort); //fake
    for (int i = 0; i < 5; i++)
        puts(pos[i]);
    return 0;
}
Jun 27

技术无用论 不指定

felix021 @ 2010-6-27 04:07 [IT » 其他] 评论(6) , 引用(0) , 阅读(5568) | Via 本站原创
也许我有点悲观,但是在我心里对“成功”的尚未明晰的公式里,“技术”这个变量的权重减少了。当然,这个技术指的是计算机专业技能,而这里的成功,也算是很概念比较宽泛、理解比较狭隘的成功,比如说,有较大的影响力,有自己的事业,赚很多钱(最次)。

记得刚入学的时候,向04级的江学姐(当时她大三)取经,她说,信息安全专业有几个方向,比如网络攻防,密码学……那时虽然啥都不懂,但是还是看过些把黑客描绘得天花乱坠的一些文章,甚至我还存着些看不懂的黑客秘籍。于是我能感觉到自己是两眼放光地说,我对网络攻防很有兴趣。那时懵懵懂懂的,对那些能在网络上呼风唤雨的技术牛人无限葱白。转眼四年过去了,我发现我现在对网络攻防一点兴趣都没有。

作为一个计算机专业本科毕业生(我居然已经不是学生了!),在学校里摸打滚爬了三年多,上课,自学,混社团,接项目,又到公司去实习过半年,还跟几位曾经在IT公司打拼过的朋友保持或紧或松的联系,让我对技术有了新的理解。

技术是什么?这个问题可真是既宽泛又无趣,简直就像“傻逼有什么特征”。也许我可以给个对得上大多数人胃口的、更具体的、不怎么准备的回答:写得一手好代码,有扎实的算法和数据结构功底;开发得出像样的软件或游戏;能管理各种服务器,尤其是熟悉各种网络协议、设备;能用PS设计出精美的图片,能用Flash做出很酷的动画;熟知那些我看来很枯燥的理论,比如图形学或者密码学,发得出几篇论文……这里说到的各个方面每个都和我身边的某个人对应。他们都是大家熟知的牛人(相比之下,我就是个四不像)。

然而在现在的我看来,装B一点的说,我觉得以上都属于较低层次的技术,一个仅仅为吃饭准备的铁饭碗,与其他专业相比没什么值得炫耀的。倒是最牛的那些人,他们可以创造出新的数据结构和算法,比如KMP;他们可以设计(更重要的在于设计)出牛X的系统,比如Google的三驾马车;他们可以不再在某个机器的层次上纠结,甚至设计新的互联网,比如IPv6;他们可以在理论的路上走得更远,但是又不脱离实际。无论什么时候,我对这些牛人的葱白都不会真的减少,因为他们能把这当作自己的追求,实现自己的成功。但是我,也许在未来的某个时候,不会再朝着他们的方向前进。

点击在新窗口中浏览此图片

《程序员的幸福生活之路》这张图片虽是恶搞,却也不乏辛酸的自嘲。在高中捣腾电脑的那阵,就已然听说程序员这活儿,吃的是青春饭,到了三十多岁吃不动了,就会被年轻人挤出来。所以网上传的那段子——“你程序员吧?" "你才程序员呢,你全家都程序员!"——可谓道尽老程序员的苦。当然,如果从二十来岁入行,到了三十多岁还在程序员的位子上原地打转,那也只能说明这人能力不行,优胜劣汰是必然的。然而就算能往上走呢?

能往上走,爬到金字塔的顶端,自然可谓成功。但是很多人都忽略了这前提,能吗?大中公司,诸如百度腾讯等,从一个底层程序员(职位美名为工程师)干起,想要爬到金字塔的中间都是比较困难的事情,何况就算爬到了,也不过是”赚还算比较多的钱“的层次;小公司,爬上去容易,但是大多数小公司无法负担远大的未来。由于信息源的缺失,以及难免的下意识信息过滤,大多数人都只看到成功的辉煌,而几乎没人关注失败者落寞的背影。所谓一将功成万骨枯,金字塔的顶端就P大的地方,想跟着别人从下面爬上去,没准早被别人踹死了。

所以有很多人觉得,爬上别人的金字塔,不如自己造一座,就像不胜数的硅谷梦创造的奇迹。这让我想起电影《雀圣》里面的一句话:都说香港遍地黄金,你知道黄金下面埋着多少尸骸!我们看到了google,看到了facebook,看到了twitter,却看不到被世纪之交那场泡沫淹没的那无数尸骸。那么多成功的典型,引着人们前仆后继。所幸的是,互联网的一波波新潮,带来无限的机会,团购,Dropbox,foursquare等新星的崛起又给人带来无限的希望。顺便说一句,facebook, twitter, dropbox, foursquare和大部分的google服务都被墙了,在目前的体制内想搞出点啥伟大的东西还真没啥希望。

于是话题终于转到了创业。一谈到创业,技术突然就变成很次要的因素了。这里有两篇文章(非常值得一看):《Dropbox 和 Xobni 如何在兩年內從 0 成長到 100 萬會員》  http://feedproxy.google.com/~r/MrJamie/~3/xUGw-48yJII/ 《Dropbox 和 Xobni 在兩年內突破百萬會員的七個關鍵》 http://feedproxy.google.com/~r/MrJamie/~3/RlRwIp_WDX8/ 。里面提到了两年前就让我大流口水的segway车。两年过去了,它离我还是那么遥远,就像摩托罗拉的铱星系统,把他们看成艺术品更合适。这两篇文章讲得很细,但是几乎就没有提起技术相关的事情,甚至还有"反技术"的倾向(Fake It Till You Make It)。其中点出了创业的三大要素:”優秀的團隊、正確的市場和非常好的執行力“。

这让我想起前一段时间参与的、由Ye发起的一个创业型的小项目,抄的是Aardvark的模式。Ye的社会关系比较丰富,找到了在创新工厂的人(Chen)推荐,希望能够拿到创新工厂的投资。由于项目本身还很不成熟,所以最后黄了,但是Ye、Feli他俩与Chen的聊天也透露出了很多信息。创新工厂对一个项目的评价标准并不是技术含量,而是前面提到的:团队、市场、执行力。尤其是在Web2.0的概念下,很难做出他人无法剽窃的核心竞争力了,这时团队和执行力几乎是成功的基本保障了。否则像马蜂一样扑面而来的400多家团购网站,会让人想死……

另一方面,前面顺便说到的那一句,是因为我对国内环境的失望。当年ZF没能意识到互联网的”危害“,放任自流,互联网才能有如此发展。现在发现网络的问题了,对政治监管不断加强加固加猛,忽视行业规范运作,反而放任国家队的进攻……所以本来就高风险的IT创业在国内更加难以捉摸——廉颇老矣,尚能"饭否"?

巴菲特的赚钱哲学是“投资而非投机”。曾有人问巴菲特为什么不投科技类的产业,巴菲特的答案是:“好的公司、不好的公司,是我花半天时间就能够看出来的,而那些花了半天时间看不出来的【比如科技类公司】,我也不会强迫自己花半个多月时间去看。我不会强迫自己花费很多时间在一个我不能“Figure out”的公司上。”在我看来,“投资”和”投机“,只是处理资金、时间等资源时冒险的程度不同。投资是将其投入低风险的领域,而投机则相反。从另一个角度来看,回报和风险又是成正相关关系的,所以这里头的关系还是有点纠缠,看来不是那么容易能说清的,暂且忽略。由于科技类公司通常都是高风险高回报的,更倾向于投机,因而巴菲特选择避开。而对于创业者,创业本身就是一种投资/投机,所以这就有个抉择:是选择科技类(如IT)的高风险高回报,还是选择实业型的稳扎稳打?

所以当我问起一个工作了好几年的朋友将来的打算时,他说,攒够资本,做实业。我想,这决定也许与年龄有关,年轻时冲劲比较大,有足够的时间资本,缺的是资金,只要能拉到,轰轰烈烈的干几年,即使失败也无妨;随着岁月逐渐流逝,梦想淡出,冲动渐冷,还是攒些养家养老的钱比较稳妥。

于我,"Niche First, World Later"正是我一直以来推崇的解决方案。下一步,加入magnetjoy这个创业型的团队,希望接下来三个月的实习能让我对以上提到的内容有新的、更进一步的认识。
Jun 8
我的邀请注册链接: https://db.tt/5PWtd8Vc

最大化Dropbox的免费空间(4G+)

虽然早就听说Dropbox这个同步应用,但是一直没有用上。根据
引用
GFW 三定律
GFW 第一定律:只要是 “用户产生内容”(User-generated content, UGC) 的国外网站都会被和谐。
GFW 第二定律:只要是被和谐的网站,国内一定会有个克隆版。
GFW 第三定律:没有被和谐的网站一定不是同类竞争者中最出色的。
Dropbox于近日被GFW掐掉,于是我决定开始使用它。

简单地说,Dropbox在单纯网络硬盘之上提供了数个很有创意的功能。包括:
a. 2G免费空间,介绍一个用户增加250M,上限是8G(或者10G?没理解)。
b. 自动同步。由于有个客户端,可以在多个电脑、手机之间自动同步文件,非常方便。
c. 照片文件夹可以作为WEB相册访问
d. 共享文件夹允许你和多个朋友一起共享、交流文件,尤其特别是小文档,比邮箱方便快捷,比IM传文件靠谱。
e. 有一个公开目录,可以生成直接的下载链接。

由于第一定律导致了它被墙的必然,但是第二定律暂时还没生效,因此,希望使用第三定律界定的这个优秀服务还是得绕个弯。所谓“奇伟瑰怪非常之观,常在於险远而人之所罕至”,所以,找个翻墙工具吧!

推荐使用 shadowsocks 来创建一个 socks5 代理,创建好以后安装Dropbox,在 preference -> network 选项卡填入代理(注意代理类型为 socks5),就可以畅享Dropbox了! (注:2018年更新,现在 ssh 和 openvpn、pptpvpn 都不好用了,shadowsocks 还行)

【创建socks代理】

创建 socks5 代理最简单是购买一个;如果有一定动手能力的话,推荐自己搭建:

1. 推荐购买一个国外的 VPS,例如 搬瓦工 年付 19.99 美元的机型:https://clients.hostmybytes.com/aff.php?aff=1042&gid=55,操作系统推荐使用Ubuntu 16.04 (配合下面说明)。购买后可以得到服务器的 ip 和 root 帐号登录密码。

2. 用 ssh 客户端(windows下推荐Tunnelier,下载地址:https://share.weiyun.com/5a3IPmg ),使用 root 密码登录服务器。

3. 安装 shadowsocks 服务端,执行命令:sudo apt-get install -y screen shadowsocks

4. 启动 shadowsocks 服务端,执行命令(记得替换你的密码):screen -dmS ss ssserver -k 密码 -m aes-256-cfb -p 8388
注:screen -ls 如果能看到一条 ss 说明正常启动了。稳妥起见可以在crontab添加一个任务 "* * * * * screen -dmS ss ssserver -k 密码 -m aes-256-cfb -p 8388"

5. 下载并打开 shadowsocks 客户端:
下载文件 (已下载 203 次)


6. 双击通知区域窗口区的纸飞机图标,将服务器的 IP 和端口(8388)、密码填入,就可以在本机启动一个 socks5 代理了。

====
我的邀请注册链接: https://db.tt/5PWtd8Vc

最大化Dropbox的免费空间(4G+)
Jun 4

ssh翻墙路由器打造计划 不指定

felix021 @ 2010-6-4 19:19 [IT » 硬件] 评论(2) , 引用(0) , 阅读(11858) | Via 本站原创
去年2月买的那个ASUS WL-520gu屈居普通路由器的角色已经很久了。由于今年由于各种失窃攒了众多RP,只剩下路由器可以折腾了,于是把它再翻出来。前一阵看到GFW Blog上总是在转载基于openvpn的翻墙路由器相关文章,于是也想搞一个自己的。但是vpn太贵了,ssh倒是正好,配合firefox的auto proxy或者chrome的proxy switchy,效果非常赞。OK,废话少说,切入正题。

需要的硬件:
1. ASUS wl-520gu,带有USB口的开源无线路由器,4Mflash,16Mram,200MHz brcm5354cpu。在 http://www.nslu2-linux.org/wiki/Optware/HomePage 提到的其他应该也OK。
2. 一个普通的U盘。256MB以上。

需要的软件:
1. Linux,貌似绕不过去,总得有的。
2. tomato固件
3. optware.rar

具体步骤:

1. 刷上tomato-1.23.8619-ND-USB-简体中文版.trx,可以在这里下载: http://dl.dbank.com/c0orlm04oj
刷好后在系统管理中开启ssh服务,从第四步开始需要ssh到服务器上操作。

2. 将U盘格式化成ext2或者ext3格式。这个在linux下很容易了,如果u盘是sdb,那么mkfs.ext3 /dev/sdb1就行。windows下可以用paragon partition manager来格式化,在这里下载 http://dl.dbank.com/c0ngokvdku

3. 下载optware.rar,将里面的tar.gz完整地解压到U盘的根目录下。
http://dl.dbank.com/c0zajdjmmp

4. ssh到路由器里头去挂载U盘的相关目录。
在wl-520gu下面U盘默认挂在/mnt/disc0_1,这个可以通过df命令查看到。
然后执行以下命令(就是rar包里的setting.sh的内容)
mount -o bind /mnt/disc0_1/opt /opt
mount -o bind /mnt/disc0_1/home /home

ln -sf /mnt/disc0_1/etc/profile /etc
ln -sf /mnt/disc0_1/etc/hosts /etc
ln -sf /mnt/disc0_1/etc/ipkg.conf /etc

5. 执行一些命令
/opt/bin/ipkg update
/opt/bin/ipkg install openssh
安装完毕以后执行
openssh-ssh -D 0.0.0.0:7070 ssh主机 -l ssh帐户
输入密码后即可连接上并开启sock5 proxy。
p.s. 不要直接输入ipkg,因为tomato固件里的ipkg不太对头,optware里面的才能用。

6. 让它更好用一些
/opt/bin/ipkg install keychain
ssh-keygen -t rsa
回车几下,会生成
/root/.ssh/id_rsa.pub
将此文件中的内容copy到ssh主机里 ~/.ssh/authorized_keys 文件中,下次就不用输入密码了。

可以用“screen -dm openssh-ssh -D 0.0.0.0:7070 ssh主机 -l ssh帐户”来进行连接,这样就不必一直开着连上路由器的终端了。

如果在 系统设置->脚本管理 的“开机脚本”里头加入
((sleep 60; screen -dm openssh-ssh -D 0.0.0.0:7070 felix021@qa.felix021.com;)&);
那么只要路由器开机联网后就能自动连上。

---------------分割线----------------

目前来说用的很好,嗯。不用在本机开着ssh了,很方便。因为ssh绑定的是0.0.0.0:7070,所以理论上只要知道路由器的IP,就可以在任何能连上路由器的地方使用这个proxy。

最后,希望这篇文章不要被发到GFW Blog上,我不想我的博客被墙=。=
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]