electron_docker

Docker简介

docker官网地址

Docker使用go语言开发,是实现轻量级的操作系统虚拟化解决方案。跨平台,可以帮助开发者在不同的设备之间快速创建、部署、发布应用。主要包含以下三个概念:

  • 镜像:可以理解为library(三方库),其实就是DockerFile文件
  • 容器:镜像的运行实例,每个容器都是相互隔离的,可以把容器看做是一个简易版的 Linux 环境
  • 仓库:存储镜像的仓库,如Docker Hub

使用

初始化

在Windows7 x64上初始化

下载

安装Docker

默认请全部勾选。

  • 如果已经安装过git可不安装,不过会导致Docker Quickstart Terminal打不开,需要右击编辑属性,修改快捷方式中的git地址。
  • 如果出现Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, CLSID_VirtualBox w/ IUnknown works.错误,需要修改注册表。需要将HKEY_CLASSES_ROOT\CLSID\{00020420-0000-0000-C000-000000000046}\InprocServer32HKEY_CLASSES_ROOT\CLSID\{00020424-0000-0000-C000-000000000046}\InprocServer32的默认值修改为C:\Windows\system32\oleaut32.dll

安装完成后,请打开Docker Quickstart Terminal输入docker,查看docker是否安装成功。

- 阅读剩余部分 -

背景

java或android源码中经常会使用移位运算来代替乘除运算,因为移位运算的性能比乘除运算的高(PS:对于计算机而言,移位运算只是移了个位置),所以了解移位运算的计算过程对于我们阅读源码会有一定的帮助。

原码、反码、补码

原码是人脑最容易理解和计算的表示方式

第一位表示符号, 其余位表示值

-1的原码是10000000 00000000 00000000 00000001

反码是人脑无法直观看出其数值的. 通常需要转换成原码在计算其数值

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

-1的反码是11111111 11111111 11111111 11111110

补码是人脑无法直观看出其数值的. 通常需要转换成原码在计算其数值

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

-1的补码是11111111 11111111 11111111 11111111

- 阅读剩余部分 -

来源:https://github.com/Snailclimb/JavaGuide

什么是字节码 采用字节码的最大好处是什么

什么是字节码

编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。

采用字节码的最大好处是什么

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

- 阅读剩余部分 -

常用工具方法

实现数组去重

参考地址:https://github.com/mqyqingfeng/Blog/issues/27

非通用方法,需要知道object中的主键,可避免object中key顺序变化而导致的异常情况,下面以id为例

unique (array) {
  // res用来存储结果
  let res = []
  for (let i = 0, arrayLen = array.length; i < arrayLen; i++) {
    let j = 0
    let resLen = res.length
    for (; j < resLen; j++) {
      if (array[i].id === res[j].id) {
        break
      }
    }
    if (j === resLen) {
      res.push(array[i])
    }
  }
  return res
}
unique (array) {
  let hash = {}
  array.forEach((v, i) => hash[[JSON.stringify(v)]] = i)
  let keys = Object.keys(hash)
  let list = keys.sort((a, b) => hash[a] > hash[b]).map(item => JSON.parse(item))
  return list
}

- 阅读剩余部分 -

页面样式

页面样式

需求1

从详情页返回列表页,需记录列表页的选择状态和页码

方案:使用localstorage或vuex实现

注:示例代码和业务可能存在依赖,这里只是提供思路

前提:列表页需要实现分页组件

首先在设置一个开关:openroute,实现灰度上线

props: {
  openroute: {
    type: Boolean,
    default: () => (false)
  }
}

在分页组件中存储选择条件和页码

let newPage;
//openroute处理
if (this.openroute) {
  //缓存page
  if (page) { //page存在则缓存page
    localStorage.setItem("lastPath", location.href + "@" + page);
  } else {
    let lastPath = localStorage.getItem("lastPath");
    if (lastPath && lastPath !== 'undefined' && lastPath.split('@')
      && lastPath.split('@')[0] === location.href) { //同一页面时的处理逻辑
      let condition = localStorage.getItem("condition");
      if (condition !== JSON.stringify(params.data)) { //选择条件变更则重置page
        localStorage.setItem("lastPath", location.href + "@1");
      } //选择条件未变更则保持page
    } else { //未存储过数据 或者 页面地址发生变更 时则重置page
      localStorage.setItem("lastPath", location.href + "@1");
    }
  }
  //缓存condition
  localStorage.setItem("condition", JSON.stringify(params.data));
  //获取page
  let lastPath = localStorage.getItem("lastPath");
  if (lastPath && lastPath !== 'undefined' && lastPath.split('@') && lastPath.split('@')[1]) {
    newPage = Number(lastPath.split('@')[1]);
  } else {
    newPage = 1;
  }
} else {
  newPage = page;
}

在列表页面打开开关,并且在created方法中读取存储的数据

u-pagination(@paginated="afterPagination", :params="pagination", :immediate.sync="pagination_immediate" :openroute="true")
//获取缓存的数据
let condition = localStorage.getItem("condition");
if (condition) {
  Object.assign(this.form, JSON.parse(condition))
}

存在的问题

如果请求参数和template中显示的字段不同,会增加回显的工作量。

- 阅读剩余部分 -