来说说帖子排名

编程技术区创建的那个帖子,排进全网首页
以前一直不知道回复的收益会影响帖子排名,这次算涨姿势了。

测试

为了验证这个事,写了一段代码
本来打算用piston的get_comments接口,但是运行的时候有BUG,出错了
大致看了一下,应该是piston中对帖子的支付状态之类的没仔细判断,导致传入无效的参数崩溃

看了一下piston的实现,使用的是get_content_replies这个API
于是在piston的底层基础上直接用这个API来调用

思路是读指定帖子的回帖(第0级)
记录每个回帖的收益pending_payout_value
然后读回帖的回帖(第一级)
依此递归

最后得到一个所有回复的列表
然后,打印列表,并统计总计得钱的值

以这个帖子为例:
谈谈这里的帖子排名算法
total_pending_payout_value已经到达
total_pending_payout_value: 37.069 SBD
其中所有回复pending_payout_value我加起来为36.43
或许这个total_pending_payout_value会影响帖子的排名

最终结论

  • 文章或回复的作者收益在pending_payout_value
  • 文章或回复中的 total_pending_payout_value包含文章或回复本身以及所有子回复。
  • total_pending_payout_value或会决定帖子的排名 (或者说是决定因素之一)

以上测试和结论仅基于首次支付模式(还没发奖)
由于数据时刻再变,读出来的以后可能已经变了,所以不保证数据的准确性
以上结论供大家参考玩。


This page is synchronized from the post: 来说说帖子排名

随便讲讲我学编程这些年(二:找工作,部队篇)

IMG_20170213_20383436236.jpg

因为传图实在是费劲,还继续用这个首图吧。

话说前文讲到大学考下了计算机四级并且和伙伴创业失败。作为一枚物理学专业的学生,我的交际圈没有那么广,想重新找到伙伴继续宏大的梦想,还是有些困难。既然如此,咱也找工作吧

物理学专业的毕业生,那时候就业前景没有那么好,一般几个出路如下:

  • 去学校当教师
  • 去一些科研所搞科研
  • 继续深造

签约部队

这几个方向都不是我菜,我觉得当时主要原因是自我膨胀太厉害,急于找一片天地实现自己的伟大抱负。用程序改变世界、进而改变自己的人生。于是参加校园招聘会啥的也把目标定在和软件、计算机技术相关的。然后和伙伴们一起参加了几次校招,谈了一些企业啥的挺多对我抛出橄榄枝的,但是都绝对不甚满意。后来一次校招,有部队过来招聘,中国人民解放军战略导弹部队(第二炮兵),我的几个朋友上前应聘,对方看了看简历就给退回。我抱着试试看的心态上前(怎么有点像广告词)拿出我的一堆证书(包括我的计算机四级证书)并阐述了我们创业期间做的一些项目和程序,当时负责招聘的军官热情的不得了,把我的信息郑重其事的记录下来,并且当我的面画了个大大的重点号。并和我聊了一大堆部队部队如何之好,他们急需计算机人才,到那之后我可以大展身手,并且几个驻点(大连、莱芜等等)我可以随便选择。恨不得我当时就和他们签协议。我当时回复考虑考虑,但是有些心动,年少谁没有铁血梦,哦,虽然是技术兵种。

因为心动了,就和家里说了这事。家里包括亲朋那是支持的不得了啊。在他们眼中,进入了部队,也算进入了体系当中,将来升官发财是板上钉钉的(事实也是这样,我身边几个同学去了各种部队,现在应该都是正营级以上啦)。然后没过多久部队就打电话要我过去签约,于是像赵丽蓉和巩汉林的小品写的一样我说我不签,你非让我签就把就业协议签上了,什么手印啊,签名啊,入伍志愿书啊,还有对方的大红印章,当当都扣上了,这下可真板上钉钉了。当时在他们的驻地,小战士啥的领我参观,对我是毕恭毕敬啊,到一个地方站岗的都咔咔给我敬礼,用导游的战士的话来讲,我入伍就算副连职,是领导呢。真的很有满足感的呢。

萌生退意

