拆掉思维里的墙(下)

如何找到热衷一生的事业

​ 借用基督徒每天向上帝祈祷中一张彩票却从来不买彩票的故事讲述了:尝试总是冒险的,而不尝试是最大的冒险

​ 很无聊的方法论。我就大概列一下提纲。

了解职业的真实信息:

  1. 做一个在职人士的职业访谈

  2. 尝试一个与目标职业相关的培训

  3. 进入一些专业职业论坛或博客群

  4. 看招聘网站和公司网站

  5. 找一些职业数据库

  6. 给名人写信

    后面的关于不要做太完美的职业规划还是有点道理的。莫名其妙的因果关系,但是有些话还是对的:

职业是自身天赋和现在世界局势的结合。

*你的天赋与社会需求的结合点,就是你的职业所在** —-亚里士多德

你的时间需要规划,但永远不要百分百的规划它。如果那样的话,你会扼杀自己创造性的冲动。—-尼古拉斯

懂得静观大地开花结果的人,决不会为失去的一切而痛心。 —-勒内

​ 后面还稍微提到了沉没成本,感觉大家都在说这个???

​ 最后的Impossible和I‘mpossible真的是不错的,只差一撇,确实两个结局。之后解释了远航者和漂泊者,虽然都去过很多地方,但是远航者更有目标性,而漂泊者只是在逃避。现在想想自己不就是一个极好的反面教材么。因为开始太容易所以不停的切换,不停的逃避。


原来我还可以这样活

这是标题党吧。。。。。开头没有什么有价值的东西。

幸福是一种转化力

​ 父母和自己对生活安排的冲突,但是有点极端,为啥一定得父母不爽我爽这种模式呢。

​ 还有欲望对快乐的影响,应该。。。太浅显了吧。。。

上天捕上要你成功,他只需要你尝试

我们真正的痛苦,来自于因耽搁而产生的持续的焦虑,来自于因最后时刻所完成项目质量之低劣而产生的负罪感,还来自于因为失去人生中许多机会而产生的深深的悔恨 —-尼尔·菲尔

成长为自己的样子

​ 讲述了价值和价格的区别???后面还提出了规划:

  1. 平衡生命的三脚架——自我/家庭/团体和职业
  2. 莫当漏斗人
  3. 在三个阶段减少工作:1.结婚前两年2.孩子0-3,14-18岁3.父母80岁后

烂????尾系列,个人意见。

acm7-7总结

7-7acm总结:

7-1月一号开始我勉强开始我的补题生活。

概率与期望(kuangbin)

这是我之前未刷完的一个专题。

B.是一个掷骰子的题。离散型概率分布。

拆掉思维里的墙(上)

拆掉思维里的墙(上)

Intention:做一个简单的读书笔记,一来介绍这本书,二来讲述一下我的认识。虽然我现在的认知可能很浅,具有一定的时期的局限性,对于以后的对比还是很有参考价值的吧。(●’◡’●)

豆瓣评分 7.9

你是不是安全感的奴隶

​ 开篇引用了一个小飞的例子,而后揭示其人就是股神巴菲特,确实让人眼前一亮。而后也举了马化腾、王石、丁磊等例子说明不能为买房而背弃梦想,但是说服力明显不够,逻辑也是有很大的问题的。

​ 但也揭示了成为一个房奴的后面的本质问题:安全感→恐惧。而后也从职业和爱的角度分析一个人为什么不愿放手,活在安逸的生活圈内,一旦脱离便会恐惧。后面也引用了孟子的一句话:“生于忧患,死于安乐”。也讽刺的讲述了父母唱作的意见害人的事:让一个人恐惧,提供给他一个无需努力就能获得安全感的环境,而且这种做法非常有效。

​ 我比较喜欢下面的几句话:

爱着的幸福,不是索取,而是给予。
喜欢是指向行为的,而爱则是指向一个人的本身。
特蕾莎修女:上帝不是要你成功,他只是要你尝试

​ 而后不仅讲述了信任潜能的好处(其实我觉得和自信是有一点相通的),而后还给出了6照快速提升爱犬干的方法:

  1. 小范围的冒一冒险
  2. 原理那些太容易获得的安全感
  3. 珍爱生命,远离恐惧。
  4. 做一个恐惧保险箱
  5. 做成功日志
  6. 面对恐惧,触底反弹。

    其中4里面的恐惧保险箱:

  1. 把你最恐惧的事情仔细写在一张纸上,至少要写10条,而且尽可能的详细,要到挖空心思也想不出来再多为止
  2. 找一个信任的人,或者一个安全的地方,做你的恐惧保险箱,把这张纸叠好放在这个地方,确保没有人知道
  3. 告诉自己,我担心的事情有可能发生,但是我得去做我自己的事,将恐惧暂时保存在这里,等做完事情再取回我的恐惧
  4. 感到心里舒服后,大胆的做
  5. 回到你的保险箱,看看多少发生了,多少没有发生

​ 其中5里面的成功日记(大概就是心里暗示,然后取回自信):

  1. 取一个空本子,每天至少写5个个人成果(任何小事都可以)
  2. 差点掉入陷阱中,能力多了一份自信,马上计入日记中
  3. 每天不间断的去作对你未来意义重大的事情,哪怕只有10min。
  4. 不仅记录取得的成绩,还记录其原因

​ 其中6通过《Feel the Fear And Do It Anyway》介绍了恐惧的三个层次:

  1. 恐惧事情本身
  2. 害怕失去背后的价值
  3. 真正的恐惧:是你觉得自己没有能力应对这个失去

    格鲁夫的两个触底反弹问题:

  4. 如果我失败了,新来代替我的那个家伙会怎么办?

  5. 既然这样,为什么我们不这样去做呢?

    附上奥普拉的一句话:

If you’re hurting, you need to help somebody ease their hurt .If you’re in pain, help somebody else’s pain.And when you’re in a mess, you get yourself out of the mess helping somebody out of theirs.


让有趣的生命扑面而来

​ 哈哈,我本人也是一个对生命感觉毫无意义的人,对什么都有一点兴趣,对什么都毫无兴趣。

​ 自我的反思是:我总是投入大量的时间,却总是不能全身心投入,我总是做好了失败的准备(逃避),我总是在我快坚持不下去的时候,轻易换到另一个兴趣上。我很少处理完一个苦难,所以想要获得一些投入而得来的快来其实是不是很容易的。

​ 显然,我是他人眼里的无趣之人,不过,更贴近事实的是我是一个无胆之人,心理学认为,快乐来于”紧张感的释放“,而我却不敢直面这种紧张,并且总是想法设法的竟然还都成功的避免了这种紧张感的出现。。。。。

​ 书中简述了张朝阳在其未来追求中写道:”首先要把”必须做什么“和”应该做什么“的责任和义务从我的词典中删去“,我总是划分的很”清楚“,很多时候我都把一件本应该是我的必须做的事情,在处罚小的情况下让他归类到了”应该做什么“,导致后面我的怠惰直接放弃了。。。。。

​ 后面张朝阳的生命追求中也写道:”把所有的价值观都打破了,包括自我。我没有自我,我努力消除自我“。感觉很有道理,却又说不上来的感觉。

​ 最后还是附上一位哲人的小诗:

Dance like nobody’s watching; love like you’ve never been hurt. Sing like nobody’s listening; live like it’s heaven on earth


心智模式决定我们的命运

​ 在我初中暗恋别人的时候,确实蛮相信的星座的,,,ԾㅂԾ,,,不过后来发现我简直和每一个星座都很像,之后基本就不信这一套了。关于星座也就不详细说了。

​ 书中提到作者的一个观点:人们宁愿自我欺骗,也不愿意相信自己是被欺骗的,因为他活在自己的”思维之墙“当中。这就让我想起来我在高中和别人讲述 我们是可能会制造一些错误的记忆的 当时没有举出自己的例子,就被别人定上了傻子的标签。。。。。

​ 作者借一段打乱的英文短句(打乱的中文应该见过吧),揭示了我们的大脑从外界接受信息,然后又抛弃他们中的大部分,只使用其中一小部分来建立一个内心世界,一次代表外部的世界。

​ 后面又举了几个无聊的例子说明了仁者见仁,智者见智。后来讲了一堆对我来说没什么用的(废)话后,引入《金钱心理学》中幸福和金钱的关系,本与金钱成正相关的幸福,突然与之没有多大的关系(“金钱的边际效应递减”)。

​ 后面都是一个很有趣的例子:科学家根据计算野山蜂的体重和两翼张开的宽度得出结论:野山蜂不能飞行。野山蜂知道一定感叹道:真TM厉害的科学家吧。

​ 而后借用《第五项修炼》(推荐)的一句话的定义:”心智模式是深植于我们心灵之中,关于我们自己、别人、组织以及世界每个层面的形象、假设和故事。就好像一块玻璃微妙地扭曲了我们的视野一样,心智模式也决定了我们对世界的看法。

