Dev's Logging

Welcome to my blog !


Thinking in RxSwift

Published at November 14, 2019 ·  1 min read

长期在 OOP 思维下进行编码,对 Reactive Programming 理解颇有难度,与 Function Programming 中 map filter 之类有些相似。 这篇文章对 RxSwift 进行了详细完整的介绍,值得细细咀嚼。 Thinking in RxSwift...

how to reclaim large space from .git, local cache of git

Published at November 14, 2019 ·  1 min read

在某生产环境中,可能由于程序运行存储在本地的大量未 tracked 的日志即生产相关文件,导致 .git 内的 objects 大量增常,多达 10 G。需要将其进行清理,以减少到合理的范围。 遇到的问题与此问题 How to shrink the .git folder 中的描述颇为相似,但测试过被接受答案和高赞答案后,均无果。 在此文章中How to Shrink a Git Repository ,“While we may have rewritten the history of the repository, those files still exist in there, stealing disk space and generally making a nuisance of themselves“ 当前项目中并没有 “.git/refs/original/” 文件夹,于是联想到,可能需要将本地 git cache 清除,“git rm –cached -r .“ 然后再运行上述文章中的命令 git reflog expire --expire=now --all git gc --prune=now git gc --aggressive --prune=now 然后,对分支进行修改,在生产环境中执行 ‘git pull’ 能够正常运行。...

Named return values in Go function

Published at November 7, 2019 ·  1 min read

在阅读 Clash 源码过程中,发现 clash/adapters/outbound/base.go 这个函数中的匿名函数中引用了一个返回值 ’t’,而未在函数中声明,这里涉及到的是 Golang 函数中关于被命名返回值的定义,如下所述,Go 中的命名返回值相当于在函数“最顶端“的定义的变量,优先级要高于一般的函数哪定义变量,因此,这个变量在函数中是需要像常规变量一样被使用,return 后无需有值。 Go's return values may be named. If so, they are treated as variables defined at the top of the function. Named return values...

【看源码学 Golang】Clash 中 Context 和 Goroutine 实现超时、可取消的异步任务管理

Published at November 7, 2019 ·  1 min read

在 Clash 的 picker 模组中,作者模仿 errGroup 利用 Context 和 Goroutine 实现了可以超时、可以取消的异步任务管理器,在一般异步任务中,通过 Goroutine 和 sync.Waitgroup 可轻松实现高并发,但在需要返回结果、错误信息、若其中某个 Goroutine 出错则取消其他 Goroutine 的情况,则需要通过 Context 和 Channel 管理 Goroutine,当有错误时,向 Channel 发送消息通知,而其他 Goroutine 则根据 Channel 取消相关的任务。 Clash/picker...

RxSwift: Benefits and Use Cases

Published at November 3, 2019 ·  1 min read

“functional reactive programming” 似乎是用 Swift 做 iOS 开发过程中必须面临的一个与以往 OOP 编程相异的一个模式。而 RxSwift 则是其中比较具有代表性的一个框架。 “It’s like flicking a light switch: the switch and the light bulb are coupling components. In coding terms: suppose that the bulb reacts to the switch and transforms its state accordingly, then it is reactive and the switch is observable, because it only observes the changes in the state of a light bulb.“ 这种思想与 Vuejs 这款前端编程框架中的 watch 较为类似,当某某发生变化时,则进行某某行为。其行为均是根据某一事件或用户交互而引发。...

Golang init order

Published at October 18, 2019 ·  1 min read

在某项目中的文件结构如下,a,b,c,d,e 中均有使用 init 函数,其中 c 中的 init 函数负责将初始化其他几个文件中初始化相关的逻辑,但是在实际测试中发现,d,e 中的初始化已经运行,但其数据迟迟不能被加载,只有 c 前的 a,b 中的数据能够顺利被加载。在经过多次测试后推测,Go 中的 init 执行是存在先后顺序,于是将 c 名称改为 z ,排在 a,b,d,e 之后,则发现原本不能被加载的 d,e 中的数据成功加载。 ├── a.go ├── b.go ├── c.go ├── d.go └── e.go 建议之后有类似需求的项目,可以将 c 文件单独放到放置或将其放到 main 中。...

