What every programmer should know about memory,Part 1

这篇文章 What every programmer should know about memory, Part 1 是出自lwn.net 作者 Ulrich Drepper 总线结构 常见的商用计算机结构: 北桥南桥结构: CPU通过FSB连接到北桥, 北桥包含内存控制器,通过不同内存控制器链接不同的RAM,如DRAM,SDRAM, Rambus,南桥主要连接I/O设备,支持不同总线接口如:PCI,SATA,USB。 特点: cpu到cpu之间数据要过北桥 所有设备与RAM需要通过北桥 RAM仅一个端口 通过南桥链接设备与cpu通讯需要经过北桥 瓶颈; 北桥处理能力成为瓶颈。 设备与内存: 北桥与内存 早些年设备间通讯需要通过cpu, 为了减少CPU压力,出现DMA,虽然减少cpu压力,但是占用北桥带宽。 为了增强北桥内存访问能力,有些系统支持北桥连接外部更多的内存控制器: 北桥连接外部内存控制器南北桥结构 特点: 增强北桥处理能力 瓶颈: 内部带宽 北桥成为中心关键节点,内存控制器接入越多 另外一种解决方法是将外部控制器集成到CPU中( NUMA) 将内存控制器集成到cpu中,不同cpu连接不同内存, 没有北桥瓶颈,但当访问链接到其他CPU的内存时使得访问变得复杂。 NUMA - Non-Uniform Memory Architecture RAM类型 Static RAM 需要多个晶体管,文章中提到有6个或4个的。 单元状态稳定,不需要刷新周期。 断电后数据丢失 Dynamic RAM 需要一个晶体管和一个电容 需要刷新不断刷新 DRAM 访问 如果要访问一个4G地址, 4GB的RAM需要2^32个地址线, 使用二进制编码,N 个地址线可以完成 2_N_ 个地址,使用N个地址线,除了电路设计复杂之外需要大量的芯片,DRAM设计时使用矩阵方式,将一维的操作转化为二维操作。使用行地址选择器和列地址选择器方式。简化了电路的设计。仅需要很少地址线,为了能区分行或列需要额外的一些lines。 总结: 处于成本考虑内存大多使用DRAM 需要单独选择存储单元才能使用 由于性价比考虑选择DRAM地址线设计使用矩阵方式。 在读取或写入操作的可用之前由于电器特性需要一段时间 ...

2021-10-16 · 1 min · 143 words

ACME 证书自动化管理

在搭建blog使用https服务,需要申请配置一个域名证书,使用了Let’s Encrypt申请了免费的https证书。 HTTP vs HTTPS HTTPS 将 HTTP over TCP/IP 变成 HTTP over SSL/TLS,也就是在原有层之间增加一个SSL/TLS安全层。 SSL vs TLS from https://dev.to/techschoolguru/a-complete-overview-of-ssl-tls-and-its-cryptographic-system-36pd SSL最初由网景(Netscape)开发,于1995年首次发布2.0版本, 1.0版本由于严重安全漏洞未发布过 1996年,发布SSL3.0版本 三年以后的1999年,TLS1.0有IETF定义再RFC2246标准中诞生,他是基于SSL3.0的,所有些文章也称他为SSL3.1。 2006年,升级到TLS1.1,但是紧接着在2008年就被TLS1.2取代。 2018年,TLS1.3做出了巨大改进。 SSL2.0和SSL3.0分别在2011,2015年被弃用,截至2020年3月Microsoft,Apple,Google,Mozilla,Cloudflare和Cisco, 均已弃用TLS1.0,TLS1.1。目前推荐使用协议是TLS1.2,TLS1.3 HTTPS如何工作 主要分为两个阶段: 阶段一 获得服务器证书(a Server Certificate) garlic要想给garlicspace.com申请证书, 首先生成CSR(a Certificate Signing Request),主要包含了 证书使用的算法 密钥对长度 私钥 与此同时生成自己的私钥留存本地 garlic找到一个证书颁发机构(CA Certificate Authority), 比如:Comodo、GeoTrust、Thawte、RapidSSL。 CA会判断对garlic是否其域名garlicspace.com有控制权。 图片来源https://devconfcz2021.sched.com/event/gmMh/acme-certificate-management-has-never-been-easier 阶段二 有了SSL/TLS协议的支持HTTPS是如何工作的呢? 以TLS1.2为例子: 客户端发送ClientHello 发送随机数,客户端TLS版本号,密码套件,扩展列表 服务端收到后返回ServerHello服务端随机数, 确定TLS版本, 密码套件,同时返回服务器证书, 密钥交换算法参数。 客户端收到证书后验证其有效性,比如证书有效期,证书对应域名,通过本地已经安装CA根证书对证书验签,如果存在中间CA,进行证书链的验证。 客户端发送密钥交换参数, 之后改用协商好密码套件中的会话密钥加密(对称密钥)传输。 图片来源: https://certs.securetrust.com/support/support-how-ssl-works.php Let’s Encrypt做了什么 简单来说他自动化的完成,证书申请,验证,下载,自动化更新, 并且可以免费使用。目前ACME v2协议已经被成为IETF标准 ...

