开始 & 安装

文档

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是开发写,而真正的测试是测试人员来写

哇,我的天呐,好谢谢,谢谢大家,哇我的天啊,今天的气氛,真的跟我想象中非常不一样哎,今天今天很嗨,今天很嗨,颇有那个两天前凯达格兰大道的气氛

不好意思,不好意思,那个我今天写了一个蛮认真的讲稿,所以大家请容忍我几分钟这样子

老师,各位同学大家好,我是建中61届的校友曾博恩,

非常开心,去年呱吉已经致过辞了,让我今年可以以备胎的身份回到母校致辞,

我很开心看到各位现在坐的椅子跟当年一样不舒服,

我毕业是刚好十年之前,那十年前呢,我跟各位一样坐在台下,忍受着隔壁同学的汗臭,嘲笑着还要考指考的同学

心里想着到底还要多久才可以离开这个无聊的典礼

但我知道任何演讲当中呢,大家也只是再次确认自己已经相信的东西,再次拒绝自己不相信的东西,你们的人生不会因为这10分钟有任何改变,所以我只有一个目标就是尽量不要把它搞得太尴尬


OK,你们高中毕业了,耶~~~

如果你们是其他杂七杂八的学校的话,我就会说恭喜

但是因为这里是建中,所以我就不侮辱各位了,因为我知道高中毕业是99%的人都办得到的事情

高中毕业比起你们将来可以达成的辉煌事迹根本不足挂齿,如果你知道一个人可以穿越撒哈拉沙漠你不会因为他跑完100公尺而恭喜他


今年毕业典礼的主题是end game,然后据说毕筹会呢,希望我讲一些跟这个主题有关的内容,但你们知道通常我写一个10分钟的段子,是可以收好几万块的,所以

所以我就帮建中写了一个10分钟的段子,因为,因为我没有什么真的钱可以回馈给母校,

这个终局之战啊,把endgame特别拆成两个字,我在猜它意味着游戏已经结束了,然后高中毕业大家开始认真了,那这个题目呢,基本上非常的高傲,因为你们都已经考上建中了,然后说这只是游戏而已啊

我猜的啦,我猜的啦

你们有考虑过延平高中同学的感受吗?

好,很好,很好,非常有建国中学的精神,高傲哈

但这个说的不错,因为在高中毕业之后,能玩的时间越来越少了,你们只剩大学四年可以玩了,或者你如果玩的够凶的话七年

啊,不过,不过这种心境上面的转变,说不玩了,不嬉闹了,要拿出真本事来面对这个世界,这个转变的确是蛮重要的,因为学如逆水行舟不进则退,将来这股涌流只会越来越湍急,而如果你不够认真,退的够快的话,说不定还会沦落到当Youtuber

不要,不要,不要像我们一样


但我想要在这边勉励各位毕业生啊,千万不要忘记怎么玩,因为活在这个世界但不玩乐,就像当一个政治人物但不a钱一样

你不免要问自己说你到底在干嘛,所以Don’t end the game,never end the game,

快乐的感觉是我们的基因为了要继续生存,吩咐我们的大脑欺骗我们说,这个吃力不讨好的世界,还有唯一值得活下去的原因,

所以请继续玩乐,要玩但是不要瞎玩,在玩乐的过程当中,要知道游戏的哪一个元素,是会让你感受到快乐的,因为这个元素有很大的机会也会让别人感受到快乐,而掌握让自己跟周遭人都快乐的秘诀,就是成功的快速通行证

你可以用这个能力换得财富、人际关系,或是一个超棒的高潮

我已经开始感受到有一些师长开始惊慌失措了

我已经侦测到有些指责的眼神像当年陳為廷的鞋子一样,直接朝我射过来

让我顺便带到下一点,建中同学你们出去之后要要懂得批判,但是不要只会批判,要点出问题非常简单,但是难的是找到更好的替代方案

你可以觉得刚才的笑话不登大雅之堂,但在你找到比高潮更贴切的比喻之前,我会继续讲下去


OK,这样会讲不完,这样真的会讲不完

我不知道这个end game是不是有别的意思

因为我不知道你们是故意要拆成两个字,还是只是不知道这本来是一个字

如果是后者的话那你们英文程度真的蛮差的,那个就跟那种会把vs点写成v点s点的人一样

但如果是这种几率性很低的书写错误的话,我也准备了一些跟endgame有关的勉励

