Tech
- Tech
- Categories
-
Nov 11, 2024
墨卡托投影法
在日常使用百度和谷歌地图的时候,你有没有想过缩小后的整个世界的地图是什么样子的?不过目前这两个地图的缩小比例都存在上限,无法在一个屏幕中全部展示。但你会发现东西向的地图是循环的,南北南的地图却是有限的,甚至看不到北极或者南极点。
Read More -
Jul 19, 2024
相对论备忘录
我们都看过很多的相对论的科普视频,大概了解狭义相对论的结论。但是如果想让我定量地分析这些结论的推导过程,或者从一个实际例子出发求解其中的具体值,我并不能很好地解决。甚至我都有可能直觉性地给出相反的结论。这篇文章梳理了狭义相对论中的几个基本概念和推导过程,基本上涵盖了狭义相对论的所有场景,以及补充了一部分广义相对论的结论,做为备忘录。
Read More -
Aug 9, 2023
在线手写识别--ML之Hello World
先从简单的手写数字识别入手,入门机器学习的模型常识、模型训练、工程构建、图像处理等基本技能,通过在线手写识别验证学习成果
Read More -
Apr 21, 2023
发散地读一篇技术Blog
读到一篇文章,核心的思路和结论并不难,但从文章引出了繁多的概念和知识点,所以发散地阅读此blog,并以此记录。
Read More -
Jul 5, 2020
TLS协议深入
随着HTTPS的普及以及诸如Google、苹果这样的大公司对HTTPS的强制使用,现在再来了解HTTPS显得略晚了些。好在一切都还来得及,本文一步步由浅入深不断提出问题、寻找答案,慢慢解开TLS的冰山一角:)
Read More -
Nov 14, 2019
对Java泛型的理解
Java自JDK 5引入泛型以来,泛型已经体现在我们代码的各个角落。借助看《Java编程思想》的机会,来全方面理清一下对泛型的理解。
Read More -
Nov 4, 2019
Java、MySQL、utf8mb4的困惑
众所周知,要在MySQL中支持Emoji等Unicode字符,需要将MySQL的字符集设置成utf8mb4。为了能让客户端也能正常更新写入这些字符,不仅是表字段的字符集,连接的字符集也要设置对才行。
Read More -
Apr 13, 2019
由etcd自动压缩引发的诡异问题
etcd作为优秀的分布式key-value存储系统,被广泛应用于服务发现、配置管理等需要提供稳定可靠的分布式服务的场景中。 但在面对频繁更新操作的场景时,比如对于任务调度系统,每一个任务的分配、完成都会写入一次etcd,这导致了etcd的版本号迅速增加。 由于默认情况下,etcd会保存所有版本的副本,所以随着时间的增加,etcd的内存就会不断地上涨,直到超过2G(默认最大内存是2G)后无法写入。 对我们的使用场景来说,历史版本并不是十分重要,所以为了解决这个问题,我们添加了自动压缩的机制,在启动时添加--auto-compaction-retention=24参数,即可每天压缩前一天之前的所有版本号了,这样对应的内存也会释放不少。 看似完美解决了内存的问题,但引发了另外一个问题,发现在开启压缩之后,对应的服务时不时地就会报错,并且panic掉 报错内容如下: panic: Campaign failed: etcdserver: mvcc: required revision has been compacted 示例代码如下: package main import ( "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/clientv3/concurrency" "github.com/prometheus/common/log" "golang.org/x/net/context" ) func main(){ cli, err...
Read More -
Mar 16, 2019
那些与TIME_WAIT有关的参数
在机器上执行以下任意命令,就可以看到这个此机器上的TIME_WAIT的数量: $ netstat -apn | grep TIME_WAIT | wc -l 39871 $ ss -ant | grep TIME-WAIT | wc -l 32892 $ cat /proc/net/sockstat sockets: used 1730 TCP: inuse 576...
Read More -
Sep 26, 2018
Raft论文翻译
Raft是用来管理日志复制的一种一致性算法。他和(multi-)Paxos算法在结果和效率上一致,但整体结构不同,这使得Raft更容易理解,也更容易构建实际的系统。为了增强理解性,Raft将一致性算法分成了几个关键的部分,例如领导者选举,日志复制,安全性,并且他强制实行了一些更严格的一致性策略来减少需要考虑的状态。从学生学习调研的结果上显示Raft比Paxos更容易学习。Raft同时还提供了修改集群成员配置的机制,他使用了一种重叠多数成员的算法来保证安全性。
Read More -
Sep 11, 2018
libcurl对域名含有多个ip时的超时重试策略
缘起 一夜报警。 某一个服务的组件panic了,赶紧起来重启了对应的组件,并让负责这个组件的同事统计一下业务上调用这个服务失败的统计,看看是否需要补数据。 同事给的反馈是没有发现有请求异常,业务这边不受影响! 这一点都不科学,我翻看了业务上的代码,并没有重试的逻辑,对应的DNS也没有做过调整。 难道DNS自动调整了?难道PHP自动进行了重试吗? 我用脚趾头想了一下,DNS不可能会自动调整,他连我开的端口都无法感知,怎么能够自动调整呢? 所以那就是PHP的curl库有重连的逻辑,或者是libcurl有重连的逻辑了! 为了验证这点,我搞了个域名重现对应的场景。 再现现场 找了个域名 example.huajiao.com,解析到的10.143.153.63,10.139.230.68这两个ip上,dig结果如下: ➜ ~ dig example.huajiao.com ; <<>> DiG 9.10.6 <<>> example.huajiao.com ;; global options: +cmd ;; Got answer: ;;...
Read More -
May 23, 2018
Docker的实际使用
原理 docker使用Union FS作为分层镜像技术的基础。具体的, 在ubuntu上使用aufs,在centos下使用的是devicemapper。而已经打入Linux内核的Overlay FS也已经得到docker支持。 Linux Namesapce为容器间提供了环境隔离,而Linux CGroups为容器间的CPU、内存等资源使用进行隔离和分配。 docker镜像 Docker Registry 注意Docker Registry与Repository的区别,Repository是具体的镜像,称之为仓库名。具体的版本号称之为标签(tag),格式为Respository:Tag,标识一个镜像。 如ubuntu:16.04,仓库名为ubuntu,标签为16.04。如果没有标签,则默认为latest标签。 Docker常用的Registry为docker hub,也可以自己使用Docker Registry搭建私有的仓库。 Docker Registry只提供了api实现,可以使用第三方的VMWare Harbor或者Sonatype Nexus来搭建图形界面。 获取镜像 加速镜像 官方中国、 Dao加速器 从docker hub上获取镜像 docker pull ubuntu...
Read More -
Apr 29, 2018
使用gRPC创建简单聊天程序
作为一篇gRPC调研的总结,本篇主要介绍了gRPC在go语言上的使用方式,并着重记录了如何使用gRPC创建一个简单的聊天程序。 gRPC介绍 gRPC是Google开源的一款远程进程调用(RPC)框架。它使用http/2传输协议,使用Protocol Buffer作为编码协议。 这使得框架本身就带有全双工,消息压缩,节省带宽,跨语言等特性。 环境准备 在安装好go语言环境的情况下,还要额外安装以下工具和库。 获取gRPC库 go get -u google.golang.org/grpc 安装Protocol Buffer v3相关工具 下载protoc编译工具 可以在github上下载现成的二进制包。 解压,并将protoc命令工具移入PATH环境变量中。 下载go语言的protoc插件 protoc需要对应语言的插件才能把pb文件转换成对应的语言,所以下载完protoc之后,需要下载pb的go语言插件: go get -u github.com/golang/protobuf/protoc-gen-go 同样,将protoc-gen-go加入到PATH环境变量。 pb文件定义 简单例子 pb中可以使用service关键字定义对应的RPC服务集合,并使用rpc关键字定义对应的方法名、接收参数和返回参数; 例如,我们要定义聊天服务,并定义一个交换姓名的RPC接口,可以定义如下pb文件: service...
Read More -
Mar 12, 2018
加权随机抽样
原论文《Weighted Random Sampling》来自Efraimidis、Spiraki, 发表于2005年,以下为部分翻译 问题定义 不放回随机抽样(random sampling without replacement(RS))问题要求从大小为\(n\)的集合中,随机抽取\(m\)个不同元素。如果所有的元素被抽取出来的概率一致,则称之为均匀随机抽样(uniform RS)。一次遍历解决均匀随机抽样问题在推荐阅读的[1,5,10]中有讨论。在数据流上使用蓄水池类型(Reservoir-type)均匀随机抽样算法在推荐阅读[11]给出。推荐阅读[9]给出了一种可并行计算的均匀随机抽样算法。对于加权随机抽样(weighted random smapling(WSR)),它指的是所有元素都含有权重,每一个元素被取出的概率是由元素本身的权重决定的。WSR问题可以使用以下算法D来定义: 算法D,WRS定义 输入:含有\(n\)个带权重元素的集合\(V\) 输出:含有\(m\)个元素的加权随机抽样结果集\(S\) 1: for \(k = 1\) to \(m\) do 2: 元素\(v_i\)在第\(k\)回合被选出来的概率为\(p_i(k)=\frac{w_i}{\sum_{s_j\in V-S} w_j}\) 3: 从\(V-S\)中选出\(v_i\),然后插入到S中 4:...
Read More -
Mar 4, 2018
蓄水水池抽样---从未知长度的序列中随机抽取m个元素
在遇到问题时,突然发现了一种精妙的算法,那可真谓是美丽的邂逅。 场景描述 在一个链表(l)里,随机获取m个元素,这m个元素满足给定的条件,并且保证所有满足条件的元素被取出来的概率相等。假设满足条件的元素个数为n,则每一个元素被取出的概率为\(\frac{m}{n}\) 解法 package main import ( "container/list" "math/rand" ) // 假定目标的数据结构 type Data struct { Condition int Value int } func ReservoirSample(l *list.List, m int, cond int) []*Data...
Read More -
Feb 11, 2018
苹果电脑上的软件使用技巧
macOS版本:10.13.3 High Sierra VirtualBox的文件夹共享 下载安装完VirtualBox(版本号5.2.6 r120293) 使用另外下载好的ubuntu-17.10.1-server-amd64.iso安装Ubuntu17.10 (Guest OS) 从Settings=>Shared Folders=>点击添加按钮=> 选择宿主机文件夹(如/Users/liqingshou/Work)=> 文件夹名称(随意,如Work)=> 勾起Auto-mount(自动挂载)和Make Permanent(永久创建) 遇到问题 设置完之后,无法在系统里找到对应的挂载文件 发现/mnt或者/media目录都是空的,/dev也找不到,查了才知道需要安装GuestAdditions 下载Extendsion Pack: Oracle_VM_VirtualBox_Extension_Pack-5.2.6-120293.vbox-extpack,并双击安装 启动Ubuntu 在VirtualBox的菜单上找到Device=>Insert Guest Additions CD Image 如果出现 Unable to...
Read More -
Nov 14, 2017
浅析TCP协议
谈到TCP连接,三次握手这个名词都会在大多数人的脑海里浮现。 那么三次握手的过程是什么样的?每个阶段的包都有什么样特征? 最近把《计算机网络》这本教材的”运输层”这一章重新复习一遍,整理成本文。 TCP连接的特点 面向连接 在使用TCP传输数据之前,必须先建立TCP连接,每一条连接只能连接两个端点,一般我们使用以下四元组来标识一条连接 {(端点1IP, 端点1Port), (端点2IP, 端点2Port)} TCP连接只是一条虚拟的连接,他并不是固定的一条物理链路 可靠交付 TCP提供可靠的交付服务,数据无差错,不丢失,不重复,并且按序到达(对于应用层来说) 与之相对,UDP提供尽最大努力交付 全双工通信 所谓全双工,是指在同一时间,两个端点皆可发送数据和接收数据。 TCP在两端都设置有接收和发送缓冲区: 对于接收缓冲区,它是用来缓存接收到的数据,应用层可以在合适的时候读取缓冲区的内容; 对于发送缓冲区,应用层在发送数据时,只是将数据先放入到发送缓冲区,TCP会在合适的时间将这些数据发送出去。 面向字节流 TCP将应用层交下来的数据看成一连串无结构的字节流,应用层不必关心这些字节流被拆成多少个包来发送,接收方在应用层看到的是和发送端一样大小,一样顺序的字节流 TCP报文段的格式 虽然TCP是面向字节流的,但传输单元实际上是报文段,报文段可分为首部和数据两部分 以下是TCP报文段首部格式 TCP首部的前20个字节是固定的,后续可以跟4N个可选的选项数据 源端口和目的端口: 各占用2字节,所以端口号的范围是0~65535 序号:占用4字节;TCP传输的数据每一个字节都是编号的,此序号表示本次发送的第一个字节编号;当序号增加到2的32次方减1(4G数据)后,又会从0开始 确认号:占用4个字节,表示期望收到的下一个数据的编号,例如B正确收到了A发送过来的一个报文段,编号为501,数据长度为200,则B收到A的最后一个字节编码是700,期望收到的下一个数序序号为701,所以确认号为701 数据偏移:占用4位,表示TCP数据部分距离起整个报文起始位置的偏移,此值的单位为4字节,所以选项的最大长度为...
Read More -
Sep 20, 2017
PHPUnit
单元测试在日常的编程中占有十分重要的地位,但大部分公司为了敏捷开发的效率要求,往往都忽略了测试用例的编写,而把这部分工作丢到了QA的身上。 但做为一个开发者,测试代码先行会带来可观的收益,不仅提高了代码的质量,而且还提供了外部使用者如何使用对应接口的例子乃至文档。 而且在需要重构一个项目或者修改添加新功能时,有单元测试的项目会更加地得心应手。 作为php测试的重要组件,以下介绍PHPUnit的基本用法。 下载安装 PHPUnit的可执行文件为phar,直接下载并移动到PATH目录即可: cd ~/bin wget https://phar.phpunit.de/phpunit.phar chmod +x phpunit.phar phpuni.phar --version 使用phpunit.phar --version测试是否已经成功安装(以6.4.4版本做为测试)。 对于使用composer管理项目依赖时,使用 composer.phar require --dev phpunit/phpunit 来声明对PHPUnit的依赖关系,执行composer.phar install 之后即可在vendor/bin目录下找到可执行的phpunit。 另外的一些可选组件: composer.phar require --dev phpunit/php-invoker:...
Read More -
Aug 17, 2017
PHP Composer的基本使用
为了更加系统地了解Composer,完整地阅读了官方文档,并记录在此,供后续参考。 Composer是一个php的包依赖管理工具,类似于nodejs的npm和ruby的bundler。 Composer安装 参考此链接 cd ~/bin php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo...
Read More -
Jul 14, 2017
机器学习(Week11)-应用: 图片OCR(Photo OCR)
Lecture1: Applica’on example: Photo OCR 问题描述 图片OCR(Optical Character Recognition,光学字符识别),让计算机读取图片中的字符信息 Photo OCR Pineline 文字检测,找出有文字的区域 字符切分,将之前找到的矩形文字区域,切分成单个字符 字符识别,识别之前划分的单个字符 后续可能还会附加的其它处理,比如拼写校正等 滑动窗口 行人检测例子 首先选定输入特征为82x36的灰度图片,找到两组数据样本,一组有行人(y=1),一组没有行人(y=0),使用神经网络或者其它的学习算法训练出模型 对需要检测行人的原始照片,从左上角起,依次使用82x36的矩形裁剪,将得到的区域输入之前训练好的模型,判断此区域是否有行人 将矩形框往右滑动一点,取出另外一个矩形,执行行人判断 滑动的大小参数叫做步长(step size),有时也称之为步幅参数(stride parameter)。 步长越小,表现越好,但计算量会比较大;一般使用步长为4或者8像素 如此重复执行,直到滑动完整张照片 等比例放大矩形框,再执行相同的动作 注意,此时得到的矩形,需要缩放到82x36大小后输入模型 文字检测 与之前的行人检测类似,使用一堆有文字和没有文字的小矩形图片样本训练出模型...
Read More -
Jul 11, 2017
机器学习(Week10)-大规模机器学习(Large Scale Machine Learning)
Lecture1: Large scale machine learning 从大量的数据中学习 It’s not who has the best algorithm that wins. It’s who has the most data. 当算法处理过拟合状态,或者高方差时,更多的数据会有更好的学习效果。如果算法本身就处理高偏差的状态,那么大量的数据也不会有改善。 先选取较小的样本集合,画出学习曲线确认算法是处于哪种状态。 当数据量很大时,比如100000000时,根据\(\theta_j = \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j\),每进行一步批量梯度下降,就要遍历所有的样本,显然计算量会特别大。...
Read More -
Jul 9, 2017
机器学习(Week9)-误差检测与推荐系统(Anomaly Detection & Recommender Systems)
Lecture1: Anomaly Detection 问题描述 已经有一组样本数据\({x^{(1)}, x^{(2)},\dots,x^{(m)}}\) 给出一个新的样本数据\(x_{test}\),判断这个样本数据是否为异常数据(abnormal/anomalous) 模型 定义一个模型\(p(x)\)表示这个样本为正常样本的概率,定义一个阈值\(\epsilon\),做为正常样本和异常样本的分界线,即如果\(p(x) \lt \epsilon\),则样本\(x\)为异常样本 例子 诈骗检测: \(x^{(i)}\)表示用户i的行为采样数据 从已有数据中学习出模型\(p(x)\) 从中找出\(p(x) \lt \epsilon\)的用户即为可疑用户 如果我们找出太多的异常用户,那么我们要适当减少\(\epsilon\)的值 高斯分布(Gaussian Distribution) 高斯分布为一个钟型的曲线,表示为\(\mathcal{N}(\mu,\sigma^2)\) 对于一个变量\(x \in \mathbb{R}\),如果它的概率分布服务从高斯分布,则表示为 \[\class{myMJSmall}{x \sim \mathcal{N}(\mu, \sigma^2)}\] 其中\(\mu\)为均值,也是高斯曲线的中点,\(\sigma^2\)为方差,\(\sigma\)为标准差,体现为高斯曲线的胖廋程度...
Read More -
Jun 15, 2017
机器学习(Week8)-无监督学习(Unsupervised Learning)
Lecture1: Clustering 无监督学习:介绍 无监督学习的样本区别于有监督学习的是每一个样本没有标签。 如有监督学习的样本表示为\(\{(x^{(1)}, y^{(1)}),(x^{(2)},y^{(2)}),(x^{(3)},y^{(3)}),\cdots,(x^{(m)},y^{(m)})\}\) 则无监督学习的样本表示为\(\{x^{(1)}, x^{(2)},x^{(3)},\cdots,x^{(m)}\}\) 应用 市场划分(Market segmentation) 社交网络划分(Social network analysis) 组织计算机集群(Organizing computer clusters) 天文数据分析(Astronomical data analysis) K-均值算法(K-Means Algorithm) 基本步骤 随机选取两个点(分为两类),这两个点称之为聚类中心(cluster centroids) 聚类分配:将样本数据根据距离聚类中心的远近分成两类 移动聚类中心:根据聚类分配划分的两个集合,算出各自的均值,将聚类中心移至该点 重复聚类分配和移动聚类中心两个步骤,直到聚类中心不再变化 变量符号定义 \(K\):分类的数量...
Read More -
Jun 11, 2017
机器学习(Week7)-支持向量机/SVM(Support Vector Machines)
Lecture1: Support Vector Machines 优化目标(Optimization Objective) 逻辑回归 \[\class{myMJSmall}{ h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}} }\] 如果\(y = 1\),则\(h_\theta(x) \approx 1\), \(\theta^Tx \gg 0\) 如果\(y = 0\),则\(h_\theta(x) \approx 0\), \(\theta^Tx \ll 0\) 对于单个样本的代价函数 \[\class{myMJSmall}{...
Read More -
Jun 4, 2017
机器学习(Week6)-偏差与方差(Bias vs. Variance)
Lecture1: Bias vs. Variance 下一步需要做什么 假设使用线性回归来预测房价,当训练好的预测函数无法应用于新房子的房价预测(预测值与实际偏差很大)时,我们应该如何改进? 获取更多的样本数据 减少特征项,保留更重要的特征项 添加特征项 加入多项式(\(x_1^2,x_2^2,x_1x_2\)等等) 增大\(\lambda\)值 减小\(\lambda\)值 但如何选择以上这些方法呢? 机器学习诊断: 诊断程序会评价学习算法是否有效,并给你下一步应该如何改进提供指引; 虽然实现会花点时间,但对提高算法很有帮助 评估假设函数 实际工作中由于太多特征无法画出曲线,所以需要有一种方法识别过拟合(high variance) 将样本数据分成两组: 一组训练集(70%); 一组是测试集(30%),表示为\((x_{test}^{(i)}, y_{test}^{(i)})\) 使用训练集学习得到参数\(\theta\)和预测函数 线性回归时,使用测试集计算代价函数:\(J_{test}(\theta) = \frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)}) - y_{test}^{(i)})^2\) 分类回归问题时,使用测试集计算代价函数:\(J_{test}(\theta)...
Read More -
May 29, 2017
机器学习(Week5)-反向传播(BP)
Lecture1: Backpropagation 神经网络的代价函数 \[\class{myMJSmall}{ J(\Theta) = -\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^K \left[ y_k^{(i)}log((h_\Theta(x^{(i)}))_k) + (1-y_k^{(i)})log(1- (h_\Theta(x^{(i)}))_k) \right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\Theta_{j,i}^{(l)})^2 }\] \(L\): 表示神经网络的层数 \(s_l\): 表示第\(l\)层的激活单元数量(不算上偏置单元bias unit) \(K\): 表示输出层单元数量(分类数量);\(s_L=K\) \(h\Theta(x) \in \mathbb{R}^{K}, (h\Theta(x))_j\)表示第\(j\)个输出 \(y \in \mathbb{R}^{K}\),例如有4种分类,那么如果\(y\)属于第1个分类,则记做...
Read More -
May 24, 2017
机器学习(Week4)-神经网络
Lecture1: Neural Networks 为什么我们需要神经网络 当特征特别多(计算机视觉问题)时,如果计算多次多项式,得出来的最终特征会特别多,多到计算机无法处理。 产生的原因 Algorithms that try to mimic the brain. Was very widely used in 80s and early 90s; popularity diminished in late 90s Recent resurgence: State-of-the-art...
Read More -
May 22, 2017
机器学习(Week3)-逻辑回归
Lecture1: Classification and Representation 分类问题(Classification) 二元分类问题(Binary Classification) \[\class{myMJSmall}{y \in \{0,1\}}\] \(y\)只有两个值(即分成两类) 标记为0的分类:也叫负类(Negative Class),例如0代表良性肿瘤 标记为1的分类:也叫正类(Positive Class),例如1代表恶性肿瘤 预测函数/逻辑回归(Logistic Regression) \[\class{myMJSmall}{h_\theta(x) = g(\theta^Tx) \\ g(z) = \frac{1}{1+e^{-z}} \\ 即 h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}}\] \(0...
Read More -
May 20, 2017
机器学习(Week2)-多变量线性回归
Lecture1: Multivariate Linear Regression 多变量线性回归(Multivariate Linear Regression) 符号 \(n\):特征数量 \(x^{(i)}\):第i个样本的所有特征 \(x^{(i)}_j\):第i个样本的第j个特征。特别的\(x^{(i)}_0 = 1\) 预测函数(Hypothesis) \[\class{myMJSmall}{h_\theta(x)=\theta_0x_0+\theta_1x_1+ \cdots + \theta_nx_n}\\ \theta^Tx\] 其中\(x_0 = 0\) 代价函数(Cost Function/Squared Error Function/Mean Squared Error) \[\class{myMJSmall}{J(\theta)=J(\theta_0,\theta_1,\ldots,\theta_n)=\frac 1{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2}\]...
Read More -
May 12, 2017
机器学习(Week1)-单变量线性回归
Lecture1: Introduce 机器学习定义 Arthur Samuel(1959), informal definition: The field of study that gives computers the ability to learn without being explicitly programmed. Tom Mitchell(1998), modern definition: A computer program is...
Read More -
May 6, 2017
使用canvas画出你的函数
有图有真相。 看到一个函数,不管你是想知道他的趋势如何,或者有人说他有一个漂亮的函数图像,我们都要画出这个函数的图来确认。 比如有人跟你说 f(x) = sin(4*x) 是一个玫瑰方程式,在看到图像之前绝对会一脸蒙逼。所以如果能有一个显示出函数图像的工具,会提升你的浪漫值和幸福感。 网页是一个快速开发的好东西,而canvas正好能实现这个需求。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~幸福的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ canvas 基础 创建一个canvas 首先,创建一个空的canvas,宽高为800x400 <html> <head> <meta charset="utf-8"> <title>画出你的函数</title> </head> <body> <canvas id="myCanvas" width="800px" height="400px" style="border:1px solid lightgrey;"> 你的浏览器不支持canvas </canvas> </body> </html>...
Read More -
May 2, 2017
ubuntu环境搭建
每一次重装ubuntu都要从头开始装一些软件配置vim环境。为了方便『下一次』,这次就把这些操作都记录下来(包括必要的软件安装和vim、bash的配置) 安装必要的软件 # 命令行工具类 sudo apt-get install git expect subversion exuberant-ctags php7.0 libssl-dev libreadline-dev zlib1g-dev build-essential nodejs ansible sshpass nginx mysql vim ruby ruby-dev # 浏览器、输入法等gui工具 sudo apt-get install chromium-browser...
Read More