C++ VSCode 运行环境配置

Tasks.json

{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}

Launch.json

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [
/*
args的作用是再调用可执行文件是添加参数
下面两句命令的作用分别是:
1.将in.txt文件输入进可执行文件
2.将可执行文件的结果输出进out.txt文件
*/
"<${workspaceFolder}/.vscode/oi/in.txt",
">${workspaceFolder}/.vscode/oi/out.txt"
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
},
{
"description": "防止 gdb 打开标准库函数",
"text": "-interpreter-exec console \"skip -rfu std::.*\"",
"ignoreFailures": false
}
],
"symbolLoadInfo": {
"loadAll": false,
"exceptionList": ""
},
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}

Redmine 项目平台部署

Docker 安装

方法一:docker-compose (推荐)

version: "3"

networks:
bridge:

volumes:
redmine-plugins: {}
redmine-themes: {}
redmine-data: {}

services:
redmine:
image: redmine
ports:
- 58088:3000
volumes:
- ./plugins:/usr/src/redmine/plugins
- ./themes:/usr/src/redmine/public/themes
- ./data:/usr/src/redmine/files
environment:
REDMINE_DB_MYSQL: db
REDMINE_DB_PASSWORD: pw_example
REDMINE_SECRET_KEY_BASE: supersecretkey

restart: always

db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: pw_example
MYSQL_DATABASE: redmine
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql

保存为docker-compose.yml之后运行即可

docker-compose up -d

方法二:直接启动

Mysql 启动(以下内容的password需要改为自己使用的地址)

docker run  --name mysql -e MYSQL_ROOT_PASSWORD="password" -e MYSQL_DATABASE=redmine -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

Redmine

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD="password" -e MYSQL_DATABASE=redmine -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

移除插件指令

rake redmine:plugins:migrate NAME=redmine_hearts VERSION=0 RAILS_ENV=production

控制问题显示字域所在位置

app\views\issues\show.html.erb

相关Docker操作

备份 Mysql 进入到容器中

mysqldump -u root -p redmine > /home/backup.sql

再执行cp复制

docker cp [docker代号]:/home/backup.sql ./backup.sql

即可完成复制导出

删除部分 issue 核心字段

笨办法,直接删除相关代码 找到 .html.erb 修改即可

调节图片显示

让长图片在桌面端正常显示

找到 public/stylesheets/application.css 替换

.filecontent-container > .filecontent {
position: absolute;
max-height: 100%;
max-width: 100%;
}

.filecontent-container > .filecontent {
position: absolute;
/* max-height: 100%; */
max-width: 80%;
}

@media
only screen and (max-width: 700px),
(min-device-width: 700px) and (max-device-width: 700px){
.filecontent-container > .filecontent {
position: absolute;
max-width: 100% !important;
}
}

MariaDB 部署

安装MariaDB

sudo apt install -y mariadb-server mariadb-client

初始化设置

sudo mysql_secure_installation

创建数据库

进入管理

mysql -u root -p

创建

CREATE DATABASE jira CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'jira'@'localhost' IDENTIFIED BY 'jira';
grant all on jira.* to 'jira'@'%';

测试用户

mysql -u jira -h localhost -p

Openssh 配置

安装server

sudo apt install openssh-server

配置root登录

sudo vim /etc/ssh/sshd_config

添加一行

PermitRootLogin yes

重启服务

sudo /etc/init.d/ssh restart

Nomachine 虚拟桌面 分辨率调整

使用虚拟桌面

安装基础组件

sudo apt-get install  xserver-xorg-core-hwe-18.04
sudo apt-get install xserver-xorg-video-dummy-hwe-18.04 --fix-missing

修改配置文件,以创建一个虚拟桌面

vim /usr/share/X11/xorg.conf.d/xorg.conf

写入以下内容

Section "Monitor"
Identifier "Monitor0"
HorizSync 5.0 - 1000.0
VertRefresh 5.0 - 200.0
# https://arachnoid.com/modelines/
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
Modeline "2560x1600" 47.12 2560 2592 2768 2800 1600 1639 1642 1681
Modeline "2560x1440" 42.12 2560 2592 2752 2784 1440 1475 1478 1513
Modeline "1920x1080" 23.53 1920 1952 2040 2072 1080 1106 1108 1135
EndSection

