主页
TodoList
今天hr让我实现一个todolist,我用30多行js代码实现了这个功能,这实际上就是redux的原理(尽管我没有看过redux的源码),也可以再精简一下,使之变为一个迭代器,实际上可以使用纯函数来实现,但那样会多出几个函数,为了代码更加精简,在这过程中我使用了函数式语言的赋值特性,用于在函数中保存变量。 //created by linshuai //运行方法: node TodoListWithClosure / 或者浏览器控制台粘贴 //todolist //task /** * 任务:字符串 * 完成状态:布尔值 * */ /** * * state//状态 * disptch //函数,接收操作对象 * reducer //计算过程 */ //创建state function createStore(reducer ,state ){ var store = state; function dispatch(action){ store = reducer(store, action) console.log(`每次提交后的数据为:${store.map((v)=>console.log(v))}`) } return dispatch } /** * * action类型:添加, 删除, 修改状态(新数据) */ function reduce(state, action){ switch(action.type){ case 'ADD': return [...state, ...[action.data]]; case 'DELETE': { let temp = []; state.map((element)=>{ if(element.todo !== action.data.todo){ temp.push(element) } }) return temp; }; case "CHANGE": { let temp = []; state.map((element)=>{ if(element.todo === action.data.todo){ temp.push(action.newData) } else{ temp.push(element) } }) return temp; } default: return state } } //示例代码 var task = { completed: false, todo: '买菜'} var dispatch = createStore(reduce, [])//dipatch of state dispatch({type: 'ADD', data: task }) dispatch({type: 'ADD', data: {completed: false, todo: '修仙'}}) dispatch({type: 'CHANGE', data: task, newData: { completed: true, todo: "买肉"} }) dispatch({type: 'ADD', data: {completed: true, todo: '谢谢体验'}})
来一打c++ (三)
我们从一个有用的项目开始做,总是在终端打字符没有太大意思,这会使人的学习兴趣快速下降,所以我们做一个小项目,它或许有点乐趣。 这个项目就是解释器,或者也可以叫广义上的编译器前端,因为我们大部分都将做解析方面的工作! 千万不要害怕!这个程序预计不会超过两千行,甚至可能会有垃圾处理机制!有意思吧,只要学会了写hello world,就能写出来。 或许你有很多问题,你会怀疑自己,编译器真的这么简单?我连循环都不会,怎么能写这么高级的东西! 不要害怕,编译原理是一门高深的学问,但是我们不用考虑外在因素,所以复杂度将会降到最小,还有我们的目标是做一门语言,大部分都是在做语法分析,和你学英语是一样的,只不过我们在此是把我们的编程语言语法转换为计算机的语法罢了。 我们这里选用lisp作为目标语言,以c++实现,在最后我们还会讨论优化运行速度和gc机制,还是那句话,不要怕,只要一路莽下去,这些都不难。 同时你要了解的是,目前作者并没有编译器相关的经验,以后的思路都会按照探索的步骤来,可能会走岔路,但是这些都是有意义的,如果你完全靠书本或者别人的经验来避开某些错误,你就无法真正地变通,比如如果你的数据结构老师说冒泡算法是一个非常差的算法,尽量不要用,很可能你以后就与神经网络或者深入事件模型失之交臂,所以适当的注射疫苗是很重要的,但是我们也不会偏离基础体系,因为我们的目标就是在这个体系中处理问题。
来一打c++(二)
hello world #include <iostream> int main(){ std::cout << "hello world\n" << std::endl; return 0; } 这是一个极简单的程序 #include <iostream> 第一行是把一个标准库引入到我们的源文件中,我们就可以在源文件中使用标准库中的函数以及操作符(<<流操作符)。 int main() 这是每个c++程序都需要有的入口函数,程序从main函数开始执行,最后可能也结束于这个函数,为什么是可能?因为如果出错,也可能会在其他地方崩溃。 { //body } 这个花括号的内容就是main函数的函数过程,函数过程就是函数执行的任务。 std::cout << "hello world\n" << std::endl; return 0; 第一行执行打印hello world的任务,第二行告诉操作系统,我执行完了,把我关了吧。 函数     上面说到函数,函数其实和数学上的函数差不多,是一个作用过程,它接收一个集合内的元素,返回另一个集合内的元素,当然也有可能返回同一个集合的元素。 int square(int x){ return x*x; } 例子: 求平方,接收一个整数,返回一个整数。 好了,基础已经够多了,下一章我们就要开始上手一个项目了,c++的特性我们会在实战中讨论。
来一打c++(一)
    我之前一直在想,对于真正零基础的童鞋,如何能够把编程语言说得更加浅显易懂,使得学习的曲线比较平滑但又没有知识点冗余,说古老的c++很明显已经没有什么意义,那种教程你可以在网上搜到很多,c++也在进化中,设计得越来越容易学习,是时候来一打c++了。     在开始真正的c++之前,我们需要一些前置知识,这些知识对于理解C++有很大帮助,不过也不用担心学不会,如果暂时无法理解,也不会对后面的课程造成太大的干扰,等你学完之后,回过头来发现,C++也并没有那么难。     废话已经够多了,让我们聊一下前置知识吧。 语言类型     c++是一门编译型语言,我们写的代码需要通过编译器编译,生成一种二进制文件,以供操作系统运行,c++有两种编译生成程序的方式,一种叫动态编译,这种编译出来的文件会比较小,但是需要外部链接库,单独的执行可能会报错,如果你使用了第三方库的话;另一种是静态编译,这种编译相对生成的文件体积会大一些,但是单个文件就可以运行,不需要链接库,所有的东西都通过编译器编译后生成一个文件,运行时不依赖外部的库文件。 标准库     几乎所有语言都有标准库,这些标准库提供了方便的操作系统访问接口和一些易用的数据结构,c++也不例外,这些标准库几乎实现得都比较优良,如果将来想深入c++,研究一下标准库是非常好的选择。 c++与c     c++几乎包含了c的所有属性,同时c有的问题c++也几乎都有,这是为了兼容c而做的妥协,c的代码不用修改就可在c++编译器里编译,在某些方面尽管还是有些差别,但整体而言c++对c的兼容做得足够优秀。 下一章     我们会从最基础的hello world做起,我认为尽快的感受学习的正面反馈比较重要。
