0%

Portainer是一个轻量级的docker环境管理UI,可以用来管理docker宿主机和docker swarm集群。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
version: '3.7'

services:
portainer:
image: portainer/portainer-ce
restart: always
labels:
- traefik.http.routers.portainer.rule=Host(`portainer.local.hypc.host`)
- traefik.http.routers.portainer.entrypoints=websecure
- traefik.http.routers.portainer.service=portainer
- traefik.http.services.portainer.loadbalancer.server.port=9000
volumes:
- data:/data
- /var/run/docker.sock:/var/run/docker.sock
portainer-agent:
image: portainer/agent
restart: always
labels:
- traefik.enable=false
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes

volumes:
data:

基础

Reflect Metadata 是 ES7 的一个提案,它主要用来在声明的时候添加和读取元数据。TypeScript 在 1.5+ 的版本已经支持它,你只需要:

  • npm i reflect-metadata --save
  • tsconfig.json 里配置 emitDecoratorMetadata 选项。

Reflect Metadata 的 API 可以用于类或者类的属性上,如:

1
2
3
4
5
6
7
function metadata(
metadataKey: any,
metadataValue: any
): {
(target: Function): void;
(target: Object, propertyKey: string | symbol): void;
};
Read more »

  1. 先fork一个你想学习的项目,在fork的项目下建立一个学习分支
  2. 了解项目背景,熟悉、理解项目的结构
  3. 找好切入点(解决bug、与其他系统集成、添加功能等)
  4. 开始阅读,并在源代码中添加自己的理解或标记
    • 优秀的项目基本上都能做到命名准确,所以大部分变量、函数都能很好的理解其意义以及用法
    • 一些私有函数、复杂的逻辑可以先跳过,只记住其输入、输出即可,之后可以回过头来细读
    • 调试代码,尤其是动态语言,你甚至不知道调用的函数是在哪里声明的
  5. 你可能还需要一个画图工具,用来绘制流程图、时序图…
  6. 提交你的记录

最后,我们阅读源码的目的主要是学习别人的设计思想、编码技巧。

当nginx监听的端口与实际访问端口不一致时(如多层反向代理、或nat转发等),这时候通常需要关闭port_in_redirect选项。

port_in_redirect: 默认开启状态。启用或禁用在nginx发出的绝对重定向中指定端口。

1
2
3
4
5
6
7
8
9
10
server {
listen 8080;

location /public/ {
root html;
index index.html index.htm;
port_in_redirect off;
proxy_buffering off;
}
}

想做好前端很难,做出可扩展的前端,从而让多个团队可以同时投身于一项复杂的大型产品项目就更难了。本文将介绍前端领域最近的一项变革:单体前端架构正在过渡到许多较小、较易管理的前端架构。我们还会展示这种新的体系结构怎样提升前端团队的效率和表现。除了讨论这种新趋势的好处与代价外,我们还将介绍一些可行的实现方案,并深入分析一个完整的微前端应用案例。

微服务近年来大受欢迎,许多组织转向了微服务以克服大型单体后端架构的局限。但虽然微服务在服务端很流行,很多企业在前端代码库上仍然在沿用问题多多的单体架构。

也许你想构建一个渐进式或响应式的 Web 应用,但却找不到一种将这些功能集成进现有代码中的简单途径;也许你想尝试 JavaScript 语言的新功能(或者是其他可以编译为 JS 的某种语言),但你却无法将关键的构建工具融入已有的构建流程;或者你只是想扩展开发流程,让多个团队可以同时开发一种产品,但现有单体架构中的耦合度与复杂性让团队间的合作变得磕磕绊绊。这些都是很现实的问题,都会影响你们向客户交付高质量体验的能力。

微前端的定义

最近业界越来越关注复杂的现代化 Web 开发需要怎样的整体架构和组织结构这个问题。于是我们开始看到单体前端正在分解为更小、更简单的模块,这些模块可以各自独立开发、测试和部署,而它们组合在一起仍然对客户表现为一件单一完整的产品。我们将这种技术称为微前端,其定义为:

“微前端是一种架构风格,其中众多独立交付的前端应用组合成一个大型整体。”

在 ThoughtWorks TechRadar 2016 年第 11 期中,我们将微前端列入了“组织应评估的技术”之列;不久后我们将其提升为“可尝试”级别,最后将其列入“应采用”之列。换句话说,我们认为它是经受住了考验的方法,企业在需要时就应该采用它。详情请点击此处链接

Read more »