2021-08-28 · 2 min · 251 words

docker 安装 Wordpress 及更新

今天登录到博客提示需要升级php,更新了下镜像顺便把之前搭建的步骤整理了一下。 搭建流程: 申请宿主机器,我用是centos。 使用docker-compose完成进行wordpress安装; 申请域名,使用Let’s Encrypt申请域名证书,使用ngnix提供 https服务。 宿主机申请,域名申请, 可以自行选在有些云服务商是同时提供DNS服务的。 镜像安装 安装docker及docker-compose 1)官网安装步骤 : https://docs.docker.com/engine/install/ 2)参考知乎的一篇文章: https://zhuanlan.zhihu.com/p/93832797。 我使用的略做了调整: version: '3.3' services: db: image: mariadb:latest volumes: - ./db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: {mysqlroot密码} MYSQL_DATABASE: {数据库名称} MYSQL_USER: {用户名} MYSQL_PASSWORD: {用户密码} wordpress: depends_on: - db image: wordpress:latest volumes: - ./wordpress:/var/www/html ports: - "{端口}:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: {用户名} WORDPRESS_DB_PASSWORD: {密码} WORDPRESS_DB_NAME: {数据库名称} 版本升级 wordpress提示升级, 只要更一下word press镜像及可以了 1)下载最新镜像 # docker pull wordpress 2) 删除容器 #docker ps -a #docker rm {对应镜像的容器id} 3) 删除镜像 ...

2021-08-24 · 1 min · 91 words

leetcode - Squares of a Sorted Array

问题 Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order. Example 1: Input: nums = [-4,-1,0,3,10] Output: [0,1,9,16,100] Explanation: After squaring, the array becomes [16,1,0,9,100]. After sorting, it becomes [0,1,9,16,100]. Example 2: Input: nums = [-7,-3,2,3,11] Output: [4,9,9,49,121] Constraints: 1 <= nums.length <= 104 -104 <= nums[i] <= 104 nums is sorted in non-decreasing order. Follow up: Squaring each element and sorting the new array is very trivial, could you find an O(n) solution using a different approach? ...

2021-06-11 · 1 min · 205 words

Leetcode-Is Subsequence

问题 Given two strings s and t, check if s is a subsequence of t. A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., "ace" is a subsequence of "abcde" while "aec" is not). Example 1: Input: s = "abc", t = "ahbgdc" Output: ...

2021-05-18 · 1 min · 193 words

DeFi

