for循环中的++i和i++有什么区别

i++和++i是C系语言的经典课题, 我们知道i++和++i的表面区别为++i的返回值为i+1,而i++则为i,而它们的底层实现分别为: ++i实现: int operator ++ () { return i+1; } i++实现: int operator ++ (int flag) { int j = i; i += 1; return »

月杪 月杪 on Code

我眼中程序员简历

为开源项目贡献过代码 +10 接触过3种以上编程语言 +10 有业余编程项目 +10 有持续维护的开源项目 +10 简历为PDF格式或独立HTML页面 +5 有独立域名的技术博客 +5 有自己的Github地址 +5 同时接触过编译语言和脚本语言 +5 只接触过一种编程语言 -5 屡次强调自己的Master/Doctor学历 -5 简历格式为docx -5 简历中提到熟悉Microsoft Office -5 Github中全是Markdown项目 »

月杪 月杪 on Other

利用Github的Webhook功能进行持续集成

Webhook,也就是人们常说的钩子,是一个很有用的工具.你可以通过定制Webhook来监测你在Github.com上的各种事件,最常见的莫过于push事件.如果你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个POST请求到你配置好的地址. 这样你就可以通过这种方式去自动完成一些重复性工作.比如:你可以用Webhook来自动触发一些持续集成(CI)工具的运作. Github开发者平台的文档中对Webhook的所能做的事是这样描述的: You’re only limited by your imagination. Github Webhook和以前写过的通过travis自动将Jekyll持续部署到服务器上相比: 不需要暴露(经过travis加密的)服务器私钥 不需要通过travis的虚拟机中转(那玩意儿的带宽实在是....) 当然和travis相比也有缺点: 需要有一台属于自己的外网服务器 自己的Webhook响应服务. 开始 要利用webhook进行持续集成工作至少需要以下几个条件: 可以外网访问的服务器 接收并响应GitHub Webhook的服务 GitHub Webhook的配置 服务器 还有什么好说的... 如何选购VPS »

如何选购VPS

什么是VPS VPS全称Virtual Private Server(虚拟专用服务器).其实就是物理机上开出的虚拟机. 很多IDC服务商都喜欢给自己的VPS起一个听起来一脸懵逼的名字比如阿里云的ECS,比如腾讯云的CVM等等. 直接说主机或者直接说实例感觉在他们的企业文化里很难接受似的,一定要起个名字. 其实我想原因是AWS这个云服务的鼻祖把他们的机器取名EC2. 有些人不管什么时候都说ECS,就是典型的只用过阿里云的傻缺. VPS虚拟化的分类 目前市场上的虚拟化技术主要分为4类: 1.XEN XEN的典型代表是早期的AWS和老牌VPS服务商Linode,不过这两家都迁移到了KVM.目前主流服务商已经全面放弃XEN. 2.KVM 目前的主流全虚拟化技术,全面替代了XEN.XEN算是Linux的一个应用,而KVM是Linux的一个模块. 下面提到的服务商除了微软以外都是使用的KVM. 3.Hyper-V 微软自家虚拟技术,Windows专享.(不然你以为Azure的母鸡是一堆Linux?) 本来Hyper-V在这个领域没什么存在感,但耐不住Azure这玩意市场占有率高啊 4.OpenVZ OpenVZ本质上并不是虚拟化,而是容器.相对于XEN和KVM而言它的性能损失是最小的(几乎可以忽略不计),并且内存/CPU/硬盘伸缩不用重启(XEN和KVM是需要重启后才能正确配置的). 而OpenVZ最大的缺点在于虚拟隔离化非常低,并且硬件层面权限较低甚至不能拥有自己的独立Linux内核. 同时OpenVZ最大的问题并不在于技术层面,而在于绝大部分服务商使用OpenVZ的目的是内存可以超售.超售是什么概念呢?简单说一台32G内存的物理机可以开出64台内存1G的VPS. 其他 除了上面说到的以外还有一些非主流的虚拟技术,比如VMWare这种商业解决方案(当然价格嘛...).不过各种其他虚拟技术加起来份额不到1%. VPS的网络 网络也分几个考虑方向,延迟 »

利用Guetzli压缩jpg图片

Guetzli is a JPEG encoder that aims for excellent compression density at high visual quality. Guetzli-generated images are typically 20-30% smaller than images of equivalent quality »

月杪 月杪 on Other

在Nginx中配置Google-Analytics

原因 在Nginx端配置Google-Analytics和在HTML中加载Google-Analytics有几个显著的有点, 杜绝用户到Google Analytics之间的网络问题,特别是国内(尽管已经解析到Google在北京的服务器) 防止adblock这样的软件屏蔽 提升页面加载速度 配置方法 nginx 配置 server 块内加入以下内容 userid on; userid_name cid; userid_domain moonagic.com; userid_path /; userid_expires max; if ($http_accept_language ~* '^(.+?),') { »

月杪 月杪 on Nginx

利用OpenSSL加解密文件

openssl包括了大量的对称,非对称,摘要等加密算法,我们可以选用对称算法对文件进行加密,比如3DES,AES. 比如我们要对ocserv-0.11.11.tar.xz进行加密,那么我们可以使用下面的方法 openssl des3 -salt -in ocserv-0.11.11.tar.xz -out ocserv-0.11.11.tar.xz.des3 其中-in是输入文件,-out是加密后输出的文件 之后会提示你输入一个用于加密的密钥,输入一个自己能记住的密码 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: 然后我们可以试试加密后的文件是否可以打开 tar Jxf ocserv-0.11.11.tar.xz.des3 tar: »

月杪 月杪 on OpenSSL

使用certbot工具签发泛域名证书

Letsencrypt的泛域名证书计划2月27日正式发布,结果临近的时候突然宣布延期了.本以为会像ECC中间证书延期一样等不到了,结果今天一大早就看到了正式发布的消息. 看到了acme.sh已经正式支持泛域名证书签发的消息,结果acme.sh支持的dns验证暂时并不支持我所使用的Google Cloud DNS. 于是尝试使用certbot(这也是一直以来我使用的签发工具). 其实和签发单域名的方法差不多,只是需要多一个--server参数 ./certbot-auto \ --server https://acme-v02.api.letsencrypt.org/directory \ --manual \ --preferred-challenges dns-01 certonly 接着会让你填入需要签发的域名,直接输入类似*.example.com就好. 后面的dns认证就和单域名一样了. 当然上一步你可以选择传入csr文件: ./certbot-auto \ --server https://acme-v02.api.letsencrypt.org/directory \ --manual \ »

使用CURL请求HTTPS页面时指定IP

一般在使用CURL请求自定义IP地址并且指定HOST的话可以这样 curl http://127.0.0.1/ -H 'Host: moonagic.com' 但是如果你需要请求的地址是HTTPS的就不行了, curl [IP]:443 -H 'Host:moonagic.com' curl: (52) Empty reply from server curl https://[IP]:443 -H 'Host:moonagic.com' curl: (60) SSL certificate problem: »

月杪 月杪 on CURL, HTTPS

删除通过pkg安装的程序

Mac下安装程序是非常便捷的. 但是这仅仅是局限于dmg/App安装,当你使用pkg安装了程序而开发者又没有提供卸载工具而你又需要卸载的话就完全摸不着头脑了. 不过我们可以通过pkgutil这个工具来搞定. 我们以mtr这个软件为例,我们并不知道mtr.pkg到底安装了什么文件,那么可以先执行pkgutil --pkgs pkgutil --pkgs com.apple.pkg.OSX_10_13_IncompatibleAppList.16U1254 com.apple.pkg.CustomVoice_en_US_nora.16U1181 com.apple.pkg.update.os.10.13.1Supplemental.17B1003 com.apple.pkg.DevSDK_macOS1013_Public com.apple.pkg.XProtectPlistConfigData.16U4027 com.apple.pkg.MRTConfigData.16U4028 com.apple.pkg.CLTools_Executables com.apple.pkg.GatekeeperConfigData.16U1300 org.rudix.pkg.mtr # 这就是我们要找的pkg com.apple.pkg.XProtectPlistConfigData.16U4024 com.apple.pkg.update.os.10.13.2SupplementalPatch.17C205 com.apple.pkg.MRTConfigData.16U4017 com.apple.pkg.MRTConfigData.16U4013 com.apple.pkg.GatekeeperConfigData.16U1259 com.apple.pkg.GatekeeperConfigData.16U1265 com.apple.pkg.CLTools_SDK_OSX1012 com.apple.update.fullbundleupdate.17D47 »

月杪 月杪 on Mac