搭建confluence

Docker中安装wiki Confluence

一下内容在centos 7安装成功。

一、安装docker

1、yum安装docker

1
2
yum update # 更新yum
yum install docker # yum安装docker

2、开启镜像加速

由于国内网络问题拉取 Docker 镜像会十分缓慢,所以可以添加网易镜像地址:http://hub-mirror.c.163.com 加速。

1
vi /etc/docker/daemon.json

将其中的内容替换为如下,当然你可以添加其它镜像地址。

1
2
3
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

3、启动docker

1
2
3
docker --version # 查看docker版本
service docker start # 启动docker
ps -ef | grep docker # 查看docker进程是否正常启动

更多docker安装内容可以参考:https://i.cnblogs.com/EditPosts.aspx?postid=8403350&update=1

二、安装数据库PostgreSQL

安装 PostgreSQL 所使用的镜像在:https://hub.docker.com/_/postgres/

1、安装PostgreSQL

1
docker run --name postgresdb -p 5432:5432 -e POSTGRES_PASSWORD=W**** -d postgres

注:1、-p 5432:5432 选项是可选的,因为在后面启动Confluence容器的时候,postgresdb这个容器会以别名db连接到confluence容器,也就是说对confluence这个容器来说,可以通过db:5432的网络地址访问到postgresql服务,不需要在主机上开放5432端口。

2、W**** 是密码需要设置成你需要的密码

2、进入docker容器并创建confluence数据库

1
2
3
4
5
docker exec -it postgresdb bash # 进入docker容器
psql -U postgres 
\l
CREATE DATABASE confluence WITH OWNER postgres; 
\q

3、安装wiki Confluence

下文中使用的镜像 https://hub.docker.com/r/cptactionhank/atlassian-confluence/ 

也可以使用 https://github.com/jgrodziski/docker-confluence/blob/master/Dockerfile 这个镜像他把PostgreSQL和 Confluence包含在一个image里面,参考:http://blogs.atlassian.com/2013/11/docker-all-the-things-at-atlassian-automation-and-wiring/

1、安装wiki Confluence

1
docker run -d --name confluence -p 8090:8090 --link postgresdb:db --user root:root cptactionhank/atlassian-confluence:latest

以上命令将在主机上开放8090端口,如果想使用80端口访问wiki请使用一下命令安装

1
docker run -d --name confluence -p 80:8090 --link postgresdb:db --user root:root cptactionhank/atlassian-confluence:latest

2、检查confluence是否启动

1
docker ps # 列出运行的容器

可以看到没有启动任何容器

1
docker ps -a # 显示所有的容器,包括未运行的

可以看到刚才安装的两个容器,启动 wiki confluence

1
2
3
docker start postgresdb # 启动数据库 postgresdb
docker start confluence # 启动 Wiki confluence
docker ps # 列出运行的容器

可以看到 wiki confluence已经启动

3、访问 http://192.168.1.108/ 就可以看到Confluence的配置页面

之前安装的docker主机ip为1.108并且安装 wiki confluence 配置主机80端口,如果你配置的是 8090 添加相应端口号即可。

四、破解 wiki Confluence

1、访问 http://192.168.1.108 记录 Server ID

2、停止 confluence

1
docker stop confluence # 停止 confluence 容器

2、进入docker confluence 容器,查找decoder.jar文件

1
2
3
docker exec -it confluence /bin/bash # 进入docker容器 confluence
su # 切换到root账户
find -name "*decoder*" # 查找名称中包括 decoder 的文件

3、将decoder.jar文件从容器中复制出来,其中 “confluence:” 是Wiki confluence容器名称,atlassian-extras-decoder-v2-3.3.0.jar 是安装版本wiki的decode文件

1
docker cp  confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.3.0.jar .

2、破解

a)下载 atlassian-extras-decoder-v2-3.3.0.jar 文件到windows上

b)将文件名改为 “atlassian-extras-2.4.jar” 破解工具只识别这个文件名

c)下载破解文件 http://wiki.wuyijun.cn/download/attachments/2327034/51CTO%E4%B8%8B%E8%BD%BD-Confluence.zip

