Skip to content

Commit

Permalink
commit message
Browse files Browse the repository at this point in the history
  • Loading branch information
gaolei-he committed Nov 4, 2023
0 parents commit 8e0a364
Show file tree
Hide file tree
Showing 7 changed files with 459 additions and 0 deletions.
74 changes: 74 additions & 0 deletions C++数据结构的可能实现/string.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include <stddef.h>
class string {
private:
char* str = nullptr;
size_t len = 0;
size_t max_len = 1;
public:
string();
string(const string &__str);
string(const char* __str);
~string();
string(string &&__str);

string substr(size_t __pos = 0, size_t __n = 18446744073709551615UL);
void push_back(char __c);
void pop_back();
size_t size() const;
size_t length() const;
const char* c_str() const;
};

string::string() {}

string::string(const string &__str) {
string(__str.c_str());
}

string::string(const char* __str) {
for(size_t i=0;__str[i];i++) this->push_back(__str[i]);
}

string::string(string &&__str) {
str = __str.str;
len = __str.len;
max_len = __str.max_len;
__str.str = nullptr;
__str.len = 0;
__str.max_len = 1;
}

string::~string() {
if(str) delete[] str;
}

const char* string::c_str() const {
return str;
}

void string::push_back(char __c) {
if(len + 1 == max_len) {
max_len <<= 1;
char *tmp = str;
str = new char[max_len];
for(size_t i = 0; str[i] = tmp[i]; i++);
}
str[len ++] = __c;
str[len] = '\0';
}

void string::pop_back() {
-- len;
}

size_t string::length() const {
return len;
}

size_t string::size() const {
return len;
}

string string::substr(size_t __pos = 0, size_t __n = 18446744073709551615UL) {
// TODO
}
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
### 目录

[指针初探,使用链式存储结构实现循环队列](%E6%8C%87%E9%92%88%E5%88%9D%E6%8E%A2.md)

[交换Esc与Caps键的几种方法](%E4%BA%A4%E6%8D%A2Esc%E4%B8%8ECaps%E9%94%AE%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95.md)

[C++数据结构的可能实现](C++%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%9A%84%E5%8F%AF%E8%83%BD%E5%AE%9E%E7%8E%B0)

