LuMing's blog

  • Home

  • Tags

  • Archives

我的 2019

Posted on 2020-01-01

首先头等大事是从一名学生成为了工程师。仿佛如做梦一般,昨天还在学校里念书,今天就作起了影响数百万用户的事情。不可思议。

7月份开始就忙个不停,在潜意识里似乎是自找的,又或是说找上门来,潜意识把他当成自找的,一时半会儿也说不清楚。不过总比没事干强,我一般不太喜欢非得给自己做的事情找一个意义,比如为了梦想为了社会什么的,更喜欢接受的说法是我这么做是我的选择,因为选择,所以发生改变,因为存在,所以进行了选择。

人是没办法什么都不干,什么都不想,什么都不做的,除非是在梦里,那才是真正的精神自由。从一觉醒来开始就得开始做事,发呆的时候是越来越少了。

工作总会给人带来成就感,让人在一段时间内全身心投入的感觉真的非常棒。但有时候也有一些虚无感,脑子里会问自己,我做的这些东西真的真的对别人很重要吗?我做的东西这些功能真的是有用的吗?这些问题的答案只能在以后的工作道路上去寻找了。
在翻回日记的时候,看到了年初给自己定的目标:
“内心强悍的人,这个人做事有计划,偶尔偷懒但紧盯目标不妥协”。“温柔的人,这个人待人温和,从不轻易生气,能把握好与他人之间的距离,不谄媚也不怠慢”。“靠谱的人,这个人做事有着落,有时候不见得做的最好但从来不会不了了之”。

在年终时候看了让人感动,虽然这一年里几乎对它没什么印象,不过这几个目标似乎在潜意识里起了不少作用,比如我真的”躬身入局”到了一些事情里,并且有了着落。这段话还没背熟,明年的目标依旧是它(不是偷懒)。

年初时定下的翻译目标全部完成了,但读书计划没有全部完成,是因为有几本书太难找了(借口),看来每年读两三本就差不多了。

今年一个比较高光的时刻是给”成为什么样的人”这个问题了一个答案。成为一名行业精英?成为一方面领域的专家?成为一个外向活泼的社交达人?不,那些都是别人,人是无法成为别人的,人只能成为自己。所谓千人千面,但其实一人便有千面,我选择自己最真实的那一面。

明年”课余时光”,安卓,电影,电子书。每天跑步,按时睡觉,抽空背单词。仿佛以往的激情化作了星星点点前进的动力,我想要的是孤独但不寂寞,平凡而不平庸。

这不一定是一年发生的所有事情,但以上的话却是我在一年结束之际的真实想法。回看2019,充满变化的一年,各阶段有各阶段的烦恼,前路如何并不知道,小步向前迈,堕落与重燃往复,失落与希望并存,整体向前跨进,2020,加油!

读《构建之法》

Posted on 2019-01-29 | Edited on 2019-04-18
1.知识体系是构建出来的,而不是接受到的。与其灌输知识,不如让学生自己构建。
2.人的认知模型改变的非常缓慢,搞那些速成的,疯狂的,喊口号的培训未必改变了人的认知模型。
3.提问能帮助构建知识体系。所以我们要鼓励学生思考,辩论。
4.身心投入是学习的关键。没有一定的工作量,怎么能达到“身心投入”呢。
NCL环境:N natural C critical L learning
软件=程序+软件工程
软件企业=软件+商业模式
软件工程是:“把系统的,有序的,可量化的方法应用到软件的开发,运营和维护上的过程”
技能的反面是解决问题
p136
君子和而不同,小人同而不和
p156
NABCB模型:need ,approach,benefit,competitors,delivery
p167
Y=X±X÷N
实际时间花费=估计时间±估计时间÷开发过类似工作次数
P289
重构-尽量保持原有界面的基础上优化部分代码
重写-重新实现原有功能
p302
Those entrepreneurs who start out with the idea that they'll make it big- and in a hurry-can be guaranteed failure

印象——DSP

Posted on 2019-01-25 | Edited on 2019-04-18

从一个现象入手

都知道模拟信号经过要想通过计算机处理需要对其进行采样,采样的过程可以看作一个连续函数的离散化,也可以看作信号经过一个电子开关。当然,这样就会引入一个新的参数——采样频率。

