居然就到2013年中了,刚过了6.18电商血拼和漫长酷热的夏至,才意思到,我已经很久没写博客了。当时愿意花几个晚上折腾博客的骚年逐渐被工作取代了闲情逸致,这样不好不好。要找回我的课外时间,就从这篇记录面经博客开始吧。


UC,当时参加的是校招,不是实习生招聘,校招笔试到发放offer时间跨度是一个月,基本上笔试->一面->二面->三面,每一步隔一周。每年的10月是IT企业校招高峰期,同一时期,和同学们听了小米,百度,UC三场招聘。其中UC的宣讲会最打动我,他们的大五文化视频有两幕我记忆深刻:1.一群技术男穿着拖鞋,T恤,短裤,一边上厕所一边做着头部运动 2.一个文静的美女因为到饭堂晚了,眼看最后一个鸡腿就要被前面一个男屌丝打走了,男屌望着美女,对打菜师傅说,鸡腿给她吧,后来美女在电视上看到此男屌是公司联合创始人何小鹏。虽然这两幕都很平常,但是却展现了我喜欢的自由,平等氛围,再加上在学校的不如意(挂科,什么比赛也没参加过,白得像张纸的简历,老师学校不重视不关心),当时我就感动得眼泪差点掉下来,对比其他企业,UC招聘宣传片做得真用心。


因为大二的时候也做了UC的笔试,没过。所以这次也是抱着打酱油心态,陪同学感受移动互联网企业来的。UC的笔试内容是根据岗位来分的,我投的是系统工程师职位。一卷是智力题,这个好像所有岗位都一样,智力题个人最不喜欢,有些你没见过的题,真的让人感觉智力捉鸡,看了答案也觉得不爽,因为即使你以后会解这种题,智力也没感觉提高。二卷是专业题,考的比较广泛,大致分为操作系统(进程,内存管理,IO,文件系统),计网(常见协议,端口,路由之类),简单数据结构(二叉树,递归,指针),工业常用技术(热备份,MySQL数据库,负载均衡策略)。当时笔试忘记带笔,只有打草稿的铅笔,字迹写得非常潦草,后来HR也问到为什么用铅笔答卷,我当时瞎说那铅笔从高考就跟着我了,是我的幸运之笔。。。


因为没有比较正式衣服,借了飞仔的黑色马甲穿,一人到了UC广州科韵路总部。一面人比较多,我们都被安排在门口内坐着,每个人贴了张贴纸在手臂上。UC的门禁上方帖着显眼的火灾逃生线路图,等的比较长时间,我对着图纸看了很久。人生第一面,终于被一个穿红色衣服的男人牵着去了上一层楼,因为找不到空的会议室,在楼上又等了30分钟,不过前台很好,给我倒了水,看了会杂志。第一面的考官问了约摸20个小问题,操作系统,计网,数据库,Linux命令,这4类分别5个问题,问的都不太难,感觉策略就是:操作系统往上下文切换,分页分段管理多看;计网一定要知道TCP三次握手,状态迁移;数据库除了常用SQL语句,往底层MyISAM, InnoDB引擎了解下;Linux多玩下桌面ubuntu自然就会了解和系统内核交互的常用命令。


顺利通过了一面,二面人就很少了,因此没怎么等,就进去会议室面试了。二面这位面试官我很喜欢,是运维组老大,温文儒雅,身上的气质让我想起了小学教钢琴的音乐老师。最开始也是自我介绍,然后他问我为什么选择UC,选择移动互联网,我照实说家里其实是希望我考公务员或者进国企的,但是我觉得年轻人应该做些有挑战的事,而且本人鄙视党员鄙视国企,没想到面试官赞同了我,接下来我就一发不可收拾批判一些社会现状,然后他微笑地对我说“有意思,你有点棱角”,然后我回了句“我是有点小愤青”(这绝逼不是技术面,是性格面),接下来我感到很轻松,能遇到和你价值观社会观相同的人,是幸运和幸福的。最后他让我提一个问题,我准备了一个自认为比较好的问题:UC浏览器敢于自己研发一个内核,一定接触到操作系统底层了,有没有想过做一个UC ROM,让整个系统都为UC浏览器优化,浏览器做为应用的平台,也许可以在论坛上开放给发烧友试玩,你看小米这样的新公司都敢做MIUI ROM(我不是米黑,MIUI第一版的确只是改改android皮肤)。面试官的想法是,公司只能集中人力做好一件事–本职浏览器,再去做一个ROM,对公司战略太分散了。


