显示标签为“感悟杂谈”的博文。显示所有博文
显示标签为“感悟杂谈”的博文。显示所有博文

2012年11月23日星期五

SCUTOJ 建站手记(2)

由于这一段时间一直在忙各种实验和课设,而且目测还要忙到差不多期末,然后又差不多要考试,所以总体来说项目进度比较慢,还是断断续续的。目前只能说把网站搭起来了,但是还需要继续深入进行二次开发,而前提是需要先大概过一遍源代码,某些关键的地方还要多加留意才是。
目前主要的问题是没有专业的web前端人员啊!只能是在下先大体改了一下界面,但是毕竟不是专业美工,效果肯定不咋的。。。今天刚好有时间,就收拾了一下界面,顺便把域名弄好了(上次注册到的tk域名竟然被回收了,完全不明所以啊 = =希望这次没事。。。)

=========================
由于在理想规划中是不止一个子域名的,这就需要用到基于域名的virtualhost配置了。关于apache虚拟主机的配置网上有很多,这里就简单说一下。

#环境:ubuntu 10.04 LTS 
#创建virtualhost配置文件
cd /etc/apache2/sites-available/
copy default scutoj      //copy一份默认的配置再修改,比较方便

其实要改的只有几处:

<VirtualHost *:80>        //服务器只有单IP的情况下这里不需要修改(个人理解)
ServerName www.example.com              //自定域名
DocumentRoot /var/www/                //这个有需要的话可以该,我将它指向OJ的根目录了,也就是直接访问IP的话就进入OJ的根目录index页面,以前要手工输入目录名,不然就是默认apache的index.html
其他貌似没什么改动了,还有一个ErrorDocument的参数可以添加,可以自定义出错页面,比如diy的404...


然后就是启用域名:
sudo a2ensite scutoj    //apache2 enable site的缩写,其实就是在sites-enable/里创建symbol link,指向VH的配置文件
sudo service apache2 restart

关闭网站服务: sudo a2dissite scutoj
====================