d)解压缩此文件夹,dos命令行进入此文件夹,目录需根据你的实际情况修改 C:\Users\lrs\Desktop\wiki\51CTO下载-Confluence\confluence5.1-crack\confluence5.1-crack\iNViSiBLE

e)执行 java -jar confluence_keygen.jar 运行破解文件

f)填入 name ,server id 处输入步骤1中得到的id,点击 “gen” 生成key

g)点击 patch,选择刚才改名为  “atlassian-extras-2.4.jar” 的jar包,显示 “jar success fully patched” 则破解成功

注意:path前先删除atlassian-extras-2.4.bak文件否则path失败

h)将 “atlassian-extras-2.4.jar” 文件名改回原来的 “atlassian-extras-decoder-v2-3.3.0.jar”

i)复制key中的内容备用

j)将 “atlassian-extras-decoder-v2-3.3.0.jar” 文件上传回服务器

3、将破解后的文件复制回 confluence 容器

1
docker cp atlassian-extras-decoder-v2-3.3.0.jar  confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.3.0.jar

4、启动 confluence 容器

1
docker start confluence

5、再次访问页面

1
http://192.168.1.108

7、输入之前复制的key后点击下一步

8、点击 ”My own database“ 后点击 next

9、输入数据库连接信息,用户名密码是之前创建数据库中的用户名和密码

注意:用户名为 postgres没有db

10、单击 ”Empty Site“

11、点击 “Manage users and groups within Confluence”

 

12、填入管理员信息后点击 “next”

13、点击 ”start“

14、设置一些信息后就完成了

15、查看授权信息,使用管理员用户登录

点击 ”授权信息“

可以看到是评估版本,但过期时间是3千多个月后

 六、解决慢时长gc的问题

默认java配置为1G内存使用一段时间后回经常gc造成卡顿,单击“系统信息”可以看到jvm使用情况

进入docker容器

1
docker exec -it confluence /bin/bash # 进入docker容器 confluence

修改java配置

1
vi /opt/atlassian/confluence/bin/catalina.sh

在 “cygwin=false” 上面添加如下内容,最大内存为2G

1
2
3
JAVA_OPTS="-Xms256m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m"
CATALINA_OPTS="-Xms256m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m"

重启 wiki confluence

1
2
docker stop confluence # 停止
docker start confluence # 启动

这时候可以看到内存为 2G 可用为 73%

 

 

 

 

 

参考文档:

http://wuyijun.cn/shi-yong-dockerfang-shi-an-zhuang-he-yun-xing-confluence/

https://blog.csdn.net/localhost01/article/details/70048339

web-components

const template = document.createElement('template');
    template.innerHTML = `
    <style>
    :host {
        display: flex;
        align-items: center;
        width: 450px;
        height: 180px;
        background-color: #d4d4d4;
        border: 1px solid #d5d5d5;
        box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
        border-radius: 3px;
        overflow: hidden;
        padding: 10px;
        box-sizing: border-box;
        font-family: 'Poppins', sans-serif;
    }
    .image {
        flex: 0 0 auto;
        width: 160px;
        height: 160px;
        vertical-align: middle;
        border-radius: 5px;
    }
    .container {
        box-sizing: border-box;
        padding: 20px;
        height: 160px;
    }
    .container > .name {
        font-size: 20px;
        font-weight: 600;
        line-height: 1;
        margin: 0;
        margin-bottom: 5px;
    }
    .container > .email {
        font-size: 12px;
        opacity: 0.75;
        line-height: 1;
        margin: 0;
        margin-bottom: 15px;
    }
    .container > .button {
        padding: 10px 25px;
        font-size: 12px;
        border-radius: 5px;
        text-transform: uppercase;
    }
    </style>
    
    <img class="image">
    <div class="container">
        <p class="name"></p>
        <p class="email"></p>
        <button class="button">Follow John</button>
    </div>
    `;

class UserCard extends HTMLElement {
    constructor() {
        super();
        var shadow = this.attachShadow( { mode: 'closed' } );
        var content = template.content.cloneNode(true);
        content.querySelector('img').setAttribute('src', this.getAttribute('image'));
        content.querySelector('.container>.name').innerText = this.getAttribute('name');
        content.querySelector('.container>.email').innerText = this.getAttribute('email');
        shadow.appendChild(content);
    }
}

