19-07-12 -> 19-08-15

Hell world

开始 & 安装

curl https://sh.rustup.rs -sSf | sh

网络真的是僵硬,下载下一年, 我用远端服务器就很快下了 真是艹了,我在远端 都跟着教程看了两章+尝试demo了,本地的build下载还没下好

国内的话 配置~/.cargo/config如下会稍微快一些,吐槽

1
2
3
4
5
6
7
[registry]
index = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index/"
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.sjtug]
registry = "https://mirrors.sjtug.sjtu.edu.cn/git/crates.io-index/"

更新 上面不能用的话看这里 https://lug.ustc.edu.cn/wiki/mirrors/help/rust-crates

IDE/vim配置

我是用的vim + spf13-vim上加自己配置的 ~/.vimrc.local

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function CompileByFileType()
if &filetype == "cpp"
"!clang++ -o "%<" "%" -std=gnu++17 -O2 -g -Wall -Wcomma
!clang++ -o "%<" "%" -std=gnu++17 -g -Wall -Wcomma
"!g++ -o "%<" "%" -std=gnu++14 -O2 -g -Wall
elseif &filetype == "c"
!gcc -o "%<" "%" -O2 -g
elseif &filetype == "python"
!python3 "%"
elseif &filetype == "go"
!go run "%"
+ elseif &filetype == "rust"
+ !cargo run
else
echo "UNKNOWN FILETYPE : &filetype"
endif
endfunction

nnoremap <F9> :call CompileByFileType() <CR>

其它的话 据说Clion + rust插件 不错

入门命令

rustup docs --book

66666 题外话,我觉得现代的游戏 除了游戏本身还需要 背景,目标玩家定位,目标游戏类型定位,以及自身完备性和营销。自身完备性比如观战,历史记录等,去年出的 刀牌 从6万峰值到现在上线就是世界前100,我认为其中缺少的就是完备性。而rust 带一个 这个文档66666

有了教程,那我yyp一点 教程里的总结吧

  • 单个rs:rustc main.rs
  • build project using cargo build or cargo check.
  • build + run a project cargo run.
  • Instead of saving the result of the build in the same directory as our code, Cargo stores it in the target/debug directory.
  • cargo build –release

依赖相关

如果玩过npm可以感觉到和package.json 和对应的lock相似

首先Cargo.toml 中加入需要依赖的库和版本描述,如rand = "0.3.14",会匹配能匹配的某个版本

然后cargo build

Cargo.lock会保存首次build的各个库的版本

如果希望升级cargo update

基本语法+写一个猜测数游戏

猜数

依赖

閱讀全文 »

Why

作为被factorio洗脑的人 看到 自动化 自动化 自动化 就会激动

Steps

首先你需要 java 8(jre/jdk),docker

这两个我之前都安装过了

然后下载jenkins: https://jenkins.io/zh/download/

运行命令java -jar jenkins.war --httpPort=8080

打开网页http://localhost:8080

