ruan4261

Public Snippets 14

Oracle数据库操作

-- Replace ${} with your text

-- Compare the structure of two tables
-- Pay attention to the case of the table name
select v1.table_name,v2.table_name, v1.column_name,v2.column_name,
v1.data_type,v2.data_type,v1.data_length,v2.data_length ,v1.data_precision,v2.data_precision,v1.data_scale,v2.data_scale
from
(select * from user_tab_columns where table_name='${table_A}') v1 left join
(select * from user_tab_columns where table_name='${table_B}') v2 on v1.column_name=v2.column_name

-- Query from 

isStringEmpty.js

/**
 * Only for String and ArrayLike.
 * Return false if parameter is an object.
 *
 * @return {boolean}
 */
function isEmpty(obj) {
  return (
    obj === undefined ||
    obj === null ||
    Number(obj.length) === 0 ||
    (typeof obj === "string" && obj.trim().length === 0)
  );
}

Ecology前端代码集合

/**
 * 获取表单页面中指定明细表所有行数据的索引
 *
 * @param detailIndex 明细表索引是对于当前流程而言的, 与模板无关(同一个明细表在不同节点模板内拥有相同的索引)
 */
function getCheckNodeIndexSeq(detailIndex) {
  var key = "check_node_" + detailIndex;
  var jqSeq = jQuery('[name="' + key + '"]');
  var idxSeq = [];
  for (var i = 0; i < jqSeq.length; i++) {
    idxSeq[i] = jqSeq[i].value;
  }
  return idxSeq;
}

getUrlParams.js

function getUrlParams() {
  var query = location.search// from ? to #
  var params = {}
  if (query.length > 1) {
    var queryStr = query.substr(1)
    var entry = queryStr.split('&')
    for (var i = 0; i < entry.length; i++) {
      var kv = entry[i].split('=')
      var key = kv[0]
      var value = kv[1]// maybe undefined
      params[kv] = value
    }
  }
  return params
}

Dynamic Hierarchical Classloader

# Dynamic Hierarchical Classloader(动态分级加载器)
## 技术攻坚点
1. 加载器动态委派, 分级
2. 命名空间适配(目前想法是重写ProxyGenerator生成继承同命名空间类, 问题在于final类无法通过加载器校验)

## Features
- 上传class文件, 存放文件夹并加载
- 上传java文件编译, 自动存放文件夹(最后再考虑)

排列组合公式

// Arrangement or Permutation
int P(int n, int m) {
  int res = 1;
  int limit = n - m;
  while (n > limit) {
    res *= n--;
  }
  return res;
}

// Combination
int C(int n, int m) {
  m = Math.min(m, n - m);
  int res = P(n, m);
  while (m > 0) {
    res /= m--;
  }
  return res;
}

模板_反转整数

public int rev(int x) {
  int res = 0;
  while (x > 0) {
    int mod = x % 10;
    x /= 10;
    res = res * 10 + mod;
  }
  return res;
}

dynamic import javascript

window.dynamic_import_javascript = function(url, text, type, frameWindow){
  frameWindow = frameWindow || window
  var doc = frameWindow.document
  var container = frameWindow.document.head || frameWindow.document.body
  var newEle = doc.createElement('script')
  if (url)
    newEle.src = url
  if (text)
    newEle.appendChild(document.createTextNode(text))
  newEle.type = type || 'text/javascript'
  container.append(newEle)
}

linux mean

## 常用
- ls: list
- cd: change directory
- su: switch user
- pwd: print work directory
- ps: process status
- lsof: list open file
- df: disk free
- du: disk usage
- rm: remove
- cat: concatenate
- ln: link
- man: manual
- touch: touch (用于修改文件时间属性)
- uname: unix name
- mv: move
- cp: copy
- nohup: no hang up
- fg: foreground (将后台命令放到前台执行)
- bg: background (将前台命令放到后台执行)
- chown: change owner
- chgrp: change group
- chmod: change mode

## 非常用
- mkfs: make file system
- fsck: file system check
- ins

ProxyGenerator重点方法

一个`ProxyGenerator`实例代表一个代理类  

`ProxyGenerator`实例中重要的属性
```java
  /** 保存所有接口的方法, key为方法签名, value中位不同返回值的同签名方法 */
  Map<String, List<ProxyMethod>> proxyMethods;
  
  /** 保存最终的字段信息, 每一个元素会生成一个实例字段 */
  List<FieldInfo> fields;
  /** 保存最终的方法信息, 每一个元素会生成一个实例方法 */
  List<MethodInfo> methods;
```

0. `#generateClassFile()`
   > 生成入口, 返回代理类字节码  
   > **步骤**
   > 1. 通过`#addProxyMethod(Method, Class)`注册`hashCode`, `equals`, `toString`方法
   > 2. 通过`#addProxyMethod(Method, Class)`循环注册每个接口的每个方法
   > 3. 对所有注册

The fastest way to exchange binary values.

/**
 * better
 */
function(a, b) {
  a = a ^ b
  b = a ^ b
  a = a ^ b
}

/**
 * standard
 */
function(a, b) {
  var temp = a
  a = b
  b = temp
}

模板_快速幂

// 不能输入负数参数
long binaryPow(long base, long exponent) {
  long res = 1;
  while (exponent > 0) {
    if ((exponent & 1) == 1) res *= base;
    base *= base;
    exponent >>= 1;
  }
  return res;
}

模板_欧几里得算法

// better
int gcd(int x, int y) {
  while (y != 0) {
      int tmp = x % y;
      x = y;
      y = tmp;
  }
  return x;
}

// simple, but slow and make more stacks(in the int case, when the ratio of two numbers is close to the 1.61(Golden Ratio), up to 80(effective 40) stacks can be made)
int gcd(int x, int y) {
  return x == 0 ? y : gcd(y % x, x);
}

int gcd(int large, int small) {
  int temp;
  for (; ; ) {
    if (small > large) {
      temp = large;
      large = small;

Markdown Syntax

# Markdown syntax
Markdown(下文中简称为md)是一种纯文本标记语言,你可以将其认为是html的超集。md是纯文本标记语言,相比于html,它更加简易,更加易于人类理解。md有非常多的拓展规范(方言),基本规范文档:RFC7763、RFC7764。  

因为md是html的超集,所以你可以使用任意html标签以补充想要的样式,例如使用`<div style="text-align: center"></div>`标签增添居中效果(部分方言/解析器可能会限制部分html标签及属性的使用)。  
原生md不支持数学表达式及UML图等,你可以通过三方插件实现这些功能,在显示时通过图片或脚本(部分平台支持在线编辑表达式并发布,通过平台依赖脚本进行渲染,坏处是无法转移至其他方言不兼容的平台)的方式插入,本文不作非md语法内容的描述。

***本文所述语法默认兼容GitHub及Cacher,与上述平台不兼容的部分,会给出提示。***

## 目录
* [反转义](#反转义)
* [注释](#注释)
* [标题](#标题)
* [分割线](#分割线)
* [换行方法](#换