​ 后米利用几种心智模式介绍了其局限性(但如果说这几种就是心智模式的话不免太局限了吧)。——win-win;win-lose;lose-lose;

​ 按书中怎么选取适当的”心智模式“应该就属于博弈论的范畴了吧。

​ 心智模式的有效性那边确实不错,我也希望我一个高中的同学能看到。书中举了一个我没有听说的一个例子:是关于卷入瀑布下的涡流中间,人在冰水中能生存的时间不过100s,即使用尽全身力气也未必能出去,但相对的游向中心,潜入底部再游出来生存的几率就大得多了。

​ 正如我们曾经以为的天道酬勤,其实那是一句天大的假话。想起我的高中生活,平时听课发呆,课后花大量的时间做课外题,课内的没有掌握,课外的习题也没做多少,自然就来一个比较弱的学校了。相比之下,我倒有一个平时认真对待学习,特别轻松的就考上一个比我好的大学,其实仔细想想问题还是蛮大的,按书中所说的,以我当时的心智模式,即使付出2,3倍的努力也不一定如别人的。有些时候,错误的努力比不努力还要可怕。

对一生进行充分规划永远都是一个好想法,但一定要记得写下来的时候要用铅笔,而且手边还要有块橡皮。——Adam Marchick

​ 今天的诸葛亮需要博客,希望大家也能和我一样利用hexo这个来写一些博客,一些学习笔记。


成功学不能学

​ 本章大多数都在举例说明,成功是小概率时间,不能模仿别人的成功。举了史泰龙,肯德基比尔盖茨一些人的例子。其实大概就是想说说你被骗了,你听到的那些所谓的传奇,都是销售大师骗骗你的,别人本来就很厉害,而且还有很厉害的人脉,你只是个垃圾,不要瞎想,洗洗睡吧。

​ 作者给了一个很好的总结:自己坚持的是结果,放弃的是方式。而且说明了成功不是完成时,而应该是进行时。

​ 除此之外,作者还给了一些名句(可能是没什么可写的了吧):

  1. 成功就是逐渐实现有价值的理想
  2. a good life is one inspired by love and guided by knowledge
  3. 我的野心是要证明一个没有野心的人也能得到所谓的成功。不过,我必须立即承认,这只是我即兴想到的一句俏皮话,其实我连这样的野心也没有。
  4. 现代社会的三种毒药:消费主义,性自由和成功学。消费主义以品牌为噱头,以时尚为药效,恋物成瘾。性自由以人性为噱头,以性爱为药效,纵欲成瘾。成功学以名利为药效,误导急于走捷径成为人上人的年轻人投身其中,投机成瘾。

    最后再附上《荒岛余生》中的一句话:
    I gotta keep breathing. Because tomorrow , the sun will rise.Who knows what the tide could bring?


​ 初步评价,举的例子还算是不错的,但是逻辑性上稍有欠缺,而且有几章有敷衍了事之意。不过如果这本书我早个四年看的话,应该还是能学到不少东西的把。

script: translate picture into ascii.text

script: translate picture into ascii.text

from:

  • 《python极客编程项目》

Intention:

  • translate picture into ascii.text

theory:

  • use pillow to translate a color image to black an white image
  • use grey level to get the average of every rectangle in the picture
  • replace the value with the scale:
  • output the list of the image

final code:

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import  argparse
import numpy as np
from PIL import Image

#gray level
gscale1 = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "
gscale2 = "@%#*+=-:. "

def getAverageL(image):
#return the average of rectangle grey value
im = np.array(image)
w,h = im.shape
return np.average(im.reshape(w*h))

def covertImageToAscii(filename, cols, scale, moreLevels):
#translating a color image to black and white(mode “L”),
image = Image.open(filename).convert('L')
W, H = image.size[0], image.size[1]
print("input image dims: %d x %d "%(W,H))
w = W/cols
h = w/scale
rows = int(H/h)

print("cols: %d, rows: %d" % (cols, rows))
print("tule dims: %d x %d" % (w, h))

if cols > W or rows > H:
print("Image too small for specified cols!")
exit(0)

aimg = []
for j in range(rows):
y1 = int (j*h)
y2 = int ((j+1)*h)
if j == rows-1:
y2 = H

aimg.append("")
for i in range(cols):
x1 = int(i*w)
x2 = int((i+1)*w)

if i == cols-1:
x2 = W
#cut a rectangle
img = image.crop((x1,y1,x2,y2))
#get the average grey levels of the rectangle
avg = int(getAverageL(img))

if moreLevels:
gsval = gscale1[int((avg*69)/255)]
else:
gsval = gscale2[int((avg*9)/255)]

aimg[j] += gsval

return aimg

def main():

descStr = "This program starts"
parser = argparse.ArgumentParser(description=descStr)

parser.add_argument('--file', dest='imgFile', required=True)
parser.add_argument('--scale', dest='scale', required=False)
parser.add_argument('--out', dest='outFile', required=False)
parser.add_argument('--cols', dest='cols', required=False)
parser.add_argument('--morelevels', dest='moreLevels', action='store_true')

args = parser.parse_args()

imgFile = args.imgFile

outFile = 'out.txt'
if args.outFile:
outFile = args.outFile

#the height of output ascii picture is longer than width
scale = 0.43
if args.scale:
scale = int(args.scale)

cols = 90
if args.cols:
cols = int(args.cols)

print('generating ASCII art..')

aimg = covertImageToAscii(imgFile, cols, scale, args.moreLevels)
with open(outFile, 'w+') as f:
for row in aimg:
f.write(row + '\n')

print('ASCII art written to %s' % outFile)

if __name__ == '__main__':
main()

simple test:

1
python ascii.py --file 1.png --cols 82

哈佛的6堂独立思考课

哈佛的6堂独立思考课

建立自我意见

基本步骤:

  1. 确认自己对“一件事”理解的程度
  2. 掌握自己对“一件事”不理解的是什么,通过查找数据来解决“不理解的部分”
  3. 持有自己的意见

学会批判性思考,站在新的角度思考,基于事实提出问题,建议。

深入理解

基本步骤:

  1. 检查自己对获得的信息是否正真的理解
  2. 切实举出不理解的部分
  3. 为消除“不理解的部分”,思考有效问题
  4. 养成实际提问的习惯

检验是否理解:

  1. 用对5岁小孩的方式说明信息
  2. 深入挖掘专业用语(养成认真思考词汇含义的习惯)
  3. 翻译成英文
  4. 使用“理解程度检查表”(分别列举“已理解部分”和“不理解部分”,并逐一审查“已理解部分”)
  5. 用5W1H方法反驳(回答Who,What,When,Where,Why,How,不妨再加入to Whom,How much)
  6. 用信号灯色的记号笔帮助思考(为提出问题时做准备,避免草率决定)
  7. 临时被人征求意见时,提出好问题。

    提出好问题的12项原则:

    1. 何时、何地、谁、做了什么、怎么做
    2. 为了什么目的,为什么这么有把握
    3. 对信息提问
    4. 探究必要性
    5. 探究数据是否正确、妥当
    6. 检验模糊的用词
    7. 引用相似但不同的例子
    8. 确认事物的两面性
    9. 询问契机、起因
    10. 探究为什么是“现在”
    11. 询问长期性发展
    12. 以采访者的姿态追问背景

尖锐的问题才是接近事物的本质的快捷方式

注意区分事实与意见

从多种角度看待问题,深入思考

基本技巧:

  1. 站在“不可忽视者”的角度思考

  2. 用崭新的观点,获得不同角度的看法:

    如讽刺漫画家的刁钻的角度

    人类学者的角度

  3. 一人辩证法(刻意否定自己的想法,提出反对的根据)

  4. 通过“反驳清单”重新审视意见

面对意外,突发事件时,可以采用单人头脑风暴,用自己以外的观点思考。

创意的方法:检讨平时认为“不可能”就丢开的创意

预测未来

基本步骤:

  1. 该“方案”如果称为显示,会发生什么事(顺利/不顺利)
  2. 面对成功/失败情节应该采取的措施
  3. 该行动有没有实现的可能
  4. 该行动有没有现在执行的必要

欲望太多的企划不会成功

重新审视所谓的根据

寻找隐藏的前提

做出决定的思考过程:

  1. 以肯定句写下难以断绝的“行动”
  2. 明确自己的目的,想想为什么要采取那个行动
  3. 写出有哪些方法可达成目的
  4. 预测可能获得的结果(顺利/不顺利)
  5. 删去“不合乎逻辑”或“不具现实性”的项目

交换意见的规则