输入终端里展示的密码 –> 下一步 –> 等待安装git等一系列工具 –> 创建管理员用户`–> 实例配置(我发现有不少网页开发工具都有意无意的避开了8080端口 这里我直接默认) –>开始使用

我这边最后一步以后白屏了,但是从Network看似乎没有资源卡着,于是我把服务先杀掉再启动一遍,可以进入jenkins了23333

Hell world

单击 New Item

閱讀全文 »

开始 & 安装

文档

https://code.visualstudio.com/api/get-started/your-first-extension

https://github.com/microsoft/vscode-extension-samples

install & Run

1
2
npm install -g yo generator-code
yo code

选择你希望的选项

code ./新建目录

F5启动

Ctrl+Shift+P输入Hello world回车

当你修改了代码后,在新打开的窗口Ctrl+Shift+P再输入Reload Window就重新加载了代码

解剖

package.json

  • 注册 onCommand Activation Event:onCommand:extension.helloWorld ,so the extension becomes activated when user runs the Hello World command.

  • 使用contributes.commands Contribution Point 来让Hello World命令 在Command Palette 可用,并且绑定到命令idextension.helloWorld

  • 使用commands.registerCommand的VS Code API绑定到已注册的命令ID extension.helloWorld

  • Activation Events: events upon which your extension becomes active.

  • Contribution Points: static declarations that you make in the package.json Extension Manifest to extend VS Code.

  • VS Code API: 代码中API,可以在你的extension代码中调起

其它配置文件

  • launch.json used to configure VS Code Debugging
  • tasks.json for defining VS Code Tasks
  • tsconfig.json consult the TypeScript Handbook

package.json

vsc使用 <publisher>.<name>作为一个插件的unique ID

tree-view

emmmmmm 看了一会代码 发现有文档 https://code.visualstudio.com/api/extension-guides/tree-view

直接看文档吧…

Why

可以在私有环境下使用。如果想用非私有,现成的,可以考虑https://github.comhttps://gitlab.com

手工安装 docker-ce

安装依赖

1
sudo apt install ca-certificates curl openssh-server postfix

安装 gitlab-ce

1
2
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt install gitlab-ce

注: 国内有不少镜像源 例如https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/,国内镜像会快很多,可以替换上面生成的/etc/apt/sources.list.d/gitlab_gitlab-ce.list中的路径

sudo gitlab-ctl reconfigure

按理说这里就可以用了

你需要设置root的密码,和新建一个用户以及(设置该用户的密码)

配置

然而 因为我本地apache服务和原来开启的nginx服务,有80冲突和原来nginx服务冲突(?),导致我找问题找了很久很久[我似乎也没看到报错

修改 sudo vim /etc/gitlab/gitlab.rb

中的external_url 为你的domain名称+port,如http://192.168.1.51:8081

最后我停掉两个服务再重启 gitlab就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 未使用了 如果本身还有nginx据说可以配一下
# nginx listen_port 配置

修改

`/etc/gitlab/gitlab.rb`

找到`nginx['listen_port']`修改为

nginx['listen_port'] = 8081

再执行`sudo gitlab-ctl reconfigure`

访问`你的domain:8081`即可
*/

gitlab on docker

1
2
3
4
5
6
sudo docker run --detach --name gitlab \
--hostname gitlab.example.com \
--publish 30080:30080 \
--publish 30022:22 \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com:30080'; gitlab_rails['gitlab_shell_ssh_port']=30022;" \
gitlab/gitlab-ce:latest

好了 ssh 30022和http 30080都ok,docker真香了

https://developer.ibm.com/code/2017/07/13/step-step-guide-running-gitlab-ce-docker/

https://docs.gitlab.com/omnibus/docker/README.html

问题:仓库通过ssh的git clone报错

httpclone可用

sshclone报错: fatal: protocol error: bad line length character: Welc

gihub上很多说sed -i 's/session\s\+required\s\+pam_loginuid.so/# \0/' /etc/pam.d/sshd 就是注释掉 也没用(也restart 过)

问题排查

网上有很多 pam的 校验关闭都没有用

然后 通过ssh -vvv git@<ip>得到Exit status 254,对应也是没有搜到可行方案,但感觉距离问题近了些

查看/var/log/auth.log发现

1
2
3
4
5
6
Aug 20 14:24:03 RBEST systemd: pam_unix(systemd-user:session): session opened for user git by (uid=0)
Aug 20 14:24:03 RBEST systemd-logind[941]: New session 170 of user git.
Aug 20 14:24:03 RBEST sshd[16070]: error: PAM: pam_open_session(): Module is unknown
Aug 20 14:24:03 RBEST sshd[16148]: Received disconnect from 192.168.1.51 port 48618:11: disconnected by user
Aug 20 14:24:03 RBEST sshd[16148]: Disconnected from user git 192.168.1.51 port 48618
Aug 20 14:24:03 RBEST systemd-logind[941]: Removed session 170.

这个error也搜不到对应的

鸽了! 用 docker来搞

docker的方法测试

ssh -vvv git@gitlab.example.com -p 30022的exit code 是0 所以感觉还是 本地的ssh相关的东西配置有问题

修复(重装试试)

上面我得到的信息是

  1. ssh git@应该是成功登录了 但是没有和gitlab联系上
  2. docker里看 只用简单配置 就应该能用
  3. 我尝试新开了个空白虚拟机,装一遍gitlab是能用的

于是按照https://askubuntu.com/a/824723/653605把 gitlab完全删除 再重装就好了?喵喵喵,虽然现在能用了,可是之前究竟是什么问题。

TODO email

https://docs.gitlab.com/omnibus/settings/nginx.html

权限管理

权限管理 https://docs.gitlab.com/ee/administration/#user-settings-and-permissions

用root权限用户登陆

<你的地址>/admin/application_settings

可见和可访问性

的Restricted visibility levelsx限制为 内部和私有

关闭了为所有项目默认 runner和默认CI/CD

HTTPS

/etc/gitlab/gitlab.rb 设置

external_url 'https://gitlab.xxx.com'

以及

1
2
letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['你的email']

gitlab-ctl reconfigure就可以自动生成证书并且 启用https了

内存占用过大

1
2
unicorn['worker_timeout'] = 60
unicorn['worker_processes'] = 2

也有其它git server :https://gogs.io/

参考

https://about.gitlab.com/

https://hub.docker.com/r/gitlab/gitlab-ce/

https://gitlab.com/gitlab-org/gitlab-foss/-/issues/25840

https://docs.gitlab.com/omnibus/settings/unicorn.html

知识依赖

  1. 基本的js语法
  2. 基本的nodejs用法
  3. Promise用法

准备工作

我想用nodejs直接跑rxjs,然而它并不支持es6的import,尝试了--experimental-modules依然有报错

方案1 在线编辑器

https://rxjs-dev.firebaseapp.com/guide/observable 在上面代码点击右上角的Edit in StackBlitx

方案2 nodejs + rxjs + ES6

https://github.com/standard-things/esm

安装:npm install esm rxjs

带上esm运行

node -r esm index.js

方案3 webpack + rxjs + ES6

创建文件夹 并初始化

1
2
mkdir rxjsdemo && cd rxjsdemo
npx webpack-cli init

这样选择

1
2
3
4
5
? Will your application have multiple bundles? No
? Which will be your application entry point? index
? In which folder do you want to store your generated bundles? dist
? Will you use one of the below JS solutions? ES6
? Will you use one of the below CSS solutions? No

然后运行

1
npm install --save-dev rxjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { Subject } from 'rxjs';
import { interval } from 'rxjs';

const subject = new Subject();

subject.subscribe({
next: (v) => console.log(`observerA: ${v}`)
});
subject.subscribe({
next: (v) => console.log(`observerB: ${v}`)
});

subject.next(1);
subject.next(2);

const observable = interval(1000);
const subscription = observable.subscribe(x => console.log(x));

运行npm start在打开的网页查看console是否正常输出, 忽略红字,能输出如下即可

1
2
3
4
5
6
7
observerA: 1
observerB: 1
observerA: 2
observerB: 2
0
1
...
閱讀全文 »

参考

https://webpack.js.org/concepts/

警告!虽然有.com的中文文档,但是存在没有更新文档的问题,不是webpack4版本的文档!!例如CommonsChunkPlugin已经被弃用,CleanWebpackPlugin的引入和使用方法不同版本不同

核心概念

入口entry

对应配置中的entry属性

webpack.config.js

1
2
3
module.exports = {
entry: './path/to/my/entry/file.js'
};

常见 分离应用程序和三方库入口

1
2
3
4
5
6
const config = {
entry: {
app: './src/app.js',
vendors: './src/vendors.js'
}
}

根据经验:每个 HTML 文档只使用一个入口起点。多页面应用

1
2
3
4
5
6
7
const config = {
entry: {
pageOne: './src/pageOne/index.js',
pageTwo: './src/pageTwo/index.js',
pageThree: './src/pageThree/index.js'
}
};

注意 以上都可以用CommonsChunkPlugin来优化公用代码

输出output

在哪里输出所建立的bundles以及命名

閱讀全文 »

参考

https://www.bilibili.com/video/av37345007?from=search&seid=12943305398860809438

https://www.bilibili.com/video/av55286346?from=search&seid=13529674123410117444

吹什么

vue的 声明式写法,最常见讲是computed

比如0 js代码 ,直接组件实现 阶乘,斐波那契数列的计算

和 命令式相比,

历史发展向讲解

就 应用程序 实体举例

跨语言啊交互举例 recycle-list

简单说 原来的命令式 比较常用的是 事件->执行的代码

现在 实现 大概是 数据 = 构成来源

vue3

chrome devTools 周活用户90万 / react的160万

what’s target?

閱讀全文 »

参考

https://material.io/collections/developer-tutorials/#web

很早就有人说过了material,不过在那时,1是不太能阅读英文文档,2是没有实际的需要,也没有要用的想法,没有阅读

下面是个人整理 (大概需要的前置知识 node基本+html+js+css

是什么

跨平台,好看的,google出的ui标准

demo

git clone https://github.com/material-components/material-components-web-codelabs

安装所有ui

npm install material-components-web

从文档和操作上来看 需要做3件事

  1. 引入css 如@import "@material/textfield/mdc-text-field";
  2. 在html的元素上 给对应的class
  3. js里引入组件和 对相应元素进行处理,如下
1
2
import {MDCTextField} from '@material/textfield';
const username = new MDCTextField(document.querySelector('.username'));

demo101 102里介绍了 输入框,按钮,图片,列表

然后103 介绍了一些,theme(例如主题颜色),subtitle(typography),elevation(实际是阴影效果 用来让页面元素有高低感觉),mdc-image-list--masonry非等长图片排列

demo111 介绍了,如何对一个原来写过的原始工程,修改成Material Components的样式(基本就是 npm引入,js引入,css引入,换class,加js

demo112 介绍了一个react工程上 改为material components

最后 目前看下来 angular+material 最多star的是https://material.angular.io

参考

https://www.cigniti.com/blog/7-best-practices-for-agile-test-driven-development/

https://www.freecodecamp.org/news/test-driven-development-what-it-is-and-what-it-is-not-41fa6bca02a2/

避免过于复杂的函数

保持每个函数 自扫门前雪,与团队讨论保证每个测试用例覆盖了所有期望的函数功能

聚焦于你真正需要实现的

测试用例要清晰描述 期望的 最终实现的功能,并按照这个原则编写。

Maintain code austerity

在通过测试样例的前提下,尽可能保持代码可读,可迭代。

Test repeatedly

…编写过程中持续测试,CI等工具都可以

Maintain code sanctity

用git,Jenkins等工具…….?????

Application knowledge

文档维护,

In TDD, coding needs to be limited but effective in that it achieves its purpose without breaking anything else. Also, the new code should ideally pass the test case in the very first run. Maintaining adequate system documentation, including a repository of test cases and engaging team members with good application knowledge can ensure a smooth and successful project execution.

Know when to use TDD

任何延长或复杂的测试都会破坏TDD的目的。

TDD rules

  • 你不被允许编写任何让单元测试挂掉的代码

  • Write only enough of a unit test to fail.

  • Write only enough production code to make the failing unit test pass.

就是说,不论是测试代码还是业务代码,都是足量,但又尽量少,【例子 红绿灯

red phase

首先 写一些 用户会需要的 ’需求‘ 而不是 ’测试‘

所以 你考虑的角度是类似BDD(行为驱动开发)的,你会在开发前首先写代码,假设它已经完成了

这个阶段你需要考虑代码的出入参数 如何被使用,需要注意的是再该阶段 关注你核心需要的,而不是写大量的

green phase

编码

注意的是,这部分主要关注的是按照 red phase部分的 代码,实现,在这部分,不需要过度关注 性能,代码复用,也不要改测试

代码的优化应该在todolist 或 重构的时候清理 整理

但你应该写 直接实现,且可迭代的代码

新的feature只要还没有测试,就不应该先实现

refactor phase

代码抽象 去重 等等

Final considerations Q&A

TDD 需要很多 多于普通编码的时间

当你熟练了 不会多很多,而在后续的持续开发中,将省时间

需要写多少

足够你测试开发的代码,的最少量,因为每个测试都会拖慢重构,但重构需要测试来支撑

分析设计框架

你依然需要,TDD无法替代,在TDD之前,应该先分析设计。

这个是我具体实践起来感觉 很重要也有难度的,如果你对业务和功能,没有实践过,那么你可能分析得设计得不全面,这样的情况下你的测试样例也实现的 有缺失。一个可能就是编码的过程可能发现测试不够,这样一个办法就是继续走cycle再改。而我之前的写python的实践时,就直接把测试ban掉了XD。还是走了先代码后测试的老路

100% coverage

不必,视图等常变的微量逻辑毫无必要写TDD测试

TDD 在examples上 工作得号,但实际代码上 很多代码未被测试

emmmmmmm….. 作者用TDD方法 写了一个俄罗斯方块

TDD 谁来写

这里的观点是TDD是开发写,而真正的测试是测试人员来写

0%