从git操作日志中恢复误操作

主要是两个命令 查看所有操作日志 git reflog #注意,不是 git log 根据日志,找到对应的操作id,然后恢复 git reset id # 例如 git reset 20b6e99 这个恢复操作会在当前分支进行,建新建个临时分支进行恢复。 恢复的原理有点类似windows的回收站,git也有个垃圾数据区。

February 6, 2020 · 1 min · holdsky

ubuntu 18.04 : 安装openvpn access server

apt update && apt -y install ca-certificates wget net-tools wget -qO - https://as-repository.openvpn.net/as-repo-public.gpg | apt-key add - echo "deb http://as-repository.openvpn.net/as/debian bionic main">/etc/apt/sources.list.d/openvpn-as-repo.list apt update && apt -y install openvpn-as 参考 https://openvpn.net/vpn-software-packages/

February 4, 2020 · 1 min · holdsky

gitblit : 仓库权限 mutable, specified 和 effective 的区别

仓库权限只能由仓库的所有者维护(所有者可以是多个用户)。 Mutable:拥有可以通过控制面板更改的权限 Specified:Mutable + 所有者 Effective:Specified +正则表达式,管理员等 Repo permissions can only be maintained by an owner of the repo. If you are not the owner, it will appear to let you change the permissions, but actually fail silently 支持上述说法的 代码片段 public class RegistrantPermissionsPanel extends BasePanel { private static final long serialVersionUID = 1L; public enum Show { specified, mutable, effective; public boolean show(RegistrantAccessPermission ap) { switch (this) { case specified: return ap.mutable || ap.isOwner(); case mutable: return ap.mutable; case effective: return true; default: return true; } } } private Show activeState = Show.mutable; 参考 1、 https://issue.life/questions/34595235

February 4, 2020 · 1 min · holdsky

typescript 聚合多个文件的多个类到一个命名空间

最近调研VSCode的插件开发,选择typescript语言,看了typescript的官方的指导手册关于 namespace 的使用方式,我尝试类官方给出的一个文件和多个文件场景下使用namespace 。 结果一个文件使用namesapce没有问题,但是多个文件共享namespace,VSCode的语法提示总是提示找不到xxxx。 重点说明下,插件工程使用 yo code 创建的,namespace的示例也是官方的,官方的多个文件共享一个命名空间的方法是使用 /// <reference path = "xxxx.ts" /> 指令。 百思不解,百度依然不解。幸好与多年的c++经验,借鉴c++的namespace中导入符号的方法,我找到类一条可行的路—-综合利用 nameapce , import as , extends,示意如下: a.ts内容 //a.ts export class A { } b.ts内容 //b.ts export class B { } c.ts内容 //c.ts export class C { } 然后创建一个聚合的ts文件,将 a,b,c的符号以子类继承方式聚合 my.ts //my.ts import * as _a from 'a'; import * as _b from 'b'; import * as _c from 'c'; expport namespace my { export class A extends _a.A {} export class B extends _b.B {} export class C extends _c.C {} } 使用示意: import {my} from 'my'; let tmp = new my.A();

January 21, 2020 · 1 min · holdsky

ubuntu 18.04 安装 shadowsocks server

shadowsocks 干啥用的,我就不细说了。 安装过程如下 安装pip3 shadowsocks有一个Python语言开发的实现,需要用pip安装 sudo apt-get update sudo apt-get install python3-pip 安装shadowsocks pip3 install https://github.com/shadowsocks/shadowsocks/archive/master.zip 查看是否安装成功,安装成功应该会有版本显示 ssserver --version //Shadowsocks 3.0.0 创建配置文件 sudo mkdir /etc/shadowsocks cd /etc/shadowsocks vi config.json config.json 的内容如下 { "server":"::", "local_address": "127.0.0.1", "local_port":1080, "port_password": { "8388":"端口A的密码", "9000":"端口B的密码", "9001":"端口C的密码" }, "timeout":300, "method":"aes-256-cfb", "fast_open": false } 启动server ssserver -c /etc/shadowsocks/config.json 添加server到系统服务 vi /etc/systemd/system/shadowsocks-server.service 内容如下 [Unit] Description=Shadowsocks Server After=network.target [Service] ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks/config.json Restart=on-abort [Install] WantedBy=multi-user.target 然后就可以以系统服务启动了 sudo systemctl start shadowsocks-server 参考 https://www.drsanwujiang.com/ubuntu-shadowsocks-install-and-optimize/

January 14, 2020 · 1 min · holdsky

小程序同层渲染--iOS WKWebView实现

先上代码 RenderWebViewWithNative 我只在模拟器环境中测了。 本文成文使用的环境 Xcode Version 11.3 (11C29) 模拟器版本Version 11.3 (SimulatorApp-912.5 SimulatorKit-570.3 CoreSimulator-681.17),对应iOS 13.2 同层渲染步骤 简单说下同层渲染效果,是将Native控件添加到WKWebView的子层级View中,最明显的是z-index 属性可以控制Native控件。详细请阅读https://developers.weixin.qq.com/community/develop/article/doc/000c4e433707c072c1793e56f5c813 需要前端改造的地方 为了让WKWebView为Native控件单独生成一个子层级的View,需要改变对应DOM节点的CSS样式,如 〈div style="position: fixed; font-size: 50px;overflow: scroll;-webkit-overflow-scrolling: touch" id="zl_native" 〉 〈zl-native id="zl_native_node"〉world〈zl-native〉 〈/div〉 本文成文环境中测试的结果是: WKWebView只为 position: fixed 的 标签内容生成单独的子层级视图 overflow: scroll;-webkit-overflow-scrolling: touch,在本文成文环境中不起作用;建议读者自行尝试更多的环境,以得到更准确的结论。 需要客户端改造的地方 首先,当前端加载DOM时,检测到需要Native渲染的节点,需要通过jsbridge通知客户端,把节点的信息告诉客户端。客户端根据节点信息找到对应的子层级view -(UIView *)find_zl_native_view { UIView *wkcontentview = [self get_wkcontentView]; NSMutableArray *arr = [wkcontentview.subviews mutableCopy]; while (arr.count > 0) { UIView *comp = arr.firstObject; [arr removeObjectAtIndex:0]; if ([@"WKCompositingView" isEqualToString:NSStringFromClass([comp class])]) { if ([comp.layer.name isEqualToString:@" id='zl_native'"]) { return comp; } } if (comp.subviews.count > 0) { [arr addObjectsFromArray:comp.subviews]; } } return nil; } 找到后,在这个子层级view上添加Native控件,渲染对应内容。 ...

January 13, 2020 · 1 min · holdsky

翻译: 介绍pptp 、l2tp、sstp、openvpn

文章内容为谷歌翻译 源址http://www.earthvpn.com/faq-items/what-is-the-difference-between-pptp-l2tp-sstp-and-openvpn/ PPTP 点对点隧道协议(PPTP)是Microsoft的一项发明,用于在拨号网络上创建VPN,因此多年来一直是内部业务VPN的标准协议。 它仅是一个VPN协议,并依靠各种身份验证方法来提供安全性。 它几乎在所有支持VPN的平台和设备上均作为标准配置提供,因此无需安装其他软件即可轻松设置,对于企业和个人使用而言,它仍然是一种流行的选择。 它还具有实现所需的低计算开销的优点。 EarthVPN通过MPPE 128位密码(带有或不带有压缩功能以及MS-CHAPv2身份验证)实施PPTP加密。 L2TP / IPSec 第2层隧道协议(L2TP)是通过Cisco和Microsoft之间的合作关系而产生的,其目的是提供更安全的VPN协议。 与PPTP相比,L2TP被认为是一种更安全的选择,因为结合使用了拥有更多安全加密算法的IPSec协议。 它还需要预共享的证书或密钥。 EarthVPN通过具有AES加密算法的标准化IPSec协议实现L2TP加密。 256位密钥将用于加密。 SSTP 安全套接字隧道协议(SSTP)在大多数VPN连接将被阻塞的情况下起作用。 其中包括禁止使用VPN技术的国家和某些阻止VPN连接的公司。 它使用TCP端口443,与安全套接字层(SSL)传输使用的端口相同。 这与特殊方法结合以形成数据包,以允许SSTP传输通过大多数代理和防火墙。 它被认为是VPN隧道协议中最安全的,因为它使用SSL,身份验证证书和2048位加密。 SSTP的主要缺点是它仅由Microsoft创建,仅在Windows Vista SP 1和Windows 7/8上运行。 由于它是专有软件,因此尚无计划将其正式提供给Mac OS,Linux和较旧版本的Windows用户。 如果您无法使用PPTP或L2TP协议进行连接,并且可以浏览https网站,则SSTP最有可能为您工作。 OpenVPN OpenVPN是一种相当新的开源技术,它使用OpenSSL库和SSLv3 / TLSv1协议以及其他技术来提供强大而可靠的VPN解决方案。 它的主要优点之一是高度可配置,尽管它在UDP端口上运行最好,但可以将其设置为在任何端口上运行,包括TCP端口443。这使得它的流量无法区分,除了使用SSL上的标准HTTP,因此很难阻止。 EarthVPN实施具有AES密码,128位和256位(可选)加密的OpenVPN协议,哈希算法为160位SHA1,控制通道为TLSv1 / SSLv3 DHE-RSA-AES256-SHA和2048位RSA。 EarthVPN在TCP端口80(http),443(https),992、1194、8888和UDP端口53(dns),80、992、1194和8888上提供OpenVPN / SSL VPN协议。 如果无法使用PPTP或L2TP协议进行连接,则可以尝试使用具有不同tcp和udp端口的OpenVPN进行连接。

January 8, 2020 · 1 min · holdsky

Gitblit权限类型

主要是这张图,看懂就懂 权限定义: V ,可以使用浏览器查看、订阅RSS、zip打包下载 R ,具有V的所有权限,还具有复制(克隆)远程仓库到本地的权限 RW,具有R的所有权限,还具有推送到远程仓库的权限 RWC,具有RW的所有权限,还具有创建远程分支的权限 RWD,具有RWC的所有权限,还具有删除远程分支的权限 RW+ ,具有RWD的所有权限,还具有回退远程分支的权限 其他: admin ,拥有所有权限(这毋庸置疑) owner,可以创建、编辑、重命名、删除、fork个人仓库 认证用户,可以创建个人仓库、fork个人仓库 参考http://www.gitblit.com/administration.html

January 3, 2020 · 1 min · holdsky

nwjs:使用webview加载本地网页

首先配置权限 在 package.json 中添加以下 partitions 内容 { "webview": { "partitions": [ { "name": "trusted", "accessible_resources": [ "<all_urls>" ] } ] } } 然后为webview 的dom节点添加属性 partitions="true" <webview partition="trusted"></webview> 之后就可以使用 src 属性加载本地文件。 或者使用javascript: var webview = document.createElement("webview") webview.partition="trusted" webview.src = "test/index.html" document.body.appendChild(webview) 参考https://nwjs.org.cn/doc/api/webview-Tag.html

January 1, 2020 · 1 min · holdsky

使用JavaScript在HTML DOM中设置全屏、隐藏滚动条

不显示滚动条 document.body.style.overflow = "hidden" //不显示滚动条 全屏 document.body.style.height = win.window.innerHeight + "px" document.body.style.width = win.window.innerWidth + "px"

December 31, 2019 · 1 min · holdsky