基本规则:

  1. 这个世界上没有绝对正确的意见(对手的意见是自我意见的肥料)
  2. 用对方听得懂的语言和文脉(运用简单的词汇和表达方式:结论-根据-提议)
  3. 揭示接下来说话内容的“地图”
  4. 重要的地方用不同表达方式再三重复
  5. 避免武断的语气
  6. 反对≠否定人格(将意见与发言者分离)
  7. 把否定当成对方的提问
  8. 不打断对方的说话
  9. 不懂装懂不可取
  10. 全盘接受对方意见不是尊重
  11. 不要跟随对方脚步(不可没有根据就说结论,跟着对方的语气反击,自乱阵脚)
  12. 问根据,说出来(问根据可以选择站在对方立场后委婉提问)
  13. 不要假装自己什么都懂
  14. 要反对,就要提出替代方案(对意见负起责任)

练习冷静:这个人真TM有趣 而不是 这个人真可怜

发现问题是思考的开始

在模糊不清的情绪中寻找真正的想法。

基本顺序:

  1. 发觉有些在意的东西
  2. 承认它的存在
  3. 思考它的起源,寻求他的本质
  4. 为什么有那种感情,寻求他的根据
  5. 承认**他的重要性。

简要感想:

全文脉络清晰,层次明确。如果再早个几年看的话可能会有一些影响。

全文基于根据,以事实讲道理,思考,蛮好的。

Django_GO01

Django 起航

环境配置:ubuntu

apt install :python, python-pip, openssh-server, vsftpd, git, tree

pip install: virtualenv, pytz

学习书籍:Django架站的16堂课

First Go

使用virtualenv创建虚拟环境

terminal:

1
2
3
4
5
6
7
8
9
10
11
12
13
virtualenv Venv
source Venv/bin/activate
pip install django
django-admin startproject myweb
cd myweb
git remote add origin https://github.com/Hu-chi/myweb
git pull origin master
git add .
git commit -m 'first remote'
git push origin master
git freeze > requirements.txt #把使用的套件更新一份记录在requirements.txt文本文件中
git add .
git push origin master

换一台机子的话:

1
2
3
git clone https://github.com/Hu-chi/myweb
cd myweb
pip install -r 'requirements.txt'

创建框架(virtualenv下):

1
2
python manage.py startapp mainsite
tree

初次运行:

1
python manage.py runserver

File parse

  • manage.py :是管理网站配置的文件,一般不会修改,只负责执行指令

    myweb中的一些重要配置文件:

    • wsgi.py :是和虚拟主机中网页服务器(如Apache)沟通的接口
    • urls.py:设置每一个URL的网址对应的函数以及对应的方式,创建新页面时编辑的文件
    • settings.py:系统设计的位置,进行新建网站所要设置的操作

真正网站所要运行的所有逻辑都是在使用startapp mainsite创建出来的APP文件中。可以让网站的每一个主要功能成为单独的一个模块。符合reuse的概念。

编辑settings.py,增加mainsite模块:

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mainsite',
]

修改时区:

1
2
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Beijing'

回去配置SQLite存储数据库。

terminal:

1
2
cd ..
python manage.py migrate

会产生一个db.sqlite3文件。

数据表

数据库是以MODEL方式来操作的。以定义一个数据类来作为一个数据表。省去了人在不同数据库操作细节上的精力和时间。

修改mainsite/models.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.utils import timezone

class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField(default=timezone.now)

class Meta:
ordering = ('-pub_date',)

def __unicode__(self):
return self.title

执行terminal:

1
2
python manage.py makemigrations mainsite
python manage.py migrate

使用python manage.py createsuperuser创建一个管理员账号。

修改mainsite/admin.py:

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin
from .models import Post
# Register your models here.

admin.site.register(Post)

runserver一下可以看见有数据库管理页面,登录。

post中自行添加并保存。增加了6个。。。

admin.py增加代码:

1
2
3
4
5
6
# Register your models here.

class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'pub_date')

admin.site.register(Post, PostAdmin)

读取数据库中的内容

根据Django中MTV架构。为了把数据抽象化,把数据的存取显示分为Model, Template, View。分别对应models.py, template文件, views.py等文件。

models.py用类class来定义了要存取的数据模型。存取数据则是在View,在views.py中处理。显示输出则交给Template处理。

修改mainsite/view.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
# Create your views here

def homepage(request):
posts = Post.objects.all()
post_lists = list()
for count, post in enumerate(posts):
post_lists.append("No.{}".format(str(count)) + str(post) + "<br>")
return HttpResponse(post_lists)

创建homepage()获取所有数据,添加到post_lists再返回输出到用户端浏览器页面。

修改urls.py 网址与程序间的对应工作。

1
2
3
4
5
6
7
8
from django.conf.urls import url
from django.contrib import admin
from mainsite.views import homepage

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', homepage),
]

我出现了编码错误,去错误的文件里面增加这个就可以了。

1
2
3
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

url(r'^$', homepage),这句话表示当用户浏览网址没有加任何字符串(根网址)的话,调用homepage().

  • 简单美化

修改views.py:

1
2
3
for count, post in enumerate(posts):
post_lists.append("No.{}".format(str(count)) + str(post) + "<br>")
post_lists.append("<small>" + str(post.body.encode('utf-8')) + "</small><br><br>")

这样做是不明智的,因为是MTV架构,应该放在template中,让template中的.html来负责正真的显示工作。

输出模板

通过template模板,当网站有数据输出时,通过渲染函数(render, 网页显示)把数据放在模板制定的位置。得到结果后交给HttpResponse()输出.

先mkdir 一个 templates

修改settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
TEMPLATES = [

{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

修改views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

from datetime import datetime
from django.template.loader import get_template
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
# Create your views here

def homepage(request):
template = get_template('index.html')
posts = Post.objects.all()
now = datetime.now()
html = template.render(locals())
return HttpResponse(html)

这里使用locals(),把当前内存中的所有局部变量使用字典类型打包。

templates目录下,创建一个index.html模板文件。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
huchi's Django
</title>
</head>
<body>
<h1>huchi's Django</h1>
<hr>
{{posts}}
<hr>
<h3>time:{{now}}</h3>
</body>
</html>

可以测试一下。

再稍微改一下index.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
huchi's Django
</title>
</head>
<body>
<h1>huchi's Django</h1>
<hr>
{% for post in posts %}
<p style='font-family:微软雅黑; font-size:16pt; font-weight:bold;'>
{{post.title}}
</p>
<p style='font-family:微软雅黑; font-size:10pt; letter-spacing:1pt;'>
{{post.body}}
</p>
{% endfor %}
<hr>
<h3>time:{{now}}</h3>
</body>
</html>

或者把中间一段改成带有链接的:

1
2
3
4
5
{% for post in posts %}
<p style='font-family:微软雅黑; font-size:16pt; font-weight:bold;'>
<a href='/post/{{post.slug}}'>{{ post.title }}</a>
</p>
{% endfor %}

接下来就要显示单张网页了。

修改urls.py:

1
2
3
4
5
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', homepage),
url(r'^post/(\w+)$', showpost),
]

然后滚到views.py写showpost(),顺便设置了一个重定向……

1
2
3
4
5
6
7
8
9
10
11
12
from django.shortcuts import redirect
...

def showpost(request, slug):
template = get_template('post.html')
try:
post = Post.objects.get(slug=slug)
if post != None:
html = template.render(locals())
return HttpResponse(html)
except:
return redirect('/')

在滚去写post.html…..:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
huchi's Django
</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<hr>
<p style='font-family:微软雅黑; font-size:10pt; letter-spacing:1pt;'>
{{ post.body }}
</p>
<hr>
<h3><a href='/'>回首页<a></h3>
</body>
</html>

不过发现其实和index.html重复的地方很多。

  • 共享模板
文件名Function
base.html基础模板
header.html放置共享的标题元素,比如网站Logo
footer.html共享网页,放置版权声明或其他声明
index.html首页
post.html单篇内容

开始搬砖。。。。。

base.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--base.html-->
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
{% block title %} {% endblock %}
</title>
</head>
<body>
{% include 'header.html' %}
{% block headmessage %} {% endblock %}
<hr>
{% block content %} {% endblock %}
<hr>
{% include 'footer.html' %}
</body>
</html>

include .html可以导入制定的文件。block 指令划分区块。

修改index.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- index.html-->
{% extends 'base.html' %}
{% block title %}huchi's web{% endblock %}
{% block headmessage %}
<h3 style='font-family:楷体;'>本站列表</h3>
{% endblock %}
{% block content %}
{% for post in posts %}
<p style='font-family:微软雅黑;font-size:14pt;font-weight:blod;'>
<a href='/post/{{ post.slug }}'>{{ post.title }}</a>
</p>
{% endfor %}
{% endblock %}

修改post.html:

1
2
3
4
5
6
7
8
9
10
11
12
<!--post.html-->
{% extends 'base.html' %}
{% block title %} {{ post.title }} {% endblock %}
{% block headmessage %}
<h3 style="font-family:微软雅黑;">{{ post.title }}</h3>
<a style="font-family:微软雅黑;" href='/'>回首页</a>
{% endblock %}
{% block content %}
<p style="font-family:微软雅黑; font-size:12pt; letter-spacing:1pt;">
{{ post.body }}
</p>
{% endblock %}

修改header.html:

1
2
<!--header.html-->
<h1 style="font-family:微软雅黑;">welcome to huchi's web</h1>

footer.html:

1
2
3
4
5
6
7
8
<!--footer.html-->
{% block footer %}
{% if now %}
<p style="font-family:微软雅黑;">时间: {{ now }}</p>
{% else %}
<p style="font-family:微软雅黑;">?唧唧唧?</p>
{% endif %}
{% endblock %}

js/css的运用

1
2
3
4
5
6
7
8
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

将这段bootstrap的代码加入到base.html里面。

可以稍微改一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<body>
<div class='container-fluid'>
{% include 'header.html' %}
<div class='panel panel-default'>
<div class='panel-heading'>
{% block headmessage %} {% endblock %}
</div>
<hr>
<div class='panel-body'>
{% block content %} {% endblock %}
</div>
<hr>
<div class='panel-footer'>
{% include 'footer.html' %}
</div>
</div>
</div>
</body>
  • 图片

像图片这些不需要处理的文件一般放置在statci file文件中(static files)。需要在settings.py先配置一下。

1
2
3
4
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]

