0%

新坑是代码评述系列, 评述写在注释里, 非常主观非常粗俗, 但可能可以给我带来一点安慰, 感觉自己好勤奋的样子.

碎碎念1-C++迭代器到底要实现什么?好在哪里?

阅读全文 »

Haskell类型类既不是”类型”, 也不是”类型的类型”, 此处中文的”类型类”与英文的”Typeclass”都很confusing, 以下整理一些常见的问题及其解答(FAQ):{以下理解都非常粗浅, 因为我学这个不到2星期}

类型类究竟是什么? 和类型有什么联系?

阅读全文 »

我请求校内信息通讯平台由微信群转移至腾讯QQ群.
在校园信息交互这方面, 微信功不可没. 然而, 微信作为一个广泛使用的校内信息平台, 其群功能上存在的3点局限性却严重制约了校园重要信息的传达, 储存与更新, 条列如下:
1. 微信群缺乏”群文件”功能, 并且初入群的群友无法回溯历史消息, 这两者导致某些重要消息需要由热心群友频繁进行重申; 此时新入群者的消息渠道依旧受限, 而重申带来的信息轰炸也给既入群者造成叨扰. 相比之下, QQ的”群文件”功能可以实现这一点
a) 消息的有效性: QQ的群文件功能, 可以实现消息的长期存储, 并保证持续有效.
b) 消息可分类: 群文件支持多文件夹, 此时通过合理命名文件夹, 可以实现消息的有效分类, 给新入群者带来以指引
2. 微信群缺乏”群公告”功能, 许多时候必须由管理员执行”At所有人”才能实现广播. 然而(1)条内存在的问题依旧存在, 新入群者无法继承, 既入群者不胜其扰. 更严重在于, 由于”At所有人”的指令优先级较高, 群友在选择”屏蔽群消息”后依旧无法阻止消息弹出, 我个人认为这点隐性地僭越了群友的隐私权, 退一步而言, 纵使没有僭越之嫌, 身边朋友也反映在”At轰炸”中深受其苦. 此时, QQ的”群公告”不失为适时之选:
a) 可设定”绝对勿扰”模式: QQ的”屏蔽群消息”指令优先级高于群友”At ”的优先级, 这点才使得”绝对勿扰”成为可能
3. 微信群在文件的传输速度与大小方面都不如QQ, 通过以下对比, 我们甚至可以说, 微信在两方面是远远逊色于QQ:
a) 微信群无法传输大小超过100M的文件, 然而TA分享的电子书资源的大小超过了100M, 这些资料只能往往只能以百度网盘链接形式传播, 造成不便. 相比之下, QQ的群文件分享上限为2G, 足以应付多数此类情况.
b) 微信群无法在P2P条件下实现离线加速传输, 较低的速度上限在大文件共享的情况下尤为严重. 相比之下, QQ具备4G地P2P离线传输上限, 也足以满足多数大文件传输的需要.
4. 微信群入群条件较为苛刻, 群人数超过100人时二维码失效, 此时必须以群内朋友为中介进行拉取, 此点上我个人认为问题本不在”求拉群”的一点人情债, 问题在于:
a) ”朋友圈的马太效应”: 交际圈子越局限, 朋友数量约稀少的人, 往往被这种”中介”的要求进一步压缩了社交空间. 而社交空间的压缩, 同样也限制了其交友的命中率.
b) 羞于开口: 二维码提供了一个比较便利的入群手段, 同时也覆盖到了更精细的隐私粒度, 举两种情况为例:
i. 以知书达礼, 开演善归为要务, 一心将自己打造成”大家闺秀”这类特定人设的女生, 却很想加入A社的”泡椒凤爪竞吃大赛群”.
ii. 终日厮磨于狐朋狗友的聊天吹水, 与一众兄弟深切共忾于”精致男孩”之流的男生, 却很想加入B社的”皂角, 葛楼子后调的香水品鉴群”
由此可见, 微信”朋友中介”的入群手段不利于交集圈子的均等弥散, 反而加剧了原有矛盾. 而QQ仅需要提供群号或者群二维码, 此类信息可以透过邮件与海报进行扩散; QQ加群仅需要管理员验证通过, 客观上避免了细粒度的隐私泄露, 同时也充当了防止投机分子随意入群的有效手段.
在可行性层面上, 由于此类平台群主多以学生与行政老师为主, 站在学校机构的立场上, 动员难度较低, 开展潜力较大.
结合以上四点局限性与可行性分析, 我请求校内信息通讯平台由微信群转移至腾讯QQ群.

