当前位置: 首页 > 编程日记 > 正文

博客大事记之迁移博客到香港主机

个人博客:https://rebootcat.com/2020/11/10/move_blog_hk/

前言

之前其实已经写过一篇博文: 迁移博客到香港虚拟空间,那为什么又要写这篇博客呢?

上次其实是把我的博客迁移到一个香港的虚拟空间里,但是不到半年的时间已经出现过 4 次宕机事件,每次持续时间 4~5 小时,阿里云 和 UpTimeRobot 的监控报警报了一大堆,邮箱都快塞满了。想着宕机就宕机吧,至少还能恢复,还能凑合用,结果呢,就在前几天当时购买虚拟空间的官网都 GG 了,管理员跑路了。。。

可能他没挣到钱吧,买一台服务器打算开很多共享的虚拟空间来卖,可能也只有我买了一个,因为我后来看了下我的博客同 IP 的网站就两个,好嘛,结果就跑路了。。。这里就不点名是哪一家了,八字开头的一个云。

好吧,言归正传,正好双 11,那就干脆直接买服务器吧,所以就购买了腾讯的一台轻量级云服务器,峰值 30Mbps,月流量 1024G,能满足我的需求,况且有了服务器,能做的事情就很多了。比如我还有其他的博客也可以解析到这里,比如可以定制化一些动态博客,比如可以使用自动化发布等。

那本文大致就记录下迁移的一些过程以及踩坑优化等:

  • 服务器购买以及初始化
  • 安装部署 nginx
  • 部署博客源码
  • 解析域名
  • 设置 https 证书
  • 绑定多个域名
  • 使用 github actions 自动化部署博客(踩坑)
  • https 性能优化

服务器购买及初始化

双 11 活动,购买了一台轻量级的腾讯云服务器。然后就是初始化服务器,登录服务器,设置 ssh key 登录等。

注意这里一定要设置 ssh key 登录,因为后面用的到。

安装部署 nginx

安装

$ yum install nginx -y

启动

$ systemctl start nginx

然后浏览器访问:

$ curl http://your_public_ip

如果一切正常,说明 nginx 启动正常。接下来把 nginx 添加到系统启动项随开机启动:

$ systemctl enable nginx.service

部署博客源码

博客采用的是 hexo 生成的静态博客,所以只需要把博客仓库克隆下来就行:

安装 git

$ yum install git -y

克隆博客网站源码到某个目录:

$ git clone https://github.com/smaugx/smaugx.github.io.git  /root/

设置 nginx 配置文件中 80 端口的 root 为博客源码的目录:

# nginx.conf
root         /usr/share/nginx/html/smaugx.github.io;

重启 nginx:

$ systemctl restart nginx

验证博客是否正常:

$ curl http://your_public_ip

正常能看到博客的主页了。

解析域名

接下来是把域名 rebootcat.com 解析到这台机器上, 如下:

主机|类型|线路|记录值|MX优先级|TTL|备注|状态
@	NS	默认	f1g1ns1.dnspod.net.	0	86400		正常
@	NS	默认	f1g1ns2.dnspod.net.	0	86400		正常
@	A	默认	101.33.123.30    	0	600		正常
@	TXT	默认	google-site-xxx	86400		正常
www	A	默认	101.33.123.30	      0	600		正常
@	TXT	默认	mP8ROM8AEYs9Zxxxx	0	600		正常

解析生效之后,验证是否成功:

$ curl http://rebootcat.com

设置 https 证书

全程参考这篇博文:

Linux CentOS 7 下 Nginx 安装使用 Let’ s Encrypt 证书的完整过程

这篇文章已经写的很清楚了,照着操作就行。

设置完成应该就能使用 https 访问了:

$ curl https://rebootcat.com

绑定多个域名

我还把 loveyxq.online 也解析到了这台机器上,这是我另外一个博客,给我女朋友用的一个。

nginx 的配置见后文。

使用 github actions 自动化部署博客(踩坑)

经过了上面的步骤,博客已经算是迁移完成了,不过每次更新博客能否直接部署道这台机器上呢?

答案是能的,而且方法很多种。我采用的是 github 自家的持续部署工具 Github Actions.