大概是这样的:

1
2
3
4
5
6
7
8
9
10
(Venv) huchi@huchi-Lenovo-ideapad-510S-14ISK:~/myweb/static$ tree
.
├── css
├── images
│   ├── backgroud_aLi.jpg
│   ├── backgroud_angelBeats.jpg
│   └── logo.png
└── js

3 directories, 3 files
1
2
3
4
5
6
7
8
<!--header.html-->
{% load staticfiles %}
<div class='well'>
<h1 style="font-family:微软雅黑;">
<img src="{% static 'images/logo.png' %}"/>
welcome to huchi's web
</h1>
</div>

js,css静态文件的导入也是如此。

template的数据是可以用filter过滤器以此来实现文章概要,HTML解析,Markdown解析。


Linux_计算机基础认识

计算机的认识

学习资料:鸟哥的私房菜,可能有些老了。

计算机硬件的五大单元:

  • 输入单元:键盘、鼠标、卡片阅读器。。。
  • 主机部分:即系统单元,主机机壳里的CPU与主存储器
  • 输出单元:屏幕、打印机

CPU分为两个部分:算数逻辑单元(程序运算/逻辑判断),控制单元(协调周边组件与各单元的工作)。

计算机硬件组成

数据流进/流出内存是CPU所发布的控制命令。处理的数据都来于主存储器。

CPU种类

  • 精简指令集(Reduced Instruction Set Computing,RISC)
  • 复杂指令集(Complex Instruction Set Computing,CISC)

前者如ARM,后则如AMD、Intel等的x86结构的CPU(x86只是因为他们的代号的末尾是86,64位的话叫x86_64),x86架构的CPU可以加速多媒体程序的运作,加强虚拟化的效能,增加能源效率,降低耗电量。

接口设备

其实最重要的接口设备是主板,它负责将所有的设备通通连接,让设备进行协调沟通。主板上最重要的组件是主板芯片组。

其他重要设备:

  • 储存装置
  • 显示装置
  • 网络装置

运行流程

  • CPU=脑子,微指令集差异,判断控制
  • 主存储器=记录区块,将与外界的互动暂时记录,供CPU判断
  • 硬盘=记忆区块,记录重要数据,以便再次使用
  • 主板=神经系统,连接重要组件
  • 各项接口设备=与外界沟通的器官,与外界互动
  • 显示适配器=脑袋中的影像,呈现
  • 电源供应器:心脏

计算机分类

  • 超级计算机
  • 大型计算机
  • 迷你计算机(科学研究)
  • 工作站(性能/价格比高)
  • 微电脑(个人计算机)

计算机上查用的计算单位

  • 容量单位(bits,Byte,K,M,G,T,P)
  • 速度单位(MHz,GHz,常用:Mbps(Mbits per second)) 如8M/1M ADSL传输速度即(1Mbyte/s下载,125Kbyte上传)

个人计算机架构与接口设备

常是x86计算机。AMD/Intel两大主流CPU架构不兼容,设计理念有差异。

芯片组通常分为两个网桥来控制各组件的沟通:

  • 北桥:负责链接速度较快的CPU、主存储器、显示适配器
  • 南桥:慢的硬盘、USB、网络卡

AMD不同的是主存储器直接与CPU沟通不通过北桥,加速了这两者的沟通。

技嘉主板各组件

技嘉主板各组件:

磁盘装置(IDE/SATA)、总线芯片组(南桥/北桥)、显示适配器接口(PCI-Express)与其他适配卡(PCI).

CPU

位于上方中央,CPU负责运算,高发热量,靠一颗风扇主动散热。

多核也就是一颗CPU中嵌入两个以上运算核心,即两个以上的CPU单元。

CPU工作效率受微指令集和其频率影响。频率即每秒工作次数。频率用来比较同款CPU的效率。

  • 倍频与外频

各个组件通过北桥和南桥连接,CPU与外部组件处理速度理论上应该一致才好。但CPU需要更强大的运算能力,CPU上有一个加速功能,即所谓的外频,倍频。

外频:CPU与外部组件进行数据传输的速度,倍频:用来加速工作效能的一个倍数。

两者之积为CPU的频率速度。一个3.0GHz的CPU,如果外频为333MHz,其倍频为9倍。

  • 32位与64位

主存储器与CPU的沟通速度靠的是外部频率。

主芯片分北桥、南桥,北桥的总线称为系统总线,为内存传输的主要通道,速度快。南桥即输入输出(I/O)总线。

北桥所支持的频率:前端总线速度(Front Side Bus,FSB),每次传送的位数是总线宽度——每秒可传送的最大数据量,常见的总线宽度有32/64位(bits)。

如果64位总线宽度,前端总线最高速度为1600MHz,内存与北桥带宽即12.8Gbytes/s

CPU每次能够处理的数据量称为字组大小(word size),现在所称的计算机是32/64位主要依据是这个CPU解析的字组大小。

Tips:字组大小与总线宽度可以不同

  • CPU等级

Intel Pentium MMX 与AMD K6年代的CPU称为i586等级,而Intel Celeron与AMD K7年代之后的32位CPU称为i686等级。

没有钱的CPU则统称为x86_64等级。

一般具有向下兼容的能力。

内存

PC的主存储器主要组件为动态随机存取内存(Dynamic Random Access Memory, DRAM),随机存取内存只有在通电时才讷讷感记录与使用,断电后消失。这种RAM也称为发挥性内存。

DRAM根据技术更新分为好几代,广泛上分为SDRAM与DDR SDRAM。DDR是所谓的双倍数据传送速度(Double Data Rate),可以在一次工作周期中惊醒两次数据的传送。

SDRAM/DDR型号数据宽度(bit)外频(MHz)频率速度带宽
SDRAMPC10064100100800Mbytes/s
SDRAMPC133641331331064MBytes/s
DDRDDR266641332662.1GBytes/s
DDRDDR400642004003.2GBytes/s
DDRDDRII800644008006.4GBytes/s

所有的数据都要加载内存才能被CPU判读,内存容量不够大会导致某些大容量数据无法被完整加载。以服务器来说,主存储的容量有时比CPU的速度还要重要。

  • 双通道设计

传统的总线宽度仅为64位。为了家打这个宽度,将两个存储器汇整在一起,就可以达到128位,这也就是双通道的设计理念。

要启用双信道佛年功能需要安插两支/四支主存储器,且这两支内存最好一样,因为启动双信道内存功能时,数据是同步写入/独处这一对存储器中,如此才能整体提升宽带。

  • CPU频率与主存储器的关系

理论上,CPU与主存储器的外频应该相同。但频率不会相同。

  • DRAM与SRAM

除主存储器外,还有其他内存的存在,如CPU内的第二层高速缓存,

内存相关性

第二层快取(L2 cache)整合到CPU内部,所以L2内存的速度与CPU 频率相同,使用DRAM无法达到这个频率速度,需要静态随机存取内存(Static Random Access Memory,SRAM)。SRAM在设计上使用较多晶体管,贵。

  • 只读存储器(ROM)

主板上每个组件的参数具有可调整性,CPU与内存的频率是可调整的,主板上的内建的网络卡或者显示适配器的各项参数是被记录到主板上头的CMOS芯片,这个芯片需要额外的电源(电池)来发挥记录功能。

