自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

chunyuan314的博客

天地有正气

  • 博客(90)
  • 资源 (4)
  • 收藏
  • 关注

原创 Java中如何优雅地调用多个方法

问题背景有某个颇为复杂的功能,功能拆分时把该功能拆分成了数十个步骤,每个步骤用一个方法来实现。需要依次调用数十个方法/函数,这些方法有相同的签名。为了后期的维护和扩展,显然不可能像这样去调用: step1(); // 第一步 step2(); // 第二步 ... stepn(); // 第n步这样去调用的话,如果后期要在每个方法/函数后面都增加一个额外的功能(比如测量每个步骤的运...

2019-02-24 15:12:21 12142 5

原创 用nginx实现不同Cookie的适配

用nginx实现不同Cookie的适配1. 背景用Java语言开发的Web应用,其Cookie名称一般是JSESSIONID。 用PHP语言开发的Web应用,其Cookie名称一般是PHPSESSID,当然,这个可以改。因特殊原因,需要由Java的Cookie转PHP的Cookie,以便不用更改APP端的代码。2. 关键知识点(针对 nginx):$cookie_nam...

2018-08-21 16:35:01 6859 2

原创 PHP用inotify扩展监控文件

PHP用inotify扩展监控文件可以用inotify扩展提供的功能来监控文件/目录,实现某些特殊的功能:如热编译,安全预警。早期phpStudy有提供防挂马功能,就是用了与inotifyf类似的机制。inotify扩展提供了一系列inotify函数:inotify_init() inotify_add_watch() inotify_rm_watch()。类似C语言里的inoti...

2018-08-16 22:44:35 4732

原创 用Yar扩展实现RPC

用Yar扩展实现RPCRPC (Remote Procedure Call),远程过程调用。是一种进程间通信技术,允许程序像调用本地方法一样调用远程服务。RPC屏蔽了数据打包、网络通信的细节,使得使用者只需要关注于服务调用,而服务调用又像调用本地方法一样自然。PHP有个Yar扩展,提供了RPC服务端和客户端的功能。1. 安装$ pecl install yar稍后片刻,...

2018-08-16 18:05:20 3926

原创 nginx的headers_more模块的使用

nginx的headers_more模块的使用nginx的headers_more模块用于 添加、修改或清除 请求/响应头,该模块不是nginx自带的,默认不包含该模块,需要另外安装。幸运的是openresty默认包含了该模块,可以直接使用。该模块主要有4个指令more_set_headers 用于 添加、修改、清除 响应头more_clear_headers 用于 清除 响应头...

2018-08-16 10:43:59 17502

原创 GPG入门笔记

GPG入门笔记0. 简介GPG 是 GNU Privacy Guard的简写,是GNU对PGP技术的实现。PGP是Pretty Good Privacy的简写,是一套用于加密的软件。PGP加密过程如下(来自维基百科 PGP):1. GPG 的安装1.1 linux命令行版本以 CentOS为例:$ sudo yum install gpg或者$ su...

2018-08-15 18:44:14 8301

原创 一个Go闭包引发的血案

