0%

引子

童话里经常会看到英雄打败恶人的故事,而且故事里总会有一个类似黑暗森林的场景——要么是一个山洞,要么是一篇森林,要么是另一个星球,反正是英雄不该去的某个地方。
当然,一旦反面角色在剧情中出现,你就会发现英雄非得去那片破森林去杀掉坏人。当英雄的总是不得不冒着生命危险进到邪恶森林中去。

在面向对象编程中,“继承”就是那片邪恶森林。
有经验的程序员知道如何躲开这个恶魔,因为他们知道,在丛林深处的“继承”,其实是邪恶女皇“多重继承”。她喜欢用自己的巨口尖牙吃掉程序员和软件,咀嚼这些堕落者的血肉。
不过这片丛林的吸引力是如此的强大,几乎每一个程序员都会进去探险,梦想着提着邪恶女皇的头颅走出丛林,从而声称自己是真正的程序员。你就是无法阻止丛林的魔力,于是你深入其中,而等你冒险结束,九死一生之后,你唯一学到的,就是远远躲开这片破森林,而如果你不得不再进去一次,你会带一支军队。

有的程序员现在正在丛林里跟邪恶女皇作战,他会对你说你必须进到森林里去。他们这样说其实是因为他们需要你的帮助,因为他们已经无法承受他们自己创建的东西了。

而对于你来说,你只要记住这一条:
大部分使用继承的场合都可以用合成取代,而多级继承则需要不惜一切地避免之。

阅读全文 »

番茄工作法简介

番茄工作法(英语:Pomodoro Technique)是一种时间管理法方法,在上世纪八十年代由Francesco Cirillo创立。 该方法使用一个定时器来分割出一个一般为25分钟的工作时间和5分钟的休息时间,而那些时间段被称为pomodori,为意大利语单词 pomodoro(中文:番茄)之复数。

番茄工作法有五个基本步骤:

  1. 决定待完成的任务
  2. 设定番茄工作法定时器至 n 分钟(通常为25分钟)。
  3. 持续工作直至定时器提示,记下一个x。
  4. 短暂休息3-5分钟。
  5. 每四个x,休息15-30分钟。

番茄工作法的关键是规划,追踪,记录,处理,以及可视化。在规划阶段,任务被根据优先级排入”To Do Today” list。 这允许用户预计每个任务的工作量。当每个番茄时结束后,成果会被记录下来以提高参与者的成就感并为未来的自我观察和改进提供原始数据。

番茄工作法一般与GTD相结合,能取得事半功倍的效果。

工具推荐

  1. GTD软件,用于任务规划和记录,推荐滴答清单Doit.im
  2. 小米手环,震动提醒防止打扰别人。
  3. 米环工具 Mi Band Tools, 百度网盘: https://pan.baidu.com/s/1qZ54Rr2 密码: pcqh
  4. 极简番茄, 百度网盘: https://pan.baidu.com/s/1smZUZxj 密码: 8fff

小米手环本来没有番茄钟的功能,通过Mi Band Tools极简番茄这两个应用,在米环工具的“应用”中添加 极简番茄,可以实现手环震动提醒番茄钟。
当然你也可以直接使用极简番茄,通过手机震动或是响铃提醒,或者买一个计时器。

小米手环和极简番茄结合方法

在米环工具的“应用”中添加 极简番茄。

具体的应用配置可以参考截图,一般只修改震动次数、忽略不可清除的通知,其他默认即可



git 简介

git是一个分散式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)創作,於2005年以GPL釋出。最初目的是为更好地管理Linux内核开发而设计。
初始版本由Linus大神在两个星期内写出来,之后基本一统文件版本控制的天下。

名词解释

工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在”git目录”下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
branch:分支,相当于不同的平行世界
remote:远程仓库
origin:默认的远程仓库名词
HEAD:一个指向当前版本号的指针

阅读全文 »

冒泡排序 BubbleSort

介绍

遍历序列,比较两个元素,如果前面的大于后面的就交换两者的位置。其实称之为冒泡排序不如加沉底排序,因为每一轮比较,这一轮轮最大都会被排到序列末尾,其实沉底更为贴切。

步骤

  1. 遍历序列,比较序列的相邻元素,比较n-1次,如果前面的大于后面的就交换两者的位置。
  2. 比较次数减一,重复步骤1
  3. 共遍历n-1次

代码

  1. 原始版本

    1
    2
    3
    4
    5
    6
    7
    8
    def bubble_sort(arry):
    n = len(arry)
    while n > 1:
    n -= 1
    for x in range(n):
    if arry[x] > arry[x+1]:
    arry[x], arry[x+1] = arry[x+1], arry[x]
    return arry
  2. 改进版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def bubble_sort(arry):
    n = len(arry)
    while n > 1:
    n -= 1
    swap_flag = False # 增加一个标记,当排好序后直接退出
    for x in range(n):
    if arry[x] > arry[x+1]:
    arry[x], arry[x+1] = arry[x+1], arry[x]
    swap_flag = True
    if not swap_flag:
    break
    return arry
阅读全文 »

总结

  1. Python2 中使用from __future__ import division就可以使用python3的除法。
  2. Python2 中/与操作数有关,x / y中x、y都为整型的话,为floor除法,否则为true除法也是日常的除法。
  3. Python3 中/true除法, 与操作数无关。
  4. //在 Python2 与 Python3 中并无差别, 都代表floor除法

Python3

1
2
3
4
5
6
7
8
>>> -5/3
-1.6666666666666667
>>> -5//3
-2
>>> -5.0/3
-1.6666666666666667
>>> -5.0//3
-2.0

Python2