BIOS(Basic Input Output System)是一套程序,写死在主板上面的一个内存芯片中,这个内存芯片在没有通电的也能将数据读取,即只读存储器(Read Only Memory, ROM)。ROM是一种非挥发性的内存。

固件(firmware)很多也是用来进行软件的写入。固件像软件一样是被计算机执行的程序,但对硬件内部更重要。如BIOS,控制着开机时各项硬件参数的取得。

BIOS原本是写入无法改写的ROM中,现在BIOS通常写入类似闪存(flash)或EEPROM

显示适配器

显示设配器VGA(Video Graphics Array),对图形影响重要,重点在于分辨率和颜色深度。每个图像的显示的颜色都会占用掉闪存,因此显示设配齐上面有一个内存的容量,这个容量直接影响屏幕分辨率和颜色深度。

由于3D game,显示设配器上嵌入了3D加速的芯片,即GPU。

显示设配器通过北桥芯片与CPU、主存储器沟通。

1024×768分辨率的全彩(3Bytes)显示器需要2.25MBytes,再考虑屏幕的更新率。

硬盘与存储设备

有硬盘、软盘、MO、CD、DVD、局域网络存储设备(SAN,NAS)。

  • 硬盘的物理组成

硬盘物理构造

硬盘分为3.5和2.5的。图是3.5的桌面计算机使用硬盘。实际的数据卸载了具有磁性物质的磁盘盘上,机械手臂可伸展让读取头在磁盘上进行读写的动作。

  • 磁盘上的数据

由圆心以放射状的方式分割出磁盘的最小储存单位,就是扇区(Sector),在物理组成方面上,每个扇区大小为512Bytes。扇区组成一个圆就称为磁道(track),多碟的硬盘上,所有磁盘上统一规格磁道组成一个磁柱(Cylinder),磁柱也是我们分割硬盘的最小单位。

计算磁盘的存储量计算公式;[header数量 * header负责的磁柱数量 * 每个磁柱所含有的扇区数量 * 扇区容量],单位换算:[header cylinder/header sector/cylinder * 512Bytes/sector]。

  • 传输接口

由于传输速度需求,分为IDE接口(宽)和SATA接口(窄)

  1. IDE界面:

    IDE接口插槽使用扁平电缆。每条扁平电缆可以接2个IDE装置,为了判别介入的装置的主/从架构,需要调整跳针(Jump)成为Master或slave。

  2. SATA界面:

    每个SATA连接线只能接一个SATA装置。SATA接口速度较快,立于主机机壳内部的散热与安装。每个SATA插槽都有编号的。

PCI适配卡

如网络卡、声卡、特殊功能卡。

主板

相当重要。主板上面负责沟通各个组件的是芯片组。芯片组分为北桥、南桥。北桥负责CPU/RAM/VGA等,南桥负责PCI接口与速度慢的I/O接口。除风扇外,还可能用到散热导管,连接数根导管的散热片。

  • 芯片组功能

芯片组是参考CPU的能力规划的。独立型芯片组可以随时抽换接口设备。

  • 设备I/O地址与IRQ中断信道

主板芯片通过I/O地址,请求中断IRQ(Interrupt Request)才能负责沟通。通过IRQ中断信道来告知该装置工作情况,以方便CPU进行工作分配。关闭没用的周边接口,空出IRQ来给真正需要使用的接口。或者使用sharing IRQ技术。

  • CMOS与BIOS

CMOS(Complementary Metal Oxide Semiconductor)主要功能为记录主板上面的重要参数,包括系统时间、CPU电压与频率、各项设备的I/O地址与IRQ等,需要电池供电.BIOS为写入到flash或EEPROM的程序,开机时运行BIOS。BIOS程序可以修改CMOS 中的数据。

  • 连接接口设备的接口

主板与各项I/O设备的链接主要都是在主机机壳的后放,主要有:

  1. PS/2:键盘与鼠标的接口,被USB取代
  2. USB:
  3. 声音输出、输入与麦克风:需要有内建音效芯片
  4. RJ-45网络头:需要有内建网络芯片。。。。
  5. else:…

电源供应器

材料不同,稳定度也不同,稳定度差的电源供应器是造成计算机不稳定的元凶。

  • 能源转换率

电源供应器本身会消耗一部分电力发热。注意转化率

  • 连接接口

24pin


基本概念结束。

python网络编程.init()

python网络编程

入门

创建套接字,使用socket.socket()函数

1
socket(socket_family=AF_INET, socket_typeSOCK_STREAM, protocol=0)
  • socket_family是AF_UNIX(面向文件)或AF_INET(面向网络)。
  • sockey_type是SOCK_STREAM(面向连接的流套接字)或SOCK_DGRAM(无连接,成本低廉)
  • protocol一般默认为0

服务器简单设计伪代码:

1
2
3
4
5
6
7
8
9
ss = socket()			# create
ss.bind() # 绑定地址
ss.listen() #监听连接
inf_loop:
cs, addr = ss.accept() #无限循环等待客户端连接
comm_loop:
cs.recv()/cs.send() #通信
cs.close()
ss.close()

调用accept()函数,开启了一个简单的单线程服务器。accept()是阻塞的,他将被暂停直到connection.然后就能获得一个临时套接字cs,随后通信就可以开始。

转化成py代码(只适用于IPv4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_STREAM) as s:
s.bind(ADDR)
s.listen(5)
print('wait')
while True:
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(BUFSIZ)
if not data: break
conn.sendall(data)

客户端简单设计伪代码:

1
2
3
4
5
cs = socket()
cs.connect()
comm_loop:
cs.send()/cs.recv()
cs.close()

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_STREAM) as s:
s.connect(ADDR)
while True:
data = input('>:')
if not data:
data = 'haha,huchi'
s.send(data.encode())
data = s.recv(BUFSIZ)
if data:
print(data.decode())

首先运行服务器端程序,再运行客户端程序。

UDP服务器伪代码:

1
2
3
4
5
ss = socket()
ss.bind()
inf_loop:
cs = ss.recvfrom()/ss.sendto()
ss.close()

transform:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from socket import *

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_DGRAM) as s:
s.bind(ADDR)
while True:
print("waiting for message")
data, addr = s.recvfrom(BUFSIZ)
if data:
print('Connected by', addr)
s.sendto(data, addr)

UDP客户端伪代码:

1
2
3
4
cs = socket()
comm_loop:
cs.sendto()/cs.recvfrom()
cs.close()

transform:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_DGRAM) as s:
while True:
data = input(">:")
if not data: break
s.sendto(data.encode(), ADDR)
data, ADDR = s.recvfrom(BUFSIZ)
if not data: break
print(data.decode())

运行后也能实现相互交流

SocketServer模块初识

它简化了很多样板代码。

TCP服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from socketserver import (TCPServer, StreamRequestHandler as SRH)

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

class MyTCPHandler(SRH):

def handle(self):
print("waiting...")
self.data = self.request.recv(BUFSIZ).strip()
print("{} wrote".format(self.client_address[0]))
print(self.data)
#回复
self.wfile.write(self.data.upper())

if __name__ == "__main__":
server = TCPServer(ADDR, MyTCPHandler)
server.serve_forever()
server.close()

写一个客户端测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)
data = "Hello huchi"

with socket(AF_INET, SOCK_STREAM) as s:
s.connect(ADDR)
s.sendall(bytes(data + "\n",'utf-8'))

received = str(s.recv(BUFSIZ), "utf-8")

print("sent: {}".format(data))
print("received:{}".format(received))

Twisted 初识

Twisted也是一款完整的事件驱动的网络框架,他提供了大量的支持来建立完整的系统(网络协议、线程、安全性、身份验证、聊天/IM(及时通信)、DBM及RDBMS(关系数据库管理系统)、web、电子邮件、命令行参数、GUI集成工具包).

尴尬,ubuntu挂掉了,windows也没成功装twisted,等考完试再写。。。。

参考链接:

  1. 菜鸟
  2. Socket Document
  3. SocketServer Document
  4. Twisted Document

遗留作业:

  1. 逐步实现半双工聊天,全双工聊天,多用户双工聊天,多房间多用户全双工聊天。
  2. 了解并研究不同的异步系统。如twisted,Greenlets,Tornado,Diesel,Concurrence,Eventlet,Gevent.

新的开始

新的开始

这是一场新的开始,今天刚刚搭好了hexo的博客还没完善完(刚好处于期末状态)。

总结一下前几天干的几件事情作为一片博客。同时也作为一篇hexo新的开始的新博客。

第一件事情——sklcc实验室招新的笔试题

笔试题我做了三道编程题和4道简答题,都是现学现做的。

编程题:

first:socket