window.customElements.define('user-card', UserCard);
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <style>
      html,body,div{
          padding: 0;
          margin: 0;
      }
  </style>
</head>
<body>
<user-card
  image="https://semantic-ui.com/images/avatar2/large/kristy.png"
  name="User Name"
  email="yourmail@some-email.com"
></user-card>
  
<script src="./components.js"></script>
</body>
</html>

 

七牛使用node上传文件

1、上传本地文件 https://developer.qiniu.com/kodo/sdk/1289/nodejs#form-upload-file

2、上传在线文件,文档里没写,api的demo里有

const qiniu = require("qiniu");
const proc = require("process");

var accessKey = proc.env.QINIU_ACCESS_KEY;
var secretKey = proc.env.QINIU_SECRET_KEY;
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var config = new qiniu.conf.Config();
//config.useHttpsDomain = true;
//config.zone = qiniu.zone.Zone_z1;
var bucketManager = new qiniu.rs.BucketManager(mac, config);
var resUrl = 'http://devtools.qiniu.com/qiniu.png';
var bucket = proc.env.QINIU_TEST_BUCKET;
var key = "qiniu.png";

bucketManager.fetch(resUrl, bucket, key, function(err, respBody, respInfo) {
  if (err) {
    console.log(err);
    //throw err;
  } else {
    if (respInfo.statusCode == 200) {
      console.log(respBody.key);
      console.log(respBody.hash);
      console.log(respBody.fsize);
      console.log(respBody.mimeType);
    } else {
      console.log(respInfo.statusCode);
      console.log(respBody);
    }
  }
});

 

基于SVG画一个环形进度图

circle {
    -webkit-transition: stroke-dasharray .5s;
    transition: stroke-dasharray .5s;
    stroke-linecap: round;
}

.chart_wrap {
    position: relative;
}

.chart_wrap .count {
    position: absolute;
    top: 190px;
    text-align: center;
    left: 2px;
    width: 450px;
    font-size: 45px;
}

line {
    stroke: #ccc;
    stroke-width: 2;
}

line.short {
    transform-origin: center center;
}
<div class="chart_wrap"> 
   <div class="count">
    62.3%
   </div> 
   <svg width="450" height="450" viewbox="0 0 450 450"> 
    <line x1="0" y1="225" x2="450" y2="225" class="long" /> 
    <line x1="225" y1="450" x2="225" y2="0" class="long" /> 
    <line x1="10" y1="225" x2="440" y2="225" class="short" style="transform: rotate(15deg);" /> 
    <line x1="10" y1="225" x2="440" y2="225" class="short" style="transform: rotate(30deg);" /> 
    <line x1="10" y1="225" x2="440" y2="225" class="short" style="transform: rotate(45deg);" /> 
    <line x1="10" y1="225" x2="440" y2="225" class="short" style="transform: rotate(60deg);" /> 
    <line x1="10" y1="225" x2="440" y2="225" class="short" style="transform: rotate(75deg);" /> 
    <line x1="225" y1="440" x2="225" y2="10" class="short" style="transform: rotate(15deg);" /> 
    <line x1="225" y1="440" x2="225" y2="10" class="short" style="transform: rotate(30deg);" /> 
    <line x1="225" y1="440" x2="225" y2="10" class="short" style="transform: rotate(45deg);" /> 
    <line x1="225" y1="440" x2="225" y2="10" class="short" style="transform: rotate(60deg);" /> 
    <line x1="225" y1="440" x2="225" y2="10" class="short" style="transform: rotate(75deg);" /> 
    <circle cx="225" cy="225" r="175" stroke-width="50" stroke="#fff" fill="#fff"></circle> 
    <circle cx="225" cy="225" r="165" stroke-width="40" stroke="#D1D3D7" fill="none"></circle> 
    <circle cx="225" cy="225" r="165" stroke-width="40" stroke="#00A5E0" fill="none" transform="matrix(0,-1,1,0,0,450)" stroke-dasharray="0 1069"></circle> 
   </svg> 
  </div> 