协议签过了,兴奋也兴奋过了。回到学校却听到不少不一样的声音,学校开的就业辅导大课,里边的老师讲有一个学生签约部队,当时部队承诺他在A城市(她女朋友所在的城市),结果却分配到的B城市(极其偏远),然后他偷偷跑去找女友,被当作逃兵抓回来。这在我心里埋藏下了一根刺。身边几个好朋友也不希望我去部队,怕那样就聚少离多。一个平时对我颇为关照的老师,甚至私下里和我半开玩笑的说,就我这样的体格到部队拉练几次就会累死的。然后我又在书店买了本介绍部队相关内容的书,仔细阅读发现到队部,第一要点就是服从,很多事,比如涉及转业之类的还是很麻烦的。也是这段时间,我和一个在其它城市的高中同学确定了恋爱关系,这时候想想部队的聚少离多,简直不能容忍。于是萌生了不去部队的想法。

3000大洋赎身

这时候是体现合同的重要性了。

因为萌生了退意,于是咨询一下周边的朋友和老师,都是签了协议很难违约。社会公司还好说,部队嘛,呵呵了。然后我不死心了,和一直在联系的军官咨询。他表示不能理解,说我的担忧根本不存在,各种许诺等等。但是我去意已决,我搬出大杀器,我说身体不好,我色弱,可能不符合入伍条件。对方回答我,只要不瞎就行,尽可放心。并对我各种安抚。

有时候想法一旦滋生出来是遏制不住的,我越来越觉得去了部队后我的人生会是一片灰暗。后来又三番两次与对方负责的军官联系,他们看出我的态度很是坚决,对我表示了极大的愤慨,亦即浪费了彼此的大量时间和资源,言下之意去也得去不去也得去了。后来在同学聊天的时候,一位同学对此表示了极大的兴趣,他让我推荐他过去,我想这不失为一个办法,于是我强烈的推荐了我的同学,对方对此表示了不屑。然后我无数次的推荐,并陈述了我同学的各种优点,以及在计算机方面的能力,对方方同意让我同学去面试,并允许我办理解除协议,但是3000违约金一分也不能少。

和家里说了这事,家人极力反对,不说一直对部队的看好,就是3000大洋,当时算是极大的巨款。说不同意我的选择,也不会出钱让我办理解除协议。后来寝室的老大借给了我这笔巨款,我终于如愿以偿赎身。

回头再看

现在回头再看,更多的已经不再是计较得失。家人朋友常说,如果当时去了部队如何如何,人生没有那么多如果不是吗?我的同学后来如愿以偿得以入伍,可能是他的能力得到了认可,但是后来聊天得知他过得并不如意,至少他这么觉得,然后从技术岗转带兵了,倒是很威武。他的手下还有我的老乡,我的老乡父母每次看到我的父母都极度客气,让我多帮忙关照一下,可惜我觉得我没这个能力关照别人了,让我同学适度关照一下,仅能做到这样而已。

但是遗憾还是有一些,毕竟人生当中没有体验过军伍生活,尤其是曾经又那么一次机会如此贴近……


This page is synchronized from the post: 随便讲讲我学编程这些年(二:找工作,部队篇)

随便讲讲我学编程这些年(一:大学篇)

IMG_20170213_20383436236.jpg

开了这个标题后有些不知从何写起。
先感谢@abit 建立#cn-programming,让这些程序猿们有一个共同的圈子
只是不知道steemit中文区还有多少程序猿,还有这些程序猿现在是不是都变身管理层或者投资者不再写程序了:)

自学编程考四级

严格的讲,我不算是一枚程序猿
我大学报考的专业是物理学,当时梦想是做一个科学家,万一哪个苹果掉脑袋上,咱也就流芳千古了。可惜那时候计算机在国内很流行,大学不管啥专业都开些乱七八糟的计算机课,然后一下子就被吸引了。于是自学C语言、VB、ASP、PHP、操作系统、数据结构、数据库、计算机网络、计算机英语、离散数学等乱七八糟的课程,几乎除了物理学专业开设的汇编语言、FOXBASE、AUTOCAD等课程,基本上大学里常接触的课程我都自学了一遍。

