这些文字同样来得有点迟。元旦和小伙伴去日本旅游时,打算每天写一点,可是发现行程有些暴走,匆匆路过,未能及时收拾所思所想成为文字。
2018 我做了一个重要的决定:每天东莞深圳来回上下班。其实是为了尽力寻找个人与家庭,工作与生活的平衡点。开始的时候,非常难适应:5:45 起床,7:00 左右到公司,晚上回到家一般是 21:30 左右。不过后来经过调整作息时间,早睡早起,发现每天的工作状态比之前还要好。如果加班太晚,我会睡在公司,感谢公司配有冲凉房,加上自备的硬床,都不是什么问题 : )
刚好上一年 10 月我的二儿子出世(感恩妻子),现在每天下班多了个任务就是陪大儿子睡觉,时间变得更加紧张,也更珍惜小朋友熟睡后的独处时刻。
2018 还加入到腾讯投票项目组,折折腾腾做了一些优化的工作,效果还不错,感谢山姆大叔拉我入坑。
2019 已经过去 20%,今年个人计划:
另外,以后没啥事就不再更新这个站了(一不小心本站断更两年- -)
欢迎感兴趣的小伙伴们关注我的公众号 BraidWorld :)
最后,放上一张一起去日本的小伙伴们啦 : )
]]>我们可以看到,数据结构的变化还是非常大的,所以release note里的的关于大幅降低内存占用的那个item应该也不是吹的。
(上面都在吹别人的,现在到我们自己折腾了)
看了源码,的确工作量巨大(mongo.so),而官方推荐使用的是这个 mongodb.so
不幸的是,mongodb.so与mongo.so的接口调用方式还是有挺多不一样的,并且官方推荐使用mongo-php-library,所以有下面关系:
PHP 5: mongo.so
PHP 7: mongo-php-library(PHP) -> mongodb.so
到这里,我只想说
php中间层mongo-php-library加入,提升数据访问接口灵活性,但也导致了性能的降低,我们可以从上图中发现大量的bson对象的转换。
[‘typeMap’=>[‘root’=>’array’,’document’=>’array’]],这个参数可以让该库不转换成bson对象,重新优化了代码后,耗时从922ms下降到398ms
因为MongoDB的扩展驱动换了,所以这里不能做最直接的比较,但像get_raw_data_list这样的接口几乎是db的直接读取接口,所以驱动对其影响是最大的。
我们也能注意到像get_summary, get_reputation_word_freq这样的接口性能提升了30%,这些接口主要是进行了数据的计算
C#的接口正在迁移中,所以暂时还没有实际的对比数据,但考虑到除7带来的提升外,相对老接口还会多引用多进程、多线程的处理,这里的优化数据还是非常值得期待
目前使用的是pcntl,后续会多加入pthreads以提高并行处理效率
注意DEPRECATED in PHP 5.x, and REMOVED in PHP 7.0.0.的接口
多了个php-cli.ini,cli下默认就用这个配置文件了
OPcache记得用上
新项目上PHP 7
旧项目先评估PHP扩展模块的兼容性(包括公司内部的……)
PHP5与7可以共存一段时间,对比调试
引入非官方扩展(自己写)时要慎重考虑,能用php语言自身解决的(socket, pack, unpack等),基决不用扩展。Less is more.
我选的是slackware 14.1,这个自己喜欢就好,但安装过程因为要组RAID 1,slackware还是说得很详细,大体上是:
sfdisk -d /dev/sda | sfdisk --Linux /dev/sdb
mdadm --create /dev/md0 --level 1 --raid-devices 2 /dev/sda1 /dev/sdb1 --metadata=0.90
mdadm --create /dev/md1 --name=1 --level 1 --raid-devices 2 /dev/sda2 /dev/sdb2
mkswap /dev/md1
chroot /mnt
,修改lilo.conf,加入raid-extra-boot = mbr-only
,root和boot设为/dev/md0
,执行lilomdadm -Es > /etc/mdadm.conf
以记录软raid的信息,如果不执行这个,有可能会reboot失败iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
,可以看看/etc/ppp/firewall-masq
/etc/resolv.conf
,我用的是119.29.29.29
和114.114.114.114
/etc/dhcpd.conf
1 | default-lease-time 600; |
eth0是对内网的,所以接到交换机,PC, AP等接入交换机,自动获取IP后,就可以上网啦,至此完成一台有基本路由功能的server。下面几个是为了增强稳定性的。
断线自动重连/etc/cron.d/pppoe-keep.sh
1 |
|
断线自动重连 watch dog /etc/cron.d/pppoe-keep_watchdog.sh
1 |
|
crontab
1 |
|
每天自动断线一次 /etc/cron.daily/pppoe-stop
1 |
|
每周机器自动重启一次 /etc/cron.weekly/reboot
1 |
|
一些脚本和配置都在这里https://github.com/imlcl/DRouter/。后面会有DDNS, NAS等续篇 : )
]]>]]>人生总有一次不懂,生活总有一次茫然,突然发现,自己的身边已经走失了那么多人,有些人,不知不觉,就淡了关系,有些人,无声无息,就远离视线,时间一天天过,好像什么也没改变,但当你回头看,每个人都变了,有的从眼前走到了天边,有的从陪伴进入了心间,明明入心的人,转身就变的陌生,明明不在意的情,有时瞬间让你感动,缘分这东西,不经意会错过,太认真会难过,落花有意水无情,有缘无份空叹息,相识相知本不易,人走茶凉奈何兮,不怕身隔南北,只怕心在天涯,不畏暖心多年,只恐心凉一瞬,唯有时间能看清真心,鉴别真情,曲终人散后依然为你而留的,才叫陪伴,物是人非中依旧拿心而守的,才是珍惜。
基于HTTP协议是处于应用层,所以HTTP包是很容易可以构造出来的,也就是说,人通过浏览器去投票发出的HTTP请求包,机器是可以模拟构造出来的。
1、投票时是否绑定session
2、投票时是否识别ip
3、投票时是否需要验证码
4、投票时需要提交什么数据到什么目标地址(这里包括是否要带上特定的cookie字段,是否要识别终端等HTTP头信息)
所以,针对不同的投票网站,可能会有不一样的变通方案,但都不会离开上面四点。
这次投票的网站,经过分析,1、2是yes,3是no,不用验证码哦,这个刷票门槛马上低了n个层次,不过发现是识别ip的,一个ip投一票,请空cookie后可以继续投。
一个ip经测试,一般可以投20-30票,如果速度不快的话。
感觉没上代码不舒服,先上个代码先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
include_once('ip.php');
$url = URL;
$timeout = TIMEOUT;
# USER AGENT哦, 多搞几个是好事
$user_agents = array(
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'
);
while (1)
{
# 通过代理API获取IP
$ret = file_get_contents(IP);
$ret = json_decode($ret, true);
$proxy_list = $ret['data']['proxy_list'];
print_r($proxy_list);
foreach ( $proxy_list as $proxy ) {
A:
$ua = $user_agents[array_rand($user_agents)];
$options = " -v
-A \"$ua\"
-m $timeout
-x $proxy
-H \"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\"
-H \"X-Requested-With: XMLHttpRequest\"
-H \"Origin: http://abc.com\"
--referer \"http://abc.com/vote.html\"";
$cmd = "/usr/bin/curl $options -d \"i=xxx\" \"$url\"";
# 用的是cmd, 用php curl也可以
$output = exec($cmd);
echo $cmd;
echo "\n*******************\n$output\n******************\n";
$ret = json_decode($output, true);
print_r($ret);
if ( $ret['success'] == '1' ) {
echo $proxy . "\n";
# 模拟停一秒, 感觉可以停久一些
sleep(1);
# 神奇的goto
goto A;
}
}
}
因为是和IP相关的投票,所以只能通过代理了,这里就只能去买代理啦,只用高匿的,因为这样server那边是不知道你是用了代理的,这个请自行google了。
另外curl需要给个user agent,这样就不需显示curl了,更加真实一点,多点user agent随机会比较靠谱。
####四、这次刷票遇到的其它问题
1、估计大家都用代理嘛,代理资源可能有很多是重复的,你会发现很多取回来的代理已经不能投票了(别人已经用这个代理投过票,并且该代理IP已入黑名单),
或者说投一到两票就不能投了,所以这样刷票是有点不稳定的,如果有一手的代理资源这个问题就可以解决。
2、大家都在刷,大家都在抢占资源,所以我们可以多开些进程去刷,这里要考虑代理获取IP的API调用频率限制问题了,太快的也是不行的。
3、代理也分布在不同网络,电信、移动、网通、铁通之类,所以刷票机在多个网络会更好一些。
4、刷票的时间最好和人正常的作息时间对应,也就是说要更智能一点,更像人在投票一点。
5、因为朋友说不想名次太高,所以我另外也写了一个程序来判定是否在前几名之外,如果不在前几名,就开始刷。这些边边角角的代码就不好意思贴出来了,写得比较快,所以比较粗烂……
####五、如果有验证怎么办
这个比较恶心,因为验证码要涉及图形识别,不同图形验证码的识别率也不一样,这一块我没有深入研究过,但知道Tesseract Open Source OCR Engine可以通过不断学习来提高图形验证码的识别率。当然也可以自己写识别算法来处理,图形学是博大精深,小弟只懂个皮毛,不过有时间还是想试试这个东东。
刷票软件什么的也很厉害,以前好像有用过,大家都可以找找看吧。我这里只是分享其中一种方法与思路,应该算是刷票的基本功吧,因为软件什么的也是基于这个思路来写的,不过功能更多强大和自动化而已。
话说刷票不便, 这种无验证码的淘宝也要四毛一票呢,我这帮朋友刷了4w多票,Just a joke : )
EOF
]]>这一年里,无论从个人情感上、心理上还是行动上,都发生了巨大的变化,甚至可以说是有生以来最大的一次巨变:
放弃公办教师来到腾讯CDC,与家庭磨合分隔两地的工作生活,
从小影响着我并深爱着我的老爸中风半身偏瘫,一下子打破了家里平静小幸福的生活状态,
妈妈全职照顾老爸,爱人辞职带小孩,也突然感觉得生活艰难了好几分。
没有把这事情诉说给什么人去听,因为除非对方的家庭也有相似的经历,否则根本没有办法理解的。
偶尔静下心来想想,真的说不出这一年来,我真正收获了什么东西。
可能收获的都是无形的,我看不到,但有这样的感觉,我就会觉得是件很恐怖的事情。
在一个设计师的团队里做一名死开发,感觉这就是我的现状,同时感觉内部这样的开发环境和氛围,对于专业的提升真的是非常有限,可能是因为一定程度的封闭。
然后,需求淹满了一些想法,直到变成让自己都讨厌的习惯。
而我也努力在寻找某种提升的方法与动力,抑或是针对我个人,抑或是“团队”。
一年前的改变,然后发现自己在某些东西上依旧没什么变化,甚至渐行渐远,在这样的压力下并不是一件好事。
可是这就是生活,这就是现实,收拾一下心情,不在沉默中死亡,就是沉默中爆发。
]]>在学校这四年时间,我学到了很多珍贵的东西,多少的人和事都历历在目,甚至咋一想,就能想起某人的嘻哈大笑。Bird说我四年最大的收获是结婚生子,我去,好像这也对。而我遇到了前卫的校长,开始接触苹果的产品,直到我遇上MacBook才发现这才是程序员用的神器,再到在学校搞起了Rails,还有很多很多……还记得当时到学校时没有办法室,我就整天在机房里编程,用PHP花了一个月左右的时间做了一个数字化平台的雏形出来,还记得那时在RTX上介绍自己:大家好,我叫刘楚龙,毕业于华南师范大学软件工程,酷爱街舞……我相信这些历练,会使得我与众不同,感谢这些日子。
下面这段话是我老师说的,我完整的摘录下来:
“人的一生是漫长的,我们总在不停遇见与离别之间徘徊、反复。很荣幸地遇见,彼此相识、熟悉、牵挂、思念,到了最后,随着时光的推移,来了,又去了;留下了,又走了;然而,我们要懂得珍惜每一次的遇见,珍惜所有踏过的足迹。
某一些事,某一些人,在我们的心里形成瞬间成永恒的影映,我们会因此哭或笑,然后就那般安静下来,一颗心恬然自得。人生就是这样一场又一场的际遇,只是多么希望我们都能够在这场际遇里,收获自己内心最渴望的那一缕情愫,满足自己的需求。
坚定、坚强、执著、淡然、随缘,无论我们的生命里那些曾心心相惜的人来与不来,在与不在,愿我们都能够站成优雅的姿态,守护在自己的心灵后花园里,不离不弃、不远不近、默然相守、寂静欢喜。 ”
是的,我离开了,不代表我不感恩,也不代表我不尊敬您,感谢你和你们对我的包容与鼓励,真的。
2010年,HBin说不如你不要走吧,那时我坚决地走了;2014年,感谢他给我带来的机会。
我清晰地记得那晚你对我说的话:当年你在深圳,我去面试时,你请我吃沙县,你要走时,我叫你不要走,而现在你又想回来,你不需要感谢我。这些东西可能是一个轮回,就像一个婴儿出生时,婴儿在哭,我们都在喜悦地欢笑,当你慢慢老去,在某一天,你周围的人在伤心地哭了,而你可能是很安详地开心地走了。
感谢每一位小伙伴,这里就不一一点名了,谨此纪念!
]]>这是个好东西,已经集成常用的插件(不要忘记要装个JDK,不然ElasticSearch就启动不了),安装完成后就启动这个东东。
如果你想加到系统启动,就要看看bin/service/elasticsearch的命令说明。
在Gemfile
加入:
1 | gem 'elasticsearch-model' |
bundle
之
这里我有个Post的Model(有几千条记录),有个title的字段,现在我需要ElasticSearch为title字段建立索引,以便查找:
1 | class Post < ActiveRecord::Base |
Import数据,我用的是官方的Rake Tasks,以Post为例就是这样子:
1 | rake environment elasticsearch:import:model CLASS='Post' FORCE=y |
如果在Production环境:
1 | RAILS_ENV=production rake environment elasticsearch:import:model CLASS='Post' FORCE=y |
而新加入的数据就会有Callback调用加入索引,这就不用我们操心了。
elasticsearch-rtf里的elasticsearch.yml文件默认是用keyword
的,按照我的理解是,需要全部匹配。
例如有个title叫abc
,如果你用a
来搜是搜不出来的。所以这里我会改为mmseg
,这样就会自动帮我们分词了。(记得重启ElasticSearch)
Post.search('blabla')
来试试看: )
这只是一个无痛的最最基本的能让ElasticSearch加入到我们Rails项目中的指导,ElasticSearch还有好多好牛的东西(我暂时也没有这个需要),请移动到guide。例如你可能需要为搜索后的结果进行一定的排序之类。
EOF
]]>我自己的做法是,新建个叫source的branch,然后在这个branch上写blog,master分支不要动,以后更新了master后,就可以在source下gitrebase master
来更新source分支了
因为Octopress的rake deploy
命令是针对GitHub的,所以这里需要对Rakefile
开刀了
因为需要把rake generate
后的文件都推送到GitCafe上的gitcafe-pages分支,所以这里先来设定生成静态文件的目录和推送的分支
查看代码
我的octopress目录里有三个git分支: master, source和gitcafe-pages,每次rake deploy
后,source保存的是源文件,gitcafe-pages保存的是生成网站静态文件,这两个分支都会推到GitCafe的服务器上。
查看代码
EOF
]]>至今,手头上还有机子是用Slackware的,包括以前的Linode VPS、现在学校的服务器等等。
我想,只要玩过Slackware的人,都知道他有明显的优点:简洁、稳定、高效。因为它里面的软件包都是原汁原味的,虽然包的数目不多,但加之SlackBuilds的,总数都有四五千个,日常是足够用的,起码在我的使用经验来说已经足够。PkgTools包管理机制,最大的特点是无依赖,这可以说是优点,也可以说是缺点。优点当然是这样组织起来,包与包的关系很明晰,要什么包就装什么,而不会装了一些不相关的包。缺点也明显,就是对管理员有一定的要求,起码是了解Linux的,如果装一些软件,可能要手动解决包间的依赖关系。我一般都是用Full Installation的,如果用SlackBuilds,也会列出相关的依赖,手动解决也很快,现在也有sbopkg这个工具。还有一点我很欣赏,就是它启动脚本管理方式是那简的简洁简单。
说了这么多,那为什么我现在下定决心转到Debian呢?其实也有非主观因素。对于服务器的管理,可能并不是你一个人,一直打理下去,总得有时会换人吧?!对于slackware,特别是在中国,真的太少众了,资料也缺,假如换人了,那他管理起来可能比较吃力。至少Debian来说,管理起来要方便快捷得多,团队也强大,当然包的数量也是我选择这个发行版的原因之一。有人问,为什么不选CentOS,我一向不喜欢RPM系的,所以,没办法,而Debian的开放自由,刚刚好可能满足我和今后相关管理人员的最基本需要,虽然我真的不喜欢deb装一大堆依赖的东西。
每个人做出一个选择,都有自己的现实需要。还记得那句话,服务器稳不稳定,除了好的发行版外,更关键的是作为一个服务器管理人员的技术水平。所以,说到底,哪个版本都不重要,重要的是,能用好,用到点子上,并能一直稳定地工作下去。
说个题外话吧,以前Slackware给我印象,是因为求稳定,很多软件包的确比较旧,但现在用Debian了,发现,Slackware的包已经非常新了。Slackware的发展也根据现在Linux发展一样,慢慢地加快,跟上了脚步。但我也相信它可以一直坚持它KISS原则,一直良好地发展下去。
]]>从wordpress里导入了280篇博文,因为是导入过来的,所以还保持了html代码,可能会有些练练的,但基本上不会有太大影响,我也就不花时间再去重整了。
回想一下,好久好久没写文章了,这个在今后会有改善。
]]>想想,回来东莞工作已有三年多了,毕业五年,这些时间似是历历在目,似是过眼云烟。
2012年,我在疑惑地问问自己,我是否进步了?我冥思良久,好像也找不到答案,感觉自己是进步了,但似乎这种进步又可以忽略不计。这是否说明,我还没有把自己看作一名教师,从教师角度出发来衡量自己呢?我也在疑惑,我是否有把自己看作为教师而衡量的必要性。
人生面临许许多多的抉择,而在我身上,似乎显得有些无力。不过,我坚信有一那么一些执着,打从孩提时就刻进了骨子里。要是说这样的工作,这样的生活渐渐地磨平了我,倒不如说我是一个顽皮的小孩,喜欢让自己跌跌撞撞,但最终是为了成就更强大的自我,这也许是未雨绸缪吧。
2013年,我会进入人生另一个重要的时期,离30已经很近了,我还有很多东西没有能力去完成。2012年所留下的很多问号,都要在2013年不断地探索,我,很想知道,我能够改变多少东西。
人生有多少个三年,多少个五年,更别说十年了。当你认为,这也许是平衡点的时候而变得懒惰时,其实,那才是最危险的,我一直都这么谨记着,所以我才有动为为那冰山一角剩余的部分去努力奋斗。
]]>阮一峰的《Git分支管理策略》可以先看看,很不错
那里这里说到一个.gitignore的文件,就是拿来声明哪些文件或文件夹不需要用Git来跟踪的。
不过刚开始使用Git时,会遇到的即使加入.gitignore的文件,但Git依然会进行跟踪,那么这里得分两种情况来看了:
1、如果该文件(夹)已git add进库,那么此时即使你在.gitignore声明,该文件依旧会进行跟踪,需要通过命令将其删除:
git rm –cached -r <path>
2、如果该文件(夹)没有git add进库,那么此时你可以提前在.gitignore进行声名,这样就可以不让Git不跟踪了
当备个忘吧,因为平时都没有用GUI工具,都是命令行来得快捷一些,不知有什么好GUI可以用。
《Pro Git》也是一本很不错的书,推荐一看
]]>首先呢,我发现自己有半年时间没有写技术类的文章了,其次,关于这个话题,我一直都想整理一篇比较好的文章出来,一来可以做个备忘,更重要是起到分享交流,共同进步。
之前一直可能都有一些零零散散关于这部分细节的,但我觉得都看得不是很爽。
另外,网上搜到大多数关于KVM的都是debian系或redhat系的,有部分内容和slackware有差异,并且由于slackware的文化,在KVM虚拟化这块,相比其它发行版要麻烦一点点,而slackware的简洁、稳定、快速是我一直所爱,所以更希望写下这篇文章。
物理服务器机器安装好slackware64
13.37后,那得得要准备相关的软件环境(均运行在root下面):qemu-kvm和tunctl(用来tap通讯)
首先到slackbuilds.org下载qemu-kvm相关的编译准备文件(还有源码包),运行qemu-kvm.SlackBuild进行编译,OK后会在tmp生成一个名为qemu-kvm-1.0.1-x86_64-1_SBo.tgz的包,installpkg之。如果在编译过程中出现错误,那就得先排错,一般都是相关的依赖问题。
同样地,下载tunctl并编译之,得到tunctl-1.5-x86_64-2_SBo.tgz并installpkg之
这部分完毕
KVM虚拟机通过tap来访问互联网,那么物理主机得设置好网桥,下面是我/etc/rc.d/rc.local里设置网桥和tap的代码1
2
3
4
5
6# create brige
ifconfig eth0 0.0.0.0
brctl addbr br0
ifconfig br0 x.x.x.x(物理主机IP) netmask 255.255.255.0(物理主机掩码) up
route add default gw x.x.x.x(网关) br0
brctl addif br0 eth0
1 | # create tap0 for windows 2003 |
windows方面我们使用virtio来提高磁盘和网络的IO性能,那么这里得准备virtio的两个文件:virtio-win-0.1-30.iso和virtio-win-1.1.16.vfd
来说明一下,virtio-win-0.1-30.iso里面放有windows的virtio磁盘控制器和网卡的驱动,是安装2003成功后,进入系统后进行相关驱动安装或更新用的。而virtio-win-1.1.16.vfd是一个软盘镜像,是用来安装2003时,通过F6来指定磁盘驱动用的。
在使用qemu-kvm前,需要载入kvm内核模块:1
$ modprobe kvm_intel
创建大小为20G的win2003.qcow2磁盘文件:1
$ qemu-img create -f qcow2 win2003.qcow 20G
启动KVM进行2003的安装:1
$ qemu-kvm -m 768 -boot d -drive file=/xxx/win2003.qcow2,cache=writeback,if=virtio -fda /xxx/virtio-win-1.1.16.vfd -cdrom /xxx/Windows.Server.2003.R2.iso -vnc :1
命令运行后,没有提示任何错误就应该是没有问题了,打开tightVNC,登录到该远程桌面进行安装的操作(VNC登录地址是IP1:1)。启动安装是按F6,之后再安“S”,进入后选择“Redhat I/O for windows 2003”相应的驱动,32或64位。之后的安装过程是和平时装2003的过程一样。
安装成功并启动一次,之后将2003关机,换用另外一条指令来启动虚拟机:1
$ qemu-kvm -m 768 -net nic,model=virtio -net tap,ifname=tap0,script=no -drive file=/xxx/win2003.qcow2,cache=writeback,if=virtio -cdrom /xxx/virtio-win-0.1-30.iso -vnc :1
此次启动将载入virtio-win-0.1-30.iso镜像,包含有磁盘控制器和网卡的驱动
启动后,同样使用VNC远程接入,把2003里的网卡安装好,也可以把磁盘控制器也升级一下,因为之前软盘镜像带的是2010年的,现在iso里包含的是最新的驱动
到这里,windows 2003安装步骤就完毕了,之后就像平时新装系统设定IP,网关什么的就好,并开启windows远程桌面方便后续的远程操作
六、安装slackware-current 另一台虚拟机我装的是slackware-current,安装步骤要比windows 2003简单一些
创建大小为20G的slackware.qcow2磁盘文件:1
$ qemu-img create -f qcow2 slackware.qcow 20G
启动KVM进行slackware的安装:1
$ qemu-kvm -m 768 -boot d -drive file=/xxx/slackware.qcow2,cache=writeback -cdrom /xxx/slackware-13.37-install-d1.iso -vnc :1
用VNC连接,像平时一样来安装,current的安装方法就略去了
安装成功后就换另外一条指令来启动:1
$ qemu-kvm -m 768 -net nic -net tap,ifname=tap1,script=no -drive file=/xxx/slackware.qcow2,cache=writeback -vnc :1
之后进行一些必要的设定,之后就可以用ssh来连接
两台KVM虚拟机都安装设置成功了,所以就需要将其加入到rc.local脚本,使两个虚拟机在开机时随系统启动,下面是我的rc.local:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# create brige
ifconfig eth0 0.0.0.0
brctl addbr br0
ifconfig br0 x.x.x.x(物理主机IP) netmask 255.255.255.0(物理主机掩码) up
route add default gw x.x.x.x(网关) br0
brctl addif br0 eth0
# create tap0 for windows 2003
tunctl -t tap0
ifconfig tap0 up
brctl addif br0 tap0
# create tap1 for slackware-current
tunctl -t tap1
ifconfig tap1 up
brctl addif br0 tap1
# macaddr
macaddr1=`printf ‘DE:AD:BE:EF:%02X:%02X\n’ $((RANDOM%256)) $((RANDOM%256))`
macaddr2=`printf ‘DE:AD:BE:EF:%02X:%02X\n’ $((RANDOM%256)) $((RANDOM%256))`
# start kvm
qemu-kvm -m 768 -drive file=/home/qcow2/win2003.qcow2,cache=writeback,if=virtio -net nic,model=virtio,macaddr=$macaddr1 -net tap,ifname=tap0,script=no -daemonize -nographic -localtime
qemu-kvm -m 768 -drive file=/home/qcow2/slackware.qcow2,cache=writeback -net nic,macaddr=$macaddr2 -net tap,ifname=tap1,script=no -daemonize -nographic -localtime
启动参数多了个mac地址,是用随机数生成的,建议生成mac地址后将其固定,不然每次启动机器都会有不同的mac地址……
另外,因为不需要用vnc,所以参数里也没有vnc的启动参数,这样也是保证安全的一个做法
到这里,文章也快要结束了。
文中没有使用libvirt来进行虚拟机管理,这个后续可以进行改进,并且也没有相应的watchdog,这也是一个不足。
文中所讲述是一个相对为通用的方法,希望读者能有所启发。
如果你按照这些步骤进展顺利,那么恭喜你:)
对于码农这个称呼,有些人喜爱有加,有些人不以为然。区别在于对待“农”这个字的感觉。农当然是指农民,这个词寓义很丰富,既可以说它伟大,也可以说它渺小。说它伟大,是因为我们的生存离不开农民,而且中国⼀直是个农业为本的国家,曾经说是百分之八十的人是农民,这意味着往前翻⼀两代,你我众人皆是农民出身。以此观之,农可谓大哉。说它渺小,则是因为大家的观念里,农民意味着有很多缺点,冠冕堂皇的说法是劣根性,比如目光短浅、思维陈旧、自私小气,等等,总之是为我们受过教育的人群所看不惯的种种毛病——这些毛病虽然我们自己也有,但是我们看不见——于是乎“农民”成为了骂人时常用的字眼。
其实,把自己的编程生涯与田间地头的锄禾日当午对应起来,确是有那么些相似之处的。你能想象得到,田间整齐栽种的秧苗,与屏幕上显示的错落有致的代码行有几分神似。各种庄稼的种植是有讲究的,正如你要注意编程风格。施肥灌溉,犹如你对代码进行的编译链接。除草除虫,自然是在做着debug 。你挑水来我浇园,大概是在小菜园中进行的结对编程。因为靠天吃饭,农民们也要学点云计算,去五道口职业技术学校进修的人也多起来了。收割的季节,活多人少,也常常是要搞外包的,因为deadline 很重要,time to market 不容错过。
不过坦率地说,码农这个叫法让人体会更多的是滑稽、搞怪、无厘头。毕竟⼀个是简单的体力劳动,⼀个是高智商的脑力劳动,不可同日而语。而程序员却偏爱这样的时空错乱的感觉,自嘲(我就是个农民!)的同时却又自命不凡(我是码农我怕谁?!),特立独行极了。
码农的草帽底下,是⼀颗充满创造力的自由不羁的头脑。他们遵从最佳实践而痛恨陈规教条,他们欣赏天才而不迷信权威,他们喜欢思考而不轻易苟同。他们是技术人,却追求人文理想;他们敢于呐喊,说出自己的观点和主张,也更善于脚踏实地,用自己的点滴工作去改变现状。码农们是勤奋的,加班加点的工作是常有的事情,城市夜间的灯火,有多少是在码农们的办公室和居所点燃?周末四处举办的技术交流和讲座,又活跃着多少码农的身影?线下读书,线上讨论,冥思苦想,动手实践,新技术驱动着码农们的脚步,码农们在改变着我们的生活。
生存离不开农民,生活离不开码农。
]]>ZIP,一个没落天才的故事,Phil Katz不愿意为一个压缩软件付钱,就索性自己写了一个更好的算法,然后无偿公开。2000年4月14日,他被发现死于一家汽车旅馆,年仅37岁,死时手中握着一个空酒瓶。他留下了zip算法,却没有留下一张像样的照片。
久违了的zip在你的脑海里还能占据多少空间?或许,你跟本就把它忘记了。
记得刚上大学的2001年,在电脑报上看到过一篇介绍Philip Katz的文章,那时,我才知道,原来zip是曾经是那么的“不可一世”,那么广泛的被使用着。
Winzip的创始人是Philip Katz。用Ultraedit打开任一个zip文件,可以看到文件最前面PK两个字母,这便是zip文件格式的创始人Philip Katz的名字缩写。
在19年前,也就是公元1988年,那时候互联网还刚刚开始有了雏形,而最流行的是一种使用电话线拨号登陆别人在家里搭建的服务平台——交换信息的电子公告牌(BBS)系统。这种系统有些类似现在的论坛和新闻组,由于站长之间互相转信也成为了一个庞大的信息网络(惠多网)。
老一点的网虫可能都有印象,在没有 Internet的年代,中国大地上也曾有几十个这样的BBS存在,著名的字处理软件WPS的作者求伯君和CCED的作者朱崇君当年都是非常有名的个人站长。
由于电话线的接入速度慢的可怜,通过BBS传输较大文件实在是叫人痛苦的一件事。于是,使用文件压缩技术减小文件的体积并将多个文件压缩到一个封包中就成为了BBS用户的一项必须掌握的技巧。当时的美国BBS上,比较流行的是一种叫做ARC的压缩技术,由于它是一家商业公司开发的压缩技术,使用这种软件进行工作是需要付费的。那时候的菲利普·卡兹是一个沉迷于BBS 上的毛头小伙,由于经常混迹于BBS上,对于ARC的收费非常不满的他自己开发了一个程序叫PKARC,这个程序与ARC完全兼容,可以压缩和解压缩 ARC文件。这样一来,大批的ARC用户自然转而使用菲利普·卡兹的免费软件。ARC的制作公司一怒之下将菲利普·卡兹告上了法庭,法庭自然判决菲利普· 卡兹禁止继续开发和传播PKARC。这种判决并没有磨灭菲利普·卡兹的斗志,而是激起了他要与ARC斗争到底的决心。在虚拟的世界中,自由、平等永远是真正的程序员永久的追求。
他放弃了PKARC的开发,发誓要写出一款比ARC更好的压缩软件来打败ARC。这一场官司造就了一名编程天才的横空出世,也造就了一个后来在互联网时代的文件标准。几周以后,后来统治整个BBS世界乃至Internet世界的ZIP在菲利普·卡兹手中发出了第一声响亮的啼哭!
不名则已,一鸣惊人,这种名为PKZIP的程序可以将一个或多个文件压缩到一个后缀为“.zip”的文件中,无论从压缩比、压缩速度方面都超过了商业软件 ARC。卡兹将PKZIP作为自由软件免费发放,使其如同草原上的星星之火般在全美的各大BBS上蔓延开来,用户以几何级数的增长,各大BBS的站长自发将原来使用ARC格式压缩的文件转换成ZIP格式,卡兹用他天才的头脑和顽强的毅力堂堂正正的击败了ARC,ARC的制作公司在PKZIP的强大攻势下很快就消声匿迹了。用自由软件打败商业公司的传奇故事很快传遍了整个BBS世界,疾恶如仇而又身手不凡的菲利普·卡兹如同数字世界的大侠般仗剑江湖,劫富济贫,以一人之力擎起了压缩软件的大旗。
此后卡兹一直继续着对 PKZIP的开发和维护工作,PKZIP建立和统治了DOS时代的压缩标准。直到Windows的诞生,使用卡兹创造的压缩算法的软件Winzip的出现更使ZIP格式成为Internet的传输标准,ZIP压缩格式也成为压缩文档的事实标准。
PKZIP及其“克隆”作品Winzip成为Internet历史上最有名的共享软件之一,ZIP压缩格式也成为压缩文档的事实标准,建立起一个统治Internet的“ZIP王朝”。菲利普·卡兹为世界贡献了一个伟大的共享软件,而他自己却几乎没有从中获得任何好处!因为从一开始,ZIP就是为了反抗收费的PKARC“而生”的。
但是,不良的生活习惯,长期巨大的精神压力,导致了潦倒无助的他在2000年的4月14号,死在了美国威斯康星州密尔沃基的一家汽车旅馆里,死时,手里还紧握着一个烈性酒的酒瓶。
Philip Katz从未在ZIP身上得到半点好处,坚持信念的结果往往是潦倒的生活,糟糕的个人生活和长期编写软件的巨大压力使卡兹染上了酗酒的恶习,最终断送了他那年轻的生命。他为世界贡献了一个伟大的免费软件,更为重要的是他缔造了一种大众化的压缩格式,然而却过早地离开了这个世界。
就在Philip Katz去世的前后,ZIP的最大对手:WINRAR,正在悄然崛起。当时Winzip早已稳坐压缩界头把交椅,但随着2.7版本的出现,Wrar却日益壮大,两者斗争得异常激烈(注:与Winzip一样,其实早在DOS时代,就存在RAR的DOS版本,只是RAR在DOS时代敌不过只能用命令行的ARJ,到了Windows时代又招架不住WinZip的进攻,皆因RAR压缩率低和速度慢,并且RAR压缩格式以前一直缺少其它软件的支持,导致WinRAR都未能广泛流行)。
就当时两者的性能而言,Winzip压缩只支持ZIP格式,解压缩支持ZIP、CAB,还有TAR、GZip、UUencode、XXencode、BinHex、MIME等几种Internet常用格式(可以看出WinZip的重心之所在),ARJ、LHA和ARC则需要相应的外挂程序。但WinZip跟Windows资源管理器结合得很紧密,最常用的压缩和解压缩操作已集成到鼠标右键菜单中,点按右键即可轻松完成压缩解压缩。并且增加了不少人性化的功能如E-mail功能,分卷压缩,密码加密等;那Winrar又凭什么与其争锋呢?答案是格式支持与功能!WinRAR压缩格式支持自家的RAR和ZIP(即可“兼容”ZIP),解压缩支持RAR、ZIP、CAB、ACE、ARJ、LHA、TAR、GZip、UUE,基本上常用的都有了。WinRAR在界面上类似WinZip在功能上基本是WinZip有的它都有,甚至有好多比WinZip还更好更强大。如有特色的”Repair archive”功能甚至可以修复损坏的zip文件;”Convert archive to SFX”功能把RAR和ZIP文件转换成自解压文件,同WinZip不同的是,在压缩时就可以直接存为自解压文件…取对手之精华,并改进之,这就是Winrar敢于与压缩界龙头叫板的原因。
或许到了这里,你会问:为什么zip不去支持rar呢?这样竞争不就“公平”了吗?但我告诉你的是:zip格式是开放的,任何压缩软件都可以免费使用,RAR是RARLab的专利算法,其它软件要想提供对Rar格式支持必须交纳费用以获得授权,如果winzip想要支持zip,就必须向rarlab付费,这根本就是拿自己的血汗去喂饱对手。我们须明白:winzip和winrar都是共享软件,中国人用惯了盗版的winrar,以为rar才是压缩格式的王道,如果自以为全天下的压缩软件都应该支持rar格式,那么只能说这是一种极其荒谬的认知。
虽然ZIP仍然是压缩文件的标准格式,但随着WinRAR的功能越来越强大,并且对ZIP的兼容性和ISO镜像文件的支持,固步自封的WinZip已经逐渐开始被网民们所遗忘。面临被打倒,昔日的强者做出了最后的反击–Winzip9.0。2004年发布的Winzip9.0是Winzip公司在02年后两年内第一次发布的Winzip软件更新,可见这次Winzip反击的决心。本版本的Winzip带来了很多新的功能特性,如:加密标准提高,支持符合AES技术的128位和256位的高级加密标准;支持64位扩展技术;内置了先进的“真空”压缩算法(Enhanced Deflate)等。这一切都是针对WinRAR 3.30,誓求夺回压缩界的王座。
可惜就像乔丹的最后出场一样,也许真的是老了,我们再难看到英雄昔日的光彩。
WinZip 9.0对压缩格式的支持并没有什么增加,支持原有的18种压缩格式,但仍然不支持ISO这一非常流行的镜像文件格式,并且最大的问题是不兼容RAR,这就令许多用户敬而远之了;相对而言,WinRAR 3.30目前的压缩格式虽然只有15种,但由于兼容ZIP和支持ISO,仅仅这两条就使不少WinZip的老用户心动神移了。
随着绝唱反击的失败,于2005年7月,WinZip被Vector Capital收购。
也许在天之灵的Philip Katz并没有想到有这一天,作为下载量达到1亿4000万次,成就压缩标准zip的Winzip计算公司好象没有考虑过用其技术来赚钱的事(实际上很少有人会在WinZip试用期过后支付29美元购买正版授权,因此WinZip至今都没有获得太多利润)。它为大家提供一款如此经典的压缩软件,曾经,它是何等辉煌,但如今却威风难再。或者正如歌词所说:”想回到过去,试着让故事继续,至少不再让你离我而去…”
首先是各种各样的任务,虽然引入了RoR框架为新系统带来便利,但学习成本还是要算进去的,综合评价系统和备课系统的实现也让我更深入了解了框架,总得来说好处更多。其中一个费时的原因就是一脚踢的开发模式,我真他妈讨厌写前端的东西,但又不得不做,另一个是我经常给打断工作,我觉得这是最严重的,因为要花更多的时间才能恢复到原先的工作当中。另一方面旧有系统很多都是不知什么公司用ASP来写的,一来我对ASP很不熟也很反感,另一方面修改起来真的是要大动干戈,我就干脆不搞了(事实上我是搞了太多了……越来越恶心)。所以,有时许多工作的确就叫做工作,并不是举手之劳。
我这人就是这样子,喜欢事必躬亲,这样才有把握某件事情状况的真实感受,即使只沾到事情的边儿。工作要高质量完成,是要有时间的保证,所以加班是必需的。突然想起以前主管说:别加班了,早点回去休息,休息好效率也高一点。这话也有道理,不过效率高也有个度,没有时间保证都他妈的是扯蛋的事。弄着弄着就晚了,晚了就休息不够,休息不够就容易生病,生病了就效率更低,效率低就占用更多时间……所以这段时间都尽量保证12点前睡着,每点早一点起来,即使是放假。
昨天还和老婆他们去了东莞图书馆看书,很是满足,很久没去过图书馆,看到一些熟悉的书目,也回忆起大学时期奋斗的日子,那个怀念。不过这图书馆的IT书目不是很新,不过勉强有些看头吧。
又说回最近的大课间,绝对是一个沉重的话题,可能这东西还得火好几年,孩子们真惨,小小年纪就禁锢了,连活动时间也不能开心地玩,在我眼中,这就叫他妈的没童年。
又说他妈的电信业务员的不诚实,800元一个月的对等光纤,骗我说上传下载都有6M,妈的上传速度压根就是2M,还说表面是达不到,事实上达得到,要达到不是你这样测速的,我晕到。妈的当我是SB吗?但这事情搞不过了,这人真他妈的恶心,寮步中国电信姓曾的,不记得名字。我就说如何不懂点原理,就要给骗死了……但事实上,用口骗你没商量,因为你还是得用呢。
其它综合科的所谓常规训练感觉也进行得风风火火,从开学到现在我根本顾不上这些,所以就没有进行,我突然在想,这他妈的是谁发明这东西,给小学生这么大压力的?还有个常规训练,我还以为是大学街舞队时的常规训练……在小学,优秀的学生基本上都是全能学生,各个科目都会抢着要人,看来这次我这吃亏了。
顶,这次好像说得太多,下次都不知什么时候说了。以后要多写技术文章才行,最近都懒于动笔了。最后推荐一个很好用的代码编辑器Sublime Text给大家吧,这东西已经出了很久了,不过现在感觉时机成熟,可以放弃TextMate的了。
]]>1、安装最新XCode环境或osx-gcc-installer,我选择的是前者,到官网下载Command Line Tool For Xcode - February 2012,只要这个就好,这就提供了最基本的编译环境工具链了;
2、rvm install ruby-1.9.3-p125 –with-gcc=clang,没有clang是不能编译通过的,因为苹果的gcc是自己定制过的。之后就是rvm upgrade ruby-x.x.x-pxxx ruby-1.9.3-p125什么的,看着搞就行;
3、还有后续工作是要重新编译一下gem里的一些native extension,特别是DB Driver,rvm requirements最后那里也有提示。不过我干脆就将gem全册再重装,可以用rvm gemdir来看gem的目录,把相关目录里的东东rm掉即可
4、之后就是常规的操作啦,一切OK
不过程序都布置到Debian下的,估计就不用考虑这些东西了:)
]]>总得来说因为时间很短,暂时也没什么可以分享的,不过刚看一篇好文,分享给大家:Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链
]]>