破解本博客不能部署的问题
试着生成公钥,然后一定要记得把 pubkey 粘贴到 github 的 setting 里然后用ssh ping github ssh -T git@github.com,即使返回错误也不要紧。 改用这个github 的部署地址:repo: git@github.com:magicliang/magicliang.github.io。
CMD 与 ENTRYPOINT
CMD 与 ENTRYPOINT 都是为了让容器工作得像可执行文件一样,接受参数,产生特定的输出存在的—容器命令化工具。如果没有这些工具,那么docker run -it abc:v0.0.1 /bin/bash 的最后一个参数就会变成启动命令。如果有CMD,它的命令也会被 docker run 结尾的参数命令锁覆盖,原本的命令不会作为 startup command 执行;如果有 ENTRYPOINT,docker run 结尾的参数命令会作为 ENTRYPOINT 的命令执行; CMD 还可以为 ENTRYPOINT 提供参数。 比较奇怪的地方是,如果使用了非 /bin/bash 的 startup command,docker run 的时候就不能 /bin/bash 进去了。 一个容器最好只有一个 CMD,一个 ENTRYPOINT。子容器的 CMD 会覆盖父容器的 CMD。 CMD 可以为 ENTRYPOINT 提供参数。 他们都有 exec 和...
Linux hypervisor
hypervisor 可以被认为等于 virtual hardware。他们的出现,可以有效减少硬件服务器数量。 常见的 hypervisor 分成两类: 直接运行在硬件上的,基于内核的虚拟机。 OS as hypervisor。典型例子是 KVM。KVM 是被集成到 Linux 内核之中的完整虚拟化解决方案。 运行于另一个操作系统之上。典型的例子是 QEMU 和 WINE。 hypervisor的实现,总是要映射一些磁盘设备和网络设备的。
MariaDB 调优相关
本文主要摘译自这里。 MySQL 曾经有独立的公司。但那间公司后来被 Sun 微系统公司获取了。 Sun 微系统公司又被 Oracle 获取了。原 MySQL 开发者担心 MySQL 成为闭源软件,因此成立了一家SkySQL 公司维护开源的 MySQL 分支—MariaDB。 MariaDB 支持的存储引擎包括: InnoDB/XtraDB 后者是前者的加强版,属于事务性存储引擎,也叫 ACID-compliant(ACID 遵从的)。XtraDB 是 Percona 开发的存储引擎,整体向下兼容。使用普通的 mysqldump 会耗尽 cpu(因为要把数据库转化成正经的 SQL 语句)。而 xtrabackup 在大库上的备份、还原、冗余都表现得更好(因为像 Oracle 一样是二进制备份吗?)。 TokuDB。另一个事务性存储引擎。以高压缩率著称(最高25倍压缩)。适合小空间存储大数据。 MyISAM。MySQL 上最古老的存储引擎。非事务性存储引擎,只支持表级锁,不支持...
KOA 初探
KOA 是 express 的进化版。都是被作者玩腻了扔掉的东西。 它简化了各个中间件层面的工作,提供了高级的“糖”,把各个中间件转化为了函数。 123456789101112131415161718192021222324252627282930313233const Koa = require('koa');const app = new Koa();// x-response-timeapp.use(async (ctx, next) => { const start = Date.now(); // 到这里就停住了运行,让下一个中间件函数运行。 await next(); // 从下一个中间件函数那里返回 const ms = Date.now() - start; ctx.set('X-Response-Time', `${ms}ms`);});// loggerapp.use(async (ctx,...
线程安全与锁优化
线程安全什么是线程安全“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。” 相对的线程安全,可以分成五个等级: 线程安全的分类不可变不可变的数据,都是线程安全的。不可变的对象引用,加上所有field都是不可变的。如果有得选,尽量连方法都是final的。 绝对线程安全Vector不是线程安全的。它也会出现并发修改时 Out of Range 的异常(注意,不是 ConcurrentModification 的异常)。 相对线程安全需要保证对这个对象的单独操作是线程安全的,在调用的时候不需要加上额外的保障措施。对于特定顺序的连续操作,就需要额外的同步来保证调用的正确性了。 线程兼容可以通过特殊手段做到线程安全的普通类,绝大部分类都属于相对线程安全的。 线程对立线程对立,是不管调用端是否采取了同步措施,都无法在多线程环境中使用的代码。常见的线程对立的操作还有 suspend(),resume(),...
JVM 的内存模型与线程
1.性能何处寻 计算机的CPU比起其他所有的设备,都快得多,所以怎样尽量复用 CPU 的时间片,是压榨计算机性能的目标。多核和并发,使得阿姆达尔定律大显神威,超越摩尔定律成为提升系统性能的金科玉律 - 现在单核计算能力已经无法垂直提升,要水平提升核数来提升整体性能。 2.缓存一致性问题(Cache Coherence) 软件缓存,不过是硬件缓存的模仿,真正的缓存,早已存在于计算机的多级存储体系结构中。JVM 里,我们可以认为每个处理器都会在主内存(Main Memory)之外有高速缓存作为工作内存(Working memory)。除此之外,处理器和 JVM 都可能出现指令重排(Instruction Reorder)的的情况。工作内存是线程 Save 和 Load 的主要场所,主内存则是他们沟通的场所。 3.JVM 的对象信息 Java Object 除了基本的内存轮廓以外,还有: Mark Word(对象的 Hash Code 的缓存值、GC标志、GC年龄、同步锁等信息)。 Klass...
如何把 composer 锚定到 e2e 的复杂网络
下载并进入/blockchain-explorer 项目。 cd fabric-docker-compose-svt。 download_images.sh(不要让 start.sh 代劳,要用特定的版本)。 ./start.sh 建立这个隐藏文件夹 /Users/magicliang/.composer-credentials,如果里面有内容要先清空。 把公私钥导入这个文件夹,注意最后一个 keystore 的私钥可能会变化: 1composer identity import -p explorer -u PeerAdmin -c /Users/magicliang/Desktop/Programming/git/blockchain-explorer-cp/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem -k...
Cello 在 mac 上需要特别注意的几个问题
/opt/cello 和 /opt/cello2 以及下面的 mongo 和 fabric-1.0 都尽量把 owner 和 group 改成当前用户名和当前用户名组名。然后把这两个子文件夹用 docker file sharing 打开。 docker 会对 cello 下的 file sharing 有很麻烦的冲突影响。解决方法是建立一个 cello2 文件夹,然后在 cello 项目下用以下脚本把 fabric-1.0 的文件夹迁移过去: 1234#!/usr/bin/env bashARTIFACTS_DIR=/opt/cello2sudo cp -r ./src/agent/docker/_compose_files/fabric-1.0 ${ARTIFACTS_DIR}sudo chown -R ${USER}:${USERGROUP} ${ARTIFACTS_DIR} 然后修改 vi .//src/agent/docker/docker_swarm.py,把 ...
Docker 的 Volume
为什么要有数据卷 Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。 换言之,删除容器的时候要记得顺便删除数据卷,例如: 1234# 删除全部容器连带的数据卷docker ps -aq | xargs docker rm -f -v# 删除遗留而不用的容器docker volume prune Volume 必须在容器初始化时就创建,也就意味着,只能在 docker run 或者 Dockerfile 里面指定数据卷。 $ docker run -it —name container-test -h...