[编程题]evaluate-reverse-polish-notati

题目来源

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M

题目描述

链接:https://www.nowcoder.com/questionTerminal/22f9d7dd89374b6c8289e44237c70447 来源:牛客网

计算逆波兰式(后缀表达式)的值 运算符仅包含”+”,”-“,”*”和”/”,被操作数可能是整数或其他表达式 例如:

   ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9↵  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*,/. Each operand may be an integer or another expression.

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9↵  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

解题思路

思路一

  1. 利用stack来计算波兰表达式的值,这都是套路
  2. 程序鲁棒性,考虑各种可能的异常

思路:

  1. 遇到操作数就出栈,把计算结果入栈
  • 计算结果时,stack至少2个数,否则不合法,返回0
  1. 遇到数字就入栈
  • 如果不是操作数,也无法转换为数字,就返回0,这里用try catch
  1. 结果要合法:
  • 如果遍历完成,stack的元素不止1个,说明不合法,返回0
  • 当stack元素只有一个的时候,返回结果

来自 @hustZa

思路二

  1. 逆波兰表达式,用栈求解。
  2. 需要注意的一点,就是来一个新的符号的时候,将栈中的两个值取出进行操作,再放回栈中。 此时先取出的为num2,后取出的为num1,进行num1 (+-/*) num2 操作

来自 @haorlee

补充

  • c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO)
使用该容器时需要包含#include
<stack>头文件;

定义stack对象的示例代码如下:

stack
<int>s1;

stack
<string>s2;

stack的基本操作有:

1.入栈:如s.push(x);

2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。

3.访问栈顶:如s.top();

4.判断栈空:如s.empty().当栈空时返回true。

5.访问栈中的元素个数,如s.size();
  • atoi()函数将数字格式的字符串转换为整数类型
  • c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. (这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。)

参考代码

class Solution {
public:
    int evalRPN(vector
<string> &tokens) {
        if(tokens.size() == 0)
            return 0;
        stack
<int> st;
        for(int i=0;i<tokens.size();++i) {
            string s = tokens[i];
            if(s == "+" || s == "-" || s== "*" || s == "/"){
                if(st.size() < 2)
                    return 0;
                int num2 = st.top(); st.pop();
                int num1 = st.top(); st.pop();
                int result = 0;

                if(s == "+")
                    result = num1 + num2;
                else if(s == "-")
                    result = num1 - num2;
                else if(s == "*")
                    result = num1 * num2;
                else if(s == "/")
                    result = num1 / num2;
                st.push(result);
            }
            else{
                st.push(atoi(s.c_str()));
            }
        }
        return st.top();
    }
};

参考文献

助力求职之STAR法则

最近在投递简历,投了至少100个岗位,收获甚少,主要问题还在于自己是第一次求职,简历总是会出现一些问题,需要在不断的被拒中寻求方法。

今天收到一份被标记 不合适 的求职申请,得知一个 STAR 法则。

非常荣幸收到你的简历,经过我们评估,认为你与该职位不太合适,无法进入面试阶段。建议参考STAR法则对简历进行修改,并突出你在专业知识方面的优势。相信更好的机会一定还在翘首期盼着你,赶快调整心态,做好充足的准备重新出发吧!

于是百度了一下:

STAR法则是情境(situation)、任务(task)、行动(action)、结果(result)四项的缩写。STAR法则是一种常常被面试官使用的工具,用来收集面试者与工作相关的具体信息和能力。STAR法则比起传统的面试手法来说,可以更精确地预测面试者未来的工作表现。

原来这是面试官使用的工具,作为求职者如果能够了解面试官筛选简历的标准,定能够更好的修改自己的简历。

[编程题]minimum-depth-of-binary-tree

题目来源

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M

题目描述

求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。 Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

解题思路

  • 递归,若为空树返回0;
  • 若左子树为空,则返回右子树的最小深度+1;(加1是因为要加上根这一层,下同)
  • 若右子树为空,则返回左子树的最小深度+1;
  • 若左右子树均不为空,则取左、右子树最小深度的较小值,+1;

来自 @Msean

  • C++11,其中有一个是新的关键字nullptr, 如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。

参考代码

// 运行时间:12ms
// 占用内存:1024k

class Solution {
public:
    int run(TreeNode *root) {
        if(root == nullptr) return 0;
        if(root->left == nullptr) return run(root->right)+1;
        if(root->right == nullptr) return run(root->left)+1;
        int leftDepth = run(root->left);
        int rightDepth = run(root->right);
        return (leftDepth<rightDepth)?(leftDepth+1):(rightDepth+1);
    }
};

参考文献

[编程题]进制转换

题目来源

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M

题目描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述

输入一个十六进制的数值字符串。

输出描述

输出该数值的十进制字符串。

示例1 输入 0xA 输出 10

参考代码

// 链接:https://www.nowcoder.com/questionTerminal/8f3df50d2b9043208c5eed283d1d4da6
// 来源:牛客网

//C语言版本:
#include <stdio.h>
int main(){
    int a;
    while (scanf("%x", &a) != EOF){
        printf("%d\n", a);
    }
    return 0;
}

//C++版本:
#include 
<iostream>
int main(){
    int a;
    while ((cin >> hex >> a)){
        cout << a << endl;}   
    }
   return 0;
}

已上代码为技巧作答,如果是直接算,可采用下面这种:


// 链接:https://www.nowcoder.com/questionTerminal/f05223063d99432eb7f3e398741378b9
// 来源:牛客网

#include 
<iostream>
using namespace std;
int main()
{
    char c;
    int s=0;
for(int i=1;i<=4;i++)
{
    cin>>c;
    if(c>=97 && c<=102) s=s*16+c-88+1;
    if(c>=65 && c<=70) s=s*16+c-56+1;
    if(c>=48 && c<=57) s=s*16+c-48;
}
cout<<s;
return 0;
}

技巧分析

  1. cin>>hex>>a,此时如果输入12,那么a就是ox12,也就是说此时的12是十六进制的,实际上a的值为18(十进制)。此时,如果用 cout<<a ;那么输出的是18.
  2. dec是十进制 如 cout<<dec<<b 就会把b转换成10进制再输出;hex 是16进制 如 cout<<dec<<b 就会把b转换成16进制再输出

参考文献

这款云盘在国内表现很惊艳了!

前些日子在全球主机论坛看到这篇帖子:还在为空间小而烦恼么 世纪互联 onedrive 解烦恼. 大概是说 Zephyr 大佬小店里出售的 世纪互联Office365 A1 for EDU 现在使用优惠码 newyear2020 购买有很大的优惠,此前需要 123 RMB 才能买到的账号现在仅需 50 RMB 即可。看中这个东西好久了, 果断下单。

大家日常使用的 Office 365 以及由微软提供的 OneDrive 在中国境内是没有服务器的,对中国近内的服务是通过香港或新加坡等地的服务器提供的,因此延迟、速率、稳定性等都得不到保障,常常会出现 OneDrive 同步好久最后失败的情况,造成 OneDrive 在国内的体验不佳。

由世纪互联运营的 Office 365 旨在满足中国用户对安全可靠的可扩展云服务的需求。此服务由 Microsoft 授权给世纪互联使用的技术提供支持。由世纪互联运维的 Office 365、OneDrive 服务在国内的体验就很棒了,同步数据、搭建资源分享站分分钟跑满带宽,目前官方提供的客户端已经全系支持世纪互联版OneDrive,可以放心使用了!

值得注意的是,网页版的管理面板需要通过这个网址登入:https://portal.partner.microsoftonline.cn

打开方式

想要用上由世纪互联提供的云存储服务,有两种方案,最靠谱的方式就是订阅官方套餐。

附上世纪互联正版购买链接:https://products.office.com/zh-cn/compare-china-global-versions-office365

其中32元/月及以上的套餐包含1T的OneDrive储存空间(可扩容至5T,文档参考https://docs.microsoft.com/zh-cn/onedrive/change-user-storage),确有所需建议支持正版

此外还可以购买第三方提供的账号,此举措没有那么靠谱,翻车了数据就丢了,玩一玩可以,成本相对较低,开头提到的小店里就有售,这个小店是比较稳的一家。

购买时需要注意,购买的账号必须有管理员,开放API,可自已注册应用,获取client_id、client_secret 才可以配置支持世纪互联的各种第三方程序,如olaindex / olaindex魔改多盘 / OneDriveUploader / OneList / oneindex魔改版 / pyone / zifile / cuteone。

下面介绍一下使用世纪互联 OneDrive 搭建资源分享站的教程。

附上本人资源站链接:https://res.frytea.com

搭建资源分享站

第一步,配置Azure AD 应用程序

访问 Azure控制台,访问https://portal.azure.cn。

依次点击【Azure Active Directory】选择【应用注册】,再点击【新应用注册】。

创建应用界面参数如图填写,然后点击创建

授予SharePoint权限,进入程序主页,点击【设置】-【所需权限】

点击密钥,描述随意填写如【sample】,有效时期一定要选【1年内】,不然会出现无授权的现象。点击保存,【值】选项下会出现一串密钥,即AAD密钥,复制到记事本保存

在应用程序主页,我们可以看到【应用程序ID】,如图点击复制,复制到记事本保存

至此,应用注册已经完成

第二步,本地 PHP 运行环境

以下两种方案选一即可,目的为在本地搭建 PHP 运行环境:

第三步,配置OneIndex修改版参数

我们采用大神开源在GitHub 上专门用于世纪互联 OneDrive 的 OneIndex 修改版进行搭建:

oneindex2-in:https://github.com/lzx8589561/oneindex2-in

之后删除WAMP Sever(或phpEnv)网站目录下全部文件,将 oneindex2-in 中拉取的内容放入网站目录。

修改 /config/base.php,填入你的应用ID和密钥,redirect_url填写 http://localhost,点击保存。注意粘贴的时候不要把两边分号删掉,也不要留下空格。

在配置中加一行:'one_prefix' => 'alphaone-my',,这里配置世纪互联 OneDrive 的前缀,需访问网页版 OneDrive 获取,具体操作方法为:登陆网页版 OneDrive,获取类似 http://*.sharepoint.cn/ 中的三级域名的位置,在 /config/base.php 中世纪互联前缀填入获取到的三级域名。

至此,参数配置已完成

第四步,绑定账户

确保PHP运行环境下的网站服务器已运行,浏览器访问 http://localhost

点击绑定账户,根据指示进行登录

完成后会清除浏览器缓存可以看到OneIndex已成功获取并显示文件列表

*在这里你就可以将网站目录下所有文件打包上传到你的服务端了。

实测资源站在国内的下载速度是可以跑满带宽的,同步也是很稳定快速的。

参考文献

一键配置 Seafile 云盘并开启 https 访问

前些日子终于受够了臃肿的 Nextcloud ,将其完全卸载,寻觅已久之后选择了 Seafile 云盘。之所以放弃 Nextcloud,大致有以下原因:

  • 插件丰富,功能强大的同时带来运行缓慢的问题
  • PHP 执行长时间大内存任务时容易出错
  • iPhone 客户端莫名闪退,Linux 客户端无法打开
  • Rclone 执行长时间文件读取操作时会容易出错,同第二条

综上原因,虽然 Nextclud 有着完整的功能和完善的生态,但并不适合目前的我个人使用。

之后发现 Seafile 提供全平台客户端,服务端安装简单,文档齐全,实测功能也比较全,带有 webdav ,使用 Python 运行速度也是不错的,因此选择 Seafile 做个人云盘。

接下来介绍分两部分:

  1. Seafile 云盘一键安装(使用官方提供的脚本)
  2. 配置域名并配置 SSL 加密通讯

Seafile 云盘一键安装

官方文档提到「如果您是初次部署 Seafile 服务,我们建议您使用自动安装脚本来快速部署一个 Seafile 服务。」

本人是第一次安装 Seafile ,对于各项配置不是很熟悉,因此采用这种方式,更容易上手。开始前需保证服务器是干净的。

第一步,获取脚本

运行如下命令获取脚本:


# 适用于 Seafile 7.1.x 及以上版本
## Ubuntu 18.04 (64bit):

wget https://raw.githubusercontent.com/haiwen/seafile-server-installer-cn/master/seafile-server-7.1-ubuntu-amd64-http

## CentOS 8 (64bit):

wget https://raw.githubusercontent.com/haiwen/seafile-server-installer-cn/master/seafile-server-7.1-centos-amd64-http

# 适用于 Seafile 6.x.x 及以上版本
## Ubuntu 16.04/18.04 (64bit):

wget https://raw.githubusercontent.com/haiwen/seafile-server-installer-cn/master/seafile-server-ubuntu-amd64-http

## CentOS 7 (64bit):

wget https://raw.githubusercontent.com/haiwen/seafile-server-installer-cn/master/seafile-server-centos-7-amd64-http

注:若服务器访问 GitHub 有困难,可以考虑在较好网络环境下访问 GitHub ,拷贝脚本内容到服务器,之后手动运行。

第二步,运行脚本(以 7.1.0 为例)


# Ubuntu 16.04/18.04 (64bit):

bash seafile-server-ubuntu-amd64-http 7.1.0

# CentOS 7 (64bit):

bash seafile-server-centos-7-amd64-http 7.1.0

第三步,选择安装版本

在这里选择 CE 版,即开源社区版。

完成后就可以看到打印输出的结果,在这里记得保存 用户名密码,这是您的管理员账户。

至此,完成了最基本的 Seafile 部署,此时访问 http://*.*.*.* 其中 *.*.*.* 是您服务器 IP 地址。之后输入刚才输出的用户名和密码,就可以进入 Seafile 了。

为 Seafile 配置 https 访问

第一步,域名解析

将域名解析到服务器。

第二步,通过 OpenSSL 生成 SSL 数字认证

免费 Self-Signed SSL 数字证书用户请看. 如果你是 SSL 付费证书用户可跳过此步.

首先进入OpenSSL目录,cd /etc/ssl ,之后运行如下命令。

openssl genrsa -out privkey.pem 2048
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

第三步,修改 Nginx 配置文件

请修改 nginx 配置文件以使用 HTTPS,首先进入脚本自动配置的 Nginx 为 Seafile 反代的配置文件目录:cd /etc/nginx/sites-enabled

主要修改两个部分:

首先添加一个 server 用来将 http 重定向到 https:


server {
listen       80;
server_name  cfile.frytea.com;
rewrite ^ https://$http_host$request_uri? permanent;#强制将http重定向到https
    server_tokens off;
}

之后在原有监听 80 端口为 http://127.0.0.1:8000/ 服务代理的服务上进行修改,将 80 改为 443,将域名改为您的域名,之后添加以下部分:


ssl on;
ssl_certificate /etc/ssl/cacert.pem;#cacert.pem 文件路径
ssl_certificate_key /etc/ssl/privkey.pem;   #privkey.pem 文件路径
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:5m;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    server_tokens off;

用来制定证书路径并配置一些必要的信息。

第四步,重新加载 Nginx

nginx -s reload

下面贴上本人的配置文件:


log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';

server {
listen       80;
server_name  cfile.frytea.com;
rewrite ^ https://$http_host$request_uri? permanent;#强制将http重定向到https
    server_tokens off;
}

server {
listen 443;
server_name cfile.frytea.com;
proxy_set_header X-Forwarded-For $remote_addr;

ssl on;
ssl_certificate /etc/ssl/cacert.pem;#cacert.pem 文件路径
ssl_certificate_key /etc/ssl/privkey.pem;   #privkey.pem 文件路径
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:5m;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    server_tokens off;

location / {
proxy_passhttp://127.0.0.1:8000;
proxy_set_header   Host $host;
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Host $server_name;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_read_timeout  1200s;
# used for view/edit office file via Office Online Server
client_max_body_size 0;
access_log      /var/log/nginx/seahub.access.log seafileformat;
error_log/var/log/nginx/seahub.error.log;
    }

location /seafhttp {
rewrite ^/seafhttp(.*)$ $1 break;
proxy_pass http://127.0.0.1:8082;
client_max_body_size 0;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout  36000s;
proxy_read_timeout  36000s;
access_log      /var/log/nginx/seafhttp.access.log seafileformat;
error_log/var/log/nginx/seafhttp.error.log;
}
location /media {
root /opt/seafile/seafile-server-latest/seahub;
}
location /seafdav {
proxy_passhttp://127.0.0.1:8080/seafdav;
proxy_set_header   Host $host;
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header   X-Forwarded-Host $server_name;
proxy_set_header   X-Forwarded-Proto $scheme;
proxy_read_timeout  1200s;
client_max_body_size 0;
access_log      /var/log/nginx/seafdav.access.log seafileformat;
error_log/var/log/nginx/seafdav.error.log;
}
}

修改 Seafile 配置文件

现在 nginx 部分已经完成,但是 Seafile 并不知道,此时已经可以通过 https://your domain 访问,下面还需要配置 Seafile 的默认域名:

修改 Seafile 配置文件:

vim /opt/seafile/conf/seahub_settings.py

在以下位置修改:

SERVICE_URL: https://www.myseafile.com
FILE_SERVER_ROOT: https://www.myseafile.com/seafhttp

最后重启 Seafile 和 Seahub


cd /opt/seafile/seafile-server-latest
./seafile.sh restart
./seahub.sh restart

完成!最后记得管理员登入管理中心,在设置里配置一下新的地址。

参考文献

GitLab 神奇问题之ssl

今天配置 GitLab 时为 GitLab Pages 配置 SSL 总是有问题,大概表现为:

  • 不开启 ssl 就无法让 gitlab pages 实现 https 访问
  • 开启 ssl 后可能无法访问
  • 对设置变更后可能需要重新部署 pages

经过长时间的摸索,发现 gitlab pages 的配置有三级:

  • 第一级:http 访问
  • 第二级:指定泛域名 https 访问(提前申请好泛域名证书)
  • 第三级:处https 访问外还可绑定自定义域名。

如果想要实现第三级 gtilab pages 目前看来至少需要两个 ip 地址,一个用于 gitlab 的主要 ip 解析,另一个用于 gitlab pages 网页解析。

目前本人只有一个 ip ,因此实现到第二级。

想要实现 https 的访问,不可心急,必须按照管网的流程,先配置 http 访问,再配置 https 访问。

下面简单说说步骤:

第一步:开启 gitlab pages 功能

此前需要解析一个泛域名到服务器,类似 *.pages.frytea.com

之后在 gitlab 配置文件 /etc/gitlab/gitlab.rb 中指定这个域名:

pages_external_url 'http://pages.frytea.com'

之后重载配置 sudo gitlab-ctl reconfigure ,就开启了 gitlab 的 pages 功能。

第二步:实现 https 访问

想要实现 https 访问,需要在开启 gitlab pages 的前提下,进行下一步:

申请好泛域名证书后,放入 /etc/gitlab/ssl 文件夹下,

之后修改 gitlab 配置文件 /etc/gitlab/gitlab.rb

pages_external_url 'http://pages.frytea.com'

pages_nginx['redirect_http_to_https'] = true
pages_nginx['ssl_certificate'] = "/etc/gitlab/ssl/pages-nginx.crt"
pages_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/pages-nginx.key"

之后重载配置 sudo gitlab-ctl reconfigure ,回到 gitlab 会发现已经实现了 https 访问。

参考文献

迁移 GitLab 小记

由于服务器到期等因素,需要对 GitLab 进行迁移,在此记下一段历程。

首先要保证迁入和迁出 GitLab 的版本是一致的,使用这一条指令:

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

我的两个服务器输出分别是:

# 迁入服务器
$ cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
12.7.5-ee
# 迁出服务器
$ cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
12.5.2-ee

升级 GitLab

因此需要对服务器进行升级。

我采用的安装方法是 Omnibus, 采用官网推荐的方式进行升级:

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install gitlab-ce

# Centos/RHEL
sudo yum install gitlab-ce

# 如果是 ee就修改为 ee

其他升级方式可以来这里看:Updating GitLab installed with the Omnibus GitLab package

打备份包

我采用的安装方法是 Omnibus, 采用官网推荐的方式进行打包:Creating a backup of the GitLab system

$ sudo gitlab-backup create
2020-02-06 10:23:21 +0000 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2020-02-06 10:23:23 +0000 -- done
2020-02-06 10:23:23 +0000 -- Dumping repositories ...
 * songtianlun/journal (@hashed/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b) ... [SKIPPED]
[SKIPPED] Wiki
 * songtianlun/Frytea-Timeline (@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/haut-gis-org-github-io (@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/frytea-docs (@hashed/ef/2d/ef2d127de37b942baad06145e54b0c619a1f22327b2ebbcfbec78f5564afe39d) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/gatsby-starter-gine-blog (@hashed/e7/f6/e7f6c011776e8db7cd330b54174fd76f7d0216b612387a5ffcfb81e6f0919683) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/frytea-docs-ex (@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Frytea-DataShare (@hashed/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/markmap (@hashed/19/58/19581e27de7ced00ff1ce50b2047e7a567c76b1cbaebabe5ef03f7c3017bb5b7) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Gis-SoDev-Expriment (@hashed/4a/44/4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/jenkins-android-sample (@hashed/4f/c8/4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Markdown-Syntax-CN (@hashed/6b/51/6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/hexo-blog (@hashed/85/27/8527a891e224136950ff32ca212b45bc93f69fbb801c3b1ebedac52775f99e61) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Flash-Light (@hashed/e6/29/e629fa6598d732768f7c726b4b621285f9c3b85303900aa912017db7617d8bdb) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Image-Hosting (@hashed/45/23/4523540f1504cd17100c4835e85b7eefd49911580f8efff0599a8f283be6b9e3) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/vue_vue2leaflet (@hashed/4e/c9/4ec9599fc203d176a301536c2e091a19bc852759b255bd6818810a42c5fed14a) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/home-forward (@hashed/94/00/9400f1b21cb527d7fa3d3eabba93557a18ebe7a2ca4e471cfe5e4c5b4ca7f767) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/nodeppt (@hashed/f5/ca/f5ca38f748a1d6eaf726b8a42fb575c3c71f1864a8143301782de13da2d9202b) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/PathManager (@hashed/6f/4b/6f4b6612125fb3a0daecd2799dfd6c9c299424fd920f9b308110a2c1fbd8f443) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/perpetual-config (@hashed/78/5f/785f3ec7eb32f30b90cd0fcf3657d388b5ff4297f2f9716ff66e9b69c05ddd09) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/PathManager-Site (@hashed/53/5f/535fa30d7e25dd8a49f1536779734ec8286108d115da5045d77f3b4185d8f790) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/CuteOneP (@hashed/c2/35/c2356069e9d1e79ca924378153cfbbfb4d4416b1f99d41a2940bfdb66c5319db) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Education-manage-system (@hashed/b7/a5/b7a56873cd771f2c446d369b649430b65a756ba278ff97ec81bb6f55b2e73569) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/PL-indoor-RouteAnalyser (@hashed/5f/9c/5f9c4ab08cac7457e9111a30e4664920607ea2c115a1433d7be98e97e64244ca) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/ResumeSample (@hashed/67/06/670671cd97404156226e507973f2ab8330d3022ca96e0c93bdbdb320c41adcaf) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/programmer-url-navigation (@hashed/59/e1/59e19706d51d39f66711c2653cd7eb1291c94d9b55eb14bda74ce4dc636d015a) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/putianxi-github-io (@hashed/35/13/35135aaa6cc23891b40cb3f378c53a17a1127210ce60e125ccf03efcfdaec458) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/ci-matters (@hashed/62/4b/624b60c58c9d8bfb6ff1886c2fd605d2adeb6ea4da576068201b6c6958ce93f4) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/coding-interview-university (@hashed/eb/1e/eb1e33e8a81b697b75855af6bfcdbcbf7cbbde9f94962ceaec1ed8af21f5a50f) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/zhongguojinxiandaishishijianzhou (@hashed/e2/9c/e29c9c180c6279b0b02abd6a1801c7c04082cf486ec027aa13515e4f3884bb6b) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Web-Demo (@hashed/c6/f3/c6f3ac57944a531490cd39902d0f777715fd005efac9a30622d5f5205e7f6894) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/WebGis-SIC-Dev-Experiment (@hashed/86/e5/86e50149658661312a9e0b35558d84f6c6d3da797f552a9657fe0558ca40cdef) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/Small-Supermarket-manager-system (@hashed/9f/14/9f14025af0065b30e47e23ebb3b491d39ae8ed17d33739e5ff3827ffb3634953) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/sou (@hashed/76/a5/76a50887d8f1c2e9301755428990ad81479ee21c25b43215cf524541e0503269) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/songtianlun.pages.frytea.com (@hashed/7a/61/7a61b53701befdae0eeeffaecc73f14e20b537bb0f8b91ad7c2936dc63562b25) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/setup-node (@hashed/ae/a9/aea92132c4cbeb263e6ac2bf6c183b5d81737f179f21efdc5863739672f0f470) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/trajectory-community (@hashed/0b/91/0b918943df0962bc7a1824c0555a389347b4febdc7cf9d1254406d80ce44e3f9) ... [SKIPPED]
[SKIPPED] Wiki
 * songtianlun/gis-changchun-info-vue (@hashed/d5/9e/d59eced1ded07f84c145592f65bdf854358e009c5cd705f5215bf18697fed103) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/PlanAssistant (@hashed/3d/91/3d914f9348c9cc0ff8a79716700b9fcd4d2f3e711608004eb8f138bcba7f14d9) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/materialistic (@hashed/71/ee/71ee45a3c0db9a9865f7313dd3372cf60dca6479d46261f3542eb9346e4a04d6) ... [DONE]
[SKIPPED] Wiki
 * songtianlun/android-example (@hashed/81/17/811786ad1ae74adfdd20dd0372abaaebc6246e343aebd01da0bfc4c02bf0106c) ... [DONE]
[SKIPPED] Wiki
2020-02-06 10:23:46 +0000 -- done
2020-02-06 10:23:46 +0000 -- Dumping uploads ...
2020-02-06 10:23:47 +0000 -- done
2020-02-06 10:23:47 +0000 -- Dumping builds ...
2020-02-06 10:23:47 +0000 -- done
2020-02-06 10:23:47 +0000 -- Dumping artifacts ...
2020-02-06 10:23:50 +0000 -- done
2020-02-06 10:23:50 +0000 -- Dumping pages ...
2020-02-06 10:23:51 +0000 -- done
2020-02-06 10:23:51 +0000 -- Dumping lfs objects ...
2020-02-06 10:23:51 +0000 -- done
2020-02-06 10:23:51 +0000 -- Dumping container registry images ...
2020-02-06 10:23:51 +0000 -- [DISABLED]
Creating backup archive: 1580984631_2020_02_06_12.7.5-ee_gitlab_backup.tar ... done
Uploading backup archive to remote storage  ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... skipping
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
Backup task is done.

完成后就已经对 GitLab 整个系统备份到 /var/opt/gitlab/backups,根据官网除了打包还需要备份以下两个文件:

  • /etc/gitlab/gitlab-secrets.json
  • /etc/gitlab/gitlab.rb

因此将这个两个文件也拷入 backups 文件夹,以便后面打包迁移:

cp /etc/gitlab/gitlab-secrets.json /var/opt/gitlab/backups/gitlab-secrets.json
cp /etc/gitlab/gitlab.rb /var/opt/gitlab/backups/gitlab.rb

完成后看一下 /var/opt/gitlab/backups 文件夹中就是我们需要迁移走的所有文件啦

$ ls
1580984631_2020_02_06_12.7.5-ee_gitlab_backup.tar  gitlab.rb  gitlab-secrets.json

对它进行打包:

# 打包后,以 gzip 压缩
$ tar -zcvf /tmp/gitlab.2020.2.6.backups.tar.gz /var/opt/gitlab/backups
tar: Removing leading `/' from member names
/var/opt/gitlab/backups/
/var/opt/gitlab/backups/gitlab.rb
/var/opt/gitlab/backups/1580984631_2020_02_06_12.7.5-ee_gitlab_backup.tar
/var/opt/gitlab/backups/gitlab-secrets.json

安装 阿里云 ossutils 工具

在这里使用阿里云 oss 做中转,你也可使用其他方式将压缩包传入待转入服务器。

首先安装:

# 下载工具:
$ wget http://gosspublic.alicdn.com/ossutil/1.6.10/ossutil64                           

# 修改文件执行权限:
$ chmod 755 ossutil64

# 使用交互式配置生成配置文件:
$ ./ossutil64 config
请输入配置文件名,文件名可以带路径(默认为:/home/user/.ossutilconfig,回车将使用默认路径。如果用户设置为其它路径,在使用命令时需要将--config-file选项设置为该路径):
未输入配置文件路径,将使用默认配置文件:/home/user/.ossutilconfig。
对于下述配置,回车将跳过相关配置项的设置,配置项的具体含义,请使用"help config"命令查看。
请输入endpoint:http://oss-cn-shenzhen.aliyuncs.com
请输入accessKeyID:yourAccessKeyID
请输入accessKeySecret:yourAccessKeySecret
请输入stsToken:

使用命令查看 endpoint,

$ ./ossutil64 ls
CreationTime                                 Region    StorageClass    BucketName
2020-02-06 06:06:37 +0000 UTC        oss-cn-beijing        Standard    oss://frytea-temporary
2019-01-12 01:59:01 +0000 UTC        oss-cn-beijing        Standard    oss://mywebsites
2019-11-12 06:47:12 +0000 UTC       oss-cn-shenzhen        Standard    oss://onedrive-index
Bucket Number is: 3

0.298487(s) elapsed

上传

$ ./ossutil64 cp /tmp/gitlab.2020.2.6.backups.tar.gz oss://frytea-temporary/gitlab/
Succeed: Total num: 1, size: 558,098,855. OK num: 1(upload 1 files).                                        

150.496710(s) elapsed

接下来来到待迁入服务器,同样执行 安装 之后进行下载:

$ ./ossutil64 cp oss://frytea-temporary/gitlab/gitlab.2020.2.6.backups.tar.gz ~
Succeed: Total num: 1, size: 558,098,855. OK num: 1(download 1 objects).                                     

10.706132(s) elapsed

在这类迁入服务器是阿里云服务器,因此下载速度很快。

还原备份

首先将下载好的文件夹解压:

$ tar -zxvf gitlab.2020.2.6.backups.tar.gz
var/opt/gitlab/backups/
var/opt/gitlab/backups/gitlab.rb
var/opt/gitlab/backups/1580984631_2020_02_06_12.7.5-ee_gitlab_backup.tar
var/opt/gitlab/backups/gitlab-secrets.json

压缩时保留了原有目录结构。

将备份文件拷入迁入服务器的 /var/opt/gitlab/backups/ 文件夹:

mv ~/var/opt/gitlab/backups/1580984631_2020_02_06_12.7.5-ee_gitlab_backup.tar /var/opt/gitlab/backups/

下面停止 GitLab 中于数据库交换数据的 服务:

$ sudo gitlab-ctl stop unicorn
ok: down: unicorn: 3188s, normally up
$ sudo gitlab-ctl stop puma
$ sudo gitlab-ctl stop sidekiq
ok: down: sidekiq: 3186s, normally up
$ sudo gitlab-ctl status
run: alertmanager: (pid 23730) 4249s; run: log: (pid 23210) 4343s
run: gitaly: (pid 23585) 4252s; run: log: (pid 22585) 4451s
run: gitlab-exporter: (pid 23620) 4251s; run: log: (pid 23064) 4359s
run: gitlab-workhorse: (pid 23569) 4253s; run: log: (pid 22926) 4386s
run: grafana: (pid 23750) 4248s; run: log: (pid 23407) 4296s
run: logrotate: (pid 28170) 780s; run: log: (pid 22977) 4379s
run: nginx: (pid 23409) 4295s; run: log: (pid 22937) 4384s
run: node-exporter: (pid 23603) 4252s; run: log: (pid 23035) 4367s
run: postgres-exporter: (pid 23741) 4249s; run: log: (pid 23245) 4337s
run: postgresql: (pid 22682) 4446s; run: log: (pid 22731) 4443s
run: prometheus: (pid 23636) 4250s; run: log: (pid 23143) 4349s
run: redis: (pid 22520) 4458s; run: log: (pid 22535) 4457s
run: redis-exporter: (pid 23623) 4251s; run: log: (pid 23091) 4355s
run: registry: (pid 23578) 4252s; run: log: (pid 23018) 4371s
down: sidekiq: 3188s, normally up; run: log: (pid 22891) 4390s
down: unicorn: 3195s, normally up; run: log: (pid 22877) 4397s

恢复备份:

$ sudo gitlab-backup restore BACKUP=1580984631_2020_02_06_12.7.5-ee
# 这里去掉备份名字的_gitlab_backup.tar
# 以下是输出
Transfering ownership of /var/opt/gitlab/gitlab-rails/shared/registry to git:git
Unpacking backup ... done
Before restoring the database, we will remove all existing
tables to avoid future upgrade problems. Be aware that if you have
custom tables in the GitLab database these tables and all data will be
removed.

Do you want to continue (yes/no)? yes
Removing all tables. Press `Ctrl-C` within 5 seconds to abort
2020-02-06 18:47:41 +0800 -- Cleaning the database ...
2020-02-06 18:47:42 +0800 -- done
2020-02-06 18:47:42 +0800 -- Restoring database ...
Restoring PostgreSQL database gitlabhq_production ... SET
...
rake aborted!
Errno::ENOENT: No such file or directory - /var/opt/gitlab/backups/registry.tar.gz
/opt/gitlab/embedded/service/gitlab-rails/lib/backup/files.rb:76:in `run_pipeline!'
/opt/gitlab/embedded/service/gitlab-rails/lib/backup/files.rb:44:in `restore'
/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:234:in `block (4 levels) in <top (required)>'
/opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/backup.rake:71:in `block (3 levels) in <top (required)>'
/opt/gitlab/embedded/bin/bundle:23:in `load'
/opt/gitlab/embedded/bin/bundle:23:in `
<main>'
Tasks: TOP => gitlab:backup:registry:restore
(See full trace by running task with --trace)
Transfering ownership of /var/opt/gitlab/gitlab-rails/shared/registry to registry:registry

将之前备份的另外两个文件迁入:

mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.2020.2.6.backup
mv /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.2020.2.6.backup
mv ~/var/opt/gitlab/backups/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json
mv ~/var/opt/gitlab/backups/gitlab.rb /etc/gitlab/gitlab.rb

重启 GitLab

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

完成!

参考文献

解决VMeare 安装 Android x86 错误

今天尝试使用 VMware 安装Android x86 9.0 时出现一个问题。

安装过程参考教程:

安装镜像来源:https://www.android-x86.org/download

完成安装进行 Reboot 时,出现了 detecting android-x86 found at /dev/sda1 错误。

此时参考文章:vmware虚拟机安装android-x86-8.1-rc2遇到的坑 解决这一错误。

解决方法摘录如下:

启动项选择时按 e 编辑 找到字串 quiet 改成 nomodeset xforcevesa 然後按 Enterb 啟動

运行效果:

2020-02-05-21-11-51-0c749eb685577f67.png

2020-02-05-22-03-01-e3801ae55f5fd7e6.png

参考文献

还记得使用手机的最基本诉求吗

时值今日,智能手机的普及使得手机在生活中充当的角色越来越多。强劲的硬件可以承担起更大的运算任务,人们不断挖掘智能手机运算里的极限,进而不断推进智能手机硬件的发展。

可是今天的你是否还记得,使用手机的最基本诉求都有哪些呢?

打电话?短信?收发邮件?日程管理?便签?

或许对于许多人来说,智能手机的这些功能已经被边缘化,看新闻、看视频、娱乐等功能成了主流。但长远来看,智能手机作为人们随身携带的电子设备,其随身特性带来的便捷还是最重要的,需要联系人的时候用手机打个电话,使用手机管理自己的日程,突然需要记录一些东西就用手机便签记录。

跨平台接力

解决这些随时出现的最基本诉求之后,又需要解决一个问题,即 数据的多端同步问题 。或许每一个人都不止一个智能设备,为了保证最舒适最高效的工作,需要在多个设备之间切换。如果是苹果家族可以使用苹果提供的苹果生态,会有非常不错的体验。但并不是所有人都用苹果全家桶的,因此今天就介绍一个可以用于众多设备 (包括 IOS/Android/Desktop)的解决方案,即 Microsoft Exchange。

Microsoft Exchange Server是微软公司的一套电子邮件服务组件。除传统的电子邮件的存取、储存、转发作用外,在新版本的产品中亦加入了一系列辅助功能,如语音邮件、邮件过滤筛选和OWA(基于Web的电子邮件存取)。Exchange Server支持多种电子邮件网络协议,如SMTP、NNTP、POP3和IMAP4。

回归到实际带来的东西,使用这一协议提供的服务,可以多端同步 邮件、通讯录、日历、待办事项以及备忘录。

79749B7D-A8F8-44AF-8EA7-63A88EE68E5B820e9e8395510dbd.png

只要是支持提供 Microsoft Exchange 的设备,就可以在设备上多端同步您的邮件、联系人、记事本和日历。而当前的 ios / Android 设备,大部分都是支持这一协议的,因此只需要在设备上绑定一个 Microsoft Exchange 的账号,就可以实现这一效果。

75A37AC7-DDF8-466F-BF14-A29580590E871b59b6d496011d04.png

使用方法

想要开启这一切的方法很简单,目前大部分邮件提供商如 腾讯邮箱、阿里企业邮箱、网易企业邮箱都是支持这一协议的,但实测从阿里企业邮箱到腾讯企业邮箱,针对这一协议服务的支持较弱,表现出来就是同步不完全,或是同步很慢,最终发现这一协议的提出者 Microsoft 提供的 outlook 邮件对这一服务的支持比较好,同步很及时,因此建议使用 Microsot Outlook 提供的 Exchange 服务。

第一步:注册 Outlook 邮箱:

首先进入 Outlook 官网(https://outlook.live.com/) 注册一个账号。

2020-02-05-21-40-01-81f67f38a5ce70b0.png

第二步:在需要的设备上添加账号:

在您的 Android/ios 设备上添加一个账号,选择协议时选择 Microsoft Exchange ,之后填入账号和密码即可。

如果需要输入服务器地址,按照这一原则:

对任何以 @outlook.com、@hotmail.com、@msn.com 或 @live.com 结尾的电子邮件帐户(包括托管于 Outlook.com 的任何其他帐户)输入“eas.outlook.com”。 对 Office 365 商业版 上承载的任何工作或学校帐户使用outlook.office365.com 。

Screenshot_20200205-152324_Settings2adcf2581073bf15.jpg

第三步:完成。

如果有问题,欢迎在博客下留言。

总结

使用 Microsoft Outlook 提供的 Exchange 服务可以很好的实现多个终端的接力,虽然实现不了苹果生态那样完善多样,基本可以实现本人理解的智能手机最基本功能的诉求,即通讯录、邮件、日历、记事本的多设备同步,目前移动设备、平板电脑、桌面设备几乎都是支持这一协议的,更不用说 Microsoft 的设备了。这是本人对比了阿里、腾讯提供的 Exchange 服务后选择了 Microsoft 提供的 服务,除此之外的 SMTP,IMAP 等只是邮件的收发,使用 Exchange 服务可以提供更多的功能。

综上,介绍了一种支持几乎所有设备的接力,希望对您有所帮助。

参考文献