SSHException: not a valid RSA private key file

Published at September 26, 2019 ·  1 min read

在使用 paramiko 或 fabric2 通过 private key 连接服务器时会遇到 SSHException: not a valid RSA private key file 的报错,此类问题一般是 private key 的格式,在 macOS 可以使用 brew install puttygen centos/ubuntu 中使用 apt-get install putty-tools or yum install putty 安装 putty ,并通过 puttygen id_rsa -O private-openssh -o new.key 将其转换成 private-openssh 格式,即可按照常规方式使用。...

reactjs 在本地开发使用 proxy 遇到的问题

Published at September 25, 2019 ·  1 min read

在 Reactjs 写前端时遇到的奇葩问题,在 react-scripts start 在 docker 容器中启动,需要在 package.json 中指定 proxy 地址。地址需要保证在reactjs 的容器中能够访问,而非 127.0.0.1:8000 或 localhost:8000 等本地地址。 然而,前后端分离中,后端 API 则在另外一个容器中,所以这里的地址就需要填写对应的地址就需要访问到相应的后端 API。 两种解决方案:1. 在 macOS 的开发环境中可以通过 host.docker.internal 外加端口即可访问宿主机相应的端口服务,2. 通过在 docker-compose 中配置的容器名,即 container_name:port 访问对应的容器资源。...

A 6 Part Introductory OpenSSL Tutorial

Published at September 9, 2019 ·  1 min read

对 openssl 做简单的介绍,如何创建私钥,如何通过私钥生成共钥,如何通过私钥加密内容,如何生成私钥和证书为 web 服务提供 ssl 加密 A 6 Part Introductory OpenSSL Tutorial...

阅读 Sniper 源码实现,学习 Golang 中重载机制的实现

Published at August 31, 2019 ·  1 min read

Sniper 是 Bilibili 开源的一款轻量级业务框架,通过阅读其代码,可以学习到很多优秀的设计理念,这里学习的主要是其中 cmd/server/main.go 中关于停止、重载的设计,首先利用 viper.OnConfigChange 函数监听配置文件,发生更改后,则向 reload channel 发送消息,通过 signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) 监听 syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP 三个信号,并将其发送给 stop channel。其后在 for loop 循环中,通过 select case 获取两个channel 中的消息,进行相应的重制、停止等操作。 func main() { reload := make(chan int, 1) stop := make(chan os.Signal, 1) conf.OnConfigChange(func() { reload <- 1 }) conf.WatchConfig() signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) startServer() for { select { case <-reload: util.Reset() case sg := <-stop: stopServer() // 仿 nginx 使用 HUP 信号重载配置 if sg == syscall....

Tags

abcs accept acid activemq affinity algorithm allocation android array async aws b+tree b-tree backoff benchmark best-practices bfs big-o bigquery bind bitcount blog break broker bubble buffer cache cap cert cgroups channel citus class classmethod closure closures cluster concurrency config consumer container context cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll errgroup escaping extra fabric2 facebook-pixel financial-report flask flutter forward-proxy freelance frontend frp garbage-collector gc gcp generator gesture get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index init innodb instagram intergration interview ios javascript jinja2 jobboard jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm mobile model mq myisam mysql namespace nat netflix network-extension nginx nodejs nomad nosql npm oodesign openssl optimization orm pandas parallelism paramiko parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender private-key process proxy proxycommand put pvm python queue rabbitmq rbac react-native reactive reactjs rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq rsa rxswift saas scaffold scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm slack slave slow-query sniper sns socket socks5 source-code spa sql sqlalchemy sqs ssh ssl ssl-pinning stack startup state stateful stateless staticmethod string struct swift swiftui switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp userdefaults variable vc vpn vuejs weak web web-development where widget yarn zset 削峰 宽索引 异步 看源码学-golang 窄索引 解耦 跨域 跳板机


Archives

2019 (156)