1. 写在前面
在实践 Erlang and OTP in Action 的第六章的时候,确实遇到了不少问题,后来慢慢多看了几遍书,多阅读了几次源码,特别是阅读了 application 的源码后,才慢慢理解了这章所讲的这个应用。这个总结不会很长,原本就想简单记在书上的,但想到以后也许会有一些更新,还有一些流程图的绘制需要经过多次修改,就还是放到github上来了,说实话,真挺感谢github的,让我学习和管理代码如此方便。
2. 程序运行流程
下图是整个simple_cache应用运行的流程,我们先上图,然后在后面再说说重要的地方。
下面我们再说明一下各个模块各自的职责:
sc_app: 应用行为模
继续阅读 »
更新日志
Method Swizzle(方法调配、方法混合、方法调和、方法混写) 是 Objective-C 运行时的黑魔法之一。我们可以通过 Swizzle 的手段,在运行时对某些方法的实现进行替换,这是 Objective-C 甚至说 Cocoa 开发中最为华丽,同时也是最为危险的技巧之一。Swizzle 使用了 Objective-C 的动态派发,对于 NSObject 的子类是可以直接使用的。
通过此方案,可以为那些『完全不知道其具体实现的』黑盒方法增加日志记录功能,这非常有助于程序调试。然而,次做法只在调试程序时有用。很少有人在调试程序之外的场合用上述『Method Swillze』来永久改动某个类的功能。不能仅仅因为
继续阅读 »
在octavia中,实际的loadbalancer服务是由虚拟机提供,所以在虚拟机中需要运行服务与octavia通信,接收octavia发来的操作指令,配置网卡、路由以及haproxy和keepalived软件。
实际上,虚拟机里面会运行amphora-agent进程,对外提供REST API访问,如下所示:
继续阅读 »
高性能的 Web 应用是获得伟大用户体验的关键。随着 Web 应用越来越复杂,要想建立吸引人的用户体验,了解性能的影响是至关重要的。在过去的几年中,浏览器中也新增了许多 API 来帮助我们分析网络性能、页面加载时间等。但这些并没有给出详尽的足够灵活的方式,来帮助我们分析具体是什么降低了我们网站的性能。User Timing API 提供了一套机制来帮助我们测量我们的应用,从而找到应用中耗时的部分。在本文中,我将介绍这个 API 并提供一些如何使用它的例子。
你不能优化那些不能被测量的东西
给运行缓慢的应用提速的第一步是,找到应用中耗时的部位。要想找到这些烫手山药,最理想的方式就是对 JavaScript 代码进行区域性的运行时间
继续阅读 »
watch 定时监测
如同名字一样,watch就是监测一个命令的运行结果,省得自己不断的重复输入。
bash
watch -n 2 "nvidia-smi" 每两秒运行一次nvidia-smi
watch -n 2 -d "nvidia-smi" 同时高亮显示每次命令执行后变化的区域
继续阅读 »
位图排序简介
位图排序的直接思路是想通过有限位数(比如1位)去映射一个整数,从而节省存储空间,而间接带来的好处是给指定数据集合排序了。
实际案例介绍
本案例摘抄自《编程珠玑》一书。
输入:
所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,这里n=10^7。如果输入时某一个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。
输出:
以非递减形式输出经过排序的整数列表。
约束:
至多(大概)只要1MB的可用主存;但是可用磁盘空间非常充足。运行时间至多只允许几分钟;10分钟是最适宜的运行时间。
代码实现如下
more
``` java
include
include
in
继续阅读 »
xmake提供了自定义打包、安装、运行脚本,可以更加灵活的针对个人实际需求来操作xmake
这里用一个例子详细说明下,比如有个需求,我需要自动编译、安装、运行android app工程,并且能够支持jni
可以进行如下操作
首先创建个基于ant的android app工程,目录结构如下:
继续阅读 »
Gitlab CI 简介
Gitlab中集成了CI (Continuous Integration:持续集成) 和CD (Continuous Delivery:持续交付) 来方便用户测试、构建、部署代码。它是Gitlab的一部分,用户可以在 Gitlab.com 上免费使用,同时也包含在了开源的Gitlab社区版和付费的Gitlab企业版中。
Gitlab CI具有如下特性:
多平台:您可以在任何支持Go语言的平台上运行,例如:Unix、Windows、OSX等。
多语言:构建脚本是通过命令行驱动的,可以支持诸如Java、PHP、Ruby、C等任何语言。
稳定:您的构建操作可以运行在其他机器上,而不是Gitlab上。
并行构
继续阅读 »
Java面试总结-线程
1、创建一个线程
创建线程主要分为两个方法
implements Runnable接口并实现run()方法,然后由Runnable对象创建一个Thread对象,调用Tread的start()方法启动线程。
extends Thread 构建一个Thread类的子类,复写run()方法。该方法目前已不再推荐,应该从运行机制上减少需要并行运行的任务数量。
警告:不要调用Thread类或Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程??。应该调用Tread.start方法,这个方法将创建一个执行run方法的新线程。
```
/**
* 创建线程的两种方式
继续阅读 »
概述
代码发布打包的时候,有很多种方式,其中一种方式在打包的时候可以将整个项目中所用到的依赖包全部一起打包。一般叫做Standalone Application.j即可独立运行的应用。
这种打包方式的优点是显而易见的,即打包之后一个Jar即可运行。迁移快,成本低。相反的,其缺点是如果依赖包升级,则需要重新发布打包。所以这种方式适用于小项目,依赖包少的项目。
继续阅读 »