<p>拖我:<input id="range" type="range" min="0" max="100" value="0" style="width:300px;" /></p> 
if (window.addEventListener) {
    var range = document.querySelector("#range"),
    circle = document.querySelectorAll("circle")[2];
    if (range && circle) {
        range.addEventListener("change",
        function() {
            var percent = this.value / 100,
            perimeter = Math.PI * 2 * 170;
            circle.setAttribute('stroke-dasharray', perimeter * percent + " " + perimeter * (1 - percent));
        });
    }
}

WebStorm快捷键(Mac版)

⌘——Command

⌃ ——Control

⌥——alt

⇧——Shift

⇪——Caps Lock

fn——功能键就是fn

编辑


Command+alt+T 用 (if..else, try..catch, for, etc.)包住
Command+/ 注释/取消注释的行注释
Command+alt+/ 注释/取消注释与块注释
alt+↑ 向上选取代码块
alt+↓ 向下选取代码块
Command+alt+L 格式化代码
tab,shift+tab 调整缩进
Control+alt+I 快速调整缩进
Command+C 复制
Command+X 剪切
Command+V 粘贴
Command+shift+V 从剪贴板里选择粘贴
Command+D 复制代码副本
Command+delete 删除当前行
Control+Shift+J 清除缩进变成单行
shift+回车 快速换行
Command+回车 换行光标还在原先位置
Command+shift+U 大小写转换
Command+shift+[,Command+shift+] 文件选项卡快速切换
Command+加号,Command+减号 收缩代码块
Command+shift+加号,Command+shift+减号 收缩整个文档的代码块
Command+W 关闭当前文件选项卡
alt+单击 光标在多处定位
Control+shift+J 把下面行的缩进收上来
shift + F6 高级修改,可快速修改光标所在的标签、变量、函数等
alt+/ 代码补全
Control+G 选中相同的代码块,可同时编辑

调试


Control+alt+R 运行项目
Command+Control+R 运行Debug
Command+F8 添加断点
Command+shift+F8 打开断点列表

导航


Command+O 跳转到某个类
Command+shift+O 跳转到某个文件
Command+alt+O 跳转到某个符号
Control+←,Control+→ 转到上/下一个编辑器选项卡
F12 打开之前打开的工具窗口(TODO、终端等)
Command+L 跳转行
Command+E 弹出最近文件
Command+alt+←,Command+alt+→ 向前向后导航到代码块交接处(一般是空行处)
Command+shift+delete 导航到上一个编辑位置的位置
Command+B 跳转到变量声明处
Control+J 获取变量相关信息(类型、注释等,注释是拿上一行的注释)
Command+Y 小浮窗显示变量声明时的行
Command+[,Command+] 光标现在的位置和之前的位置切换
Command+F12 文件结构弹出式菜单
alt+H 类的层次结构
F2,shift+F2 切换到上\下一个突出错误的位置
Command+↑ 跳转到导航栏
F3 添加书签
alt+F3 添加带助记的书签
alt+1,alt+2… 切换到相应助记的书签位置
Command+F3 打开书签列表

VCS/本地历史记录


control+V 打开VST小浮窗
Command+K 提交项目
Command+T 更新项目
alt+shift+C 打开最近修改列表

搜索和替换


Command+F 搜索
Command+R 替换
Command+G 查找下一个
Command+shift+G 查找下一个
Command+shift+F 按路径搜索
Command+shift+R 按路径替换

选中文字的搜索


Command+F7 向声明的地方搜索并选中
Command+shift+F7 打开搜索框进行搜索
Command+alt+F7 打开小浮窗显示搜索列表

对项目文件的操作(重构)


F5 复制文件到某个目录
F6 移动文件到某个目录
Command+delete 安全删除
shift+F6 重命名

全局的


双击shift 弹出小浮窗搜索所有
Command+切换项目 Command+shift+ 反向切换项目
Command+shift+A 整个工程的查找操作
Command+1,Command+2… 打开各种工具窗口
alt+shift+F 把文件添加到收藏夹
alt+shift+I 打开项目描述
alt+~ 快速切换当前计划
Command+, 设置编辑器
Control+Tab 选项卡和工具窗口之间进行切换
alert+回车 显示npm版本升级列表