blog icon indicating copy to clipboard operation
blog copied to clipboard

:octocat: 用issues写博客,记录点滴

Results 49 blog issues
Sort by recently updated
recently updated
newest added

## 第一章 绪论 机器学习正是这样一门学科,它致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。如果说计算机科学是研究关于`算法`的学问,那么可以说机器学习是研究关于`学习算法`的学问 若预测的是离散值,例如好瓜、坏瓜,此类学习任务称为`分类`;若预测的是连续值,例如西瓜的成熟度0.95、0.37,此类学习任务称为`回归`。一般地,预测任务是希望通过对训练集![equation](http://latex.codecogs.com/gif.latex?\lbrace(x_1,y_1),(x_2,y_2),...,(x_m,Y_m)\rbrace)进行学习,建立一个从输入空间![equation](http://latex.codecogs.com/gif.latex?\chi)到输出空间![equation](http://latex.codecogs.com/gif.latex?y)的映射![equation](http://latex.codecogs.com/gif.latex?\chi)。对二分任务,通常令![equation](http://latex.codecogs.com/gif.latex?y=\lbrace-1,1\rbrace)或![equation](http://latex.codecogs.com/gif.latex?y=\lbrace0,1\rbrace);对多分类任务,![equation](http://latex.codecogs.com/gif.latex?|y|>2);对回归任务,![equation](http://latex.codecogs.com/gif.latex?y=R),R为实数集 根据训练数据是否拥有标记信息,学习任务可大致划分为两大类:监督学习和无监督学习,分类和回归是前者的代表,而聚类则是后者的代表 通常假设样本空间中全体样本服从一个未知的`分布`![equation](http://latex.codecogs.com/gif.latex?D),我们获得的每个样本都是独立地从这个分布上采样获得的,即`独立同分布`。一般而言,训练样本越多,得到的关于![equation](http://latex.codecogs.com/gif.latex?D)的信息越多,这样就越有可能通过学习获得具有强 ## 第二章 模型评估与选择 通常把分类错误的样本数占样本总数的比例称为`错误率(error rate)`,即如果在m个样本中有a个样本分类错误,则错误率![equation](http://latex.codecogs.com/gif.latex?E=a/m) ![equation](http://latex.codecogs.com/gif.latex?1-a/m)称为精度(accuracy) 交叉验证法(cross validation) 调参(parameter tuning) 回归任务最常用的性能度量是`均方误差`(mean squared error) ![equation](http://latex.codecogs.com/gif.latex?E(f;D)=\frac{1}{m}\sum_{i=1}^{m}(f(x_i)-y_i)^2) 查准率(precision)、查全率(recall)与F1 挑出的西瓜中有多少比例是好瓜、所有好瓜中有多少比例被挑了出来 ## 第三章 线性模型 给定由d个属性描述的示例![equation](http://latex.codecogs.com/gif.latex?x=(x_1,x_2,...,x_d)),![equation](http://latex.codecogs.com/gif.latex?x_i)![equation](http://latex.codecogs.com/gif.latex?x)在![equation](http://latex.codecogs.com/gif.latex?i)个属性上的取值,线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即 ![equation](http://latex.codecogs.com/gif.latex?f(x)=w_1x_1+w_2x_2+...+w_dx_d+b) ![equation](http://latex.codecogs.com/gif.latex?f(x)=w^Tx+b)...

## pbdq blog [https://pbdq.github.io](https://pbdq.github.io) Data From:[https://github.com/v4if/blog/issues](https://github.com/v4if/blog/issues) ## 思路 使用issue写文章,将图片等资源放在`{repo}/assets`下做存储,利用Github API获取issue内容,Github Pages构造单页面应用 静态博客,无后台搭建,自动拉取issues内容渲染 ## Hack ``` // api https://api.github.com/repos/v4if/blog/issues ``` 默认会返回30条issue,为了拉取全部的issue,采用了一种相对hack的方法 ``` page: [int], // 当前页 per_page: [int] // 获取的条数 ```...

## 阻塞 阻塞会block住当前进程,非阻塞通常采用轮询的手段,本质上都是同步的; 只有使用了特殊的 API 才是异步 IO,如Linux的AIO和Windows的IOCP ## Docker [Docker 版本号说明](https://www.jianshu.com/p/348dca0e314c) Docker version 1.2.0 (2014-08-20) ![docker](https://user-images.githubusercontent.com/16042235/44319161-ac5d0280-a46c-11e8-8b3f-a0d8cd92082d.PNG) ![container_unixsocket](https://user-images.githubusercontent.com/16042235/44562117-a9bf1d80-a78a-11e8-9edc-ee45a6ee2f2c.png) Docker version 1.11.0 (2016-04-13) With Docker 1.11, a Linux docker installation is now...