因为对计算机课程的如此热爱,大学同学都在打扑克、打游戏、谈恋爱的时候,我不是在看书就是在上机。为了检验自己的学习成果,报名参加了计算机四级考试,朋友们可能都听说过计算机一二级,三四级很少有人报考的,四级是当时计算机国家等级考试的最高级别,分为软件硬件两个方向,考点几乎涉及了我自学的所有课程。然后一番辛苦后,拿到了个计算机四级合格证书,据说全世界承认(据说而已)

硬件创业一场空

为了继续实践,大四的时候我和三个朋友创建了一个工作室。

我们接乱七八糟的一些软硬件项目,因为一个老师帮忙推介了一些偏硬的项目,我们的重心一点点的跑到硬件上去了。我记得花2000多大洋买了单片机编程器(没记错的话是南京西尔特的,据说这个公司还存在呢)。然后无数次的跑沈阳这边的电子市场,采购了一堆乱七八糟的原件。作为一个自学软件出身的人,我也操起了电烙铁、万用表、示波器,什么keil C给89S51编程更是拿来就编

记得印象最深的一次,那是那年的元旦,我们四个喊了几个朋友,一起去我们的出租屋Happy。记得有两瓶红星二锅头、还有一大瓶所谓红酒(我感觉就是葡萄汁兑酒精)、还有一堆啤酒,喝的是昏天暗地啊,然后我就死沉沉的睡过去了。

半夜醒来,看我另外两个哥们在电脑前红着眼睛调程序。原来白天的时候我们刚收到一块液晶显示屏,只有寥寥几行文档告诉咋用汇编驱动。我凑过去看他们写的代码,死活液晶也不显示内容,一看汇编写的一团糟,难怪不亮!然后我说你们下来,我来写,然后我用Keil C写程序把这款液晶点亮、再写出打点、画线、画图形、显示文字、显示图像,我写的差不多的时候,天亮了,酒的后劲上来,吐的一塌糊涂啊。然后我在两个睡得死猪一般的哥们身上爬过去,躺在床上,合计睡一会,然后在爬出去吐,再爬回来,如此好几次。他们依然死猪一般。

这组液晶驱动程序,现在我一哥们的产品里还再用,不知道当时自己怎么能写出来的,莫非这就是斗酒诗百篇

我们断断续续接了一些项目,当时比较突出的两个问题是费用低、要钱难。因为我们还是学生,一个小项目要个300-500人家都觉得很贵,有几个上千的又非常复杂。另外一个问题就是要钱难,我记得一个软硬件一体的电子称,就是把硬件的称重读数用RS232传到电脑上,并且在电脑上显示。在那个时代应该算智能称了,当然不像现在什么WIFI啊,蓝牙传输到手机上等等。这个当时要了3000元,剩下了一笔尾款500,死活不给啊,后来记得我冒着大雪坐公交去讨债,然后对方说你这个板卡有问题,数据不稳定,我表示不服,说马上回去拿备用的板卡来测试,然后冒着大雪坐公交回出租屋,半路对方给我发传呼告诉我不用比了,直接回去取钱吧,他们手中板卡上一枚芯片没有完全按倒插座里。然后我又回去,又回来。

我们怀着一腔热血,期待做大做强
然后一个家里给安排了去银行工作
一个哥们家里给安排去日本留学
一个哥们不知道啥时候偷摸签约了东软集团
居然不知不觉剩我自己没着落了,然后我们商量了一下,把东西卖的卖、分的分
最后剩了一些钱,大家分了一下就散伙了。

敬请期待

随便放了两个图,本来想讲我学Python的经历
然后写着写照跑题了……
总之,这个cn-programming 勾起我无数回忆啊
毛主席诗词中有一句三十八年过去,弹指一挥间
这段往事距离现在也快到半个弹指了

电脑桌


This page is synchronized from the post: 随便讲讲我学编程这些年(一:大学篇)

不求甚解之Python清理字典组成的列表/ Python:Process the list of dictionary

M3

不写程序的时候,觉得自己什么都会,无所不能啊
一动手,发现,我擦,啥都不会了,磕磕绊绊边学边写吧,然后发现学过的,又忘了……