接下来的计划其实蛮激动人心的 = =!!
因为自从我在SJUT-NIC回来之后,就对web application产生了相当大的兴趣,对web架构,web服务器,数据库以及众多的web开源框架与应用之类的都有莫名的冲动~希望能自己亲手实现一下。
在目前OJ的系统当中,只提供了基本的judging和contest等等服务,原生论坛太搓,所以准备自己搭一个论坛挂在主站上面,想试试Rable(基于Livid的PB2)。最近泡V2EX比较多,觉得论坛的话还是这种比较好~更重要是的想玩玩Ruby on Rails啊!(其实《python学习手册》我都借回来了,暂时还没时间看...但是ruby对我来说更有神秘感,嘛,可以都看看,到时再决定用python或者ruby或者PHP。
另外还需要一个关于ACM的文档和心得体会分享平台,用mediawiki搭一个wiki感觉上是个不错的方式。个人也很喜欢wiki的分享方式,只是不知道实际运营起来效果怎么样。

这样算下来,二级域名下面就有三个子站了,还是蛮不错的~有得折腾~

其实这些天一直在想另外一个很现实的问题,就是:OJ该由谁来负责长期运营和维护呢?在下是真心不想交给学院,事实证明无论什么东西,到了行政机关手里都会变成一堆渣渣 = =
在下希望这是一个有活力的project,以至于product。所以一个好的管理员或者管理团队是必须的,就好象Livid一个人给整个V2EX注入了灵魂,这个社区才能通过口碑吸引不少高质量的用户。这方面感觉其实SYSU做的挺不错的,他们的官方OJ是由ACMM协会负责维护的貌似,还有一个很萌的吉祥物sicily。POJ或者HDOJ都比较正式和官方的感觉,但毕竟是老牌,所以题库和用户积累是个很重要的因素。

综上所述,SCUTOJ要走的路还很远啊。。。希望不要半途夭折就好Orz

PS:近期准备学markdown,在github page上个octopress,因为blogspot实在太蛋疼了。。。希望在下次有需要写post之前能弄好吧。。。

2012年8月12日星期日

SJTU-NIC实习总结

机缘巧合之下,有幸来到SJTU-NIC实习。转眼已经过去一个多月了。回顾在SJTU这一个月,感触良多啊~

七月份来到交大,一整天的火车啊。来之前并不算顺利,家里人意见蛮大的,主要是担心安全问题,而且也不想我整个暑假都在上海。说起来,也算是我一意孤行吧。并不是我不想回家,只是在家里的学习效率真的不能让我满意。琐琐碎碎的事太多了,囧。一直都认为在学校,在图书馆,在实验室的时候,效率是最高的。事实也证明,交大没有让我失望。

在Omnilab的日子,跟随 @WeiJianwen 老师,与 @WangHaiyang @LiuYukun 共事,学到了很多。应该说,我还是蛮幸运的。同来的另外一个实习生被分到openstack组,负责dashboard的前端开发了。本人是真的对前端无爱啊....而我则被分到BigDate组,负责Ganglia分布式监控平台的部署配置。应该说,这和我预想中的工作差不多,也是我目前最愿意做的。主要是纯linux的工作环境让我期盼已久啊!大体上,这是偏向运维一类的工作。大部分时间是工作在SSH的remote host上(终端什么的总是很有爱的~)。

整个实验室架构大概是:openstack组负责提供IaaS层的VM,然后在上面部署Hadoop与HBase环境,由rsyslog daemon负责从远端数据源接受海量数据转发到Hadoop经过分析写入HBase。Hadoop Cluster状态则有Ganglia负责监控,包括CPU,disk-IO,network-IO,memory等。

应该说,最大的收获是对linux操作熟练程度有了很大提升。之前一直苦于没有一个合适的环境来实践书上的各种理论,对服务器的各种daemon理解都不深。在实验室的时候,案上必备一本鸟哥,随用随查,感觉甚好。另外,实验室采用wiki的资源经验分享方式,结合git项目管理,让我受益匪浅啊。只是可惜直到现在对git的使用还是处于初级阶段,汗一个。。。还有就是对云计算和海量数据处理的概念有了一定理解。目前实验室项目的研究水平在国内的高校甚至业界也算是领先的吧,接触到都是世界范围内的领先技术与概念,真心感受到云计算的发展前景相当大啊。而海量数据处理也是相当程度上依赖于云技术,目前这两个名词已经被炒得相当火了。。。

实习期间还好是住在交大里面,白天全身心投入到工作中,到晚上回到宿舍不用怎么折腾就可以睡了。交大的环境很好,黄昏的时候,还有闲情逸致漫步校园。周末或泡图书馆,或到外面逛下,时间过的真心充实。这才是我梦寐以求的校园生活啊!~~

上一张wiki的图以示纪念吧~半个月的成果~


2012年6月6日星期三

host主机SSH登陆虚拟机配置

说来玩了linux 1年多还是第一次SSH登陆 = =汗
大概弄了半个晚上 + 半个早上
显示解决了互ping的问题,设好SSH,解决putty的中文乱码。。。
问题真是一个接一个啊 = =


先说说环境吧。
host:win7 ultra, 客户端用PuTTY登陆, Oracle Virtualbox
VM:GNU/Linux debian 6.0,openSSH


----------------------


物理机配置(host configuration):
virtualbox 设置-> 网络,启用网络连接1,选择NAT,网络连接2,选择host-only adapter
宿主机当前使用的网卡设置为 “允许共享” 给虚拟网卡

cmd下看看网络状态:
ipconfig /all
应该可以看到本机真实网卡信息和虚拟网卡信息,将host-only的IP记下(我这里是192.168.137.1)


虚拟机配置(VM configuration):
先看看网络情况
$/sbin/ifconfig -a
看到有eth0 和 eth1
由于我装debian的时候选的NAT和DHCP,所以eth0就是分配到的子网IP:10.0.2.5
eth1默认没有设置IP,负责和虚拟网卡通信

以下设置eth1

$sudo gedit /etc/network/interfaces
添加下面配置:
# 启动系统激活设备
# 网卡eth1设置为Static类型
auto eth1
iface eth1 inet static

# 指定IP地址、子网掩码、广播、网关
# IP和host-only虚拟网卡同一网段即可
# 网关地址为宿主机的虚拟网卡IP
address 192.168.137.2  
netmask 255.255.255.0
broadcast 192.168.137.255
gateway 192.168.137.1

保存之后

$sudo /etc/init.d/networking restart  //重启网络服务
$/sbin/ifconfig -a   //查看当前网络状况


看到eth1正常配置即可

然后VM和host互ping,ping通就说明可以进行SSH登录了

------------------------------optional
debian默认没有安装SSH服务端,so

$sudo apt-get install openssh-server
----------------------------------

2012年5月21日星期一

Gobang summary

电工实习两周,算是抽空把Java的大作业搞好了。感悟还是蛮多的,遂记录之。
原来看《thinking in Java》的时候是完全不懂GUI,不单如此,很多之前看过的知识由于没有应用到具体项目中,时间一长竟然忘了许多。以《thinking in Java》如此丰富高深的内容,涉及各种design pattern和 类机制,其实真正会用的真不多。。。现在觉得可以重新回头看看要点了。
老实说吧,刚开始的时候真是各种不适应。用惯了C的人,代码越简洁越好,但是面对Java这一坨坨的类。。。好吧,确实有点难以接受咯。如果不是有eclipse这种自动化程度这么高的IDE,而是用什么notepad ++,估计早就崩溃了 = =

敲代码过程中主要还是吃老本,Java的特性没用到多少,反倒是有点C++的OOP影子。但是基础方面我觉得两者差不多吧,都是OOP的话。

说回五子棋。其实核心的也就是AI算法。基本思路是用二维数组模拟棋盘状况,然后对每个可能下子的空位置进行评价,也就是在最有价值的位置下子。这个价值判定分两部分,对己方的有利程度和对敌方的有利程度。对一个位置的考虑是有主攻和主防两种方向。实现起来也不算难,就是根据相同的权值表对该位置进行两种角色的评价。但是这个算法其实还远远不够,顶多只能算考虑了一步半(比只考虑进攻的要好点)。考虑过A*寻路算法+启发式搜索,还有博弈树,但是无奈水准还不够啊,真要弄起来估计deadline之前完成不了,遂暂且作罢。但是这个思路我觉得还是不错的,就是实现起来可能会比较麻烦。
另外还有一点深有体会的就是各组件之间触发事件的相互响应。Java的事件机制感觉上比较混乱,而且功能不够齐全,有些还有自己实现。各部件之间基本上是通过父部件来进行通信。e.g. A component 的listener接受到触发信号,然后需要通过parent component来调用B component的函数。有时候直接用getparent方法还不行,要在构造的时候直接传入父部件的引用,这样貌似效果要好点。

类的设计也是很讲究技巧的。怎样才能体现程序的高内聚,低耦合呢,这里貌似有点类似递归的思想。把大任务分成很多的小任务,由对应的对象完成。也就是说,作为某一类对象,其自身拥有的特殊属性和操作应该封装起来。这个就好像DIY,父部件把任务分配给子部件,至于怎么完成就是子部件的事了,父部件关心的只是任务完成的结果。如果是大量重复的子部件,更应该仔细考虑这个问题,尽量提高代码复用性,同时注意节约内存空间。这些都体现在代码的细节上。

前期的话,基本上是变开发边重构的。因为本身就不熟悉Java,同时会参考另外的样例程序。通过比较代码,了解原作者的思路,同时思想为什么要这样写,有什么好处,是否有更好的实现方法。经过不断的对比debug,算是搞出一个相对精简的AI算法。效果上来说还过得去吧。还有就是蛋疼的UI布局管理器,这里就不多说。各种触发事件之间的协调变化也是要慢慢理清思路才好下手,反正都是细节问题。

要说开发这个程序,主要目的还是熟悉基本的UI设计与操作,事件机制和OOP思想。现在看来,预期目标算是基本达到了,良好的核心算法是需要扎实的算法基本功和建模能力的,这个在不断加强中。
Anyway,熟悉软件开发流程算是暂告一段落。貌似各种书和资料(PPT,pdf)什么的已经积压的很多了,还有得忙呢。期待暑假的锻炼~


源码已托管于Google Code:
code.google.com/p/gobang-scut-csne/
为开源社区贡献的第一份代码 T_T

2011年12月14日星期三

转一段书评

from 豆瓣《我是一只IT小小鸟》


    一年多前,我到一位朋友家作客,他从学校已经毕业半年有余,没找工作,一直呆在家游手好闲。当时电视正在播电视剧《奋斗》,看了半集我问我朋友,这片子有什么好看么?而我朋友则一面严肃的表情说“你不懂,这片子特励志,不是你这种90后理解得来的”,并表示,等看完这部电视剧以后,自己马上也要开始奋斗;我没想到这种流行电视剧居然有如此“功效”,实在令我有点将信将疑。
 
  一年后,我再次拜访这位朋友,他依旧是无业流民,每天过着:上网-看电视-睡觉,三点一线的生活,还时不时跟我抱怨说,为什么别人刚毕业就有奥迪A6开,老爸一给就是两百万,用的诺基亚8800,都怪我爸妈不努力呀。
 
  我听完,心中满是唏嘘,心想,你要是一年前真的开始努力奋斗,即便现在没有大富大贵,起码也不必落得这斯田地。 

  同样地,适逢计算机专业成为最难就业专业,高校里有不知多少为仕途忧虑、对未来毫无概念的计算机专业学生,然后恰好这本书就出现了(这个时机决定了它必然是一本畅销书),那些迷惘的学生肯定是迫不及待地订购了一本,然后读到书上那些成功的学长学姐们,就如同我那位朋友看了励志电视剧一样——满腔的热血都被激发了,心中暗下目标,将来也要成为一只“小小鸟”,入主google,差一点的也要去个微软研究院什么的。 

  可是当他们实践起来的时候,才发现行动起来是如此的难,少了老师的填鸭,任何事情都变得寸步难移了:什么c/c++、java一点不会(老师还没教会我呢),linux难用得要死(之前我都是用windows的),搭个web服务器居然不能点鼠标来设置(linux的编辑器连鼠标不能用,天哪!)。。。一次次尝试之后,他们开始受挫,几次失败之后,他们放弃了,心想,都怪这本书,害我一时激动白费了那么多努力,维持现状不就够了,拿到文凭不就行了,折腾那么多干嘛? 

  励志形式的题材总会给人一种错觉,就是它们都把未来描绘得太美好了:那些读书的年轻人们,那些单纯而浮躁的年轻人们,一心只想着也给自己创造一个美好的未来,却对得到一个好的结果所要付出的代价和努力知之甚少,甚至充耳不闻。

  很多深陷泥潭的人,他们从来不去思考自身的困境,却满心期待着通过一本两本书、一部两部电视剧,希望从中得到启发,让自己脱胎换骨,那无异是痴人说梦;

  即便你真的能排除思想上的障碍,将计划付诸行动,在过个程中,也有无数这样那样的困难,挡住你前进的道路——这是一个漫长而艰苦的过程,决不是一时意气就能坚持下来的。

  你要做的,不是看几本励志书、重温几部像《奋斗》那样的片子,或者跑到小组上问像“学c++该看什么书“之类的蠢问题,而是应该把你脑子中那点渴望不劳而获的思想赶跑,把你从小到大养成的无须思考、等待答案的填鸭式教育带来的坏习惯改掉,然后,也是最最重要的——开始做实事,这就够了。

  看到满版评论都在为这本书喝彩,看到不少朋友立志成为“小小鸟”,我忽然有种毛骨悚然的感觉,毫不客气的说,我想这里面大部分人(如果不是全部的话)都会精神抖擞而去,垂头丧气而归。

  前几天一个刚大一的朋友问我一道很简单的c语言题目,我告诉他思路,说这道题用bit operator来做,他说不会,让我直接给答案,我希望他自己做出来,就跟他说我也不会你自己做,拉拉扯扯了一个多小时,最后他从网上搜出了一个答案交给老师。

  据他说,他们班上大部分人都是那么干的(每当老师从背后经过的时候总是胆战心惊),我对这群同年人有点失望,觉得学习不应该这样得过且过,随即又明白一个道理:很多时候,我们对别人的选择其实无能为力;

  开个玩笑,假如给我朋友那班的大一新生全部发一本《小小鸟》,他们就会认真对待自己的编程课吗?我想未必,因为他们本身都不愿意努力,我们对他指手划脚、好言相劝,又有什么用呢?


-------------------------------------------------------------------

个人觉得,一样东西的存在,总有它的道理,励志文学也是如此。虽然说执行力确实是另一回事,但起码会给人一个奋斗的目标。有动力,还需要持之以恒。找准方向才是第一要务。多花一点时间,思考一下人生的路,未来的路,未尝不是一件好事。技术无止境,找到真正属于自己的,适合自己的,才会事半功倍。

有时候确实会很迷茫,各种各样的技术与方向,那条才是自己的路。看过各种博客,也经常去请教师兄,始终不得其道。大概有些事,是真的要自己走过才能深有体会吧。

2011年11月27日星期日

关于子函数的一些思考

前天和海天说起关于编程能力的问题。其实对于编程这东西,从来都是熟能生巧。自从开始做题以后,才慢慢发掘编程基本功真的好重要。简单的说,就是一种思维,或者说是条件反射。当你遇到一个问题,你很自然的会将之细分化,分隔成若干个过程,也就是子函数。这样你就只需要关心子函数的参数输入和返回值。对于整个main函数的流程构成是相当有帮助的。即使是debug的时候也可以很有针对性的进行调试。思路也要比之前只有一个主函数的时候清晰很多。
可以说,子函数就是一种解决问题的思想。对于如何快速的写出各种子函数,这就是考验编程能力的时候了。而main函数则是整个问题的基本思路。这样一道题的代码敲出来就要好看很多了。。。。
个人感觉这里面是有点面向对象的思想....不过想想也是,对象调用的成员函数不正是子函数的一种么? = =

2011年11月8日星期二

POJ 1517 大水



#include
int main()
{
int i;
double t = 1,sum = 1;
printf("n e\n- -----------\n0 1\n");
for(i = 1;i < 0;i ++){
t *= i;
sum += (1 / t);
printf("%d %.10g\n",i,sum);
}
return 0;
}




关于%g的消零使用,第一次遇见 = =

2011年11月7日星期一

POJ 1504 字符串处理


感觉这题就是atoi和itoa的重复使用。。。。不过思路还是蛮清晰的
但看了discuss之后发觉弱爆了 = =

char* a[M],b[M],sum[M];存储输入的两个正整数,然后去除a,b中的前导0和后缀0,下标由0开始由低到高带进位相加存放在sum中,再去除sum中的前导0和后缀0,然后输出就行了。因为 反转(反转(a))=a,所以这里就是改变了一下加法的规则。
这题比较好的解法,如果是模拟的话还要考虑数据溢出问题。用这个方法可以直接上高精度。嗯,很好~

还有strrev函数、、、囧,各种方便。。。。



#include
#include
#include
void swap(char *p,int len)
{
for(int i = 0;i < len / 2;i ++){
p[i] ^= p[len - 1 - i];
p[len - 1 - i] ^= p[i];
p[i] ^= p[len - 1 - i];
}
}
int main()
{
int n;
scanf("%d",&n);
while(n --){
char a[15]={'\0'},b[15]={'\0'},sum[15]={'\0'};
int c,d;
scanf("%s%s",a,b);
c = atoi(a);
d = atoi(b);
_itoa(c,a,10);    //用itoa还不行,必须用_itoa
_itoa(d,b,10);
swap(a,strlen(a));
swap(b,strlen(b));
_itoa(atoi(a) + atoi(b),sum,10);
swap(sum,strlen(sum));
printf("%d\n",atoi(sum));
}
return 0;
}

2011年10月26日星期三

算法之道—形而之上谓之道



注:本文转载自程序员


1966年3月的一天,美国加州大学洛杉矶分校的Andrew J. Viterbi教授在给研究生讲解缠绕编码的时序译码算法SDCD。但不管他如何讲解,学生就是听不明白。思来想去,Viterbi觉得学生不能理解的原因是该算法的证明过于复杂。于是他开始考虑如何简化这个证明。在经历了持久的烦躁和困惑后,他灵感顿现:需要简化的不是算法的证明,而是算法本身。于是Viterbi对SDCD算法进行了少许修改,提出了基于Trellis的概率译码算法。这个算法就是后来著名的CDMA技术的基石。Viterbi也因此而身价暴涨(创立了高通公司,赚取了数十亿美元)。