## 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded ``` ➜ ~ find /usr/ -name libproxychains.so.3 -print /usr/lib/x86_64-linux-gnu/libproxychains.so.3 ➜ ~ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libproxychains.so.3 ``` ## cygwin apt-cyg You can do this using Cygwin’s...

## Buffers 数据传输效率不对称,或提前不知道接收数据的大小都需要进行缓冲区的设计,而对于TCP本身就是一个流协议,一次发送可能多次接收,一次接收也可能是多次堆积的数据,因此对于消息接收解析缓冲区的设计必不可少,用streambuf从async_read_some读取数据,然后再对streambuf里面的数据进行消费,通过split_and_process_message将streambuf里面完整的消息体取出 buffers又可以简单的表示成一个包含pointer和size的tuple,比如boost里面 ```c++ typedef std::pair mutable_buffer; typedef std::pair const_buffer; ``` 底部存储容器可以使用array、vector、string等 buffers的设计离不开内存的管理,一种方案是固定内存块大小,配合内存池,当缓冲块底层存储容量被消耗完了之后,将缓冲块释放到内存池,然后重新分配一个缓冲块;还有一种方案是对当前缓冲块进行重用,但是需要对没有consume的数据进行整理,调整到缓冲块的头部,asio::streambuf就是采取的这种方式 ## asio::streambuf asio::streambuf则是提供了一个流类型的buffer,它自身是能申请内存的,包含数据内容,而且内存可以自动增长。它的好处是可以通过stl的stream相关函数实现缓冲区操作,处理起来更加方便 而asio::buffer只是一个适配器,使用时需要注意原始数据源 ![streambuf](https://user-images.githubusercontent.com/16042235/40772967-0d0ec1bc-64f4-11e8-8085-0117b6767ea4.png) put get 对asio::streambuf的简单测试 ```c++ size_t fake_read(boost::asio::streambuf::mutable_buffers_type buff) { size_t size_ =...

先抛出一个思考的问题,对象构造的时候什么时候选择栈上对象,什么时候选择需要去new一个对象,对象在作为参数传递的时候,谁来保证对象的有效性,所有权如何传递? 对象的构造分为栈上对象和堆上对象。 ## 栈对象 在对栈上的对象也即局部变量对象进行函数参数传递的时候,无非两种选择:值传递或者引用传递。值传递的情况比较简单,会增加数据拷贝的开销,对象越大,付出的代价就会越大,但是不会涉及所有权的问题,在调用者和被调用函数内部对象永远都是有效的,相当于建立了一个对象的副本,同样也不会对原有对象进行更改。因此值传递会带来两个问题:拷贝带来的性能代价和对形参的操作并不会对实参有所改变。 引用传递不会拷贝对象,好像可以避免值传递所带来的问题,但是在某些情况下却会有对象有效性的问题,比如`异步回调中局部变量对象的引用` ```c++ void timer_async_wait(boost::asio::io_service& ios) { int a = 1; boost::asio::steady_timer timer(ios); timer.expires_from_now(std::chrono::seconds(2)); timer.async_wait([&a](const boost::system::error_code& error){ std::cout

>Assuming you want your client to work with other servers, and server to work with other clients, your server can't expect to be treated nicely. There are two ways to...

``` sudo vi /etc/apt/apt.conf #vi 下面非插入模式x删除字符 ``` ``` Acquire::http::proxy "http://:/"; Acquire::ftp::proxy "ftp://:/"; Acquire::https::proxy "https://:/"; ``` 之后可以安装proxychains对命令进行代理 ``` sudo vi /etc/proxychains.conf ``` ``` #dpkg -l 可以查询可用包 dpkg -l python* ```