添加 github 仓库配置

如上图所示,分别在 Secrets 项添加 3 个变量:

  • BLOG_DEPLOY_PRI_KEY : ssh 私钥
  • BLOG_HOSTNAME : rebootcat.com
  • BLOG_USER : root

编写工作流文件

在博客网站源码仓库创建文件:.github/workflows/deploy.yml,内容如下:

name: Deploy site fileson:push:branches:- master  # 只在master上push触发部署paths-ignore:   # 下列文件的变更不触发部署,可以自行添加- LICENSEjobs:deploy:runs-on: ubuntu-latest   # 使用ubuntu系统镜像运行自动化脚本steps:  # 自动化步骤- uses: actions/checkout@v2   # 第一步,下载代码仓库- name: Deploy to Server  # 第二步,rsync推文件uses: AEnterprise/rsync-deploy@v1.0  # 使用别人包装好的步骤镜像env:DEPLOY_KEY: ${{ secrets.BLOG_DEPLOY_PRI_KEY }}   # 引用配置,SSH私钥ARGS: -avz --delete --exclude='*.pyc'   # rsync参数,排除.pyc文件SERVER_PORT: '22'  # SSH端口FOLDER: ./  # 要推送的文件夹,路径相对于代码仓库的根目录SERVER_IP: ${{ secrets.BLOG_HOSTNAME }}  # 引用配置,服务器的host名(IP或者域名domain.com)USERNAME: ${{ secrets.BLOG_USER }}  # 引用配置,服务器登录名SERVER_DESTINATION: /usr/share/nginx/html/smaugx.github.io/   # 部署到目标文件夹- name: Restart server   # 第三步,重启服务uses: appleboy/ssh-action@masterwith:host: ${{ secrets.BLOG_HOSTNAME }}  # 下面三个配置与上一步类似username: ${{ secrets.BLOG_USER }}key: ${{ secrets.BLOG_DEPLOY_PRI_KEY }}# 重启的脚本,根据自身情况做相应改动,一般要做的是migrate数据库以及重启服务器script: |echo "update rebootcat.com blog" >> /tmp/github/blog.log

上述文件记得 push 到远端仓库。然后你可以随便修改一下博客源码并且 push 到远端,正常的话应该能看到如下的输出:

hexo deploy 踩坑

重点来了,上面两部其实是经过了 hexo deploy 的踩坑的。为啥?

由于 hexo generate 默认会忽略隐藏文件,所以生成的网站源码就会忽略 .github/workflows/deploy.yml,所以要设置一下博客根目录的 _config.yml:


# Include / Exclude file(s)
## include:/exclude: options only apply to the 'source/' folder
include:- ".github/*"- ".github/**/*"
exclude:
ignore:

很重要!!!

OK,现在你可以放心大胆的使用 hexo generate 来生成博客源码了,但是当你使用 hexo deploy 的时候问题又来了, hexo deploy 默认也是忽略隐藏文件的,而且好像上面那个配置对 hexo deploy 无效。

搜索了很多,没有找到针对 hexo deploy 如何避免忽略隐藏文件的解决方案,于是探索了一下:

$ hexo deploy
INFO  Deploying: git
INFO  Clearing .deploy_git folder...
INFO  Copying files from public folder...
INFO  Copying files from extend dirs...
On branch master
nothing to commit, working tree clean
...

可以看到,上面执行 hexo deploy 命令后的输出有一个 “.deploy_git folder”,看了一下真有这个隐藏目录,想必 hexo deploy 是把 public 目录与较旧的(上一次发布的)目录 .deploy_git 做比较,然后增量上传文件。

所以我直接把 .github/workflows/deploy.yml 拷贝到了 .deploy_git 目录,然后执行 hexo deploy 成功。

哈哈哈!!!

所以记住,如果后期修改了这个 deploy.yml ,需要手动拷贝一下,但是基本上不会再动这个文件了。

到这里,基本上就解决了利用github actions 自动化部署博客的问题了。

实测 push 仓库后到服务器上的网站源码成功替换时间很快,大概一分钟左右,Good!

https 性能优化