Section "Device"
Identifier "Card0"
Driver "dummy"
VideoRam 256000
EndSection

Section "Screen"
DefaultDepth 24
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Depth 24
Modes "2560x1600" "2560x1440" "1920x1080"
EndSubSection
EndSection

重启,即可生效,此时,物理屏幕输出为黑屏

若要恢复有线屏幕输出,则删除该文件,重启

调整为任意分辨率

xrandr --fb 1280x960

Pastebin 在线剪贴板部署

https://github.com/Nugine/pastebin 加Star,赞

设置nginx代理

修改默认nginx配置文件default为

server {
listen 80;

server_name "pastebin";

gzip on;
gzip_comp_level 4;
gzip_types application/javascript text/css application/json;
gzip_vary on;
gzip_static on;

location / {
proxy_pass http://localhost:3000;
}

location /api/ {
proxy_pass http://localhost:8000;
}
}

启动后端

进入pastebin-server目录后

nohup cargo +nightly run &

需要 Nightly 工具链

启动前端

进入pastebin-front目录后

screen -dmS pastebin npm run dev

Rust 环境配置

使用rustup最优

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs  sh

如要使用NIGHTLY新功能

rustup toolchain install nightly
cargo +nightly run

分块

定义

  • 把一个序列从左往右切分成若干块,每块大小不超过size。
  • 一个区间可以看作是若干个完整的块加上两端零碎的不超过2size个数
  • 对于每个完整的块维护信息方便修改/查询。
    阅读全文 »

高级二分查找

知识回顾

  • 给定一个单调不下降的序列a[1..n],问x是否在其中。

  • 根据初始信息,答案显然位于[1,n]。

  • 假设我们已知答案位于[l,r]。

  • 若l>r,则说明x不在其中。

  • 否则取mid=(l+r)/2,比较x与a[mid]的大小关系。

  • 若x==a[mid],则x在其中。

  • 若x<a[mid],则答案位于[l,mid-1]。

  • 若x>a[mid],则答案位于[mid+1,r]。 ### 二分的适用范围

  • 当x<a[mid]时,可以把可能区间缩小至[1,mid-1]是因为a[mid]<=a[mid..n]。

  • 二分的适用范围:单调不下降/不上升的序列或函数。

代码实现

bool find(int n, int a[], int x) {
int l = 1, r = n;
while (l <= r) {
int mid = (l + r) / 2;
if (x == a[mid]) return true;
if (x < a[mid]) r = mid - 1;
else l = mid + 1;
}
return false;
}

例子:找平方根下取整

ll findsq(ll val){
ll l = 0;
ll ans=-1;
ll r = maxmid;
while(l <= r ){
ll mid = (l + r) >> 1;
if((mid*mid)<=val){
ans=mid;
l = mid +1;
}
else{
r = mid -1;
}
}
return ans;
}

例题1-序列划分

  • 给定n个正整数a[1..n],将这个序列从左到右划分成m段,使得每段至少有一个数。
  • 你需要让数字之和最大的那一段的数字和尽可能得小
  • 1 <= m <= n <= 100000。
  • 1 <= a[i] <= 10^9。

代码

贪心

int f(long long x) {
long long sum = 0;//当前段的数字之和
int cnt = 1;//最少切出的段数
for(int i = 1; i <= n; i++) {
if (a[i] > x) return -1;//无解
if (sum + a[i] <= x) sum += a[i];
else sum = a[i], cnt ++;
}
return cnt;
}