```bash Use this solution with GNU sed: sed ':a;N;$!ba;s/\n/ /g' file This will read the whole file in a loop, then replaces the newline(s) with a space. Explanation: Create a...

最近了解内存管理,也看了不少关于内存管理的机制和每家对于内存管理这个`老大难`问题的一些做法,比如Linux利用buddy伙伴算法管理物理页,内核直接映射的896M空间采用slab机制,主要总结一下关于自己看到的一些东西和看法。 ## 为什么需要内存管理 这也是我看内存管理的时候一直存在的一个问题,现在慢慢的有了一点理解。 ![memory](https://user-images.githubusercontent.com/16042235/36946576-cb5ef578-1ff9-11e8-9177-1564e1d252ee.png) 开始脑补假如没有内存管理,给定一段内存区域,然后用指针直接进行访存,假设完全一点,没有虚拟内存那一套,先考虑单进程A,假设通过ptr_1,ptr_2,ptr_3对内存进行访存,首先会出现的问题可能就是边界不明,ptr_1可能越界访问ptr_2的内容,然后就是使用的时候不知道哪段内存区域可以使用,哪一段内存区域上有其他数据不能使用。在多进程下,多个进程之间没有隔离。 先讨论第二个问题,现在都知道是通过虚拟映射,中间加一层的方法解决的,每个进程看到的地址空间都是0-4G,互相隔离。 对于第一个问题,自然就想到了将内存分块进行管理,比较简单的思路是将内存分成固定大小的块,然后用一段空间来存储内存使用情况的bitmap,该块被使用标记为1。块的大小取经验值:4K,然后分配的时候只能分配标记为0的内存块,即空闲内存块,好像是解决了第一个问题。 但是又会带来新的问题:外内存碎片。多次对内存进行分配和回收之后,内存中会出现很多空洞,将空闲内存隔成一个个小的内存区间,因此在分配大内存的时候会由于内存块大小太小而无法分配足够的空闲块,所以引入了buddy伙伴算法,按照2的幂次方进行管理。 假设块的大小取4K,在分配一些小内存的时候又会出现内碎片,即已被分配出去但是用不到的内存空间,所以引入了slab机制和STL的二级分配器,其实Linux的虚拟内存管理也会对内碎片起到一定的缓冲作用。 内碎片是已被分配出去但是用不到的内存空间,外碎片是由于大小太小而无法分配出去的空闲块。 因此为了解决这两个头疼的问题,出现了一系列的内存管理机制。 ## Linux内存管理 ![linux_mm_arch](https://user-images.githubusercontent.com/16042235/36945581-a66d0aa6-1feb-11e8-836a-fbb7ebb829af.png) 从下往上看,首先是buddy伙伴算法的物理页内存管理,MAX_ORDER通常为11,2^10 1024个页面 ![buddy](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=c90b238b263fb80e18dc698557b8444b/0eb30f2442a7d9330077cbc9aa4bd11372f001a8.jpg) 虚拟内存与真实物理内存整体映射关系 ![map_entry](https://user-images.githubusercontent.com/16042235/36945687-bfda70ae-1fec-11e8-89d1-ecdeab8ecd50.png) 先看用户空间,虚拟内存的申请有两种方式brk和mmap brk通过_edata指针从堆区开始往上推内存,分配的虚拟内存会有一段区域存储header信息,malloc函数分配内存,如果请求内存大于128K,那就不是去推_edata指针了,而是利用mmap系统调用,从堆和栈的中间分配一块虚拟内存。brk分配的内存需要等到高地址内存释放以后才能释放,而mmap分配的内存可以单独释放。 ![brk_mmap_1](http://img.blog.csdn.net/20150114145619968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2ZnZHNn/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![brk_mmap_2](http://img.blog.csdn.net/20150114145652375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2ZnZHNn/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) ![brk_mmap_3](http://img.blog.csdn.net/20150114145745283?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2ZnZHNn/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 再看内核空间,高端内存映射和直接映射。高端内存映射通过vm_struct管理,因此走内核页表,MMU那一套得到物理地址,因此对内碎片的问题有所缓解;物理内存映射区采取直接映射的做法,即虚拟地址经过一定的线性偏移即可得到物理地址,那么这部分的内碎片问题怎么办,加一个中间层slab机制,基于缓冲和池子的思想对上层提供一个分配小内存块chunk和object对象的机制。L1_CACHE_BYTES值为32,KMALLOC_MAX_SIZE值为4194304,内核slab分配器能够默认的提供32-4194304共20种内存长度分档 kmem_cache是一个cache_chain的链表,描述了一个高速缓存,每个高速缓存包含了一个slabs的列表,这通常是一段连续的内存块。存在3种slab:slabs_full(完全分配的slab),slabs_partial(部分分配的slab),slabs_empty(空slab,或者没有对象被分配)。slab是slab分配器的最小单位,在实现上一个slab有一个或多个连续的物理页组成(通常只有一页)。单个slab可以在slab链表之间移动,例如如果一个半满slab被分配了对象后变满了,就要从slabs_partial中被删除,同时插入到slabs_full中去。 ![slab](https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/figure1.gif) ## Linux地址转换...