上面的一切搞定后,体验了一天访问我的博客 https://rebootcat.com,使用 chrome 控制台发现 ssl 握手时间很慢,第一次访问基本都要 3 ~ 4 s左右,无法忍受,再次访问就快了。

所以网上搜索了下关于 Let’s Encrypt 的优化,找到了一些解决方案以及 nginx 的配置优化等:

# config file name: /etc/nginx/nginx.confuser  root;
worker_processes  2;error_log  /var/log/nginx/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;pid         /var/run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections  1024;
}http {include             /etc/nginx/mime.types;default_type        application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';#access_log  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush      on;tcp_nodelay     on;#keepalive_timeout  0;keepalive_timeout  65;types_hash_max_size 2048;gzip  on;gzip_vary on;gzip_min_length 1k; #不压缩临界值,大于1k的才压缩,一般不用改gzip_buffers 4 16k;gzip_comp_level 6; #压缩级别,数字越大压缩的越好gzip_types  text/plain application/javascript application/x-javascript application/json text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-icon text/xml;#记录160000个请求 超过将返回失败limit_conn_zone $binary_remote_addr zone=addr:10m;#单个请求小于20r/slimit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;server {listen 80;server_name  www.rebootcat.com rebootcat.com;rewrite ^ https://$server_name$request_uri? permanent;access_log  /var/log/nginx/access_rebootcat.log  main;}#  HTTPS serverserver {listen 443 http2 ssl;server_name  www.rebootcat.com rebootcat.com;access_log  /var/log/nginx/access_rebootcat.log  main;charset utf-8;root         /usr/share/nginx/html/smaugx.github.io;limit_conn addr 10;location /api {limit_req zone=one burst=10;# 真实的客户端IPproxy_set_header   X-Real-IP        $remote_addr;# 请求头中Host信息proxy_set_header   Host             $host;# 代理路由信息,此处取IP有安全隐患proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;# 真实的用户访问协议proxy_set_header   X-Forwarded-Proto $scheme;}location ~.*\.(js|css|ico|png|jpg)${expires    3d;}location /js{#add_header Cache-Control no-cache;}location / {limit_req zone=one burst=30;index  index.html index.htm;}error_page  404              /404.html;# redirect server error pages to the static page /50x.htmlerror_page   500 502 503 504  /50x.html;# 开启 ssl#ssl on;# letsencrypt生成的文件ssl_certificate /etc/letsencrypt/live/rebootcat.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/rebootcat.com/privkey.pem;ssl_session_timeout 20m;ssl_session_cache shared:SSL:50m;# 由客户端保存加密后的session信息ssl_session_tickets on;ssl_dhparam /etc/ssl/private/dhparam.pem;# 开启OCSP Stapling,由服务器验证证书在线状态,提高TLS握手效率ssl_stapling on;ssl_stapling_verify on;# 开启HSTS,缓存http重定向到https,以防止中间人攻击# 不包含子域(宝塔界面是http的)# 不预加载(预加载要在https://hstspreload.org/中添加)add_header Strict-Transport-Security "max-age=63072000;" always;# 开启TLS False Startssl_prefer_server_ciphers on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLSssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';}server {listen 80;server_name  www.loveyxq.online loveyxq.online;rewrite ^ https://$server_name$request_uri? permanent;access_log  /var/log/nginx/access_loveyxq.log  main;}#  HTTPS serverserver {listen 443 http2 ssl;server_name  www.loveyxq.online loveyxq.online;access_log  /var/log/nginx/access_loveyxq.log  main;charset utf-8;root         /usr/share/nginx/html/smaugx.github.io;limit_conn addr 10;location /api {limit_req zone=one burst=10;# 真实的客户端IPproxy_set_header   X-Real-IP        $remote_addr;# 请求头中Host信息proxy_set_header   Host             $host;# 代理路由信息,此处取IP有安全隐患proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;# 真实的用户访问协议proxy_set_header   X-Forwarded-Proto $scheme;}location ~.*\.(js|css|ico|png|jpg)${expires    3d;}location /js{#add_header Cache-Control no-cache;}location / {limit_req zone=one burst=30;index  index.html index.htm;}error_page  404              /404.html;# redirect server error pages to the static page /50x.htmlerror_page   500 502 503 504  /50x.html;# 开启 ssl#ssl on;# letsencrypt生成的文件ssl_certificate /etc/letsencrypt/live/loveyxq.online/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/loveyxq.online/privkey.pem;ssl_session_timeout 20m;ssl_session_cache shared:SSL:50m;# 由客户端保存加密后的session信息ssl_session_tickets on;ssl_dhparam /etc/ssl/private/dhparam.pem;# 开启OCSP Stapling,由服务器验证证书在线状态,提高TLS握手效率ssl_stapling on;ssl_stapling_verify on;# 开启HSTS,缓存http重定向到https,以防止中间人攻击# 不包含子域(宝塔界面是http的)# 不预加载(预加载要在https://hstspreload.org/中添加)add_header Strict-Transport-Security "max-age=63072000;" always;# 开启TLS False Startssl_prefer_server_ciphers on;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;# 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLSssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';}}

重启 nginx 之后,再次使用 chrome 无恒模式打开控制台看一下访问速度,是不是有所好转。

或者直接使用 curl 命令:

$  curl -X GET -w '\n\n    time_namelookup:  %{time_namelookup}time_connect:  %{time_connect}time_appconnect:  %{time_appconnect}time_pretransfer:  %{time_pretransfer}time_redirect:  %{time_redirect}time_starttransfer:  %{time_starttransfer}----------time_total:  %{time_total}\n'   -H 'Cache-Control: no-cache'  -o /dev/null  -s "https://rebootcat.com"

输出如下:

    time_namelookup:  0.005120time_connect:  0.257869time_appconnect:  0.492787time_pretransfer:  0.492887time_redirect:  0.000000time_starttransfer:  0.751222----------time_total:  1.339793

上面的 time_appconnect 减去 time_connect 的耗时就是 ssl 握手的耗时 0.2349s,比之前好了很多。

The END

OK,到这里算是把博客正式的迁移到腾讯云香港服务器上了,以后就一直打算用自己的服务器托管博客了。

参考

使用 GitHub Actions 实现博客自动化部署
提高https载入速度,记一次nginx升级优化

Blog:

  • rebootcat.com

  • email: linuxcode2niki@gmail.com

2020-11-10 于杭州
By 史矛革

相关文章:

限时福利:腾讯高级专家手把手教你打造 OCR 神器!

OCR,英文全称即 optical characters recognition(光学字符识别),通过服务器把图片上的文字识别出来,以供大家编辑使用,比如进出火车站的时候,已经可以自动识别的身份证;在道路行驶中…

C++与.net的编译方式

C和.Net程序采用了两种不同的编译方式。 通常一个C编写的程序,都是一次编译成二进制的代码,在相应的操作系统平台上直接执行即可。 而.Net程序采用两次编译的方式,用C#,VB.Net等语言写成的程序被编译成IL代码,通过CLR在…

awk (一)

示例文件:[rootorclsrv ~]# catsample Heigh-ho! sing,heigh-ho! unto the green holly: Most friendship isfeigning, most loving mere folly: Then, heigh-ho, theholly!使用感叹号(!) 作为字段分隔符(FS)打印示例数据的第1 个字段:[rootorclsrv~]# …

TCP全连接和半连接的问题探讨

个人博客: https://rebootcat.com/2020/11/14/tcp_accept/ 从何说起 说起 tcp 的连接过程,想必 “3次握手4次挥手”是大家广为熟知的知识,那么关于更细节更底层的连接过程也许就很少人能讲清楚了。 所以本文会先简单回顾一下 tcp 的 3次握手…

[转] ASP.NET MVC3 路由和多数据集的返回

1.ASP.NET MVC3 中的路由 同前边一样本篇并不会过多的介绍理论知识,我们在Global.asax.cs文件中可以看到如下代码: routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controlle…

给Python代码加上酷炫进度条的几种姿势

作者 | 刘早起来源 | 早起Python(ID: zaoqi-python)大家好,在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度条可以便捷的观察任务处理情况,除了使用print来打印之外,今天本文就介绍几种…

(转)mongodb分片

本文转载自:http://www.cnblogs.com/huangxincheng/archive/2012/03/07/2383284.html 在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内…

深入浅出paxos

原文 https://rebootcat.com/2020/12/05/paxos/

Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?

受访者 | Graviti 创始人&CEO 崔运凯记者 | Aholiab,编辑 | Carol出品 | AI科技大本营(ID:rgznai100)经过数年的发展,现在的人们谈到“AI”已经不再像过去一般感到遥不可及。但 AI 在国内发挥的作用仍然只是冰山一角&#xff…

oracle服务

OracleOraDb11g_home1ClrAgent服务,在网上查找到了资料 http://download.oracle.com/docs/cd/B19306_01/win.102/b14306/install.htm Configuring Extproc Agent Using Windows Service As part of Oracle Database Extensions for .NET installation, a Windows se…

B00009 C语言分割字符串库函数strtok

切割字符串是常用的处理。 这里给出一个使用函数strtok切割字符串的例子。 使用C语言的库函数strtok来切割字符串的好处在于,可以指定任意字符作为分隔符来切割单词。使用该函数,切割字符串的分隔符可以同时指定多个,放在一个字符串数组中。 …

WEB打印大全

1、控制"纵打"、 横打”和“页面的边距。 &#xff08;1&#xff09;<script defer> function SetPrintSettings() { // -- advanced features factory.printing.SetMarginMeasure(2) // measure margins in inches factory.SetPageRange(false, 1, 3) // ne…

漫画 | 程序媛小姐姐带你一次了解什么是排序算法

来源 | 小齐本齐封图 | CSDN 付费下载自视觉中国插入排序借用《算法导论》里的例子&#xff0c;就是我们打牌的时候&#xff0c;每新拿一张牌都会把它按顺序插入&#xff0c;这&#xff0c;其实就是插入排序。齐姐声明&#xff1a;虽然我们用打牌的例子&#xff0c;但是可不能学…

POJ 1207 The 3n + 1 problem

题目链接&#xff1a;http://poj.org/problem?id1207 题目大意&#xff1a;给你一个数x&#xff0c;规定一个函数F(x)&#xff0c;如果x为1则F(x)1&#xff0c;否则如果x是偶数&#xff0c;F(x)F(x/2)&#xff0c;x为奇数F(x)F(3*x1)计算给定x到变换到1的步数。 注意点&#x…

PopupWindow响应返回键的问题

假设情景是这样的&#xff1a;在一个Activity中弹出一个PopupWindow&#xff0c;要求在按返回键时关闭该PopupWindow。 如果该PopupWindow是无焦点的&#xff08;默认情况&#xff09;&#xff0c;那么可以在Activity中响应返回键&#xff08;onBackPressed&#xff09;&#x…

Unix / Linux世界里的4-2-1

Unix / Linux世界里的4-2-1 在Unix / Linux世界里&#xff0c;4代表可读( r )&#xff0c;2代表可写入 ( w )&#xff0c;1代表可执行 ( x ) 如果拥有7 421 的权限&#xff0c;即代表这个人可以对档案完全控制。 以0777为例&#xff1a; 去掉0&#xff0c;第一个7代表着拥有者…

深度学习概述:NLP vs CNN

作者 | Manish Kuwar译者 | 苏本如&#xff0c;责编 | 郭芮头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;当今&#xff0c;人工智能已经不仅仅是一个技术术语了。这项技术在过去十年的时间内几乎将其影响扩展到…

oracle 求A中不存在于B的记录

oracle 求A中不存在于B的记录 select * from a minus select * from b 是求A中不存在于B的记录select * from a union select * from b 是求A和B的DISTINCT的并集select * from a union all select * from b 是求A和B的冗余并集那么A和B的交集是什么函数来的?交集是 INTERSE…

正则表达式grep、egrep--already

第一式 grep是什么 #man grepgrep&#xff08;global search regular expression&#xff08;RE&#xff09;是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。UNIX的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令…

万字长文综述目标检测领域,你要的都在这里

来源 | AI专栏&#xff08;ID: pursue-Y-future&#xff09;目标检测是计算机视觉中的一个重要问题&#xff0c;近年来传统检测方法已难以满足人们对目标检测效果的要求&#xff0c;随着深度学习在图像分类任务上取得巨大进展&#xff0c;基于深度学习的目标检测算法逐渐成为主…

ASP.net随机数应用实例

家可能都用过Chinaren的校友录&#xff0c;不久前它的留言簿上加了一个防止灌水的方法&#xff0c;就是系统每次产生一个由随机的数字和字母组成的图片&#xff0c;每次留言必须正确地输入这些随机产生的字符&#xff0c;否则不能添加留言。这是一个很好的防止恶意攻击的方法&a…

PreferenceActivity是什么?

我们看到Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理&#xff0c;那么它是怎么保存数据的呢&#xff0c;如何创建PrefenceActivity的呢?创建Android项目&#xff0c;并添加一个pref.xml文件(先建一个xml名的Folder)。注意&#xff0c;这次选择的…

坑系列 --- 时间和空间的平衡

这是坑系列的最后一弹了&#xff0c;这篇文章非常长&#xff0c;希望你能看完&#xff0c;要是看完有很酣畅的感觉就最好了。这一篇的坑主要来说说架构中时间和空间的平衡吧&#xff0c;这里的时间指代比较广&#xff0c;可能是开发时间&#xff0c;但大部分指的是执行时间&…

C#中调用Windows API的要点

在.Net Framework SDK文档中&#xff0c;关于调用Windows API的指示比较零散&#xff0c;并且其中稍全面一点的是针对Visual Basic .net讲述的。本文将C#中调用API的要点汇集如下&#xff0c;希望给未在C#中使用过API的朋友一点帮助。另外如果安装了Visual Studio .net的话&…

线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI

Geoffrey Hinton等6位图灵奖得主亲临&#xff0c;百余位顶级学者邀请你加入群聊「2020北京智源大会」&#xff0c;深入系统探讨「人工智能的下一个十年」。自2009年深度学习崛起以来&#xff0c;第三波人工智能浪潮席卷全球&#xff0c;推动了新一波技术革命。在这波澜壮阔的11…

ServerSocket

ServerScoket 这个类用于与 Socket 进行通信。 在实例化ServerSocket 的时候&#xff0c;服务器相当于已经开始了&#xff0c;但是还需要通过socket来accept &#xff08;socket serverSocket.accept()&#xff09;以使服务器选择性与某一Client进行连接。如果有指定了允许连接…

NDK开发 - C/C++ 访问 Java 变量和方法

上一篇有提到 JNI 访问引用数组&#xff0c;涉及了 C/C 访问 Java 实例的方法和变量。虽然在之前的开发中&#xff0c;并没有用到 C/C 范围 Java 层数据&#xff0c;但是这部分内容还是很有用的。传送门&#xff1a;NDK开发 - C/C 访问 Java 变量和方法 C/C 访问 Java 层的方法…

在C#中应用哈希表(Hashtable)

一,哈希表(Hashtable)简述 在.NET Framework中&#xff0c;Hashtable是System.Collections命名空间提供的一个容器&#xff0c;用于处理和表现类似key/value的键值对&#xff0c;其中key通常可用来快速查找&#xff0c;同时key是区分大小写&#xff1b;value用于存储对应于key的…

俄罗斯自研Elbrus CPU参数曝光,CEO年近九旬仍未退休

导语&#xff1a;俄罗斯自研 CPU 参数最近曝光&#xff0c;虽然比起主流产品仍存在较大差距&#xff0c;但是这也是俄罗斯在自研道路上的一大进展。虽说自研 CPU 并非易事&#xff0c;但为了避免被美国牵制&#xff0c;很多国家都在这方面投入了巨大的人力与资金。战斗民族俄罗…

停止Password Manager Agent服务导致应用程序启动缓慢

在一个实施环境中&#xff0c;部署了Password Manager用来实现单点登录功能&#xff0c;但是由于Password Manager的提示基本都是以英文为主&#xff0c;而且配置也比较麻烦&#xff0c;普通用户看见会比较影响用户体验&#xff0c;所以用户决定暂时关闭Password Manager功能&a…