假设有一信号,y = cos(0.5x)。我们使用 matlab 对其进行分析:

n = 0:1:300;                                                    
x = cos(0.5*pi*n); 
w = (0:1:1000)*pi/1000;                              
X= x* exp(-j).^(n'*w);                                          
magX = abs(X); 
plot(w/pi,magX);grid

使用 300 点的离散信号,可以看作对模拟信号的采样,自然而然地产生了采样频率 = 300 / 300 = 1 HZ。
从结果上看,响应大部分集中在 0.5pi 的区域,与原函数特性相符。
横轴用 1000 点的离散值逼近连续值,这样的分析方法称为 DTFT——离散时间傅里叶变换。变换特点为时域离散信号变为频域连续信号。

为了简便起见,频率(横轴)的范围是0~pi,会不会有什么东西漏掉了呢?
修改第三行将范围扩大:

w = (0:1:1000)*5*pi/1000;     

在 1.5pi、2.5pi、3.5pi…地方均出现了响应。为什么呢?

记得之前分析过,采样频率为 1HZ,使用公式 Ω = 2pi * f 可将其转换为角频率 = 1pi。
实际上在频域中,通过采样后的图像为原图像以采样频率进行的周期性延拓。因此会在 0.5 ± N*采样频率(N=0,1,2,..)的地方出现响应。可这是为什么呢?

还是回到时域中来,我们的信号就像一颗颗珠子:

n = 0:1:300;                                                    
x = cos(0.5*pi*n);
plot(n,x,'*');
axis([0 50 -2 2]);

傅里叶分析的目的是观察信号的频率,而我们事先已经知道了这些点是频率为 0.5 pi 的信号,只不过离散处理了。那么我们是否能够用频率为 0.5 pi 的连续信号将其串起来呢?换句话说:想要知道信号的频率,就用此频率的信号去拟合,拟合上了就说明信号符合这一频率。

使用 y = cos(0.5πx) 拟合:

n = 0:1:300;                                                    
x = cos(0.5*pi*n);
plot(n,x,'*');
axis([0 50 -2 2]);
hold on;
t = 0:0.01:300;
plot(t,cos(0.5*pi*t),'r');

果不其然,信号完美的落在了红线上。就像串项链一般。
但串法唯一吗?

既然傅里叶分析出了 1.5pi、2.5pi、3.5pi… 的频率,不妨试一试用 cos(1.5πx)、cos(2.5πx)、cos(3.5πx) 串一下:

n = 0:1:300;                                                    
x = cos(0.5*pi*n);
t = 0:0.01:300;
subplot(3,1,1)
plot(t,cos(1.5*pi*t),'r');
hold on
plot(n,x,'*');
axis([0 50 -2 2]);
subplot(3,1,2)
plot(t,cos(2.5*pi*t),'r');
hold on
plot(n,x,'*');
axis([0 50 -2 2]);
subplot(3,1,3);
plot(t,cos(3.5*pi*t),'r');
hold on
plot(n,x,'*');
axis([0 50 -2 2]);

也都很好的被串在了一起。这也就解释了频域分析中出现延拓的现象。通俗来讲:信号离散后使得串法不唯一。

频域采样

连续的东西毕竟不方便使用计算机处理,时域通过采样即可解决。对于频域当然也可如法炮制,这样的变换就是 DFT。其特点为时域离散信号变为频域离散信号。
但这样又引来了新的参数:频域采样点数。幸好频率采样定理说只要频域采样点数大于信号长度即可。

可以用一张图来概括几种分析方法:

参考资料:如何理解离散傅里叶变换及Z变换

软件工程

Posted on 2018-12-24 | Edited on 2019-04-18

学完了软件工程,不苟妄得多少分,但至少让我发表一下见解吧。

“高内聚,低耦合?” 有点小陷阱

结构化程序设计核心思想之一叫做“高内聚,低耦合”。很直观,模块与模块独立,模块之间保持简单的调用/依赖关系,模块之内完成单一的任务。
不错,你已经明白了其含义。让我画一张图,请问下图模块的内聚与耦合度呢?

你一定会回答,“很明显,耦合度很高,是一个糟糕的设计”。
OK,A 调用 B、C。B 调用 C,C 调用 D。乱七八糟的的确让人感到不愉快。但是,如果让我换个角度看看呢?

请再次回答它的内聚与耦合程度。怎么,耦合度很低?
你有没有觉得,内聚和耦合其实是一回事。那么当我们谈论到“高内聚,低耦合”时,我们在谈论什么呢?
让我再给图上画一个圈,现在我问你,圈内的耦合度与内聚度?
一目了然吧。

好吧,我的观点其实是在讨论内聚与耦合程度时,应以某个界限作为划分,实际上在谈论“模块”这个概念时,就已经有了一条边界了,只不过很容易会忽视掉我们所讨论的对象的性质(之前虽然没有提到但阅读起来毫无违和感对吧?)所以还应该明确,内聚是边界之内,耦合是边界之间。

我的 2018

Posted on 2018-12-09 | Edited on 2019-04-18

前言

年底截至,最忙碌的就是在最后一个月里回顾一年的人、事、物。去年底写的大部分是技术方面的思考,连我自己都不会看(笑哭),今年要有所改进(有好的建议你倒是提呀)。“计划的目的是给予灵魂框架”,不管怎么样,在结束之前再回头看看总能让人发现一些意外的乐趣。

主线

大体来说今年的主线就是找工作啦。
1月份刚从课程设计的结尾走出来就直奔主题,四人一组,寒假编程小组诞生,互励互勉。2 月份大部分是属于家人的,小撮时间里学习《熊逸书院》、搭建博客、完成一次跨区骑行。3 月份索性因春招做好了简历 Ver.1 ,投递 * 4,有上升趋势。

昨夜西风凋碧树?太冷了

4 月份,非技术因素的失败 * 2,一次成功的面试,剩下时间里,等待与练习。5 月份,未知因素,科目二考试失败;实力因素,比赛失败。练习到达白热化阶段。没等病痊愈,命运的因素,面试失败。6 月份到了复习阶段,也该搞搞专业课了,还有练习不能停。7 月份,从考试的洗礼走出来进入到课设的轰炸(挺有意思的),笔试一次(失败)、科目二考试又失败、再练习,搞定一切后进入假期。

8 月份,丢工作 * 3,丢水壶,挂笔试 * 3,生病,炎热,又一个低谷,感谢朋友与家人。

9 月份,没来得及感叹大城市的繁华就进入课程实习,同时邮箱里各大公司轮番轰炸,笔试计划安排的水泄不通,恨不得分身出去跑招聘会:4 号第一次测评,深受打击。5 号进行一次测评。6 号进行第一次笔试,不理想。7 号两场劝退型笔试彻底打击自信心,“复习考清华吧”调侃道。9 号一次笔试。直到11号晚上,收到第一次面试通知。13号最忙,丢东西、冒雨赶招聘会,学校的事情,挂笔试,“晚上宿舍里,只想一个人静静地躺着”。14 号回学校笔试。15 号既测评又笔试。16 号第一次面试,很一般。17、18号又是死寂般的等待。

终于在 19 号,情况有所转机,从“用户体验”的角度上讲非常顺畅。

后续又大大小小的跑了 2 趟,参加三四次笔试,或是受到区别对待,或是不了了之。24 号成功拿到 offer。

不,是工程师

10 月份,先给家里来一场“大修”。接着完成本学期课程设计,空闲之余做做开源项目,从忙碌的日子走出来似乎还有些不适应。11 月份,病了又好了,接着又是项目?学会了做饭。

12 月:年总,考试。

不完全统计,一年当中“胜率”不达到 6%,也是没谁了。

无声的战争

找到了敌人:清晨的闹钟响起,死缠着的,是懒惰。听到别人取得的成就,心中的鬼胎,是嫉妒。躺在床上,思考如何演好下一次的演出,是焦虑。不经意地打开app,不停下拉的是无聊。“放弃吧,你不行,做不到”,说话的是自馁。与这些敌人交战,成了每天无声的战争。唯有用最平和的心态,最诚恳的心意,最谦卑的态度去结盟毅力,意志力,自驱力与使命感这些最坚实的盟友。

UBIQUITOUS ASSIMILATE 学刚出生的婴儿

去过一些地方,不得不感叹“太复杂了”。人心复杂、关系复杂、环境复杂、行业复杂。

城里人真会玩

可我相信,大道至简。一切由于跟人打交道而产生的问题总能用一种普适的方法来解决。
人们总说 “真、性、情”,可见在历史的长河中,“真”乃是第一心法。婴儿的特征是什么?“UBIQUITOUS ASSIMILATE”,像一块海绵,时时刻刻在向外界吸收。面对复杂的问题,保留最 “真” 的一面,真是“真诚”、是“纯真”、是“天真”、是“真切”。

技术的思考:保留维度-夯实基础

新技术总是不断变化,像我这么笨的人看是赶不上了。向前看不到我选择了向后看,任你技术再怎么变,我只打基础,往深地打,往扎实了打。会发现:旧的东西是在维度上有所突破,而新的东西只是在一个维度上的延伸。做一颗孕育无限可能的蛋不影响变成展翅翱翔的鸟,一个道理。

有些话

1 月:“如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣赏它”。———Dijkstra
2 月:“科学精神就是,不被谣言所轻信,用一颗真诚的心态与刨根问底的精神对待未知的问题”。——佚名
“君子可使食无肉,不可居无竹” ——我爸
3 月:“胆大心细,刻苦耐劳”——我爸
4 月:“success is not final, failure is not fatal, it is courage to continue that counts” ——《至暗时刻》
5 月:“仁者如射,射者正己而后发。发而不中,不怨己者,反求诸己而已矣”。——《孟子》
6 月:“这世界有太多不如意~但你的生活还是要继续~太阳每天依旧要升起~希望永远种在你心里~”——《侠客行》
7 月:“由来意气合,直取性情真。浪迹同生死,无心耻贱贫。”——杜甫
8 月:“万丈高楼平地起,勿在浮沙筑高台”——佚名
9 月:“备后则前寡,备左则右寡,备右则左寡,无所不备则无所不寡”——《孙子兵法》
10 月:“没有道路通向真诚,真诚本身就是道路”——贾行家
11 月:“你会发现英雄人物,在常人会恐惧的点,他体现为愤怒”——梁宁
12 月:“你永远无法逃离什么,直到你开始追寻什么”——《超级个体》

一年完了昂

宁可一年不将军,不可一日不拱卒

重要的是,明白了要将 ”兴趣“ 与 ”任务“ 分开。”兴趣“真的是太不靠谱了(偷偷瞄一眼舍友尘封的吉他),而任务一旦定好了后就是坚如磐石的。人总是会给自己编织各种各样的意义之网,例如“不跑完这一圈不去吃饭!”、“周内打游戏摔电脑!”、“不写年度总结就不买新年礼物!”。
游昌平老师说过:“热爱心中的艺术,但绝不可以爱艺术中的‘我’。”我想是同一个道理。

一句话概念

达克效应:“驼峰线三个阶段:愚昧之山、绝望之谷、开悟之坡”
比较优势原理:“自身比较,优势互补,利益最大”
谷歌效应:“人们比起数据更喜欢指针”
幸存者偏差:“只考虑了幸存者满足的特征,忽略全局视角”
纳什均衡:“竞争越激烈,打法越相似”
网络效应:“使用人数越多越有价值”
结论先行原则:“少说废话”
锚定效应:“取决于正方向的选取”
STAR原则:“情景、任务、行动、结果”

软肋

“心态不稳定”。这一点真是屡试不爽。多少次血淋淋的教训让我意识到了,即使是再怎么故作镇定,内心依旧会泛起层层波澜,接下来就会调动大脑进行无用的“计算”,窥探天机总是很危险的,会在心里埋下一个影子、一个期望、一个缠着的幽灵。而且更烦人的是,越是重大的场合越严重。
“小气”。对,小气。
“偏执”。很难把握,谁能告诉我怎么分的开“坚持”与“偏执”?
公众演讲。脑袋的反应力没有想象中的那么快!介绍自己要有底气。语速要特别特别慢。
“玻璃心”。怎么说,只有在 2 成的闲暇时间里会有,找些事情做可以消除。

年度最佳

番剧(从时间背景):《四叠半神话大系》——“走出四叠半,拥抱色彩”。
电影(从点开次数):《守望者》 ——“万物从不终结,阿德里安,万物永不终结”
游戏(从游玩时长):《塞尔达传说-荒野之息》——“开放性世界的冒险游戏从来都是本心”
书籍(从专业xuan xue深度):《人月神话》——“人就是一切”

再看一眼学府城吧,阿嚏

2019:成为自己的英雄

主线:职业化
态度:”保持开放与自信”、“乐观!”
目标:“内心强悍的人,这个人做事有计划,偶尔偷懒但紧盯目标不妥协”。“温柔的人,这个人待人温和,从不轻易生气,能把握好与他人之间的距离,不谄媚也不怠慢”。“靠谱的人,这个人做事有着落,有时候不见得做的最好但从来不会不了了之”。
阅读计划:《构建之法》、《Clean Code》(感谢刘未鹏)、《Implementation Patterns》(同上)、《新选组血风录》(感谢熊老师)、《中关村笔记》、《红玫瑰与白玫瑰》、《圣经故事》、《宽容》、《连城诀》(感谢小强)
学习计划:《关系攻略》
运动计划:365 W 步、爬圭峰山、爬骊山
语言学习:翻译文章 12 篇、打卡 365

后记

写的很零碎,以后的我请不要笑。另此曲很应景。


我已经迫不及待了

懒汉模式

Posted on 2018-11-26 | Edited on 2019-04-18

程序在必要的时候才进行相应操作。成对的概念为”eager evaluation”。

例1. string 类

例2. Copy On Write

例3. 单例模式

设计模式-单例

Posted on 2018-11-26 | Edited on 2019-04-18

前言

最近在做 Android 项目时,碰到一个实际问题的场景,查了一下解决办法,居然凑巧捕获到一种设计模式,文以记之~

场景

当 app 运行在 MainActivity 时,需要连接一个服务端以获取服务端的配置信息。而后根据配置信息进入相应的管理界面。
这就会带来一个问题,获取配置时会建立一个 socket,而 Android 又不支持直接将这个 socket 会话传到另一个 Activity 当中,这就导致同一个会话需要建立两次: 1. 获取设备配置 2. 发送控制信息
众所周知,建立 socket 是一种资源占用型很高的行为,可不可以只用建立一次呢?
答案是 OK 的。

单例模式

参考这里使用了单例模式的第三种,全局状态下 socket 只用实例化一次,因为存在着严格的时间先后关系,所以连线程同步都不用考虑,轻松解决~

formal-semantics

Posted on 2018-11-14 | Edited on 2019-04-18
  1. operational semantics
  2. axiomatic semantics
  3. denotational semantics
  4. logical semantics

一种实验性的分时系统

Posted on 2018-11-14 | Edited on 2019-04-18
Fernando J. Corbato, Marjorie Merwin-Daggett, Robert C. Daley

麻省理工科技学院计算机中心

剑桥市麻省理工学院

摘要

本文简要的讨论了分时的必要性,实现过程中存在的一些问题,和当代 IBM 7090 上所部署的一种分时系统,最终并使用我们团队之一所提出的调度算法(FJC)展示了一些可用在这种分时系统上提高运行性能并可定量分析的技术。

绪论

在过去的十几年里,计算机的使用取得了巨大的进展。在 20 世纪 50 年代早期,解决的问题大多在硬件的制造与维护上;到了 50 年代中期,随着编译器的出现,编程语言的使用得到了极大的改善;进入了 20 世纪 60 年代,我们正经历计算机使用的第三次巨大变革:通过分时技术所带来的人机交互的改善。
本文所描述的分时的思想,大部分是与麻省理工学院基础研究委员会preliminary study committee(由 H.Teager 担任主席)的工作相结合而发展起来的,该委员会研究了学院的长期计算需求,以及随后参与的由 J.McCarthy 担任主席的麻省理工计算机工作委员会。然而,本文所表述的观点与结论应单独作为本文作者所阐述的。
在开始之前,最好还是对于分时做一个精确的解释。其含义为同一时刻在不同的任务上使用硬件的不同部分,或是多个人同时使用计算机。第一个含义,通常称之为多道程序设计,它面向硬件的使用效率,在某种意义上尝试完全利用计算机的所有部件。分时在这里的第二个含义,主要关注于个人尝试去使用计算机的效率。计算机效率也应当考虑,但只应从整个系统效用的角度来看。
分时计算机的使用可能出于现在人们与更大、更先进的计算机之间缓慢的人机交互效率。这个效率在过去计算机广泛使用的十年间改变微乎其微(在某些情况下更糟)。
某种程度上,这种现象是由于随着计算机上基础的问题得到掌握,更多复杂的问题引起了人们的兴趣。结果,更大、更复杂的程序设计去利用计算机更快、更强进的性能。这个过程不可避免的导致出现了更多编程上的错误以及更长的调试周期。就像在大多数大型计算机上所使用的现有的批监控batch monitor技术,每个程序的 bug 通常需要数小时甚至一整天去排除。目前唯一可替代的方法是让程序员直接在计算机上调试,这一过程极大地浪费了计算机运行时间,并且由于通常可用的控制台通信能力极差而严重受阻。即使用打字机当作控制台,通常情况下依然缺乏复杂的命令和相应程序,而这些程序对于实现有效的交互非常重要。因此,我们希望在不造成巨大经济损失的情况下,大幅度提升程序员与计算机之间的交互效率,并且通过广泛而复杂系统编程来辅助进行人机通信,让每次交互更有意义。

为了解决这些交互问题,我们想让计算机制作的像电话交换台telephone exchange那样同时让多个用户去使用。每位用户能够根据自己的需要去使用一个终端并且无需关心其他使用系统的用户。这个终端可以最小化到仅仅像打字机那样,但更理想的是包含一个可扩展修改的独立显示。在任何情况下,数据传输都要求在远程安装上没有大的障碍。
分时系统的基本技术是让多个人通过打字机终端同时使用计算机,并通过分时管理程序在短时间内或是一定计算量内按顺序地运行每一个用户程序。形成这个序列,最直接的方式是简单的时间片轮转round-robin,它应当多次被调度以便让每个保存在高速存储中的用户程序在人的反应时间内(大约 0.2 秒)至少运行一定量。用这种方式,用户看到计算机可以充分响应每一次键击,它也许只需要简单的计算;而复杂情况下,用户看到响应时间的逐渐减少与响应计算的复杂度、计算机速度、活动用户的总数成比例。也就是说,如果有 n 个用户同时请求服务,那么每个用户只会看到 1/n 的有效计算机速度,这一点应当清楚。在进行例如调试程序这样高交互率的过程中,原先计算量所产生的计算机响应要足够小,这不应当成为阻碍。
这种分时系统不仅可以提升传统程序一到两个数量级的能力,还能够开创出几种新的计算机使用方式。许多科学和工程上的应用将逐步重新规划,程序中包含的决策树decision trees需要提前指定将被废除,取而代之的是仅指定需要的决策分支。另一个重要的领域是在计算机教学机器上,尽管这些机器的计算量很小,但它们可以自然而然地利用分时系统的终端,以使用更复杂更适合的教学程序。

未完待续

译者后记

在某种意义上in the sense of
in a manner
one or two orders of magnitude 一两个数量级

正则表达式

Posted on 2018-11-08 | Edited on 2019-04-18

引言

65. Valid Number。如何去判断给定的字符串是否为有效的数字?
使用正则表达式的描述如下:

^\\s*[+-]?(?:[0-9]+[.][0-9]*|[0-9]+|[.][0-9]+)(e[+-]?[0-9]+)?\\s*$

^:标注起始位置.
\\s*:若干个空格。
[+-]?:包含与否正负号的情况。
(?:[0-9]+[.][0-9]*|[0-9]+|[.][0-9]+):三种底数部分的表示,a.b 形式(1.2、1. ),a 形式(1、2、3),.a形式(.1、.2)。
(e[+-]?[0-9]+)?:指数部分,用括号表示一个整体,别忘记最后的?。
\\s*:若干个空格。
$:结束标记。

12…6

LuMing

57 posts
3 categories
11 tags
GitHub E-Mail
© 2020 LuMing
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v6.3.0