Github Access

导言

作为程序员,最经常遇到的问题就是无法访问github,这无异于和世界断开连接。

  1. 由于http代理可以代理DNS请求,所以不太可能是DNS污染的问题。
  2. github加速访问两种思路:
    1. VPN加速
    2. warp或者wg转发到墙外(linux 服务器)
  3. 之前能访问,但是现在不能访问,可能是wg配置重启掉了。

Proxy in terminal

ssh config

linux下通过按照如下修改.ssh/config设置账号密码,并 ssh -vT [email protected],成功后输出Hi Kirrito-k423! You've successfully authenticated, but GitHub does not provide shell access.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# .ssh/config
Host github.com
User [email protected]
Hostname ssh.github.com
PreferredAuthentications publickey
ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p #如果通过代理需要这句话
IdentityFile ~/.ssh/id_rsa
Port 443

Host *
# Win报错取消下面三行 getpeername failed: Not a socket getsockname failed: Not a socket
ControlMaster auto
ControlPath /tmp/sshcontrol-%C
ControlPersist 1d
ServerAliveInterval 30

Windows PowerShell 平台

假如是windows下,如果安装了git bash,会有connect.exe的程序

配置如下[^1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Host github.com
User git
Port 22
Hostname github.com
# 注意修改路径为你的路径
IdentityFile "C:\Users\Administrator\.ssh\id_rsa"
TCPKeepAlive yes
# 这里的 -a none 是 NO-AUTH 模式,参见 https://bitbucket.org/gotoh/connect/wiki/Home 中的 More detail 一节
ProxyCommand E:\\commonSoftware\\Git\\mingw64\\bin\\connect.exe -S 127.0.0.1:7890 -a none %h %p

Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
# 注意修改路径为你的路径
IdentityFile "C:\Users\Administrator\.ssh\id_rsa"
TCPKeepAlive yes

debug ssh clone/push

ssh-git 与 https-git的不同

1
2
3
4
git config --global http.proxy localhost:7890 # PowerShell proxy
git config --global http.proxy "http://127.0.0.1:7890"
git config --global https.proxy "http://127.0.0.1:7890"
GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone [email protected]:Kirrito-k423/autoUpdateIpconfigPushGithub.git

1
GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone https://github.com/llvm/llvm-project.git

Windows PowerShell 平台 git push –verbose

不同于linux平台的GIT_TRACE=1 git push,Windows PowerShell 平台应该如下设置:

1
2
3
$env:GIT_CURL_VERBOSE = 1
$env:GIT_TRACE = 1
git push

ssh成功,但是git操作还是失败

没使用上指定config文件,git操作需要明确指定。

1
2
$env:GIT_SSH_COMMAND = 'ssh -F /path/to/your/ssh_config'
git push

http代理

There are tons of identical solutions over the internet for defining proxy tunnel for git’s downloads like this one, which all is by setting git’s https.proxy & http.proxy config. but those answers are not working when you try to clone/push/pull etc. over the ssh protocol!

For example, by setting git config --global https.proxy socks5://127.0.0.1:9999 when you try to clone git clone [email protected]:user/repo.git it does not go through the defined sock5 tunnel!

环境实在是只有https代理, 可以利用github_token的https协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Method 1. git http + proxy http
git config --global http.proxy "http://127.0.0.1:1080"
git config --global https.proxy "http://127.0.0.1:1080"

# Method 2. git http + proxy shocks
git config --global http.proxy "socks5://127.0.0.1:1080"
git config --global https.proxy "socks5://127.0.0.1:1080"

# to unset
git config --global --unset http.proxy
git config --global --unset https.proxy

# Method 3. git ssh + proxy http
vim ~/.ssh/config
Host github.com
HostName github.com
User git
ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=1087

# Method 4. git ssh + proxy socks
vim ~/.ssh/config
Host github.com
HostName github.com
User git
ProxyCommand nc -v -x 127.0.0.1:1080 %h %p

%h %phostpost的意思

或者

After some visiting so many pages, I finally find the solution to my question:

1
2
3
4
5
6
7
8
9
10
11
12
# [step 1] create a ssh-proxy
ssh -D 9999 -qCN [email protected]

# [step 2] make git connect through the ssh-proxy
# [current script only]
export GIT_SSH_COMMAND='ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
# OR [git global setting]
git config --global core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'
# OR [one-time only use]
git clone -c=core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"' [email protected]:user/repo.git
# OR [current repository use only]
git config core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:9999 %h %p"'

To install connect on Ubuntu:

1
sudo apt install connect-proxy

ssh代理

1
2
3
4
5
ssh -vT -o "ProxyCommand connect -S 127.0.0.1:7890 %h %p" [email protected]
ssh -vT -o "ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p" [email protected]
# 使用HTTP 代理
ssh -o ProxyCommand='corkscrew proxy.net 8888 %h %p' [email protected]
ssh -o ProxyCommand='proxytunnel -p proxy.net:8888 -P username -d %h:%p' [email protected]

Wireguard 代理

post request forward is an all-in-one solution.

1
2
3
4
5
6
7
8
9
10
11
interface: warp
public key: fcDZCrGbcpz3sKFqhBw7PtdInygUOtEJfPAs08Wwplc=
private key: (hidden)
listening port: 51825

peer: bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
endpoint: [2606:4700:d0::a29f:c001]:1701
allowed ips: 172.16.0.0/24, 0.0.0.0/0, ::/0
latest handshake: 89 days, 23 hours, 15 minutes, 28 seconds ago
transfer: 3.51 GiB received, 1.71 GiB sent
persistent keepalive: every 25 seconds

latest handshake: 89 days ago demonstrate wg is done for a long time. At the same time mtr github.com shows no output prove the bad situation.

STEP1: first try is to bring the wg-proxy up again

1
2
3
4
python register.py #自动生成warp-op.conf,warp.conf和warp-helper
mv warp-helper /etc/default
vim /etc/config/network #填写warp-op.conf内容,修改只用替换option private_key 和 ipv6 的 list addresses 即可
ifup warp #启动warp, 代替wg-quick up warp.conf

and test brainiac machine is back online

常见情形

大文件提交

Sometimes,it‘s the big log fault.

1
2
3
4
5
6
7
8
9
10
11
# find file
find . -type f -name "zsim.log.0" -size +10M
# find the most repeated lines
head -n 10000 your_file.txt | sort | uniq -c | sort -nr | head
# delete partten line in files
sed -i '/\[S 0\] WARN: \[6\] ContextChange, reason SIGRETURN, inSyscall 1/d' /staff/shaojiemike/github/PIA_huawei/log/zsim/chai-n/hsti/1000/cpu_tlb/zsim.log.0

# conbine two command
find . -type f -name "zsim.log.0" -size +10M -print0 | xargs -0 sed -i '/字符串模式/d'
# or just save the tail (sth wrong needed test)
find . -type f -name "zsim.log.0" -size +1M -exec bash -c 'tail -n 2000 "$1" > "$1"_back ' _ {} \;

请求被拦截

1
2
3
4
t00906153@A2305023964 MINGW64 ~/github
$ git clone https://github.com/jeremy-rifkin/cpptrace.git
Cloning into 'cpptrace'...
fatal: unable to access 'https://github.com/jeremy-rifkin/cpptrace.git/': SSL certificate problem: self-signed certificate in certificate chain

常见问题

error

出现于使用https协议,下载大仓库时,出现该错误。

  1. 首先使用retry脚本,多重试。
  2. 脚本中有http下载的限制修改。
  3. 使用depth=1参数,只下载最新提交。之后下好后能适应unshallow复原
  4. 使用更快的https代理。 e.g., 华为xgate使用HK或者Auto

expecting SSH2_MSG_KEX_ECDH_REPLY

设置mtu解决:

STEP1:

1
2
3
4
5
6
7
8
9
10
eno0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 202.38.73.217 netmask 255.255.255.0 broadcast 202.38.73.255
inet6 fe80::ae1f:6bff:fe8a:e4ba prefixlen 64 scopeid 0x20<link>
inet6 2001:da8:d800:811:ae1f:6bff:fe8a:e4ba prefixlen 64 scopeid 0x0<global>
inet6 2001:da8:d800:730:ae1f:6bff:fe8a:e4ba prefixlen 64 scopeid 0x0<global>
ether ac:1f:6b:8a:e4:ba txqueuelen 1000 (以太网)
RX packets 12345942 bytes 2946978044 (2.9 GB)
RX errors 0 dropped 1438318 overruns 0 frame 0
TX packets 4582067 bytes 675384424 (675.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

STEP2:

1
ifconfig eno0 mtu 1200

STEP3:

1
2
3
4
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eno0
MTU=1200 #MTU设置

[root@localhost ~]# systemctl restart network

参考文献

Git Standardization

workflow

内容模板

隐藏文件夹 .github , 里面放两个文件:

ISSUE_TEMPLATE.md

PULL_REQUEST_TEMPLATE.md

分支模型

Git Flow 分支模型

仓库有两个基础分支:

dev(默认分支)
master(用于发布)

通过pull request来合并新的代码:

协作者的代码通过pr合并到dev
dev通过pr合并到master

注意点:

merge 到 dev,使用squash merge
merge 到 master,使用普通的merge
永远不向master直接commit代码

GitHub Flow 分支模型

只有一个长期分支 master ,而且 master 分支上的代码,永远是可发布状态,

CI(Continuous Integration)集成

netlify

to do

github action

github自带的,貌似比Travis CI好用

ctest 怎么写

自动化生成TOC 目录

可以使用 toc-generator

  1. 在README里配置插入TOC的位置
1
2
<!-- START doctoc -->
<!-- END doctoc -->
  1. 配置GitHub Action, 需要在仓库的Settings > Actions > General里的Workflow permissions开启Read and write permissions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: Generate TOC
on:
push:
branches:
- main

jobs:
toc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: technote-space/toc-generator@v4
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

travis ci

Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。

持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。

  1. 使用准备

    1. 登录 https://app.travis-ci.com/ ,绑定github,选择监听仓库.
    2. 项目里面有可运行的代码,项目还包含构建或测试脚本
  2. .travis.yml

    1. 在项目根目录下新建 .travis.yml 文件。参考官方文档编写 https://docs.travis-ci.com/user/languages/cpp/
  3. 运行流程

    1. install 阶段:安装依赖
    2. script 阶段:运行脚本
  4. 可选部分

    1
    2
    3
    4
    5
    6
    7
    before_install:install 阶段之前执行
    before_script:script 阶段之前执行
    after_failure:script 阶段失败时执行
    after_success:script 阶段成功时执行
    before_deploy:deploy 步骤之前执行
    after_deploy:deploy 步骤之后执行
    after_script:script 阶段之后执行
  5. 运行状态

    1
    2
    3
    4
    passed:运行成功,所有步骤的退出码都是0
    canceled:用户取消执行
    errored:before_install、install、before_script有非零退出码,运行会立即停止
    failed :script有非零状态码 ,会继续运行
  6. 可选加密环境变量

git commit 规范

Angular规范

1
<type>(<scope>): <subject>

type 必须

name description 实例
feat: 新功能(feature)。 打印函数 feat: Add print function for enhanced runtime information
fix/to: 修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
fix: 产生diff并自动修复此问题。适合于一次提交直接修复问题
to: 只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
docs: 文档(documentation)。
style: 格式(不影响代码运行的变动)。
refactor: 重构(即不是新增功能,也不是修改bug的代码变动)。
perf: 优化相关,比如提升性能、体验。
test: 增加测试。
chore: 构建过程或辅助工具的变动。
revert: 回滚到上一个版本。
merge: 代码合并。
sync: 同步主线或分支的Bug。

规范化commit message

格式为:

1
2
3
4
5
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
  1. 对于Revert:
    If the commit reverts a previous commit, it should begin with revert:, followed by the header of the reverted commit. In the body it should say: This reverts commit <hash>., where the hash is the SHA of the commit being reverted.
  2. type的类型有:
  • feat: A new feature
  • fix: A bug fix
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)空白、格式、缺少分号等
  • refactor:(重构) A code change that neither fixes a bug nor adds a feature
  • perf: A code change that improves performance
  • test: Adding missing or correcting existing tests
  • chore: (琐事)Changes to the build process or auxiliary tools(辅助工具) and libraries such as documentation generation
  1. scope:
    commit 改变的位置,如果是多处写*
  2. subject:
    简明的描述:
    1. 使用祈使句,现在时态
    2. 不要.结尾
    3. 第一个字母不要大写
  3. body:
    包括改变的动机,并将其与以前的行为进行对比。
  4. footer:
    Breaking Changes或者reference GitHub issues that this commit closes.
    Breaking Changes should start with the wordBREAKING CHANGE: with a space or two newlines. The rest of the commit message is then used for this.

自动生成Release Notes

规范化commit

插件 vscode插件git-commit-plugin

命令行 husky + commitlint

工具

  1. Standard Version

    1. 实现自动化版本控制,自动创建changelog, 创建 git tags
    2. 安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    npm cache clean --force #npm指令清除npm缓存
    # 删除node_module包
    npm install -g npm # npm 更新到最新
    npm install -g n
    n latest # node 更新
    Note: the node command changed location and the old location may be remembered in your current shell.
    old : /usr/bin/node
    new : /usr/local/bin/node
    To reset the command location hash either start a new shell, or execute PATH=$PATH"
    PATH=/usr/local/bin/:$PATH
    npm install -D standard-version
    1. 编写package.json
    1
    2
    3
    "scripts": {
    "release": "standard-version"
    }
    1. CHANGELOG.md 记录内容的配置

      1. 创建.versionrc
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      {
      "types": [
      {"type": "chore", "section":"Others", "hidden": false},
      {"type": "revert", "section":"Reverts", "hidden": false},
      {"type": "feat", "section": "Features", "hidden": false},
      {"type": "fix", "section": "Bug Fixes", "hidden": false},
      {"type": "improvement", "section": "Feature Improvements", "hidden": false},
      {"type": "docs", "section":"Docs", "hidden": false},
      {"type": "style", "section":"Styling", "hidden": false},
      {"type": "refactor", "section":"Code Refactoring", "hidden": false},
      {"type": "perf", "section":"Performance Improvements", "hidden": false},
      {"type": "test", "section":"Tests", "hidden": false},
      {"type": "build", "section":"Build System", "hidden": false},
      {"type": "ci", "section":"CI", "hidden":false}
      ]
      }
    2. 使用Standard Version

    1
    2
    3
    4
    // 初次发布版本
    npm run release --first-release
    npm run release #(自动更新版本号,自动更新 CHANGELOG.md, 自动创建 git tag)
    git push --follow-tags origin master
    1. 寄
  2. Commitizen for contributors

    1. Linux下commit规范辅助,用来选择(没vscode的时候用)
    2. 用 git-cz 来提交文件
    3. https://www.jianshu.com/p/acfdd4ca0104
  3. Visual Studio Code Commitizen Support
    vscode的插件

  4. conventional-changelog/commitlint
    阻止不规范的提交

github-release-notes

github-release-notes,以下简称 gren ,是用来一键向 github 发布 release notes 的工具。
https://zhuanlan.zhihu.com/p/99499246

https://blog.csdn.net/weixin_39586683/article/details/110643111

release 语义化版本 semver

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

主版本号:当你做了不兼容的 API 修改,
次版本号:当你做了向下兼容的功能性新增,
修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。

Git auto-release requirements

  1. github Actions / travis-ci
    1. 自动化测试
  2. Commitizen / Visual Studio Code Commitizen Support
    1. 规范commit message
  3. standard-version
    1. 更新 package 版本并打 tag
  4. github-release-notes
    1. 生成 release-log

需要进一步的研究学习

写个github模板

  1. 明确文件结构
    1. src/include/build/Doc/Debug/test/example
  2. 清晰的README
    1. Intro/Install&Run/Features/Bugs/Acknowledge
    2. 图片和标签
      1. https://shields.io/category/build
  3. Release的自动发布
    1. 规范commit
  4. 其他自动化的轮子持续整合 (Continuous Integration, CI)
    1. travis ci
    2. github action
      1. ctest 怎么写?
    3. cmake.yml
    4. .github/workflow
      1. https://github.com/iBug/AWS-Lambda-webhook-py/tree/master/.github/workflows
      2. https://github.com/Kirrito-k423/github-stats
    5. 文档生成
      1. doxygen
      2. Doxygen主要解决说明书问题,可以在我们写代码的时候讲注释转化为说明书,Graphviz主要是用于图形展示
      3. 有项目,文件,函数三部分的书写要求 https://www.cnblogs.com/silencehuan/p/11169084.html
    6. Codecov
      1. 代码覆盖率,执行部分占比。因为未执行部分可能是错的
  5. projects/ bug fixs
  6. 设置为 template repository
  7. 查看 https://app.travis-ci.com/github/Kirrito-k423/githubTemplate

plus

将网站变成带名字的md格式参考文献的插件

Boost 设置

set(Boost_USE_STATIC_LIBS ON)

set(Boost_DEBUG ON)

Boost_INCLUDE_DIR: 含有boost头文件的目录
Boost_LIBRARYDIR: 偏好的含有boost库的库目录

https://stackoverflow.com/questions/3897839/how-to-link-c-program-with-boost-using-cmake

Boost Install

http://c.biancheng.net/view/7772.html cache?

cmake boost install path

https://cloud.tencent.com/developer/ask/107360

设置boost-root 查看安装位置

Travis-CI Install

Travis-CI 依赖软件包每次都要重新安装吗

apt-get install in a GitHub Actions workflow

https://stackoverflow.com/questions/57982945/how-to-apt-get-install-in-a-github-actions-workflow

Actions may have no Boost, where

ctest

Ctest add build/bin to test

Ctest https://www.cnblogs.com/hustcpp/p/12922998.html

https://blog.csdn.net/zcteo/article/details/117527823?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-15.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-15.no_search_link

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

还是ipcc的github组织的太烂了,需要学习一下

参考文献

https://zhuanlan.zhihu.com/p/67620599

http://www.ruanyifeng.com/blog/2017/12/travis_ci_tutorial.html

https://github.com/levy9527/blog/issues/1

PicBed & OSS

PicGo介绍

这是一款图片上传的工具,目前支持微博图床,七牛图床,腾讯云,又拍云,GitHub等图床,未来将支持更多图床。

所以解决问题的思路就是,将本地的文件,或者剪切板上面的截图发送图床,然后生成在线图片的链接,走到哪就可以用到哪。

  1. 创建github仓库
  2. 在设置的最后生成token
  3. 下载PicGo并设置github图床

Cloudflare R2 Storage

对象存储有时也称为 Blob 存储,可以存储任意的大型非结构化文件。我们常用的有 AWS 的 S3、阿里云的 OSS、腾讯云的 COS、华为云的 OBS,都是对象存储,他们都可以为我们提供延迟一致、持久性高和容量无限的服务,免去了我们本地文件系统的共享、备份等痛点。

最为经典的是 AWS 的 S3(Simple Storage Service),刚刚推出的时候是革命性的服务,但也带来了新的痛点,上传、存储的费用还可以,但下载也就是取回的时候会被收取流量费,这个费用随着时间的推移,存储的文件越来越多,流量费也变得越来越高

2022年 5月 Cloudflare 就为我们带来了 R2 Storage,基于带宽联盟,为存储对象提供更低成本的存储服务。在后台,R2 自动智能管理数据分层,以在峰值负载时提高性能,并为不经常请求的对象降低成本。

R2 的革命性

在上面我们了解了 Cloudflare R2 Storage 收费项目,发现了什么?只收取存储费用、操作费用,没有流量费用!是的没有流量费用,这就是 Cloudflare R2 Storage 的革命性,依托带宽联盟,做到了零出口费用![^5]

picbed / OSS compare

  1. github图床,国内连不上
  2. (推荐)七牛申请了免费的证书证书,由于是海外访问还是慢。
  3. one drive虽然能用也能访问,但是速度慢而且操作麻烦,只能一个个传。而且会失效
  4. OSS charge but easy-to-use.

Pricing

Name Storage request operations newwork flow
Cloudflare R2 10GB/monthfree+$0.015/add-GB/month 1Moperations/monthfree+ $4.50 per additional million operations(2) not charge[^5]
Aliyun OSS [^4] 0.12元/GB/月(1) 0.01元/万次 0.50元/GB
  1. (6GB内不要买套餐,最低配一年9元40GB)
  2. B 类操作费用:每个月一千万次免费额度,超出后每百万次收取 $0.36 的操作费用

reads per object is Class B operations

  1. Class A operations which are more expensive and tend to mutate state.
  2. Class B operations which tend to read existing state.[^6]

Current picbed usage

timestamp storgy Network flow(per month) request operations
Aliyun 231031 395.13MB 21.41GB 61,490
Cloudflare 231124 490MB xxx 9.11k

I need to pay 10RMB each month and the fee grows fast

My choice

  1. First I am not a cross-platform blog writer(1). So If i have a sever machine, i can save my pic in it and no need for picbed

  2. But I use cloudflare + github solution, It will face 3 potential problem

    1. pic set touch the github repository storagy size limits (maybe no limits just recommend less than 5GB[^2])
    2. cloudflare pages will clone the whole pic-repo after each git push leading to long blog building latency(2)
    3. And the cloudflare pages maybe have a static webfile limits 25MB.[^3]
  3. So I still recommand to use OSS rather than other tricks like using github.
    { .annotate }

  4. I use blog as my brain cache

  5. cloudflare pages Builds will timeout after 20 minutes.

Old阿里云图床配置

Please read [^1]

1
2
3
*设定存储空间名 shaojiemike
*确认存储区域 oss-cn-hangzhou
指定存储路径 img/

参考文献

[^1]: 阿里云OSS PicGo 配置图床教程 超详细

[^2]: large files on github

[^3]: cloudflare pages limits

[^4]: 阿里云 价格计算器

[^5]: 关于 Cloudflare R2 Storage 的使用体验测评和我的观点

[^6]: cloudflare R2 Pricing