一个Go闭包引发的血案今天群里有人问了个问题,说是以下代码会输出什么:func main() { functions := make([]func(), 3) for i:=0; i<3; i++ { functions[i] = func() { fmt.Println(i) } } functions[0]() functions...

2018-07-27 21:02:32 448

原创 Javascript对HTML表格排序-很实用

Javascript对HTML表格排序-很烂但实用Javascript实现HTML表格排序,点击表头的标题单元格,即可对该列排序,升序降序切换,数字、文本都可以排序。先看下面的效果图:该功能已经封装成了一个Javascript函数,要实现表格排序的功能非常简单,只需:引入包含该函数的js文件(需要预先引入jQuery)—— 这个不难在需要排序的表格的标题单元格(th元素)的...

2018-07-25 22:11:41 15412 66

原创 Javascript动态创建SVG圆弧

Javascript动态创建SVG圆弧1. 问题描述先看个草图,如下: 其中,点AAA是圆弧的起点,点OOO是圆心,点B是圆弧的终点,θθ \theta 是OBOBOB与OAOAOA的夹角,即 ∠BOA∠BOA \angle{BOA} 。YYY轴的箭头是朝下的,因为SVG使用的是屏幕坐标系。已知: 1. 圆弧起点AAA的坐标(startX,startY)(startX,st...

2018-07-24 20:57:23 6912

原创 varnish学习笔记-后端服务器

varnish学习笔记-后端服务器大部分情况下,varnish发给客户端的数据都不是自己产生的,而是从后端服务器获取的(如果发的是缓存的内容,其起源也是后端服务器),它充当的是反向代理和缓存的角色。所以需要给varnish定义一个/多个后端服务器,告诉它应该从哪里获取数据,可以选择性的让它从指定服务器获取数据。1. 定义一个后端服务器使用backend指令来定义一个后端服务器。最简...

2018-07-24 09:16:10 771

原创 varnish学习笔记-清除缓存

varnish学习笔记-清除缓存1. 概述,purge当varnish缓存的后端文件有更新时,需要让varnish清除缓存,有三种方法:return (purge) —— 使流程进入vcl_purge 子程序,取出相应缓存的对象内容然后清除之;ban(String) —— 不从缓存中获取指定的内容;set req.hash_always_misss=true —— 强制不命中缓存...

2018-07-22 23:13:42 2202

转载 varnish原理

varnish原理varnish原理讲得非常详细的文章:varnish-原理 http://blog.51cto.com/11637223/1910092

2018-07-18 11:26:24 324

原创 editormd 支持拖放上传图片和视频

editormd 支持拖放上传图片和视频在editormd中,有时觉得 点击按钮 => 弹出对话框 => 选择文件这样的上传步骤有些麻烦,要是能支持文件拖放上传,将会是非常不错的用户体验。实现这个功能,关键点有3个:监听并处理editormd编辑区域的拖放(Drag-Drop)事件放下文件后,获取到文件,通过Ajax上传至后端收到后端返回的视频/图片 url,转换成合...

2018-07-12 21:12:06 2585 3

原创 editormd支持上传视频

editormd支持上传视频editormd是一款非常不错的Markdown在线编辑器。最近需要把该编辑器集成到项目中,需要上传图片和视频,editormd自带的image-dialog插件是已经支持上传图片了,但是从官网上没找到视频上传的插件。于是想对image-dialog插件二次开发,让该插件同时支持上传图片和视频。当然可以从网上找下其他人有没有做过类似的插件,不过没有这样做,因...

2018-07-12 20:16:08 3328 5

原创 GC算法实践(四) 标记-清除算法

GC的标记-清除算法由标记阶段和清除阶段组成,标记阶段是标记出活动对象的阶段,《GC算法实践(二) 对象标记、清除算法》一文中已经实现了对活动对象的标记,该步骤需要从根对象出发,递归标记由根对象可以访问到的所有对象。清除阶段则是将非活动对象(垃圾)回收的阶段,暂且把这些回收后的一个一个的非活动对象叫做空闲块。回收当然是为了再次利用,所以需要用合适的方法把这些空闲块组织起来,使得分配内存的时候可以从这

2017-10-25 08:06:02 561

原创 GC算法实践(三) 标记-压缩算法

1.标记-压缩算法简介标记-压缩算法的基本思路: 标记阶段。该阶段与标记-清除算法中的标记算法一样。 遍历根对象及其引用的对象。假设每个对象都有个标记位flag,对根对象集合中的每个根对象,从根对象出发,对可以访问到的每个对象的标记位flag设为1(活动对象)。 压缩阶段。该阶段分3步,依次是: 计算当前活动堆中活动对象移动后的地址。该步骤需要从堆的开始遍

2017-10-13 18:07:21 2338

原创 GC算法实践(二) 对象标记、复制算法

上一篇文章中,我们实现了自定义分配内存,有了这个基础,我们可以开发垃圾回收算法了。GC算法有很多种,如引用计数法、标记-清除算法、复制算法、分代回收算法等,也有综合运用几种算法的。PHP用到了引用计数算法,Java用到了复制算法和分代回收算法。由于引用计数算法需要频繁更新引用计数,目前暂不研究;标记-清除算法则因为清除后造成大量内存碎片不好管理,目前只研究标记(标记出活动对象);复制算法是本篇研究的

2017-10-12 22:32:01 1683

原创 GC算法实践(一) 内存分配篇

要实现自己的垃圾回收算法,首先要实现一套自己的内存分配方法,把内存的管理权掌握在自己手里,而不是每次都调用系统函数,向操作系统要一小块内存,否则垃圾回收就无从谈起。思路主要是: 一开始申请一块大的内存,后面每次程序需要内存就从这个内存块中分配,不够了再想办法处理(垃圾回收、压缩、分配更大的内存等)。 上面申请的一块大的内存一般叫做堆(heap)。名字叫什么不要紧,反正就是内存的一部分,

2017-10-12 00:13:51 2837

原创 联通物联网卡ICCID校验位的计算方法探究

SIM卡的ICCID校验位的计算方法,应该不是什么隐私或者机密吧,最近关于这个有点小发现,故写出来与大家分享一下。ICCID简介ICCID (Integerate Circuit Card Identity),集成电路卡识别码,是SIM卡的唯一识别号码。ICCID长为19~20位,其中最后一位是校验位(当然也有另外,中移动的某些卡就不是校验位,而是普通的序列号)。关于其它位的含义,可自行百度。背景最

2017-09-28 13:31:46 11803 8

原创 okHttp管理cookie的简单方法

初识okHttp,发现默认不管理cookie,登录成功之后,后端设置了cookie,但是由于okHttp在后面的请求没有携带cookie,导致被后端认为没有登录而不能正常获取数据。百度了一下,发现别人的方法有点复杂。有一个简单粗暴的方法:通过某种方式获取到后端发送的Cookie的名称和值。 由于是前后端是通过接口调用方式交换数据,后端可以在用户登录之后把Cookie的名字和值作为业务数据返回给前

2017-08-24 20:46:11 2002 1

原创 Mybatis不能正确解析typeAliases问题的处理方法

Mybatis配置文件中使用typeAliases竟然报错,明明用的是typeAliases,并没有拼错。原来是typeAliases与environments相对顺序的问题更改前配置文件示意图: <environments default="local"> <environment id="local"> <transactionManager typ

2017-08-22 13:25:42 7999 2

原创 Centos7下nginx配置https

Centos7下nginx配置https在互联网信息安全日益重要的今天,https协议几乎成了标配,部分浏览器如果遇到非https的服务器会拒绝访问,有的平台也要求app的服务器要用https协议(如苹果、微信小程序)。一、步骤1 配置nginx假如你已经申请到了https证书,而且有nginx下的版本,通常是两个文件,一个是 .key 后缀的文件,为证书的私钥,另一个是 .crt 后缀的文件,为证

2017-08-18 14:02:08 9151 1

原创 自制Java虚拟机-总结

自制Java虚拟机-总结项目介绍该项目的目的是从零开始用C语言做一个实验性质的Java虚拟机,实现大部分JVM指令,实现基本的面向对象特性(封装、继承、多态),能够运行一个不涉及Java本地方法调用的类(不能包含未实现的指令,见下面的指令实现情况),因为涉及到Java的本地方法(native method)还是比较麻烦的,暂时没有那么多时间精力去研究。 经过整理之后,代码托管到了github上。

2017-06-24 12:05:13 1911 3

原创 自制Java虚拟机(六)静态属性和静态方法(getstatic, putstatic, invokestatic, <clinit>)

自制Java虚拟机(六)静态属性和静态方法(getstatic, putstatic, invokestatic, )Java中,静态属性和静态方法都是属于类的,类的诸多实例共享同一个静态属性和静态方法。操作实例属性和实例方法的指令分别为:getfield、putfield、invokespecial、invokevirtual等,至于静态属性和静态方法,对应的指令为getstatic、putsta

2017-06-15 00:30:33 9492

原创 利用mysqldump导出数据库的子集

利用mysqldump导出数据库的子集一、引言假如:你有一个非常大的正式数据库,和一个空的测试数据库需要把正式数据库中的部分数据导到测试数据库中用来测试,同时,希望导入的数据尽可能的保持一致性、完备性比如,有一个商城的数据库,你希望导出其中的部分数据到测试数据库中,导入的两个主要依据是:用户表user:购买了商品的部分用户和没有购买商品的部分用户商品表goods:部分已经有过购买的商品和

2017-06-14 14:40:48 557

原创 windows下Mysql批量备份多个表

windows下Mysql批量备份多个表如果:数据库太大(几十个G),不想备份成一个文件,而是每个表备份成一个文件备份耗时太长(几个小时)数据表太多,不想一个一个表手工导出需要把数据备份成sql格式可以采用如下脚本批量备份多个表:@echo offset MysqlDumpPath=D:\mysql\bin\mysqldumpset dbhost=localhostset dbuse

2017-06-14 10:16:54 2655

原创 自制Java虚拟机(五)实现继承、多态、invokevirtual

自制Java虚拟机(五)实现继承、多态、invokevirtual本篇文章将研究如何实现面向对象的继承和多态特性,同时实现invokevirtual。一、实例属性的继承继承实现了数据与方法的复用。类属性与实例属性类属性的修饰符要加上static,是属于类的类属性只有一份,该类创建的多个对象共享同一份类属性,jvm中由getstatic、putstatic指令操作实例属性每个对象各自一份,各管各

2017-06-07 19:12:27 2637 2

原创 自制Java虚拟机(四)-对象、new、invokespecial

自制Java虚拟机(四)-对象、new、invokespecial一、对象的表示刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出的优点往往都有纯面向对象、自动垃圾收集(不用管理内存)、跨平台(Write once, run everywhere 是宣传的重点,前提是需要在每个平台上安装jvm)、没有指针(后来证明是有的)、安全等。本

2017-06-04 09:32:19 2836

原创 自制Java虚拟机(三)运行第一个main函数

自制Java虚拟机(三)运行第一个main函数一、执行指令的一般模型Java虚拟机有200多条指令,用switch-case来一一匹配并执行每个指令,显得过于臃肿又不灵活。我们可以把每个指令用一个函数实现,遇到指令就调用相应的函数处理之。这个函数应该知道它所处理指令的上下文,包括当前指令位置、当前类、当前帧等,这些我们都封装在一个结构体内,通过指针传给函数。函数太多,我们把它们组织到一个数组里,以o

2017-06-03 11:49:46 1667

原创 自制Java虚拟机(二)指令、帧/栈帧

自制Java虚拟机(二)指令、帧/栈帧上篇文章中,我们已经成功地解析了class文件,包括其中的常量池(constant_pool)和代码(code),一个很直接的思路就是实现jvm的200多条指令,然后找到main方法,执行里面的指令。一、初识jvm指令一条java虚拟机由一个指明需要执行操作的opcode,以及后面跟着的0个 或多个被操作的值组成。jvm指令是基于栈的,意味着这些指令不直接操作寄

2017-06-02 22:06:21 1133

原创 自制Java 虚拟机(一)解析class文件

自制Java 虚拟机(一)解析class文件一、认识class文件结构一个.java后缀的java源文件,经过javac编译之后的字节码文件,结构如下:(摘自jvm虚拟机规范 version8)ClassFile { u4 magic; // 魔数,值为 0xCAFEBABE,表示这是一个java class文件 u2 minor_ve

2017-06-01 23:05:15 1306

原创 用PHP写PHP扩展-Another way writing php extensions

前言目前写PHP扩展主要有三种方法:C语言C++ php-cppZephir Zephir其中Zephir其实也是先翻译成C语言,然后再编译成扩展的。用Zephir 编写的Phalcon,就是以PHP扩展形式发布的一个全栈式MVC框架。Zephir与PHP在语法上很相似,不过还是有些差别。在不同语言间频繁切换,正如CPU频繁切换进程/线程一样,有一定的开销。虽然用Zephir写应用也没问题

2017-05-03 23:17:57 892

原创 Yaf学习之整合yii

Yaf 是一个MVC框架,可惜它对M的支持甚弱,只支持自动加载模型(现在好像是吧),不像其它框架yii、laravel等,支持ORM以及各种方便的查询方法。但我们总有方法。本文章的例子将涉及:将yii整合到Yaf框架中,使得Yaf中可以使用yii的类编写配置文件配置数据库连接参数获取配置文件信息,构造数据库连接对象(yii\db\Connection)编写一个正则路由协议(Yaf_Route

2017-04-18 23:17:11 2381

原创 Yaf学习之Request

但凡Web框架,PHP也好,Java也好,还是其它语言,都会把请求用一个Request类来封装,响应则用Response类来封装。Web应用的典型流程就是 接收Request,处理之,输出Response。Yaf中表示Request的类有三个,分别是Yaf_Request_AbstractYaf_Request_HttpYaf_Request_Simple其中,Yaf_Request_Htt

2017-04-16 19:46:32 10018

原创 Yaf学习之Action类

Yaf提供了这种机制: 可以在控制器的public属性 $actions 中定义一个或多个键值对,键为动作名字,值为定义该动作所在的文件路径。如果所请求的action在本控制器中没有相对应的方法,而在$actions中存在的话,该控制器就会载入$actions中对应的文件,实例化该动作类,执行该动作类的execute()方法。这种机制对于多个控制器之间共享同一个动作是非常有用的。这种定义在控制器外

2017-04-16 14:20:17 3999

原创 Yaf学习之控制器

Yaf中的控制器:必须是Yaf_Controller_Abstract的子类类名要以Controller结尾,保存的文件名则不需要执行的动作对应的方法名称要以Action结尾init()方法是控制器被实例化时自动调用的方法,而不是__construct(),所以整个控制器的初始化代码要放在这里。一、Yaf控制器常用方法一览表 序号 方法名称 作用 1 getModuleN

2017-04-16 12:32:25 5296

原创 Yaf学习之Bootstrap

Yaf的Bootstrap机制,提供了一个全局配置的入口,它:运行于Yaf_Application:run()之前,必须手动调用,如$app->bootstrap()->run();类名必须为Bootstrap,继承自Yaf_Bootstrap_Abstract类文件默认为APPLICATION_PATH下,文件名为Bootstrap.php。可以通过通过配置 application.boot

2017-04-16 09:40:39 3651 2

原创 Yaf学习之路由

一、前言Yaf的路由组件包括Yaf_Router和Yaf_Route_Abstract路由协议指导框架如何将request_uri解析到module、controller、action,以及如何解析用户提交的参数一个应用可以注册多个路由协议,最后注册的路由协议最先尝试(优先级最高)路由解析出来后会被传递给Yaf_Request_Abstract 实例默认的路由协议是Yaf_Route_St

2017-04-15 20:48:25 9393

原创 Yaf学习笔记之钩子与插件

Yaf中定义了6个钩子(Hook),相当于事件,在插件(Plugin)类中定义与钩子相同名称的方法,注册之后,这些方法便会被框架自动调用。一、钩子列表 触发顺序 名称 触发时机 说明 1 routerStartup 路由之前 触发最早的一个事件 2 routerShutdown 路由结束之后 3 dispatchLoopStartup 分发

2017-04-15 17:26:35 2060

原创 Yaf学习笔记之多模块

问:假如我们需要Yaf支持多模块,该怎么办呢?答:把模块放在 application/modules目录下,模块目录下放置该模块的控制器和视图。同时在conf/application.ini中添加该模块的名字,模块直接以逗号隔开,记得一定添加个index的模块,防止路径只有两段时出错,此时index模块对应的控制器是application/controllers目录下的。Yaf 多模块示例假如我们需

2017-04-15 13:56:23 6363

GUN C Library Reference Manual

GUN下的C库参考手册,英文版。做linux下C开发的必不可少的参考手册。

2009-09-24

The Java Programming Language 4th edition

Java 编程语言第四版。纯英文版,但并不难懂。言简意赅,让你掌握Java的要点。

2009-09-24

80X86汇编pdf

本pdf文档详细描述了如何在80X86体系下汇编编程 本pdf文档详细描述了如何在80X86体系下汇编编程 本pdf文档详细描述了如何在80X86体系下汇编编程

2009-05-17

c++hanshudaquan

很好,很强大。认真学完后,肯定让你c++内功大增!

2008-11-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除