三面HR面,正是宣讲会上的主持人,听口音是东北妞,身材很好,HR还没有见过不漂亮的。HR面,只要诚实的扯扯淡,估计就好了。

第一个学习的数据库,以MySQL开刀。

Server version:mysql 5.5.24-0ubuntu0.12.04.1 (Ubuntu)

1.字符集修改

mysql5.5版本以后不支持修改default-character-set方法,改为vim sudo:/etc/mysql/my.cnf ,在[mysqld]后添加

character-set-server=utf8

最近帮南都报社的一小子买了台10.6寸上网本,为了自己也尝尝新电脑玩,将我自己那台14寸笔记本格了,把两台电脑都装了ubuntu12.04 & win7双系统。自然是以前的octopress配置都没了,所以我要在两台电脑都配置好octopress本地环境,创造一个写博客的好环境。


一.安装ruby,git等软件依赖

1
2
3
kiwi@kiwi:~$ sudo apt-get install git
kiwi@kiwi:~$ sudo apt-get install ruby1.9.3
kiwi@kiwi:~$ sudo gem install bundler --pre

二.从github上获取你的博客

1
2
3
4
kiwi@kiwi:~$ git clone -b source git@github.com:orange8637/orange8637.github.com octopress
kiwi@kiwi:~$ cd octopress/
kiwi@kiwi:~$ git clone git@github.com:orange8637/orange8637.github.com _deploy 
kiwi@kiwi:~$ bundle install

由于octopress这个项目和我们其他的github项目不同,它可不是只有一个master分支的,所以我们要理清一个关系:文件目录octopress对应远程和本地的source分支,_deploy目录对应远程和本地的master分支。

1
2
3
4
5
kiwi@kiwi:~/octopress$ git branch
* source
kiwi@kiwi:~/octopress$ cd _deploy/
kiwi@kiwi:~/octopress/_deploy$ git branch
* master

好了。不到10条指令,源速度够快的话,10分钟我们就配好了octopress环境,就是这么简单,没有数据库史上最快的可以版本控制的博客环境就可以工作了。多rake new_post吧。

第一天,睡觉刷微薄。

第二天,刷微薄睡觉。

第三天,…… 。


和胡适先生打牌打牌一样,我一到暑假就彻底慵懒,从小学到大学,暑假从来没有好好利用。开始是有规划的,但是一计划就是一整个暑假,也就是睡睡睡。

吐嘈完自身后,还是总结一下这几天在看奥运刷微薄间隙看的一点python入门书经验吧。

相信很多人都听过这个笑话:一哥们去谷歌面试,简历只有一句话:I wrote python,结果面试到第10轮谷歌才知道这句话的意思。这哥们就是大名鼎鼎的Guido。我当时听到这个笑话,有点纳闷,怎么以python为噱头,而不以cpp,java这些更有名的语言抖包袱呢。现在想来真是惭愧,大二了才知道python。

程序员每隔一段时间就会讨论各种语言的优劣,就像月经一样,即使像Linus这样的高手也不能避免。我个菜鸟就不浪费时间参与python和java,cpp的对比了,直接show the code, 展示一下python的美丽。