缘起

  • 因为不知道做错了什么事遭到了可敬的人的讨厌, 这样的事于我已不鲜见, 然而心情还是难以平复的, 好像再次变回了曾经的顽劣少年.
  • 好在babun下配置git-zsh的成功, 多多少少平复了一点苦辛.
阅读全文 »

装饰器的实例1-代码计时器,说明都写在代码注释中了~

import time

def timer(func):
def wrapper(*arguments,**keyword_arguments): # 参数有无与多少不确定, 关键字参数有无与多少不确定
start=time.time()
ret=func(*arguments,**keyword_arguments) # 与前文类似, 参数有无与多少不确定
end=time.time()
print('FuncName:{};\nResult:{}\nTime Spent:\t{}s'.format(getattr(func,'__name__'),ret,end-start),file=open('D:\跑速情况.txt','a'))
# 可以先dir(func) 查出func有__name__这个attr, 于是用函数getattr(funcName, funcAttrName)
return ret # 很关键, 因为func有返回值所以要写ret(其实没有返回值也写一下没什么问题)
return wrapper # 装饰器本质: ret内层函数

# 注意: 带参数的装饰器指的是装饰器有参数, 就是最外层的timer(func,args),
## 被装饰函数有参数, 直接在内部处理就可以, ret=func(*arguments,**keyword_arguments)

@timer
def m1_feibonaqi(n,visited=[]): # 改进版递归型斐波那契, 区分于远坂sb无脑递归型在于加入visited使得不用重复计算
if n==1 or n==2:
return 1
else:
if bool(visited)==0:
ori_visited=[1,1].extend([None for each in range(3,n+1)])
visited=ori_visited
else:
if visited[n-2]==None:
tail=m1_feibonaqi(n-2)
visited[n-2]=tail
if visited[n-1]==None:
head=m1_feibonaqi(n-1)
visited[n-1]=head
return visited[n-1]+visited[n-2]
return m1_feibonaqi(n-1)+m1_feibonaqi(n-2)

@timer
def m1_feibonaqi(n): # sb无脑递归型, 可以拿来测下栈帧深度
if n==1 or n==2:
return 1
else:
return m1_feibonaqi(n-1)+m1_feibonaqi(n-2)

@timer
def m2_feibonaqi(n): # 正常型斐波那契
if n==1 or n==2:
return 1
else:
f1,f2=1,1
head,tail=f2,f1
cnt=2
while cnt<n:
cnt+=1
next_val=head+tail
head,tail=next_val,head
return next_val

@timer
def m3_feibonaqi(n,visited=[]): # 改进版递归型斐波那契, 区分于远坂sb无脑递归型在于加入visited使得不用重复计算
if n==1 or n==2:
return 1
else:
if bool(visited)==0:
ori_visited=[1,1].extend([None for each in range(3,n+1)])
visited=ori_visited
else:
if visited[n-2]==None:
tail=m1_feibonaqi(n-2,visited)
visited[n-2]=tail
if visited[n-1]==None:
head=m1_feibonaqi(n-1,visited)
visited[n-1]=head
return visited[n-1]+visited[n-2]
return m3_feibonaqi(n-1,visited)+m3_feibonaqi(n-2,visited)


m1_feibonaqi(10) # 这个只能跑20以内的
print('----分界线12----',file=open('D:\跑速情况.txt','a'))
m2_feibonaqi(10**5) # 这个可以跑10万以内的
print('----分界线23----',file=open('D:\跑速情况.txt','a'))
m3_feibonaqi(10) # 这个也同样只能跑20以内的

## 实际上m1和m3跑出来结果是一样的(^7$7^), 难受~
阅读全文 »