如果你们会下西洋棋的话你就会知道endgame是残局的意思,那残局并不是一个大舌头的高雄人称呼他们前市长的名字是,他是残局不是,不是残局,是西洋棋下到最后只剩几颗棋子的局面

好那各位要知道,endgame最重要的是你要如何将有限的资源最大化,

那要做到这一点呢,你必须知道你有哪些资源,然后也要知道你的目标是什么

唯一的困难点是,在这个技术科技性发展的现在,你很难知道呃自己的目标是什么

在10年前,我们还在用Sony Erikson玩德州飞人的时候,有谁想得到今天只要漏奶学猫叫就可以月入几十万

所以在一个不确定性这么高的环境里面,我的经验是做你认为可以让这个世界变得更好的东西,叫他热情也罢,使命感也好在,我的作品里面通常反应比较好的,都是我真正感受到对现况的不满,而自然而然随之产生的

换句话说,你如果想要拍一个pornhub的影片呢,不会有人看,但是你如果拍了一个超好的影片,一定会有人帮你上pornhub


OK,最后1/3

如果大家看过复仇者4的这个电影,大家应该都看过了吧,还没还还没看过的话就代表你不你不在乎,所以呃,我继续讲

如果你看过复仇者4这部电影的话,你就会知道复仇者获胜的关键不只是周严的计划,面对突发状况的应变能力,最重要的是他们有钢铁人

哦,对,就只有钢铁人一个人重要而已,没有钢铁人其他人都是废物

钢铁人非常重要,因为钢铁人展现了一个人靠着超高的IQ也可以变成超级英雄

那这个角色用来勉励建中的同学我想是再适合也不过

因为在建中真的很有复仇者联盟的感觉,大部分的的同学都有超乎常人的能力,那当然班上还是会有一些鹰眼

就是,你不知道他是怎么加入这个大家庭的,但他就在那里

稍安勿躁

我要讲的重点是,当年的鹰眼就是我,在建中的时期是我人生最平庸但是也最快乐的时期

你们现在可能感受不到,但是在任何方面都可以碾压自己的同学,被这样子的同学包围是一个很幸福的感觉

因为在任何领域都有学习的对象,然后任何事情你几乎都不需要担责任

我在美国住了6年,我英文是母语程度,但是我当年的英语话剧是男配角,然后因为男主角呢,他在纽西兰住了7年,然后他同时身兼导演跟编剧,完全被碾压

所以建中会是你们接触到智商跟才华最密集的地方,对,就是建中,不是台大,相信我,我读过台大,台大有一堆智障

你们的人生,即将面临一个再一次的重大变化,因为在进入建中之前,大概所有的同学都是一方之霸,你们都是班上最优秀的学生

那经过三年的洗礼之后,大部分的人都已经忘记那种感觉了,现在你们要离开建中,大家要各据山头,你会有一种从勇士队的Kevin Duran变成湖人队的LeBron James的感觉

好,我知道,这样子讲有点不尊重所谓的多元智能,所以我换个比喻好了

以后你身边的人的专长,可能比较不是智能这一块,可能比较是像好客这种

那我在这边,要勉励各位同学,要当以后这个团队当中的钢铁人,维持清晰的头脑,不要忘记了那个是你们的超能力,要相信队友,但是内心同时也不要偷偷希望下一个队友可以帮你传球,帮你接球,帮你擦屁股

因为以前没有带钥匙妈妈可以帮你开门,以前期末报告没有想法老师可以给你提示,但是上大学之后呢没有人会当你的靠山,你自己要当那个最后的靠山,当团队所有人都在推卸责任事情只做一半的时候,你要当那个書擋

你要知道it all ends here,每一件事情到你这边结束,在关键的时刻时刻把责任扛下来,然后把事情解决好

有点剧透,当然最好的情况就是你们才华洋溢到刚才的建议你们都不需要用到

但是我觉得如果你们在这边已经忍受我废话够多的话,那祝福你们将来有个美丽辉煌璀璨的未来,谢谢大家

閱讀全文 »

oiTerminal

简介

能够通过命令行 打oj比赛

开发进度

  • codeforces 已经完全支持 分析题目,上传,获取评测结果
  • 其它oj准备开工

对任意oj都支持本地的代码测试了

相关项目

cf-tool

idne

cfTerminal

spider

开发过程中的一些想法

首先 cfTerminal 是基于idne开发的

閱讀全文 »
0%