tcpS.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/env python
# encoding:utf-8
from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
  print 'waiting for connection...'
  tcpCliSock, addr = tcpSerSock.accept()
  print '...connected from:',addr
  while True:
      data = tcpCliSock.recv(BUFSIZE)
      tcpCliSock.send('the server replid at %s %s' %(ctime(), data))
  tcpCliSock.close()
tcpSerSock.close()

抛开这段代码干什么,直接看外貌,想起一个同学曾经语重声长地对我说:python的代码很漂亮。用现在很火的中国好声音导师哈林老师的话讲就是:python代码辨识度很高。刚接触python一个星期,python用缩进的简洁取代其他语言的各种括号要漂亮多了。

言归真传,这个python例子是实现一个C/S架构的网络编程,重点是socket。我用的是TCP,先讲讲服务器的设计要点:创建服务器套接字->绑定地址到套接字->监听连接->服务器无限循环->接受客户端连接->通信循环->与客户端对话->关闭客户端套接字->关闭服务器套接字。

有了S版本,自然要有Client版本:

tcpC.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /usr/bin/env python
# encoding: utf-8
from socket import *

HOST = '192.168.1.103'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
  data = raw_input('>>> ')
  tcpCliSock.send(data)
  data = tcpCliSock.recv(BUFSIZE)
  print data
tcpCliSock.close()

客户端版本设计要点就简单多了:创建客户端套接字->连接服务器->通信循环->对话->关闭客户端套接字。

下面就要测试了。主机ubuntu12.04-desktop运行tcpS.py

客户端虚拟机下的centos6.2-server运行tcpC.py

大二的小学期终于结束了,标志着我的大学二分之一已经过了。


搞完了tinyos的实验报告,看了一部诺兰导演的电影《致命魔术》,演员都是我很喜欢的,有金刚狼,蝙蝠侠,还有我最喜欢的scarlett。电影似乎被定位为悬疑/惊悚片,但我看到更多的是两种对魔术境界追求的人。金刚狼为了追求表演结束时的掌声和观众惊讶的表情而表演魔术,蝙蝠侠为了将魔术钻研到最高境界而表演魔术。两位都是狂热追求魔术而几乎丧失人性的大师,导演也借此讽刺了爱迪生阴暗的一面。


这是大学最后一个暑假了,大一的暑假因为突如其来的疾病睡了一整年,所以大二下的暑假是真正意义上的第一个暑假。一入计算机之门深似海,这是一条技术的不归路。金刚狼和蝙蝠侠恰好就代表了对技术追求的两种人:是为了用技术实现工程,应用,创造改变人们生活的产品而学习技术,这是工程师的思想;还是为了学术的至高无上,理论的完备性,什么都要建立在数学的基础之上的科学研究,这是科学家的思想。当然这两者有一个共同点,都能改变世界,我不能否认谁不好。


金刚狼使用特斯拉的线圈机器把魔术做得复杂以至于找不到明显的缺陷,蝙蝠侠使用栾生兄弟把魔术做得简单以至于明显找不到缺陷。每次看到别人的博客写着若干年前,中学的他们随手拿起了一本《VB 》,然后啃出了一片IT的天地就默默敬佩。这个暑假,我也要过一个技术的暑假。Today,我不随手地拿起了一《python基础教程》,以Unix为中心学习python。

一直以来,我最敬佩的不是那些技术看起来很牛很牛的人,而是那些文笔很好的创作设计者,不写博客的程序员不是好程序员,这是我的价值观。本来是不打算转载任何文章的,但是在豆瓣看到这个书评小魏爱生活,太喜欢了。近期要常上豆瓣读书与CSDN。


世界是如此的熙熙攘攘

让年轻的心找不到方向

但这些人是不能小看的啊

如果

他们开始敲打自己的命令行

  

“一群IT小小鸟,来自十几所院校,或科班,或非科班;或男生,或女生,在失望中追求希望,在迷茫中辨别方向……”那些故事太真实,让我觉得就像一个个学长学姐在我熟悉的教室里平静地给我讲他自己的故事一样,让我越读到后来,越怀着一种崇敬而羡慕的心情。

  