Socket编程 — by Senix
背景
江爷爷是一位德高望重的长者,备受全国人民的爱戴。人民为了兹次他,自发的捐出了自己的一分钟内的1s,形成了庞大的时间
流:11111111111111111111111…然而来自全国各地时间流在续给爷爷的路上出了点差错,一些时间丢失了:1011100010000…..江爷爷很苦恼,机
智的你,能不能帮江爷爷计算下两个时间流的和,并且仍以时间流的形式返回江爷爷,帮爷爷续1s呢?
任务
因为来自全国各地的时间流是源源不断的,所以你需要向爷爷那里获取最新的时间流。
现在我们通过socket与爷爷通信,获取这个字符串。爷爷的地址为10.10.65.153 ,开放给你们的端口为3336

下面使用的是python写的简易的代码:

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
import socket
ip = ('10.10.65.153',3336)
s = socket.socket()
s.connect(ip)

#GET
msg1 = s.recv(400).decode()

#PROCESS
msgList = msg1.split(',')
num1 = int(msgList[0],2)
num2 = int(msgList[1],2)

temp = bin(num1+num2)
temp = str(temp)
tempList = temp.split('b')
ans = tempList[1]
print(ans)
while(len(ans)<100):
ans = '0'+ans

#RETURN
returnString = "王仁杰1627406066-13773289761 收到请回复"
s.send(ans.encode())
s.send(returnString.encode())

msg2 = s.recv(300).decode()
msg3 = s.recv(300).decode()
print(msg2)
print(msg3)

second:进程

第二题是一道进程题。由于我先学的pipe管道通信,从某种程度上来说并没有实现题目的要求。现在觉得用信号sigmal会比较好,而且代码也简短。

剪刀石头布! — by Senix
背景
小亮某一天突发奇想,想试试看自己和自己进行剪刀石头布会是什么样子。
自己的大脑作为裁判,右手和左手进行比赛。每进行一次比赛大脑都会告诉左手和右手谁赢了
任务
因为是大脑进行判断而左右手进行比赛,你需要做的就是使用计算机模拟这个效果。
编写代码,由父进程创建子进程进行比赛,父进程判断最终结果。每一次比赛父进程都要即时宣布比赛结果

下面是我提交的代码:

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
#include<cstdio>
#include<iostream>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<cstring>
#include<ctime>
#define maxn 2048
using namespace std;

bool judge(){
srand(unsigned(time(0)));
return rand()%2;
}

int main(){
pid_t pid;
char buf[maxn],sendMessage[maxn];
int fd[2],n;
if(pipe(fd) == -1){
//failed
printf("Create pipe failed\n");
exit(0);
}
pid = fork();//use once,return twice
if(pid<0){
//error raised
//1.the number of processes is bigger than manx limited
//2.memory is poor
printf("Create fork failed\n");
exit(1);
}else if (pid == 0){
//in the child send
printf("Process %d start Judging\nThe ans is:",getpid());
close(fd[0]);
if(judge()) strcpy(sendMessage, "Left hand wins\n");
else strcpy(sendMessage,"Right hand wins\n");
write(fd[1],sendMessage,strlen(sendMessage));
return 0;
}else {
//parent get
printf("Father %d get alive\n",getpid());
sleep(1);
close(fd[1]);
n = read(fd[0], buf, maxn);
write(STDOUT_FILENO, buf, n);
}
printf("请等待10s钟\n");
sleep(10);
return main();
}

third:爬虫

这是一道有趣的爬虫题。

我要吐槽! –by Python小组
背景
小孙很喜欢去B站看各种弹幕视频,但是弹幕的质量良莠不齐,有脑洞大开的吐槽,有素质三连。所以,他想统计B站弹幕里面的词频。机智的你,能
不能帮助小孙将B站某一视频的弹幕爬取下来呢?
任务

  1. 小孙将会提供给你一个网址,你需要爬取全部的弹幕内容。
  2. 将爬取的每一条弹幕分词,去除标点和给定停用词文件中所包含的停用词,进行词频统计,注意用字典形式存储结果({词语1:词频1, 词语2:词频
    2……..})
  3. 将结果保存为一个json文件,文件命名为source.json
  4. 以词频为关键字对结果从高到低进行排序,写一个静态web页面,在页面上用柱状图展示词频最高的前5项

使用的python实现的爬虫,不过从代码风格来说还是比较丑的。现学现卖的程度是有的。

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import requests
import random
import time
import socket
import http.client
import re
import gc
import collections
import json

from bs4 import BeautifulSoup

def getContent(url , data = None):
header={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
}

timeout = random.choice(range(80, 180))
while True:
try:
rep = requests.get(url,headers = header,timeout = timeout)
rep.encoding = 'utf-8'
break

except socket.timeout as e:
print( '3:', e)
time.sleep(random.choice(range(8,15)))

except socket.error as e:
print( '4:', e)
time.sleep(random.choice(range(20, 60)))

except http.client.BadStatusLine as e:
print( '5:', e)
time.sleep(random.choice(range(30, 80)))

except http.client.IncompleteRead as e:
print( '6:', e)
time.sleep(random.choice(range(5, 15)))

return rep.text

def getDanmu(html_text):
final = []
bs = BeautifulSoup(html_text, "html.parser") # 创建BeautifulSoup对象
listOfd = bs.findAll('d')
listOfdanmu = []

#get danmu
pattern = re.compile(r'>([\w || \W]+)<')

for i in range(len(listOfd)):
tempStr = str(listOfd[i])
matchList = pattern.findall(tempStr)
listOfdanmu.append(matchList[0])
return listOfdanmu

def getStopList():
stopFile = open("stopwords.txt", "r")
try:
flag = 0
readList = []
while not flag:
newLine = stopFile.readline()
if(newLine == '\n'): continue
if(newLine != ''):
readList.append(newLine.rstrip())
else:
flag = 1