1
2
3
4
5
6
7
8
>>> -5/3
-2
>>> -5//3
-2
>>> -5.0/3
-1.6666666666666667
>>> -5.0//3
-2.0

说到python赋值语句,大家想必一个念头——so easy,不是lz = 'dashabi'吗。
确实,easy是easy,里面却有个小坑,虽小,却不易发现。在代码量多的时候,就有点恶心了。

正常的语句是这样

1
2
3
>>> aa = u'这是一个坑'
>>> aa
u'\u8fd9\u662f\u4e00\u4e2a\u5751'

坑在这里

1
2
3
>>> aa = u'这是一个坑',
>>> aa
(u'\u8fd9\u662f\u4e00\u4e2a\u5751',)

看出区别没有,坑的后面有个逗号,平时这逗号没什么卵用,但在赋值语句的末尾会将原来的对象转化为tuple。
aa = (u'这是一个坑',)是一样的效果。

简介

谷歌百度一键搜索, 在百度页面上搜谷歌,在谷歌的页面上搜索百度,无需切换,无需重新输入搜索词。

详细描述:
虽然谷歌比较好用,结果也准确,但搜索中文这方面却也弱了点,百度还是有点用。谷歌百度一键搜索, 在谷歌的页面上搜索百度,在百度页面上搜谷歌,无需切换,无需重新输入搜索词。
目前支持http(s)://www.baidu.com, http(s)://www.google.com.hk, http(s)://www.google.com

创建:2015.11.25
作者:ponder.work
反馈:190127701@qq.com
forked from: raywill/BaiGoogleDu

阅读全文 »

概述

在开发django网站时发现,用户登录后不能跳转到之前的页面,google了很多答案,讲得也不清楚。

其实就是渲染登陆表单时,将原链接带到action参数里,view函数接收到参数后进行重定向。

实现

登录链接

1
<a href="/account/login/?next={{request.path}}">登录</a>

view

1
2
3
4
5
6
7
8
def login(request):
next_url = request.REQUEST.get('next', '/')

if request.method == 'GET':
return render_to_response('account/login.html', {'next_url': next_url}, context_instance=RequestContext(request))

django_login(request, user)
return redirect(next_url)

登录表单

1
2
3
4
5
6
7
<form action="/account/login/?next={{next_url}}" method="post" >
{% csrf_token %}
用户名<input id="username" type="text" name="username" required/>
</br>
密码<input type="password" name="password" required/>
<input type="submit" value="登 录"/>
</form>

问题背景

在用django的admin进行管理的时候,对于指定的用户角色,不希望他看到特定状态的foreignkey,可以采用以下方案。

当然,也可通过自定义form解决该问题。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
class FactoryOrderItemInline(admin.TabularInline):
model = FactoryOrderItem
fields = ('order_item', 'product_sn', 'style', 'size', 'factory_sn', 'price', 'quantity', 'amount')
extra = 1

def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'order_item':
try:
parent_obj_id = request.resolver_match.args[0]
except IndexError: #仅在新建状态过滤
kwargs['queryset'] = OrderItem.objects.filter(order__status='2')
return super(FactoryOrderItemInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

随感

  下午去看了《小王子》电影,拍得很好,在忠实原著的基础上又有所发展。回来又把原著给温习了一遍,感触颇深。

  记得李安在拍《卧虎藏龙》的时候说过每个人心中都有把青冥剑,而我想说每个人心中都有个小王子

  作者说过,这是写给曾经是孩子的成人的童话。所以,不论文章还是电影,都比较有深度,适合我们这些曾经是孩子的人观看。
  

阅读全文 »

概述

  • 简介:政治寓言,可惜在过往历史中已经能找到他的影子了,老大哥、真理部等梗的来源。说的是在1984年世界被三个国家瓜分,他们均高度集权,改变历史,改变语言(所谓新话);建立健全的监控系统,控制人们的思想和行为。

  • 本篇文章仅为测试人工智能的最新研究进展。

阅读全文 »

  昨天晚上听到一则消息,小学一老师得骨癌,37岁,自杀了。
  
  不知怎的,心里乱乱的,就想起“生死之间有大恐怖”这句话来了。
  
  人生在世确如白驹过隙,忽然而已。而这白驹过隙却也还有快慢之分,如何不令人怅然。犹记得,《兰亭集序》里一句“修短随化,终期于尽。”,少时懵懂只觉语句优美,终不解其中深意。到如今,自己也算是经历了一些,才明白这寥寥数语却是道尽世间沧桑。个体寿命的长与短,都是由造化决定,最终都不免走向那个尽头。然而这个中差别,却让多少世人肝肠寸断。

  也曾想,自己的生命有多长,然后就是一阵惊惧。
  
  生命实在是太过短暂,而且很可能在你不经意时终结。

生死事大,无常迅速。

  唉!无法,徒增忧伤而已。

人生苦短,及时行乐。
有愿立偿,不余遗憾。

概述

  • 作者:[日]铃木俊隆
  • 简介:禅修的心应该始终是一颗初心(初学者的心)。初心是空空如也的,不受各种习性的羁绊。只有保持这颗初心,随时准备好去接受、怀疑,并对所有的可能性敞开,才能如实看待万物的本然面貌,一步接着一步前进,然后在一闪念中证悟到万物的原初本性。[1]
阅读全文 »

概述

  • 作者:A·阿德勒
  • 主要内容:讲述自卑感的形成原因以及解决方法。作者和弗洛伊德一样都认为童年对个人的心理成长有重大影响,不过着眼点有所不同,阿德勒着眼于社会合作,弗洛伊德主要研究个体、性。
阅读全文 »