二分解法(更快

  • 若f(x)有解,则若能划分成f(x)段,必然能划分成f(x)+1段。
  • 另一方面,若f(x)有解,则f(x)≥f(x+1),因为x+1的限制变松了。
  • 显然我们要求的答案位于[max(a[1..n]), sum(a[1..n])]之中。
  • 我们需要在这个范围里,找到最小的x,使得f(x)≤m。
  • 因为f(x)≥f(x+1),是单调函数,二分即可。

需要通过O(n)算法f处理数据,看是否满足 二分即可(可以使用ANS储存中间值,更方便)

long long solve(long long mx, long long sum) {
long long l = mx, r = sum, ans = r;
while (l <= r) {
long long mid = (l + r) / 2;
int tmp = f(mid);
if (tmp <= m) ans = mid, r = mid - 1;
else l = mid + 1;
}
return ans;
}

最大/最小 等问题可以用二分解决

例题2 - Tower

例2-Ice Cream Tower

  • 给定n个正整数a[1..n]和一个正整数k。
  • 一座高度为k的塔b[1..k]满足b[1]*2≤b[2],b[2]*2≤b[3],b[3]*2≤b[4]…
  • 你要从中选择一些数来叠很多座高度为k的塔,问最多能叠多少座塔。
  • 2 ≤ n ≤ 100000。
  • 2 ≤ k ≤ 30。
  • 1 ≤ a[i] ≤ 10⁹。

考虑的问题

  • 如何判断能否叠出x座塔?
  • 将序列从小到大排序,那么最优情况下前x小的数字将作为这x座塔的底层。
  • 从小到大依次考虑剩下的数,不断尝试铺出第二层、第三层…第k层。
  • 如果一个数铺不上去,那么舍弃就好。
  • 考虑完所有数字之后,判断每座塔的高度是否达到k即可。

代码:

using namespace std;
typedef long long ll;
const int N=300010;
int Case,cas,n,k,i,l,r,mid,ans,c[N]; ll a[N],b[N];
bool check(int x){
int i,j;
for(i=1;i<=x;i++)b[i]=a[i],c[i]=1;
for(i=x+1,j=1;i<=n;i++)if(a[i]>=b[j]*2){
b[j]=a[i];
c[j]++;
j++;
if(j>x)j=1;
}
for(i=1;i<=x;i++)if(c[i]<k)return 0;
return 1;
}
int main(){
scanf("%d",&Case);
for(cas=1;cas<=Case;cas++){
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
l=1,r=n,ans=0;
while(l<=r){
mid=(l+r)>>1;
if(check(mid))l=(ans=mid)+1;else r=mid-1;
}
printf("%d\n",ans);
}
}

例题3 - K小

  • 给定n个正整数a[1..n]和m个正整数b[1..m]。
  • 在n*m个a[i] + b[j]中,找到第k小的数(不去重)。
  • 1 ≤ n,m ≤ 100000。
  • 1 ≤ k ≤ n * m。
  • 1 ≤ a[i], b[i] ≤ 10^8。

思路:

例3-第K小的数

  • 本题的单调函数是什么呢?
  • 设f(x)表示有多少对i,j满足a[i]+b[j]<=x。
  • 则f(x)<=f(x + 1),是单调函数
  • 我们需要找到最小的x,满足f(x)>=k。
  • 二分。
  • 给定x,如何统计有多少对i,j满足a[i]+b[j]<=x?
  • 将a和b都从小到大排序后双指针统计。

代码

long long f(int x) {
long long cnt = 0;
int j = m;
for (int i = 1 ; i <= n ; i ++) {
while (j && a[i] + b[j] > x) j --;
cnt += j;
}
return cnt;
}

j 直接减小即可,因为a序列有序,j只能减小,O(n)

Box64 Arm64 平台运行 x86_64 应用

预构建容器

docker run -it -v yourvolumename:/minecraft -p 19132:19132/udp -p 19132:19132 -p 19133:19133/udp -p 19133:19133 --restart unless-stopped 05jchambers/legendary-bedrock-container:latest

指令

可以直接运行,无需环境

export BOX64_LD_LIBRARY_PATH=.
box64 ./bedrock_server

QEUM 虚拟机

使用 qemu-x86_64-static 需要提取环境依赖文件,然后

export LD_LIBRARY_PATH=.
qemu-x86_64-static ./bedrock_server
0%