那些讲故事的人,是一开始就定好方向,然后一步一步走过去也好,还是在跌跌撞撞中摸索,最后找到自己的方向也好,都以认真的面孔,上进的姿态生活,然后在一点点进步,一点点思索中理所当然地走到那么一个平衡的状态——可以与生活握手言和,可以那么自然地审视自己的原来,然后平和而谦逊地告诉我们于自己经历中总结的道理。

  

在故事的字里行间,在每个不同的人不同的道路上的是相同品质,持久而坚定,专注而踏实。他们言传身受让我觉得,那由对自己对未来的不确定而引起的惶惶是一种多么无知的状态……收获那么少,只因为自己把那么多不曾用心打理的时间浪费在幼稚的好高骛远和无数的浅尝辄止上面。现在大二觉得时间那么那么少,才可惜大一的时间被自己那样低效率的牺牲。开始时那样充满期待的希望自己可以成为怎样怎样的牛人,然后在“谁谁很厉害”“谁谁做了个什么什么”的“听说”中,自己也知道了一些概念,然后匆匆的去学这个技术,去看那个书……书也真的是看了些,但翻透的少,囫囵的多……泛泛的涉猎中也有了一些自己的偏好,但真的不敢说什么是自己坚持下来了的,那么多时候只是让自己处于一个不停步的状态,以求不被落下的太远,不被鄙视的太多,却一直没有魄力停下来,认真的反思,认真的规划,认真的坚持……

  

优秀的人,优秀的故事,不是让我们在对比中无限的自卑,而是提醒我们去反省总结,去调整自己。我承认对比和反省中我对自己很有几分失望,但我依旧对未来抱以全部的希望。

Description Time Limit:1sec Memory Limit:256MB

The N cities of Estiah are connected by N-1 roads. The roads are built in a way that it’s always possible to travel between any two cities. Now the king of Estiah wants to pair adjacent cities into defending units. Two cities are adjacent if they are connected directly by a road. Each defending unit consists of exactly two cities, and each city can never be paired into two different defending units. What the king wants to know is if it’s possible to have all the cities paired into defending units. Can you help him ?

Input

The input consists of several test cases. The first line of the input is an positive integer indicating the number of test cases following. Each test case starts with an positive integer N (1<=N<=10000) , which is the number of cities. Cities are numbered from 1 to N. The next N-1 lines each contains two positive integer A and B, indicating that there is a road connecting city A and city B.

Output

For each test case, output a line containing “Yes” if there is a way to pair all the cities, or “No” otherwise.


挺有意思的一道小题。定义:没有回路的连通图为树。对于图G=(V,E),V=N,|E|=N-1,显然这里的无向连通图即为树。要判断图是否能将连通的节点两两配对,看似无从下手,其实这里要用到贪心思想,首先找出一个配对原则:一棵树的叶子节点要配对,显然只有跟它的父节点配对。所以我们可以从叶子节点入手,把整个问题划分为所有叶子节点是否能完全配对,若所有叶子节点(度数为1的节点,删除一个节点后,相邻节点可能成为新叶子)都能配对,则Yes。因为题中N<=10000,所以邻接矩阵会超时,这里用邻接表,vector,list,set都行,并用栈或队列存储叶子节点。

顺便吐嘈一下我们学院,除了做ACM题,其他都被弱化了,尤其是操作系统和计算机网络,教学和实践做的太不好了,一味的鼓励刷题,这不是真正的计算机专业,算法很重要,但是过度强调竞赛,就变成了另一个奥数,毁新手不倦。

节点配对
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<set>
#include<string.h>
#include<stack>
using namespace std;

set<int> adj[10001];//存储邻接表
int deg[10001];//保存节点度数
int del[10001];//判断节点是否配对,即是否被删除
stack<int> leaf;//保存叶子节点入栈