[pbds的简单使用](pbds%E7%9A%84%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8.md)
63 changes: 63 additions & 0 deletions log_in_to_campus_network.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''开机自动登录校园网'''

import asyncio
import pyppeteer
import requests
import time


'''需要修改的变量'''
user_name = '123456' # 学号
pass_word = '123456' # 密码
tmp_dir = '/tmp' # 临时文件夹
chrome_path = '/usr/bin/google-chrome' # chrome浏览器路径


async def loginfunction(loginUrl: str):
start_time = time.time()
while True:
if time.time() - start_time > 60:
return # 60秒内未连接到校园网,退出
try:
response = requests.get(loginUrl, timeout=3)
if response.status_code == 200:
break # 连接到校园网,准备登录
except KeyboardInterrupt as e:
return # 用户中断
except:
pass # 未连接到网络,继续尝试

width, height = 1400, 800 # 窗口大小
# 启动浏览器
browser = await pyppeteer.launch(headless=False,
userdataDir = tmp_dir,
executablePath = chrome_path,
args=[f'--window-size={width},{height}'])
page = await browser.newPage() # 新建页面
await page.setViewport({'width': width, 'height': height}) # 设置页面大小
await page.goto(loginUrl) # 跳转到登录页面

if await page.querySelector("body > div.success > p") != None: # 已登录
await browser.close()
return

element = await page.querySelector("#username")
await element.type(user_name) # 输入用户名
element = await page.querySelector("#password")
await element.type(pass_word) # 输入密码
element = await page.querySelector("#login-account")
await element.click() # 点击登录
await page.waitForSelector("body > div.success > p", timeout=30000) # 等待登录页面加载完成
await browser.close() # 关闭浏览器


def main():
url = 'http://172.22.255.18/srun_portal_pc?ac_id=1&theme=pro'
asyncio.get_event_loop().run_until_complete(loginfunction(url))


if __name__ == '__main__':
main()
104 changes: 104 additions & 0 deletions pbds的简单使用.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# PBDS

## `__gnu_pbds :: tree`

```cpp
#include <ext/pb_ds/assoc_container.hpp> // 因为tree定义在这里 所以需要包含这个头文件
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
__gnu_pbds ::tree<Key, Mapped, Cmp_Fn = std::less<Key>, Tag = rb_tree_tag,
Node_Update = null_tree_node_update,
Allocator = std::allocator<char> >
```

## 模板形参

- `Key`: 储存的元素类型,如果想要存储多个相同的 `Key` 元素,则需要使用类似于 `std::pair``struct` 的方法,并配合使用 `lower_bound``upper_bound` 成员函数进行查找
- `Mapped`: 映射规则(Mapped-Policy)类型,如果要指示关联容器是 **集合**,类似于存储元素在 `std::set` 中,此处填入 `null_type`,低版本 `g++` 此处为 `null_mapped_type`;如果要指示关联容器是 **带值的集合**,类似于存储元素在 `std::map` 中,此处填入类似于 `std::map<Key, Value>``Value` 类型
- `Cmp_Fn`: 关键字比较函子,例如 `std::less<Key>`
- `Tag`: 选择使用何种底层数据结构类型,默认是 `rb_tree_tag``__gnu_pbds` 提供不同的三种平衡树,分别是:
- `rb_tree_tag`:红黑树,一般使用这个,后两者的性能一般不如红黑树
- `splay_tree_tag`:splay 树
- `ov_tree_tag`:有序向量树,只是一个由 `vector` 实现的有序结构,类似于排序的 `vector` 来实现平衡树,性能取决于数据想不想卡你
- `Node_Update`:用于更新节点的策略,默认使用 `null_node_update`,若要使用 `order_of_key``find_by_order` 方法,需要使用 `tree_order_statistics_node_update`
- `Allocator`:空间分配器类型

## 构造方式

```c++
__gnu_pbds::tree<std::pair<int, int>, __gnu_pbds::null_type,
std::less<std::pair<int, int> >, __gnu_pbds::rb_tree_tag,
__gnu_pbds::tree_order_statistics_node_update>
tr;
```

## 成员函数

- `insert(x)`:向树中插入一个元素 x,返回 `std::pair<point_iterator, bool>`
- `erase(x)`:从树中删除一个元素/迭代器 x,返回一个 `bool` 表明是否删除成功。
- `order_of_key(x)`:返回 x 以 `Cmp_Fn` 比较的排名。
- `find_by_order(x)`:返回 `Cmp_Fn` 比较的排名所对应元素的迭代器。
- `lower_bound(x)`:以 `Cmp_Fn` 比较做 `lower_bound`,返回迭代器。
- `upper_bound(x)`:以 `Cmp_Fn` 比较做 `upper_bound`,返回迭代器。
- `join(x)`:将 x 树并入当前树,前提是两棵树的类型一样,x 树被删除。
- `split(x,b)`:以 `Cmp_Fn` 比较,小于等于 x 的属于当前树,其余的属于 b 树。
- `empty()`:返回是否为空。
- `size()`:返回大小。
- `find(x)`:返回指向 x 的迭代器,如果不存在则返回 `tree.end()`

## 示例

```cpp
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <iostream>
using namespace std;
using namespace __gnu_pbds;
int main()
{
tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> tr;
tr.insert(1);
tr.insert(2);
tr.insert(4);
// 树中元素 1,2,4
auto it = tr.insert(3); // pair<point_iterator, bool>
cout << *it.first << endl; // 3
cout << it.second << endl; // 1

bool flag = tr.erase(3); // bool
cout << flag << endl; // 1

// 树中元素 1,2,4
// order_of_key(x) 返回小于x的元素个数(int)
int cnt = tr.order_of_key(3);
cout << cnt << endl; // 2
cnt = tr.order_of_key(2);
cout << cnt << endl; // 1

// 树中元素 1,2,4
// find_by_order(k) 返回指向第k小的元素的迭代器 (从0开始)
auto it2 = tr.find_by_order(1); // point_iterator
cout << *it2 << endl; // 2

auto it3 = tr.lower_bound(2); // point_iterator
cout << *it3 << endl; // 2
it3 = tr.upper_bound(2); // point_iterator
cout << *it3 << endl; // 4

tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> tr1;
tr1.insert(8);
tr1.insert(16);
tr1.insert(32);

// tr.join(tr1) 将tr1合并到tr中,tr1中的元素会被删除
tr.join(tr1);
for(auto it : tr)
cout << it << endl; // 1 2 4 8 16 32

tr.split(4, tr1); // 将tr中小于等于4的元素分离出来,放到tr1中
for(auto it : tr)
cout << it << endl; // 1, 2, 4

return 0;
}
```
75 changes: 75 additions & 0 deletions 交换Esc与Caps键的几种方法.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# 交换Esc与Caps键的几种方法

## Windows

### PowerToys

在Microsoft Store 中下载PowerToys,其中有一个`Keyboard Manager`的工具,可以用来交换键位

## Linux(Ubuntu)

### GUI

无论是`Xorg`还是`Wayland`,该方法都适用
修改以下文件
> /usr/share/X11/xkb/symbols/pc
格式类似如下风格

```txt
key <ESC> { [ Escape ] };
key <CAPS> { [ Caps_Lock ] };
```

若要交换`Caps_Lock``Esc`,则修改为

```txt
key <ESC> { [ Caps_Lock ] };
key <CAPS> { [ Escape ] };
```

### CLI

1. 运行以下命令,备份当前键盘映射

```bash
dumpkeys > back.kmap
cp back.kmap new.kmap
```

2. 修改`new.kmap`文件,将`Caps_Lock``Esc`的映射交换

```txt
keycode 1 = Escape
...
keycode 58 = CtrlL_Lock
...
```

```txt
keycode 1 = CtrlL_Lock
...
keycode 58 = Escape
...
```

3. 运行以下命令,使新的键盘映射生效

```bash
loadkeys new.kmap
```

#### 备注

1. 若要恢复默认键盘映射,运行以下命令

```bash
loadkeys back.kmap
```

2. 若要每次开机自动生效,将以下命令添加到`/etc/rc.local`中即可,注意`/etc/rc.local`文件需要有可执行权限,可运行`sudo chmod u+x /etc/rc.local`赋予其可执行权限

```bash
#!/bin/bash
/usr/bin/loadkeys /path/to/new.kmap
```
Loading

0 comments on commit 8e0a364

Please sign in to comment.