这不,遇到个小麻烦
我有一组数据,是一个列表,列表项是字典
然后呢,会有一些重复的数据,现在我想去掉重复的数据
数据举例如下:
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 2, 'id': 2}, {'data': 1, 'id': 3}]
我想去掉id相同的数据,至于data是否相同,留那个,我不关心

函数代码一

为了处理类似这组数据,我写了段代码:

1
2
3
4
5
6
7
8
9
10
def clean_list_v1(list):
id_list = []
for obj in list:
if obj['id'] in id_list:
list.remove(obj)
continue
id_list.append(obj['id'])

clean_list_v1(list)
print(list)

输出如下:

1
2
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 2, 'id': 2}, {'data': 1, 'id': 3}]
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 1, 'id': 3}]

看起来似乎正确
其实这里有个大BUG,比如我们换一组数据

1
2
[{'id': 1, 'data': 1}, {'id': 2, 'data': 1}, {'id': 2, 'data': 2}, {'id': 2, 'data': 3}, {'id': 3, 'data': 1}]
[{'id': 1, 'data': 1}, {'id': 2, 'data': 1}, {'id': 2, 'data': 3}, {'id': 3, 'data': 1}]

{'id': 2, 'data': 3}这组数据期望被移除,但是居然还在!!!

出错原因
想了半天啊,各种测试后,想明白了
因为代码中list.remove(obj)删除了当前位置的对象,然后后边列表项自动前移一位
但是for循环的位置已经指到下一个位置,就是少处理了一个对象

函数代码二

为了解决之前代码一中的问题,我重写了一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def clean_list_v2(list):
id_list = []
obj_2_del = []
for obj in list:
if obj['id'] in id_list:
#list.remove(obj)
obj_2_del.append(obj)
continue
id_list.append(obj['id'])

for obj in obj_2_del:
list.remove(obj)

clean_list_v2(list)
print(list)

结果如下:

1
2
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 2, 'id': 2}, {'data': 3, 'id': 2}, {'data': 1, 'id': 3}]
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 1, 'id': 3}]

简单说,我将待删除的元素放到一个列表中
然后再一起删除

函数代码三

既然可以将待删除的算出来,然后一并删除,那么是否反向操作,将待保留的保留呢?
于是我写了代码三

1
2
3
4
5
6
7
8
9
10
11
12
13
def clean_list_v3(list):
id_list = []
new_list = []
for obj in list:
if obj['id'] not in id_list:
new_list.append(obj)
id_list.append(obj['id'])
continue

return new_list

new_list = clean_list_v2(list)
print(new_list)

结果如下:

1
2
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 2, 'id': 2}, {'data': 3, 'id': 2}, {'data': 1, 'id': 3}]
[{'data': 1, 'id': 1}, {'data': 1, 'id': 2}, {'data': 1, 'id': 3}]

结果倒是没错,就是不是在list上直接处理的

函数代码四

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def clean_list_v4(list):
id_list = []
new_list = []
for obj in list:
if obj['id'] not in id_list:
new_list.append(obj)
id_list.append(obj['id'])
continue

list.clear()
for obj in new_list:
list.append(obj)

clean_list_v4(list)
print(list)

思路就是算出新列表后,清空老列表,在把新列表填充进去
额,好蛋疼

总结

  • 在for循环中删除列表元素,可能会导致BUG
  • 代码二看起来还是不错的,至少是这组代码中最顺眼的了

当然,我现在有些头晕,不知道有没有逻辑错误
另外,总觉的还是很麻烦,大家都什么好办法,一定要告诉我啊

PS:
同之前的文章一样,把这个过程写下来,一则做个备忘,二则给遇到同样问题的朋友一点参考
我是初学者,边学边试边玩,有错漏的地方,烦请各位大神指正。


This page is synchronized from the post: 不求甚解之Python清理字典组成的列表/ Python:Process the list of dictionary

不求甚解之Python函数参数 (元组,字典)/ Python function & parameter & argument

M3

前文我们因为一段测试程序不好用,特意装了Python 3.5.3
How to install python 3.5 on Banana-Pi M3 / 如何香蕉派上的安装python 3.5
导致问题的程序代码如下:

1
2
3
4
5
6
7
foo = {'1': 1}

def bar(*args, **kwargs):
print(kwargs)

