January 15, 2019
docker build . 命令后面的.是什么意思
"\u003cp\u003e今天来公司自己构建了一个Dockerfile,放在一个经常用到的项目目录里,内容如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# This is a comment\nFROM ubuntu:14.04\nMAINTAINER Docker Newbee \u0026lt;[email protected]\u0026gt;\nRUN apt-get -qq update\nRUN apt-get -qqy install ruby ruby-dev\nRUN gem install sinatra\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e然后执行\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esudo docker build -t \u0026#34;cfanbo/test:v2\u0026#34; .\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e发现在构建的时候发送给 docker daemon 竟然有4G多,超极大。首先的第一反映出问题了。一个ubuntu镜像也没有这么大呀,况且现在还没有开始从远程pull 镜像呢。\u003c/p\u003e\n\u003cp\u003e那到底什么情况了呢?经过一翻搜索,发现在docker build . 的时候,会将当前目录里的内容发送给 docker daemon。只需要加一个 .dockerignore 文件,将其它内容排除掉就可以了,类似于git中的.gitignore文件的作用。\u003c/p\u003e\n\u003cp\u003e后面就想通 …\u003c/p\u003e"
December 29, 2018
windows下更新docker源(aliyun)
"\u003cp\u003e每个aliyun账号都有一个专属的镜像源\u003c/p\u003e\n\u003cp\u003e我这里安装的是 Docker Toolbox 软件,更新docker源有两种情况,一种是你还没有创建过Docker Machine,另一种是你已经创建过了Docker Machine。\u003c/p\u003e\n\u003ch2 id=\"一未安装过\"\u003e一、未安装过\u003c/h2\u003e\n\u003ch4 id=\"创建一台安装有docker环境的linux虚拟机指定机器名称为default同时配置docker加速器地址\"\u003e创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。\u003c/h4\u003e\n\u003cp\u003e$ docker-machine create –engine-registry-mirror=https://xxxx.mirror.aliyuncs.com -d virtualbox default\u003c/p\u003e\n\u003ch4 id=\"查看机器的环境配置并配置到本地然后通过docker客户端访问docker服务\"\u003e查看机器的环境配置,并配置到本地。然后通过Docker客户端访问Docker服务。\u003c/h4\u003e\n\u003cp\u003e$ docker-machine env default\n$ eval “$(docker-machine env default)”\n$ docker info\u003c/p\u003e\n\u003cp\u003e这里 xxxx 是您的专有加速器地址\u003c/p\u003e\n\u003ch2\u003e\u003c/h2\u003e\n\u003cp\u003e二、已安装过\u003c/p\u003e\n\u003cp\u003e登录已创建的Docker VM\n$ docker-machine ssh default\n$ sudo vi …\u003c/p\u003e"
December 24, 2018
MySQL中group_concat函数详解
"\u003cp\u003e**函数语法:\n**\u003c/p\u003e\n\u003cp\u003e**group_concat( [DISTINCT] 要连接的字段 [Order BY ****排序字段 **\u003cstrong\u003eASC/DESC] [Separator ‘分隔符’] )\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003e下面举例说明:\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eselect * from goods;\u003c/p\u003e\n\u003cp\u003e+——+——+\n| id| price|\n+——+——+\n|1 | 10|\n|1 | 20|\n|1 | 20|\n|2 | 20|\n|3 | 200 |\n|3 | 500 |\n+——+——+\n6 rows in set (0.00 sec)\u003c/p\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli\u003e以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eselect id, group_concat(price) from goods group by id;\u003c/p\u003e\n\u003cp\u003e+——+——————–+\n| id| group_concat(price) |\n+——+——————–+\n|1 | 10,20,20|\n|2 | 20 |\n|3 | 200,500|\n+——+——————–+\n3 rows in set (0.00 sec)\u003c/p\u003e"
December 22, 2018
MySQL中order by 排序必知
"\u003cp\u003e在开发过程时,我们经常会遇到 order by 排序操作,那么你知道什么时候MySQL才会进行排序操作,什么时候不需要时间排序操作?,下面我们就从一个很小的例子中了解一下排序场景。\u003c/p\u003e\n\u003cp\u003e表结构如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eCREATE TABLE t (\n id int(11) unsigned NOT NULL AUTO_INCREMENT,\n city varchar(16) NOT NULL,\n name varchar(16) NOT NULL,\n age int(11) NOT NULL,\n addr varchar(128) DEFAULT NULL,\n PRIMARY KEY (id),\n KEY city (city) USING BTREE\n ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e这里只有一个索引city,我们执行一条SQL语句:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSELECT city, name FROM t WHERE city=\u0026#39;杭州\u0026#39; ORDER BY name LIMIT 1000;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e通过Explain命令查看执行情况\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/explain-1024x119.jpg\" alt=\"\"\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e …\u003c/p\u003e"
November 29, 2018
mac下安装python web框架django
"\u003cp\u003e\u003cstrong\u003e前提\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e由于mac自带的python2.7(路径 /usr/bin/python)\n后来手动又安装了python3.7(/usr/local/bin/python3)\u003c/p\u003e\n\u003cp\u003e两个版本共存。为了方便,直接在.zshrc文件里做了别名映射\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ealias python=\u0026#34;/usr/local/bin/python3.7\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以直接使用命令python实际上用的是3.7版本。\u003c/p\u003e\n\u003cp\u003e按照官方教程 \u003ca href=\"https://docs.djangoproject.com/zh-hans/2.1/intro/install/\"\u003ehttps://docs.djangoproject.com/zh-hans/2.1/intro/install/\u003c/a\u003e 安装django。发现在使用命令 pip install django 安装后发现检测不到django,很奇怪,后来发现了问题所在。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e➜ ~ python\nPython 3.7.1 (default, Nov 6 2018, 18:46:03)\n[Clang 10.0.0 (clang-1000.11.45.5)] on darwin\nType \u0026#34;help\u0026#34;, \u0026#34;copyright\u0026#34;, \u0026#34;credits\u0026#34; or …\u003c/code\u003e\u003c/pre\u003e"
November 27, 2018
Python中的装饰器decorator
"\u003cp\u003ePython中装饰器有些类似于java中的面向切片编程AOP的概念,就是对一些请求方法进行一些拦截,然后加入一些其实的逻辑。可以参与 \u003ca href=\"https://blog.csdn.net/caimouse/article/details/78078189\"\u003ehttps://blog.csdn.net/caimouse/article/details/78078189\u003c/a\u003e 这篇举的例子,很好理解。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://wiki.jikexueyuan.com/project/the-python-study-notes-second-edition/decorator.html\"\u003ehttp://wiki.jikexueyuan.com/project/the-python-study-notes-second-edition/decorator.html\u003c/a\u003e\u003c/p\u003e"
October 20, 2018
Golang中struct结构体的的值方法和指针方法
"\u003cp\u003e推荐:\u003ca href=\"https://mp.weixin.qq.com/s/msXzSfrDAHNPFjMtJ_i0cw\"\u003eGo的方法集详解(360云计算)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e平时我们在写struct的时候,经常会用到一些方法,有些方法是我们熟悉的普通方法,在golang中我们称之为值方法,而另一种则是指针方法。\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etype Person struct {\n Firstname string\n Lastname string\n Age uint8\n}\n// 值方法\nfunc (p Person) show() {\n fmt.Println(p.Firstname)\n}\n// 指针方法\nfunc (p *Person) show2() {\n fmt.Println(p.Firstname)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e可以看到所谓的值方法与指针方法在编写的时候,只是有无*****号的区别,这个*就是指针的意思。\u003c/p\u003e\n\u003cp\u003e那么用法又有何不同呢?\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e// 值方法\nfunc (p Person) setFirstName(name string) {\n p.Firstname = name\n}\n// 指针方法\nfunc (p *Person) setFirstName2(name string) { …\u003c/code\u003e\u003c/pre\u003e"
October 20, 2018
分布式系统与消息的投递(转)
"\u003cp\u003e\u003ca href=\"https://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\"\u003ehttps://mp.weixin.qq.com/s/ZLzwQAIG6ZL88ohusOyxIQ\u003c/a\u003e\u003c/p\u003e"
October 19, 2018
Golang中的unsafe.Sizeof()简述
"\u003cp\u003e测试环境:\n系统 win7 64位\ngo version: go1.10 windows/amd64\u003c/p\u003e\n\u003cp\u003e我们先看一下代码的输出\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;unsafe\u0026#34;\n\nfunc main() {\n\t// string\n\tstr1 := \u0026#34;abc\u0026#34;\n\tprintln(\u0026#34;string1:\u0026#34;, unsafe.Sizeof(str1)) // 16\n\tstr2 := \u0026#34;abcdef\u0026#34;\n\tprintln(\u0026#34;string2:\u0026#34;, unsafe.Sizeof(str2)) // 16\n\n\t// 数组\n\tarr1 := [...]int{1, 2, 3, 4}\n\tprintln(\u0026#34;array1:\u0026#34;, unsafe.Sizeof(arr1)) // 32 = 8 * 4\n\n\tarr2 := [...]int{1, 2, 3, 4, 5}\n\tprintln(\u0026#34;array2:\u0026#34;, unsafe.Sizeof(arr2)) // 40 = 8 * 5\n\n\t// slice 好多人 …\u003c/code\u003e\u003c/pre\u003e"
October 19, 2018
数据结构与算法
"\u003cp\u003e平时开发中,一般很少用到手动来写算法的情况,但实际上我们一直在接触一些数据结构与算法,如JAVA中的ArrayList 就用到了数据结构与算法,从名字可以看到了用到了Array这种数组结构和链表结构。下面根据目前学习的情况做一个总结。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e数据结构\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们常见的数组结构一般有:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArray数组、\u003c/li\u003e\n\u003cli\u003eStack栈、\u003c/li\u003e\n\u003cli\u003eHeap堆、\u003c/li\u003e\n\u003cli\u003eQueue队列\u003c/li\u003e\n\u003cli\u003eHash 哈希类型\u003c/li\u003e\n\u003cli\u003eLinkedList 链表,其中又分为单向链表、双向链表、还有最少用的环形链表\u003c/li\u003e\n\u003cli\u003eTree 这个Tree分的太多了,如B-Tree、 B+Tree(mysql使用)、Binary Search Tree二叉搜索树 、AVL高度平衡树、Red Black Tree红黑树 等\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/data-struct.png\" alt=\"数据结构\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.bigocheatsheet.com/\"\u003ehttp://www.bigocheatsheet.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e算法\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e一般开发中用到的基本上排序算法居多,而算法大体上又分为比较排序和非比较排序。我们常用的比较排序算法有(参考: \u003ca href=\"http://www.cnblogs.com/eniac12/p/5329396.html\"\u003ehttp://www.cnblogs.com/eniac12/p/5329396.html\u003c/a\u003e):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e快速排序 (Quick Sort)\u003c/li\u003e\n\u003cli\u003e冒泡排序 (Bubble Sort) …\u003c/li\u003e\u003c/ul\u003e"
October 17, 2018
常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
"\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/alsf/p/6606287.html\"\u003ehttps://www.cnblogs.com/alsf/p/6606287.html\u003c/a\u003e\n\u003ca href=\"https://blog.csdn.net/wang_hufeng/article/details/80774761\"\u003ehttps://blog.csdn.net/wang_hufeng/article/details/80774761\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e推荐”极客时间”的两个算法专栏,其中有个专栏是视频形式的,两个专栏讲的都是特别的通俗易懂的。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://time.geekbang.org/column/126\"\u003ehttps://time.geekbang.org/column/126\u003c/a\u003e \u003ca href=\"https://time.geekbang.org/course/intro/130\"\u003ehttps://time.geekbang.org/course/intro/130\u003c/a\u003e\u003c/p\u003e"
October 13, 2018
Heap And Stack 堆与栈的区别
"\u003cp\u003e\u003cstrong\u003e堆与栈的区别\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e推荐: \u003ca href=\"https://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\"\u003ehttps://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e栈是上下顺序存储的,且“先进后出LIFO”规则,只能删除顶部的元素,而堆是没有特定的顺序的存储,您可以删除任意元素。堆分配需要维护分配的内存和未分配的内存的完整记录,以及一些开销维护以减少碎片,找到足够大以适应请求大小的连续内存段,等等。内存可以随时释放,留出自由空间。有时,内存分配器将执行维护任务,比如通过将分配的内存到处移动来对内存进行碎片整理,或者在运行时进行垃圾收集——当内存不再处于作用域中时对其进行标识并释放它。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e栈用在线程中,程序执行时由线程创建有限数量的栈空间,当线程结束的时候会自动回收,属于系统级。\n堆一般是由应用程序在启动时创建,由应用程序回收,属于应用级。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe stack is attached to a thread, so when the thread exits the stack is reclaimed. The heap is …\u003c/p\u003e\u003c/blockquote\u003e"
October 11, 2018
raft一致性算法动画演示
"\u003cp\u003e\u003ca href=\"http://thesecretlivesofdata.com/raft/\"\u003ehttp://thesecretlivesofdata.com/raft/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://raft.github.io/raft.pdf\"\u003eThe Raft Paper\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eraft算法中文版: \u003ca href=\"https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\"\u003ehttps://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md\u003c/a\u003e\u003c/p\u003e"
October 11, 2018
Kubernetes学习资源
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com/uploads/2021/04/1f57f5934f4db11b6e9e473ffd043b03.jpeg\" alt=\"\"\u003ek8s guide\u003c/p\u003e\n\u003ch2 id=\"准备\"\u003e准备\u003c/h2\u003e\n\u003cp\u003e对于一个新手来说,第一步是必须了解什么是 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/\"\u003ekubernetees\u003c/a\u003e、 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/architecture/\"\u003e设计架构\u003c/a\u003e 和相关 \u003ca href=\"https://kubernetes.io/zh/docs/concepts/\"\u003e概念\u003c/a\u003e。只有在了解了这些的情况下,才能更好的知道k8s中每个组件的作用以及它解决的问题。\u003c/p\u003e\n\u003ch2 id=\"安装工具\"\u003e安装工具\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://minikube.sigs.k8s.io/\"\u003eminikube\u003c/a\u003e 参考 \u003ca href=\"https://minikube.sigs.k8s.io/docs/start/\"\u003ehttps://minikube.sigs.k8s.io/docs/start/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://kind.sigs.k8s.io/docs/\"\u003ekind\u003c/a\u003e 参考 \u003ca href=\"https://kind.sigs.k8s.io/docs/user/quick-start/\"\u003ehttps://kind.sigs.k8s.io/docs/user/quick-start/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以上是安装k8s环境的两种推荐方法,这里更推荐使用kind。主要原因是 \u003ccode\u003eminikube\u003c/code\u003e 只支持单个节点,而 \u003ccode\u003ekind\u003c/code\u003e 可以支持多个节点,这样就可以实现在一台电脑上部署的环境与生产环境一样,方便大家学习。\u003c/p\u003e\n\u003cp\u003e要实现管理控制 Kubernetes 集群资源如pod、node、service等的管理,还必须安装一个命令工具 \u003ca href=\"https://kubernetes.io/zh/docs/reference/kubectl/kubectl/\"\u003ekubectl\u003c/a\u003e ,请参考: \u003ca href=\"https://kubernetes.io/zh/docs/tasks/tools/\"\u003ehttps://kubernetes.io/zh/docs/tasks/tools/\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"学习文档\"\u003e学习文档\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eKubernetes 文档 \u003ca href=\"https://kubernetes.io/zh/docs/home/\"\u003ehttps://kubernetes.io/zh/docs/home/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlay with …\u003c/li\u003e\u003c/ul\u003e"
October 9, 2018
Golang中的调度器
"\u003cp\u003e\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/go-mpg-1.jpg\" alt=\"\"\u003e\u003c/p\u003e\n\u003cp\u003egolang实现的协程调度器,其实就是在维护一个G、P、M三者间关系的队列。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e介绍(Introduction)\u003c/strong\u003e\n———————\nGo 1.1最大的特色之一就是这个新的调度器,由Dmitry Vyukov贡献。新调度器让并行的Go程序获得了一个动态的性能增长,针对它我不能再做点更好的工作了,我觉得我还是为它写点什么吧。\u003c/p\u003e\n\u003cp\u003e这篇博客里面大多数东西都已经被包含在了[原始设计文档]( \u003ca href=\"https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw\"\u003ehttps://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw\u003c/a\u003e)中了,这个文档的内容相当广泛,但是过于技术化了。\u003c/p\u003e\n\u003cp\u003e关于新调度器,你所需要知道的都在那个设计文档中,但是我这篇博客有图片,所以更加清晰易懂。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e带调度器的Go runtime需要什么?(What does the Go runtime need with a scheduler?)\u003c/strong\u003e\n——————————————————————————-\n但是在我们开始看新调度器之前,我们需要理解为什么需要调度器。为什么既然操作系统能为我们调度线程了,我们又创造了一个\u003cstrong\u003e用户空间调 …\u003c/strong\u003e\u003c/p\u003e"