关于函数式编程

函数式编程与面向对象地位类似。不得不说,函数式作为一种思想是有其价值的,然而其本质是什么? haskell 中的各种特性,惰性求值也好,类型系统也好,能够成为其函数式的理由么?java中添加了 λ 就脱离了面向对象?显然不是。 函数作为一等公民在很多场合下是适用的,然后又有了纯函数式的说法,不修改变量就能算作函数式编程了么?代价则是描述能力的下降,譬如计时过程。而一些其他的概念,又可以在其他地方看到影子。 其实还是有些收获的,haskell类型的无穷递归emm,有点类似null?然鹅并没有看到最后。 函数式的精髓应当在于其对解决问题的证明,然而这一方面关乎测试,另一方面要求代码的可读性高。而目前来看,过程式的命令似乎更符合人们的认知规律。

link

gopls——及时的代码补全

升级Go1.12之后虽然可以使用go mod在GOPATH之外构建工程,同时却带来了诸多开发工具兼容性问题 这里无意介绍有关包管理的使用,对我而言,最头疼的是VSCode自动补全基本残废,自动提示已经追 不上我的输入了( ﹁ ﹁ ) ~→ 网上也没有什么解决方法,经过重新编译工具->查看issue->重搭环境之后,决定使用微软力推的lsp 总之就是启用useLanguageServer,需要预先编译gopls,然后启用ExperimentalFeatures,关闭server Format,为了支持格式化,设置defaultFormatter,超快的代码提示又回来啦( ̄▽ ̄)" 贴一下我的配置 ``` { "files.autoSave": "afterDelay", "go.goroot": "C:/Go", "go.gopath": "C:/Code/MyGoWorks", "go.useLanguageServer": true, "go.languageServerExperimentalFeatures": { "format": false, "autoComplete": true, "rename": true, "goToDefinition": true, "hover": true, "signatureHelp": true, "goToTypeDefinition": true, "goToImplementation": true, "documentSymbols": true, "workspaceSymbols": true, "findReferences": true, "diagnostics": false }, "http.proxy": "http://127.0.0.1:1080", "[go]": { "editor.defaultFormatter": "ms-vscode.Go" }, } ``` PS. 看到bingo作者的声明,一时些许感慨 > I am very sorry that I have planned not continue to maintain this project. > > According to the issue #13 collaborating on golsp, I hope that we will eventually have a unified language server: gopls. > > It is Google's upcoming Go language server. It is in the best interests of the community to only have a single language server.

link

使用StartTLS

我们知道smtp是邮件传输协议,传输过程中往往需要加密 直接使用TLS/SSL加密当然简单明白,但是为了兼容传统的传输方式,出现了StartTLS 简单说就是先使用明文通信,如果双方支持加密的话升级为TLS加密通信 当然,前提是邮箱服务器支持StartTLS(各服务商支持并不相同),目前来看,还是老老实实tls吧 放一下标准库里的StartTLS实现 ``` // StartTLS sends the STARTTLS command and encrypts all further communication. // Only servers that advertise the STARTTLS extension support this function. func (c *Client) StartTLS(config *tls.Config) error { if err := c.hello(); err != nil { return err } _, _, err := c.cmd(220, "STARTTLS") if err != nil { return err } c.conn = tls.Client(c.conn, config) c.Text = textproto.NewConn(c.conn) c.tls = true return c.ehlo() } ``` 如果服务端仅支持TLS,c.hello()会无法收到正确信息,c.cmd()报错

link

关于interface{}