bar(**foo, baz=2)
`

最终我们通过的升级Python到3.5.3 解决了这个问题
(把传入的参数顺序调换一下也可以解决这个问题)

但是,这到底是咋回事呢? kwargs,前边的到底是啥意思呢?
作为菜鸟,不求甚解是不对的,为此我特意学习了一下

什么位置参数,关键字参数就不用说啦,来看看那个***是什么鬼?

函数参数

为此,我特意写了一段程序测试一下:

1
2
3
4
5
def func(arg1, *arg2, **arg3):
print(arg1)
print(arg2)
print(arg3)
print("End Func\n--------")
  • 调用 func(1)
    1
    2
    3
    4
    5
    1
    ()
    {}
    End Func
    --------

结果一如所料,位置参数传入1,元组以及字典为空

  • 调用 func(1, 2, 3)
    1
    2
    3
    4
    5
    1
    (2, 3)
    {}
    End Func
    --------

位置参数传入1,多余的直接传入的参数被放入元祖,字典为空

  • 调用 func(1, a=’aaa’, b=’bbb’)
    1
    2
    3
    4
    5
    1
    ()
    {'b': 'bbb', 'a': 'aaa'}
    End Func
    --------

位置参数传入1,元祖为空,多余的关键字参数被放入字典

  • 调用 func(1, 2, 3, a=’aaa’, b=’bbb’)
    1
    2
    3
    4
    5
    1
    (2, 3)
    {'b': 'bbb', 'a': 'aaa'}
    End Func
    --------

位置参数传入1,多余的直接传入的参数被放入元祖,多余的关键字参数被放入字典

至此已经大致明白了
对于def func(arg1, *arg2, **arg3):
除了正常的位置参数,关键字参数外,多余的位置参数放入元组(arg2),多余的关键字参数放入字典(arg3)

注意:顺序是不能乱的,例如
func(1, a='aaa', 2, 3, b='bbb')会出错误提示:SyntaxError: non-keyword arg after keyword arg

传入元组以及字典

在回头看我们最初的代码,它定义了一个字典,并把字典加了两个星号传入函数,这是又是什么鬼?

  • 测试传入*元组

为此我测试了如下代码:

1
2
tup = (2, 3)
func(1, *tup)

结果如下:

1
2
3
4
5
1
(2, 3)
{'b': 'bbb', 'a': 'aaa'}
End Func
--------

等同于 func(1, 2, 3)

  • 测试传入**字典
    1
    2
    dict = { 'a':'aaa', 'b':'bbb'}
    func(1, **dict)

结果如下:

1
2
3
4
5
1
()
{'a': 'aaa', 'b': 'bbb'}
End Func
--------

等同于 func(1, a='aaa', b='bbb')

由此可知:
*元组将元祖内的元素直接拿出来
**字典将字典改变为key1=value1, key2=value2, ...的形式
有人将此称之为:元组解包,字典解包,倒是挺恰当的

混合传入

1
2
3
4
tup = (2, 3)
#注意关键字参数不能重复,所以此处不能用dict = { 'a':'aaa', 'b':'bbb'}
dict = { 'c':'ccc', 'd':'ddd'}
func(1, 2, 3, *tup, a='aaa', b='bbb', **dict)

结果如下:

1
2
3
4
5
1
(2, 3, 2, 3)
{'c': 'ccc', 'b': 'bbb', 'a': 'aaa', 'd': 'ddd'}
End Func
--------

好了,这回总算明白个大概了,不怕蒙头转向了。
需要注意的是,位置啥的是不能乱写的,不然会把编译器搞蒙圈的
所以,虽然我们最初的例子,Python 3.5.3 支持,但是我觉得还是按规矩来比较好呢。

PS:
同之前的文章一样,把这个过程写下来,一则做个备忘,二则给遇到同样问题的朋友一点参考
我是初学者,边学边试边玩,有错漏的地方,烦请各位大神指正。

参考链接

https://docs.python.org/3/reference/compound_stmts.html#function-definitions
https://docs.python.org/3/glossary.html#term-parameter
https://docs.python.org/3/glossary.html#term-argument


This page is synchronized from the post: 不求甚解之Python函数参数 (元组,字典)/ Python function & parameter & argument

创建虚拟Python环境以及在crontab中运行虚拟Python环境/ Create a virtual Python environment and set virtualenv for a crontab

M3

在前文中我记录了如何安装Python 3.5.3:
How to install python 3.5 on Banana-Pi M3 / 如何香蕉派上的安装python 3.5

那么问题来了,系统原来带了Python 3.4.2 以及 Python 2.7.9,现在又多了个 Python 3.5.3
那么运行程序的时候,到底是在哪个环境下啊?
别问我静静是谁,我想静静了!

测试脚本(test.py):

1
2
import sys
print(sys.version)

哦, 大师们说,这个问题有好多办法呢!仰望大师…
经过虚心向大师们学习,有如下办法:

  • 直接使用绝对路径运行Python
    比如:
    /opt/python/3.5.3/bin/python3.5 --version
    Python 3.5.3
    或者
    /opt/python/3.5.3/bin/python3.5 test.py
    3.5.3 (default, Feb 6 2017, 18:38:10)
    [GCC 4.9.2]

  • 在脚本中指定环境

    1
    2
    3
    #! /opt/python/3.5.3/bin/python3.5
    import sys
    print(sys.version)

测试

1
2
3
./test.py
3.5.3 (default, Feb 6 2017, 18:38:10)
[GCC 4.9.2]

virtualenv

虽然上述方法可行,但是还是要牢记有两个版本,要时刻注意区分
如果在涉及到在不同版本下安装不同软件包,会更加混乱,尤其是对我这种菜鸟而言。

那有没有更简单的方法呢?答案是有的,就是使用virtualenv

virtualenv我理解就是创建一个虚拟的Python环境
在这个环境下,你看到的就是你虚拟的Python环境,很干净,不用考虑乱七八糟的事情

  • 安装
    sudo pip3 install virtualenv

  • 创建一个virtualenv环境
    virtualenv --no-site-packages --python /opt/python/3.5.3/bin/python3.5 venv

  • 启动虚拟Python 环境
    cd venv/bin
    source activate

  • 安装需要的Python包
    这时候可以安装任何你需要的Python安装包了

  • 测试

测试脚本(test.py):

1
2
import sys
print(sys.version)

运行与运行结果

1
2
3
python3 test.py
3.5.3 (default, Feb 6 2017, 18:38:10)
[GCC 4.9.2]

  • 退出
    deactivate

set virtualenv for a crontab / 在crontab中运行虚拟Python环境

是不是很简单,那么问题来了
在终端我们可以通过执行source activate来启动虚拟Python环境
那么如果在crontab下中如何执行呢?

直接直接Python脚本肯定是不行的,因为还没进入到虚拟环境呢。
那么该如何办呢?

简单的说,就是创建个shell脚本,在shell脚本中进入虚拟Python环境,然后执行Python文件即可

可以参考这个两个链接:
http://stackoverflow.com/questions/4150671/how-to-set-virtualenv-for-a-crontab
https://segmentfault.com/q/1010000000319231

其它问题

编译Python后,在虚拟环境中运行
import sqlite3
提示:
ImportError: No module named '_sqlite3'

相关链接:
http://stackoverflow.com/questions/1210664/no-module-named-sqlite3
http://www.360ito.com/question/57.html

  • 尝试一:

虚拟环境下运行
pip3 install sqlite3
提示
RuntimeError: Package 'sqlite3' must not be downloaded from pypi

相关链接:
https://www.ateamsystems.com/tech-blog/solved-virtualenv-runtimeerror-package-sqlite-must-not-downloaded-pypi/

  • 尝试二:

安装libsqlite3-dev 后重新编译Python, 重新创建virtualenv
sudo apt-get install libsqlite3-dev
详情见:
How to install python 3.5 on Banana-Pi M3 / 如何香蕉派上的安装python 3.5

PS:
同之前的文章一样,把这个过程写下来,一则做个备忘,二则给遇到同样问题的朋友一点参考
我是初学者,边学边试边玩,有错漏的地方,烦请各位大神指正。


This page is synchronized from the post: 创建虚拟Python环境以及在crontab中运行虚拟Python环境/ Create a virtual Python environment and set virtualenv for a crontab

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×