segments = ['。',',','、',''',':','∶',';','?','‘','’','“','”','〝','〞','ˆ',
'ˇ','﹕','︰','﹔','﹖',',','﹑','·','¨','…','.','¸',';','!','´','?',
'!','~','—','ˉ','|','‖','"','〃','`','@','﹫','¡','¿','﹏','﹋',
'﹌','︴','々','﹟','#','﹩','$','﹠','&','﹪','%','*','﹡','﹢','﹦','﹤',
'‐',' ̄','¯','―','﹨','ˆ','˜','﹍','﹎','+','=','<','­','­','_','_',"'",
'-','\\','ˇ','~','﹉','﹊','(',')','〈','〉','‹','›','﹛','﹜','『','』',
'〖','〗','[',']','《','》','〔','〕','{','}','「','」','【','】','︵','︷',
'︿','︹','︽','_','﹁','﹃','︻','︶','︸','﹀','︺','︾','ˉ','﹂','﹄','︼']
for i in segments:
readList.append(i)
return readList
except:
print("wrong at getStopList")
exit()
finally:
stopFile.close()

def solveSplit(List):
tempList = List
if(type(tempList) != type([])):
print("Wrong at solve")
exit()

stopList = getStopList()
finalList = []
for stop in range(len(stopList)):
if(stopList[stop] == None ): continue
if(stopList[stop] == '\n' ): continue
list = []
for temp in range(len(tempList)):
if(tempList[temp] == None): continue
if(type(tempList[temp]) != type('a')):continue
cache = tempList[temp].split(stopList[stop])
if(cache == ['']):continue
list.append(cache[0].strip())
#cover
tempList = list
# memory clear
del list
gc.collect()
final = sorted(tempList)
return final

def solveCount(list):
countDict = collections.Counter(list)
print(countDict)
return countDict

def save(dict):
fd = open("source.json","w+", encoding='utf-8')
try:
fd.write(json.dumps(dict, ensure_ascii=False, indent=2))

finally:
fd.close()

if __name__ == '__main__':
url ='http://comment.bilibili.com/17158352.xml'
html = getContent(url)
danmutemp = getDanmu(html)
danmuSplit = solveSplit(danmutemp)
danmuDict = solveCount(danmuSplit)
save(danmuDict)

#http://comment.bilibili.com/17158352.xml

这是爬取的代码。还有剩下的则是网页和js部分的代码。js是使用的d3.js

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
72
73
74
75
76
77
78
79
80
81
82
83
var width = 600;  
var height = 600;

dataset = {
x:['献','回','莱纳','胡佛','卧槽'],
y:[98,97,48,47,45]
};

var svg = d3.select("body").append("svg")
.attr("width",width)
.attr("height",height);

var xAxisScale = d3.scale.ordinal()
.domain(dataset.x)
.rangeRoundBands([0,500]);

var yAxisScale = d3.scale.linear()
.domain([0,d3.max(dataset.y)])
.range([500,0]);

var xAxis = d3.svg.axis()
.scale(xAxisScale)
.orient("bottom");

var yAxis = d3.svg.axis()
.scale(yAxisScale)
.orient("left");

var xScale = d3.scale.ordinal()
.domain(dataset.x)
.rangeRoundBands([0,500],0.05,0);

var yScale = d3.scale.linear()
.domain([0,d3.max(dataset.y)])
.range([0,500]);

//图
svg.selectAll("rect")
.data(dataset.y)
.enter()
.append("rect")
.attr("x", function(d,i){
return 30 + xScale(dataset.x[i]);
} )
.attr("y",function(d,i){
return 50 + 500 - yScale(d) ;
})
.attr("width", function(d,i){
return xScale.rangeBand();
})
.attr("height",yScale)
.attr("fill","blue");

//数字
svg.selectAll("text")
.data(dataset.y)
.enter().append("text")
.attr("x", function(d,i){
return 30 + xScale(dataset.x[i]);
} )
.attr("y",function(d,i){
return 50 + 500 - yScale(d) ;
})
.attr("dx", function(d,i){
return xScale.rangeBand()/3;
})
.attr("dy", 15)
.attr("text-anchor", "begin")
.attr("font-size", 14)
.attr("fill","white")
.text(function(d,i){
return d;
});

svg.append("g")
.attr("class","axis")
.attr("transform","translate(30,550)")
.call(xAxis);

svg.append("g")
.attr("class","axis")
.attr("transform","translate(30,50)")
.call(yAxis);

网页其实没怎么写,只是为了显示嘛。

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<title>huchi's 图片</title>
<h1 align="center">柱形图</h1>
</head>
<body align="center">
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8">
</script>
<script type="text/javascript" src="javascript.js"></script>

</body>
</html>

简答题:

简答题也是非常有趣的,但是由于时间原因我只挑选了其中四个进行解答。剩下的两个一个是云计算的还有一个是数据库的没有实现完。

first:网络

前一段时间有看过图解http,然后百度阅读资料大概就写了一下:

请简述从输入www.baidu.com到返回结果中的流程及其中用的相关技术或协议

获取IP地址

  1. 打开浏览器,在地址栏中输入度娘的网址。

  2. 浏览器根据输入的URI先去看浏览器缓存中是否有未过期的记录,

  3. 然后去查看一下host文件看看有没有度娘这个网址对应的IP地址,

  4. 没有的话,浏览器向本机DNS模块发出DNS请求,DNS模块生成相关的DNS报文

  5. DNS模块将生成的DNS报文传递给传输层的UDP协议单元

  6. UDP协议单元将该数据封装成UDP数据包,传递给网络层的IP协议单元

  7. IP协议单元将该数据封装成IP数据包

  8. 封装好的IP数据包将传递给数据链路层的协议单元进行发送;

  9. 发送时如果ARP缓存(IP地址和DNS服务器物理地址)中没有相关数据,则发送ARP广播请求,等待ARP(地址解析协议)回应;

  10. 得到ARP回应后,将IP地址与路由下一跳MAC地址对应的信息写入ARP缓存表;

  11. 写入缓存后,以路由下一跳地址填充目的MAC地址,并以数据帧形式转发;

  12. 向上

  13. DNS请求被发送到DNS服务器的数据链路层协议单元,其内部的IP数据包传递给网络层IP协议单元,其内部的UDP数据报传递给传输层的UDP协议单元,其内部的DNS报文传递给该服务器上的DNS服务单元,解析后得到相应的IP地址,产生DNS回应报文。

  14. 将域名解析的结果以域名和IP地址对应的方式写入DNS缓存表。

    (概括就是DNS-UDP-IP-MAC-发送-IP-UDP-DNS-返回DNS响应报文。。)

如果访问到多个IP地址,一般取第一个。

使用的协议:UDP 53,DNS协议,ARP协议 ,IP协议

使用技术:DNS域名解析负载均衡

TCP建立的三次握手

已经get到一个IP地址啦,浏览器就要向web服务器发送一个GET或POST请求了。

客户端发送请求后,服务器端返回响应,客户端再返回确认报文即可。一般返回2XX(200 OK)状态码就没什么问题了把。

  1. 发出TCP连接请求报文-IP-MAC(可能要进行ARP请求)-度娘主机或者代理
  2. 度娘MAC-IP-TCP-回应请求报文并请求确认
  3. 客户端经过一系列操作收到响应报文,然后再返回确认报文
  4. 如果没有收到这个确认报文则执行2

HTTP/1.1都默认使用了了持久连接,为了减少通信量,从而避免了一次又一次的TCP连接断开。

第四次连接应该就是TCP断开连接了。至此我们已经得到了www.baidu.com这个html并由浏览器解析呈现给我。

使用的协议:TCP协议,http协议。

second:python元类

这个东西的理解毒,其实是不够的,按照廖雪峰的教程敲了一遍,其实没懂(●’◡’●)。

下面给出我写的答案:

元类就像是类的模版,可以控制类的创建行为,动态创建类。所以从type类型派生。

通过元类修改类定义,可以实现如ORM(对象-关系映射).元类实现查找类中的属性,保存后删除(防止运行时错破)。继承元类的子类可以实现数据库的操作,之后继承那个子类的子类就可以当成是一个表,从而实现一个简易的数据库。(例子来于廖雪峰教程)

  1. 你可以自由的、动态的修改/增加/删除 类的或者实例中的方法或者属性
  2. 批量的对某些方法使用decorator,而不需要每次都在方法的上面加入@decorator_func
  3. 当引入第三方库的时候,如果该库某些类需要patch的时候可以用metaclass
  4. 可以用于序列化(参见yaml这个库的实现,我没怎么仔细看)
  5. 提供接口注册,接口格式检查等
  1. 自动委托(auto delegate)
  1. 以上为引用

元类的主要用途是创建API。

主要思路就是:

  1. 拦截类的创建
  2. 修改类
  3. 返回修改的类

third:js闭包

刚好这段时间有在看js DOM编程艺术。

下面给出我的答案:

闭包听上去是一个很高大上的东西,其实也就是变量作用域搞的鬼。

1
2
3
4
5
var a = 1;
function test(){
alert(a);
}
test();

显然读取外部var变量是so easy的。但反之是不行的。

1
2
3
4
5
6
7
8
9
10
function test(){
a = 2;
add = function(){a++;};//global
function innerTest(){
alert(a);
}
return innerTest;
}
var result = test();
result();

这就是闭包通过返回一个内部的函数,建立起与函数外的桥梁。

但闭包会使变量都保存在内存,然后内存upup,严重的话就内存泄漏了,退出函数前需要删除局部变量。

不过这种作用域的机制促成了闭包,但是给我造成了一个大坑。

匿名函数的大坑。匿名函数取得的值都是任何变量的最后一个值。

1
2
3
4
5
6
7
8
9
10
11
12
//show the picture in old page
var links = document.getElementsByTagName("a");
for(var i=0; i < links.length; i++){
var source = links[i].getAttribute("href");
if(!source) continue;

links[i].onmouseover = function(){
var temp = links[i].getAttribute("href");//wrong here
var Holder = document.getElementById("pictureHolder");
Holder.setAttribute("src", temp);
};
}

这里取得匿名函数取得的i就是3了,然后一查是undefined。。。。gg

不过把links[i]改成this就ok了。

fourth:父子进程通信方法

这是一道很让我蒙蔽的。因为通信的方式那么多。。。而且只能写200字,最后大概是我每个方法写了两百字,(●’◡’●)。

1.管道

匿名管道用于亲缘进程通信,命名管道任意。

管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。

以管道文件作为通信的媒介,下面使用了pipe生成管道和fork生成进程,子进程给父进程通信。

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
#include<cstdio>
#include<iostream>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<cstring>
#define maxn 2048
using namespace std;

int main(){
pid_t pid;
char buf[maxn],written[]={"hello wrold\n"};
int fd[2],n;
if(pipe(fd) == -1){
//failed
printf("Create pipe failed\n");
exit(0);
}
pid = fork();//use once,return twice
if(pid<0){
//error raised
//1.the number of processes is bigger than manx limited
//2.memory is poor
printf("Create fork failed\n");
exit(1);
}else if (pid == 0){
//in the child send
printf("I am the child,my process ID is %d\n",getpid());
close(fd[0]);
write(fd[1],written,strlen(written));
}else {
//parent get
printf("I am the parent,my process Id is %d\n",getpid());
close(fd[1]);
n = read(fd[0], buf, maxn);
write(STDOUT_FILENO, buf, n);
}
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
23
24
25
26
27
28
29
30
31
32
33
34
#include<cstdio>
#include<iostream>
#include<signal.h>
#include<cstdlib>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
using namespace std;
static int alarm_fired = 0;
void ouch(int sig){
alarm_fired = 1;
}

int main(){
pid_t pid;
pid = fork();
if(pid == -1){
perror("fork failed\n");
exit(1);
}else if(pid == 0){
sleep(5);
kill(getppid(), SIGALRM); //send s signal to parent
exit(0);
}
signal(SIGALRM, ouch);//Once accept then run ouch
while(!alarm_fired){
printf("Hello world\n");
sleep(1);
}
if(alarm_fired){
printf("\nI got a siganl %d\n",SIGALRM);
}
exit(0);
}

3. 消息队列

通过msgget建立消息队列,子进程msgsnd发送消息,父进程msgrcv接受消息并输出。

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
#include<cstdio>
#include<iostream>
#include<signal.h>
#include<cstdlib>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<errno.h>
#include<cstring>
#define MAX_TEXT 512
using namespace std;
struct msg_st{
long int msg_type;
char text[BUFSIZ];
};

int main(){
pid_t pid;
int running = 1;
int msgid = -1;
msg_st data;
long int msgtype = 0;
char buffer[BUFSIZ];
//steup up
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if(msgid == -1){
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(-1);
}
printf("q to quit:\n");
pid = fork();
while(running){
if(pid == -1){exit(-1);}
else if(pid == 0){
printf("Enter:");
fgets(buffer, BUFSIZ, stdin);
data.msg_type = 1;
strcpy(data.text, buffer);
//send falied
if(msgsnd(msgid, (void*)&data, MAX_TEXT, 0) == -1){
fprintf(stderr, "msgsnd failed\n");
exit(-1);
}
//quit
if(strncmp(buffer, "q", 1) == 0)
running = 0;
sleep(1);

}else {

if(msgrcv(msgid, (void*)&data, BUFSIZ, msgtype, 0) == -1){
fprintf(stderr, "msgrcv failed with error: %d\n", errno);
exit(-1);
}
printf("Write: %s\n",data.text);
//quit
if(strncmp(data.text, "q", 1) == 0)
running = 0;
}
}
//delete
if(pid>0 && msgctl(msgid, IPC_RMID, 0) == -1){
fprintf(stderr, "msgctl failed\n");
exit(-1);
}
return 0;
}

4. shared Memory

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
72
73
74
75
76
77
78
79
80
81
#include<cstdio>
#include<iostream>
#include<signal.h>
#include<cstdlib>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<errno.h>
#include<cstring>
#include<sys/shm.h>
#define MAX_TEXT 512
using namespace std;

struct shared_use_st{
int written;
char text[MAX_TEXT];
};

int main(){

pid_t pid;
int running = 1;
void *shm = NULL;
struct shared_use_st *shared;
int shmid;//shareMemory number
char buffer[BUFSIZ];

shmid = shmget((key_t)1234, sshared Memoryizeof(shared_use_st*), 0666|IPC_CREAT);
if(shmid == -1){
fprintf(stderr, "shmget failed\n");
exit(-1);
}
//point to memory space
shm = shmat(shmid, (void*)0, 0);
if(shm == (void*)-1){
fprintf(stderr, "shmat failed\n");
exit(-1);
}
printf("SharedMemory attacher at %X\n",(unsigned long long)shm);
shared = (struct shared_use_st*)shm;
shared->written = 0;

pid = fork();
if(pid <0)exit(-1);
while(running){
if(pid == 0){
while(shared->written == 1){
sleep(1);
printf("Wait a second\n");
}
printf("Enetr:");
fgets(buffer, BUFSIZ, stdin);
strncpy(shared->text, buffer, MAX_TEXT);

shared->written = 1;
if(strncmp(buffer, "q", 1) == 0)
running = 0;
}
else{
if(shared->written != 0){
printf("Written: %s",shared->text);

shared->written = 0;
if(strncmp(shared->text, "p", 1) == 0)
running = 0;
}else sleep(1);
}
}
//seperate the memory
if(shmdt(shm) == -1){
fprintf(stderr, "shmdt failed\n");
exit(-1);
}
//delete
if(pid>0 && shmctl(shmid, IPC_RMID, 0) == -1){
fprintf(stderr, "delete failed\n");
exit(-1);
}
return 0;
}

fifth:数据库

是一道增删查改,多表查询的题。不详细贴出来了。

sixth:云计算

这个我没看。。。里面还有好几个小问题呢。

Welcome to Cloud Computing Group
Here are some chanllenges for you, don’t be afraid :)
Short answer

  1. How do you understand distributed file systems and distributed computing?
  2. Please tell the difference between parallelism and concurrency.
  3. Please describe features about Binary Search Tree.
  4. How do you understand functional programming.
    Programming questions
    Ok, it’s time to prove your programming skills. Give you some English articles, you need to count how many
    times each word appears, which is so-called WordCount problem. You can do it with language like Scala, Java,
    Python and R, and we prefer you to use Scala because it’s very simple and more suitable to the Spark.
    Before you write your codes, you should set up hadoop and spark environment on your computer, you
    just need to set up a single node using your computer, and the file system must be hdfs. You can set
    up the enironment on Windows, but indeed Linux is more easier to set up the enironment. By the way,
    if you use standalone for spark, it’s more esaier. If you don’t know how to set up the enironment, just
    baidu or google it, don’t be afraid, it’s not very difficult.The search key word is “spark单机伪分布式配
    置”。
    There are some requirments for this question.
    You should put the articles into HDFS and read it from HDFS in your codes.
    Do WordCount on spark, using map-reduce.
    You should save your results into HDFS, and your WordCount program’s output may be like this:
    hello 1
    world 2

    The articles are in http://pan.baidu.com/s/1c11Dkq8 (pass word: kfdo)
    Tips & Requirements
    Learn to use search engine
    Learn about linux
    Learn about how to use HDFS, Hadoop, Spark
    Programming languages includes Java, scala, python etc.(Scala is better.)
    Once you have finished all these above, you should write a report about your work, including your code,
    your answer, your ideas, your understanding, whatever you want to say.What’s more, if you do the
    wordcount successfully, you should get the results directory(include part-xxx and _SUCCESS file) from HDFS.
    If you can’t do the wordcount completely, don’t be discouraged, you just write your ideas and difficulties in
    your report, we are not just focuing on your results, we prefer to your ideas and your learning ability.
    Submit your report, code files and result directory together in a single compressed file.

就直接贴出来了。据说里面的问答题还是可以做做的,

第二件事情——微软的编程之美

讲真。。我这个水平应该是不适合参加的,但是社团要求,然后就组了几个小伙伴稍微搞了一下。

我负责的是jieba分词,后面有让我做爬虫爬数据训练的,后来发现爬的数据真是。。。。

下面贴jieba分词的代码:

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
72
73
74
75
76
77
78
79
80
81
# _*_coding:utf-8_*_
from jieba import analyse
import jieba
import jieba.posseg as pseg
tfidf = analyse.extract_tags
num = [[]]
questions = []
#ans = [[]]

stopkey=[line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]

with open("train.txt",'rb') as fp:
line = fp.readline().decode('utf-8').split('\t')
i = 0
questions.append(line[0].rstrip())
while line:
num[i].append(line[1].rstrip())
#ans[i].append(line[2].rstrip())
if line[1] not in questions:
questions.append(line[0])
i+=1
num.append([])
#ans.append([])
line = fp.readline().decode('utf-8')
if(line) : line = line.split('\t')
# 小数据测试
# if(i>10000) :break
if(i%100==0) : print(i)

# 分词
for i in range(len(questions)):
# words = pseg.cut(questions[i])
# 词性
# attribue = []
# for word in words:
# if word.flag not in attribue:
# attribue.append(word.flag)

temp = ''
index = 0
for qtemp in jieba.cut(questions[i]):
if qtemp not in stopkey:
temp += qtemp
# if(index<len(attribue)):temp+=attribue[index]
temp += ' '
# index += 1
questions[i] = temp

for j in range(len(num[i])):

# 词性
# attribueOfans = []
# for word in pseg.cut(num[i][j]):
# if word.flag not in attribueOfans:
# attribueOfans.append(word.flag)


temp = ''
# index = 0
for qtemp in jieba.cut(num[i][j]):
if qtemp not in stopkey:
temp += qtemp
# if(index<len(attribueOfans)):
# temp += attribueOfans[index]
temp += ' '
# index+=1
num[i][j] = temp
print("分词成功")
# write
with open("a_file.txt",'w',encoding='utf-8') as wf:
for i in range(len(num)):
for j in range(len(num[i])):
if(num[i][j]==[]):continue
#if(ans[i][j]==[]):break
wf.write(questions[i])
wf.write('\t')
wf.write(num[i][j])
#wf.write('\t')
#wf.write(ans[i][j])
wf.write('\n')
if(i%100==1):print(i)

不过事实证明,用词性来计算问答句的关联度是不怎么正确的,毕竟我们组没有人学过dl,也没有接触过nlp。不过还是可以称得上是一次很好的经历吧。

conclusion

burn the pages for me

turn the pages for me

|