编译下列代码,哪些行会出现编译错误 ``` package main type Books struct { } func foo1(x interface{}) { } func foo2(x *interface{}) { } func main() { s := Books{} p := &s foo1(s) //line:1 foo2(s) //line:2 foo1(p) //line:3 foo2(p) //line:4 } ``` 编译提示line2,line4出错,*interface {} is pointer to interface, not interface 即指向接口的指针不是接口 怎么理解呢,空接口可以是任意类型,当然可以是指针,所以line1,3是没有问题的 最终在[stackoverflow](https://stackoverflow.com/questions/44370277/type-is-pointer-to-interface-not-interface-confusion)上找到了答案 接口保持了传入值的指针和类型,本身相当于指针了 s呢?是一个Book类型,Book实现了空接口(他还有可能实现其他接口), 但Book不是空接口啊,这时传入foo2(s),便会提示s不是空接口指针类型 同样的,p是指向Book的指针,并不是指向接口的指针,故也无法编译 Golang接口是一个方法集,实现了其全部方法的类型即实现了此接口,但接口和普通类型仍有区别 如: ``` type Books interface { foo() } type book struct{ name string } func (b book)foo(){ // 方式1 } func (b *book)foo(){ // 方式2 } ``` 方式1可以实现Books接口,但无法修改其内部变量,换言之,b是值传递 方式2也实现了Books接口,但是为指针传递传递,使用中会隐式进行指针类型转换 即: 方式1可用(book).foo() 方式2可用(*book1).foo() , (book).foo()

link

又是一年春招季

大概今年经济总体形势低迷,尤其互联网公司裁员成了常态 春节期间打车,司机师傅拐弯抹脚地找我们发红包,后来竟直接张口: “今年实体经济不好做,你们多支持一下” 想起来上一次听到这话大概是某个开网店的亲戚这么说 是果真如此,还是人云亦云,亦或者得了便宜卖乖? 又是一年春招,不同的是,自己准备投身其中了 大概是因为理想吧 风口终究会平静,真正有价值的东西更有可能留下来 总的来说,还是看好互联网前景的,毕竟当初可是说好让计算机取代各行各业的 总不能自己先栽跟头 套一句话,我们拭目以待

link

Golang数据库驱动

SQLite3驱动,参考: https://www.sqlite.org https://golang.org/pkg/database/sql/driver https://www.cnblogs.com/5211314jackrose/p/5816532.html https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/05.1.md 不得不说C语言真的强大,SQLite3也仅提供了一组接口 试着读了一下源码,果断选择使用Cgo,面向接口编程/白眼 总之参考各方资料,简单实现了基本功能,bug多多,纯属自用 最近在学习算法相关的知识,果然先要有理论基础才能处变不慌

link

雪意留君君不住,知道故人相念否

新年快乐

link

Ajax异步加载

今天选课,居然有同学拿脚本来选!!!还故意多选,这实在有点不公平(ㆀ˘・з・˘) 为了抓住别人退选的机会,咳咳,那就比一下谁的脚本快了 Ajax即异步加载JavaScript和xml,有什么用呢,主要是在不刷新页面的情况下与服务器交换数据。。。 使用如下: let urlList = new Array(3); urlList[0] = "http://xk.urp.***.edu.cn/jw_css/xk/runSelectclassSelectionAction.action?select_jxbbh=22223051201830000&select_xkkclx=11&select_jhkcdm=22223051"; urlList[1] = "http://xk.urp.***.edu.cn/jw_css/xk/runSelectclassSelectionAction.action?select_jxbbh=22213050201830000&select_xkkclx=11&select_jhkcdm=22213050"; urlList[2] = "http://xk.urp.***.edu.cn/jw_css/xk/runSelectclassSelectionAction.action?select_jxbbh=22123080201830000&select_xkkclx=11&select_jhkcdm=22123080"; let reqList = new Array(3); for (let i = 0; i < 3; i++) { reqList[i] = new XMLHttpRequest(); reqList[i].onreadystatechange = function() { if (reqList[i].readyState == 4 && reqList[i].status == 200) { let resp = reqList[i].responseText; resp = JSON.parse(resp); if (resp.rso.isSuccess == "false") { reqList[i].open("POST", urlList[i], true); reqList[i].send(); } console.log(resp.select_jhkcdm, resp.rso.errorStr); } }; reqList[i].open("POST", urlList[i], true); reqList[i].send(); }

link

使用dplayer收听我的歌单

细心的同学已经发现,现在可以在首页听歌了( •̀ㅁ•́;) 使用dplayer,感谢(@diygod)[https://diygod.me]

link

使用ngrok设置内网穿透

总所周知,使用国内主机商需要备案,而国外的羊毛又不稳定,那么为什么不尝试自建服务器呢? 然而大多数情况是没有公网IP,这时候就需要内网穿透工具。 市面上的某壳,某AT,并不实惠。(实际上,自建服务器电费就很可观了,为了这个付费有点本末。。) 于是有了ngrok,当然公网ip少不了,然后还需要服务端转发。。。总之可以见到的好处是可以多人共享一个公网ip了。。。 喏,现在访问[ras.impuss.com](http://ras.impuss.com),就是挂在树莓派上的页面喽,虽然性能捉急,但是好歹能用,暂时只开放了80端口 服务器跑路时可以凑和凑和。 另,新邮箱 i#fullstack.love

link