Pulsar在很多情况下提供了比Kafka更快的吞吐量和更低的延迟,并为开发人员提供了一组兼容的API,让他们可以很轻松地从Kafka切换到Pulsar。

Pulsar的最大优点在于它提供了比Apache Kafka更简单明了、更健壮的一系列操作功能,特别在解决可观察性、地域复制和多租户方面的问题。在运行大型Kafka集群方面感觉有困难的企业可以考虑转向使用Pulsar。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.7'

services:
pulsar:
image: apachepulsar/pulsar
restart: always
labels:
- traefik.http.routers.pulsar.rule=Host(`pulsar.yourdomain.com`)
- traefik.http.routers.pulsar.entrypoints=websecure
- traefik.http.routers.pulsar.service=pulsar
- traefik.http.services.pulsar.loadbalancer.server.port=8080
command: bin/pulsar standalone
volumes:
- conf:/pulsar/conf
- data:/pulsar/data

volumes:
conf:
data:

GitHub

  • Repo Releases: https://github.com/{owner}/{repo}/releases.atom
  • Repo Commits: https://github.com/{owner}/{repo}/commits.atom
  • Repo Tags: https://github.com/{user}/{repo}/tags.atom
  • User Activity: https://github.com/{user}.atom

少数派

V2EX

Examples:

RSSHub

RSSHub是一个开源、简单易用、易于扩展的RSS生成器,可以给任何奇奇怪怪的内容生成RSS订阅源。

RSSHub是一个开源、简单易用、易于扩展的RSS生成器,可以给任何奇奇怪怪的内容生成RSS订阅源。

FreshRSS是开源免费RSS订阅工具,功能设置上类似于Google Reader,支持快捷键操作,多用户,Ajax加载,数据导入与导出以及统计数据。

这里直接使用docker-compose一键化部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.7'

services:
freshrss:
image: freshrss/freshrss
labels:
- traefik.http.routers.freshrss.rule=Host(`freshrss.yourdomain.com`)
- traefik.http.routers.freshrss.entrypoints=websecure
- traefik.http.routers.freshrss.service=freshrss
- traefik.http.services.freshrss.loadbalancer.server.port=80
environment:
- TZ=Asia/Shanghai
- CRON_MIN=*/20
rsshub: # port: 1200
image: diygod/rsshub
restart: always
labels:
- traefik.enable=false
environment:
- NODE_ENV=production
- PUPPETEER_WS_ENDPOINT=ws://browserless-chrome:3000
browserless-chrome: # port: 3000
image: browserless/chrome
restart: always
labels:
- traefik.enable=false
Read more »

Headless CMS是一个内容管理软件,它允许作者创建和管理内容,以及提供结构化数据给开发者,让开发者能够将数据展示在网站或者应用前端的一个独立系统中。

一个传统的,完整的CMS是同时负责后端的内容管理以及提供内容给最终用户。 但相比之下,一个headless CMS将前端分离出来,让开发者能够用最好的技术来建立优越的用户体验。

Strapi是一款开源的、也是最受欢迎的Headless CMS

Strapi这个名字取自bootstrap的后缀strap,然后因为它是一个提供快速生成安全可靠的api架构, 然后再加了一个i,合并就是strapibootstrap的有启动的意思,你可以用strapi来快速构建你的后端,可以快速让自己的项目启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.7'

services:
shaarli:
image: shaarli/shaarli
restart: always
labels:
- traefik.http.routers.shaarli.rule=Host(`shaarli.yourdomain.com`)
- traefik.http.routers.shaarli.entrypoints=websecure
- traefik.http.routers.shaarli.service=shaarli
- traefik.http.services.shaarli.loadbalancer.server.port=80
volumes:
- data:/var/www/shaarli/data
- cache:/var/www/shaarli/cache

volumes:
data:
cache:

Django已经内置了许多lookup用来检索数据,这些lookups能满足绝大部分应用场景。 但有些时候我们需要自定义lookup用来满足特定的需求。

假设需要实现如下查询需求:

1
select * from test_tbl reverse(content) like '54321%';  -- postgresql

定义如下Lookup

1
2
3
4
5
6
7
8
9
10
11
from django.db.models import Field
from django.db.models.lookups import Lookup

@Field.register_lookup
class ReversePattern(Lookup):
lookup_name = 'reverse'

def as_sql(self, compiler, connection):
lhs, _ = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
return 'reverse(%s) like %s' % (lhs, rhs), [''.join(reversed(str(rhs_params[0]))) + '%']

查询:

1
Test.objects.filter(content__reverse='12345')