DeFi:Decentralized finance 是一种基于block-chain的金融形式。他不依赖于券商,银行,交易所等中心话的机构。 说到区块链就让人想到Bitcoin, 当初第一次听到这个介绍还是是在infoQ大会上,恒生的一位架构师分享的时候了解到的。当时还有点融的CTO做的分享。我都尝试了。。。这两年板砖, 努力还债。 虽然Bitcoin实现了去中心化资金的转移,但是对于如今贷款,储蓄,保险,股票,丰富的金融服务大多是CeFi:Centralized financial 集中化的,于是Defi出现了。 什么是Defi? DeFi去中心化的金融服务, 主要包括啊以下几个部分: 基础架构:这里指的是可进行编程,运行去中心化服务的基础架构。 Ethereum实现了这点,你可以自己动手编写自己Dapp, Ethereum上面运行的代码也称智能合约。 稳定币:由于Ethereum本身高度波动性,需要有资产和我们现实世界的价值挂钩, 比如美元。常用的稳定币:去中心化:DAI,中心化: USDT, USDC or PAX 金融服务:有了去中心化稳定资产,就需要一个去中心化的交易所。比如Dex,Compound等,最近比较火的有Uniswap。一般提供以下服务: 借贷 Lending and Borrowing;赚取利息 兑换 Decentralized Exchanges; 衍生品 Derviatives;可以对标美元,黄金,其他数字资产等。 保证金交易Margin Trading; 保险 Insurance; 预言机Oracles, 将外部可靠数据传送到智能合约。 “乐高模式” 在统一个基础架构下,比如以太坊环境下,可以使用不同的钱包, 选择不同的Dapp提供给参与者一系列交易转账,借贷,保险等金融服务。 DEFI vs CEFI 图片来自 https://finematics.com/defi-explained/ 风险 涉及的几个潜在风险: 智能合约的BUG:天下程序员都会犯的错误。 伪中心化:是否有admin的角色存在。 价格波动:当然这正是他吸引人的地方。 网络拥堵和高昂的费用:目前以太坊正通过Ethereum2.0和second layer进行解决。 代币的发行:引起币价大幅度波动 最后 板砖的日子里远离了币圈有一段时间,当年出于好奇用2个eth,在 cryptokitties 买了几只猫,我看他们现在活得都挺好, 我试了试他的配种和拍卖的功能,没有成功。 而Defi应用能方便的给参与者带来收益,这使得更多的人参与进来。 当年跟着大军进入了币圈,P2P,“财富自由”应该是当时最火的词,回过头想想,对于投机行为,要控制好度,最好是在承受损失范围内,或者稍微超出一点;另外就是趁着年轻的时候,这样还有试错的机会。 参考及引用 Photo by Ralph W. lambrecht from Pexels https://finematics.com/defi-explained/ https://99bitcoins.com/what-is-defi/

2021-05-12 · 1 min · 70 words

LeetCode-3Sum

问题: Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0. Notice that the solution set must not contain duplicate triplets. Example 1: Input: nums = [-1,0,1,2,-1,-4] Output: [[-1,-1,2],[-1,0,1]] Example 2: Input: nums = [] Output: [] Example 3: Input: nums = [0] Output: [] Constraints: 0 <= nums.length <= 3000 -105 <= nums[i] <= 105 ...

2021-05-10 · 2 min · 237 words

LeetCode-Two Sum

问题 Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. You may assume that each input would have exactly one solution, and you may not use the same element twice. You can return the answer in any order. Example 1: Input: nums = [2,7,11,15], target = 9 Output: [0,1] Output: Because nums[0] + nums[1] == 9, we return [0, 1]. Example 2: ...

2021-05-10 · 1 min · 170 words

Vagrant 创建Centos8 环境

使用Vagrant重新搭建一个测试环境,只需要简单几步就可以启动一个测试环境。 Vagrant 起初是和VirtualBox绑定, 1.1版本后支持Vmware, 1.6版本支持Docker容器。 环境搭建 使用VirtualBox镜像,在工作目录执行以下指令: vagrant init centos/8 vagrant up 启动登录修改下密码: vagrant ssh 之后就可以putty进行远程访问(IP:127.0.0.1,Port:2222) 网络配置 要跑一个golang的服务程序,需要启动端口1718 。修改工作目录下的 Vagrantfile文件增加以下一行即可。 config.vm.network "forwarded_port", guest: 1718, host: 1718 重启一下服务, 网路端口生效。 vagrant reload 参考引用 https://zh.wikipedia.org/wiki/Vagrant Photo by Nick Kwan from Pexels

2021-05-07 · 1 min · 38 words

Effective Go-5

Concurrency Share by communicating Do not communication by sharing memory; instead,share memory by communicating 通过通讯来共享内存,而不是通过共享内存来通讯 Goroutines go的协程并发在同一地址空间, 更轻量级。 package goroutines_test import ( "fmt" "sync" "testing" "time" ) var wg sync.WaitGroup func Announce(message string, delay time.Duration) { wg.Add(1) go func() { time.Sleep(delay) fmt.Println(message) defer wg.Done() }() } func TestAnnouce(t *testing.T) { Announce("helloworld", time.Second) Announce("helloweida", time.Second) Announce("hellosanding", time.Second) Announce("hellogarlic", time.Second) Announce("helloding", time.Second) wg.Wait() } Channels 可以通过make创建通道,可以通过第二个参数设置是否带有缓冲 ch:=make(chan int, 0) ch:=make(chan int, 100) 可以通过chan完成协程等待, 如果无缓冲通道, 接收者会立即引发等待, 有缓冲通道,数据填满缓冲区时开始等待。 ...

2021-04-27 · 8 min · 1625 words