int main()
{
    int t;
  scanf("%d", &t);
    while(t--)
    {
        int n;
        scanf("%d", &n);
        memset(deg, 0, sizeof(deg));
        memset(del, 0, sizeof(del));
      while(!leaf.empty())
            leaf.pop();
        for(int i=0; i<10001; i++)
            adj[i].clear();
        for(int i=1; i<=n-1; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            adj[a].insert(b);//无向图
            adj[b].insert(a);
            deg[a]++;
            deg[b]++;
        }
        for(int i=1; i<=n ;i++)
            if(deg[i]==1)
                leaf.push(i);
      while(!leaf.empty())
        {
            int v=leaf.top();
            leaf.pop();
            if(!adj[v].empty())
            {
              int j=*(adj[v].begin());
              for(set<int>::iterator it=adj[j].begin(); it!=adj[j].end(); it++)
              {
                  adj[*it].erase(j);//与被删除节点相邻的边都删除
                  deg[*it]--;
                  if(deg[*it]==1 && del[*it]==0)
                  {
                      leaf.push(*it);//如果这个节点此时度数为1,入栈
                  }
              }
              del[v]=1;//删除配对成功的两个节点
              del[j]=1;
          }
        }
        int ok=1;
        for(int i=1; i<=n; i++)
            if(del[i]==0)
            {
                ok=0;
                break;
            }
        if(ok==1 && n%2==0)//只有偶数个节点才能配对
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

先提出问题,以后在解决。 案例1

键盘输入流缓冲区
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>  
using namespace std;
int main()
{
  char name[10];
  cin.getline(name,5);
  cout<<name;
  cin.getline(name,5);
  cout<<name;
  return 0;
}

案例2

文件输入流缓冲区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
int main()
{
  freopen("data.in", "r", stdin);
  map<char*,double> m;
  char name[100];
  double score;
  for(int i=0;i<2;i++)
  {
      //scanf("%s %lf", name, &score);
      cin>>name>>score;
      m[name] = score;
  }
  for(map<char*,double>::iterator it=m.begin(); it!=m.end(); it++)
  {
      printf("%s %lf\n", it->first, it->second);
  }
  return 0;
}

附上原文本文件

data.in
1
2
apple 92.3
orange 94.5

首先贴个链接我的vim配置,没有github帐号也可以下载zip包安装。


第一次接触到ubuntu的时候就听说了vim的大名,vim的前身是鼎鼎大名的Bill Joy叔叔在1976年写的vi,vi是集成到Unix-like系统中的。 开始被vim“神级编辑器”,“圣经编辑器”的称号吓尿了,对于一个连VS2010都用不太熟的人来说,我犹豫了很久是否有必要学习vim。但是,当我偶然在学校自习室见到某颖同学在他的10寸小上网本上完全抛离鼠标,如弹钢琴般在键盘上行云流水的使用vim以及vim插件vimperator,我震惊了。 vim的学习曲线的确很陡峭,但是一旦学会,威力巨大,工欲善其事,必先利其器,vim,你值得拥有。


vim如果没有配置,还是不太好用的,下面先展示一下我的平常使用图 vim 当然我更喜欢平常写点小东西的时候用vim配合terminator分屏,那码字简直是一个享受啊。 vim2


vim是由c和vimscript语言构成的,所以vim的插件脚本也是很牛很牛的,少量插件让vim更好用。开始在网上找了几份vim配置,不是过于冗余复杂就是过分简单。所以决定自己根据需求配置一个属于自己的vim。


首先,ctags需要手动安装,我将ctags压缩包放到了vim_plugin文件夹内,安装步骤经典的源代码安装方法

1
2
3
4
pineapple@pineapple:~/.vim/vim_plugin$ tar -zxvf ctags-5.8.tar.gz 
pineapple@pineapple:~/.vim/vim_plugin$ ./configure
pineapple@pineapple:~/.vim/vim_plugin$ make
pineapple@pineapple:~/.vim/vim_plugin$ sudo make install

插件清单,我的最小完备集需求,实现任务管理器,TAB超级补全,头文件源文件一键切换,c/c++/java一键编译运行,过于智能的c.vim以及括号补全我不习惯,就没有设置了。

1
2
3
4
5
6
7
8
9
pineapple@pineapple:~/.vim/plugin$ tree
.
├── a.vim
├── neocomplcache.vim
├── supertab.vim
├── taglist.vim
├── winfileexplorer.vim
├── winmanager.vim
└── wintagexplorer.vim

当然还有最重要的.vimrc文件,这个可以根据需求灵活更改。详见.vimrc。配置好了vim,就可以做专心做你爱做的事,写笔记,写博客,写代码,写论文,当然还有两个很重要的浏览器插件,firefox的vimperator和chrome的vimium,都是利器,我每天都不能离开它们了,呵呵。

第一次听说blog是在2008年高二吧,那时有电脑课,电脑老师是个骄傲的抽大中华的老头,他说我会很多计算机专业词汇,比名牌大学出来的计算机专业学生还懂的多,然后他随便在黑板上写了个英文单词”blog”,问全班同学有没有人知道这个单词是什么意思,没想到真的是没有一个学生认识这个单词(不得不承认母校高中的计算机落后广州一百年了)。


课后我就去了网吧,第一次知道了博客这个单词,而且也第一次听说了韩寒,徐静蕾,看着他们过千万的点击率,我心里萌生了个小小的梦想,将来我也要有一个属于自己的博客。大学进入计算机专业也算是阴差阳错,根本不知道编程语言为何物,只知道,我有自己的笔记本了,可以自由看博客了,于是学习从博客开始,到目前为止,我看过的博客比我看过的书要多多了。


大二的时候无意中看到了parano杨博客,深深的被octopress的简洁吸引了,于是放弃了原来想用wordpress的想法(看了网上有人的一句”因为octopress而学ruby”深受鼓舞),而且刚好正在学习Linux,于是就开始了octopress之旅。octopress能托管在github上,能像项目一样控制管理分支,这个设计真心棒!


现在正式进入主题,我为什么要写博客呢?

  1. 现在不是已经是微薄时代,快餐文化时代了吗?

  2. 博客不是已经过时了吗?

  3. 个人资历过浅,自认为写博客不够水平

我也爱玩微薄,但是我不认为微薄会取代博客,我认为两者会长期共存,就像讨论Windows该灭亡还是Linux会灭亡,这个对比的问题本身很无聊,世界是多元化的,存在即合理,博客还是有它独到的深入,这是微薄不能取代的。每个人建立博客之前都会问自己,为什么我要建立博客。我也这样问过自己,FUCK同学曾说,看了陈皓的博客,自卑自己的能力不够写出好的博客。其实我想陈皓大牛也不是第一篇博客就写的那么好,如果自己的博客写的好,那写出来分享给大家,肯定有人能收益;如果自己的博客写的不好,回过头来看自己写的弱智东西,也会觉得很好笑,这样不是也让自己开心了一下嘛。所以用博客的形式来记录下你有价值的思考,会带来很多好处,却没有任何明显的坏处书写是为了更好的思考,每次写博客,我都喜欢在夜深人静的时候,享受孤独的乐趣,毕竟互联网太浮躁了,充斥着各种诱惑亮点,而只有在写博客的时候,我才知道自己想的是什么,想要什么。用写博客来养成持之以恒做一件事情的习惯,我的大学到目前为止都是挺窝囊的,没有任何奖学金,没有参加竞赛,还挂过科,结果是很惨淡的,但是中间自由学习的过程我还是挺喜欢的,毕竟我现在每天都会看博客,而不是打游戏。


最后,希望大家都开始写博客,然后爱上写博客。May the force be with you!