知识的难易
简而言之,如果某个知识点的基础很多,与其基础知识成线性链式逻辑或者树状逻辑关系那么这个知识比较难,难在数量上,需要基础打牢固。如果某个知识点与上下多层成强耦合逻辑关系,逻辑网甚至达到多层的全排列数量级,那么这种知识点就会非常绕,极其考验一个人的记忆和逻辑,也就是广义的智商,这种难的知识点需要多训练才能理解。
opengl配置
https://riptutorial.com/opengl/example/21105/setup-modern-opengl-4-1-on-macos--xcode--glfw-and-glew-
认知哲学与角度变换
    如果你对你设计的解决方案感到困惑,那么可以尝试重新审视问题,重新认知问题。     以上的主要思想是我最先在麻省理工的sicp课程上看到的,今天一则新闻让我重新审视了这个思想在人的行为上的意义。     老婆刚刚生完小孩,在杭州临安上班的张某有些按耐不住了,他在某社交平台上找了一个网约对象。两人约定晚上在富阳某地见面。见面后,张某立即通过支付宝转账1500元给女孩。这时,张某发现女孩看起来很小,就提出不想做了,要求对方退钱,女孩拒绝。两人起了争执,女孩在跑的过程中,摔了一跤,随后她打了个电话。来了一个自称女孩男友的袁某,跟张某起了争执,还给了张某一巴掌。张某报警,警察调查后发现,这对小情侣在短短一个月,用仙人跳骗了8000元,对于每个人而言,所有的行为久而久之都会成为惯性,我在想如果是我,会不会也会做出这样的行为?当你长期拥有稳定的性生活时,忽然,上帝告诉你,你未来一年都将与性生活说拜拜,就像是别人从你这儿抢了了一样必需品,你必须要找到替代品,你会像个狗一样,疯狂到处找吃的。     这是个难题,但是,或许我们的认知错误了,这应当是你的确需要面对的困难,就如同唐僧需要面对81难一样,拥有这种经历后你才心智完整,而不是逃避,不去面对。     换句话说,我们的主观认知并不一定正确,行为的惯性客观存在,但是现实的生活规则也是客观存在,人类的进化过程需要这些规则,我们应当重新审视自己的认知了。
蕾哈娜与张宇
蕾哈娜之于席琳迪翁就如张宇之于韩磊。 懂得声乐的人,一定知道韩磊和席琳迪翁的强大之处,极其熟练控制并能产生极强声压的气息系统使得他们的声音浑厚、稳定,同时具有极强穿透力和情感表达能力,尽管张宇和蕾哈娜都是喉下关闭,但是气息还是差得太远,很多时候在并不是特别高的时候喉部就加入了运作,这是很无奈的一件事,声带机能和气息系统都很强大的很少,声乐这个东西还是很看天赋的,像空气补给者在高音do以上那样通透的共鸣,没有天赋再努力也是枉然
缘分与拥有粒子的空间模型
在不涉及任何高深、使人望而生畏的数学或者物理概念,来讨论一下缘分,简单的如同经济学之于经济来解释一下缘分的一点细节。 我们这里讨论的不仅仅是姻缘,而是广义上的缘分,想象我们自身的各种特性,它们对于人生轨迹产生了不同程度的影响,比如你认为写诗是人生第一大事,比任何事情都重要,那么你很可能成为诗人,那么写诗对你的人生轨迹产生的影响是最大的,我们在这里暂且把它叫做轨迹系数(马上就会明白为何这样定义它)。我们想像一下,我们身上有很多种特性,每个特性的轨迹系数都不一样。 建立一个以这些特性种类总数为纬度的多维坐标空间,以时间为参考轴,一个人就是里面的一个粒子对象,粒子对象在空间中的不同时间的不同特性都会发生不同程度的特性系数改变(随机过程),这些改变是由同时空的另一个系统所影响,你可以考虑一下这个系统应该是怎样的(极不稳定的错综复杂的图逻辑结构)。 缘分与两个对象之间的空间距离成反比,这里的多维空间同时满足万有引力,对象之间的特性越接近(空间距越短),缘分(产生轨迹交点)的概率系数越大。