├── .github └── workflows │ └── blog.yml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README-zh.md ├── README.md ├── img └── screenshot.jpg ├── package.json ├── pnpm-lock.yaml ├── src ├── .gitignore ├── .vuepress │ ├── components │ │ ├── Category.vue │ │ ├── Footer.vue │ │ ├── Header.vue │ │ ├── LoadingCard.vue │ │ ├── LoadingCategory.vue │ │ ├── PostCard.vue │ │ └── SearchBox.vue │ ├── config.js │ ├── custom.js │ ├── icons │ │ └── search.svg │ ├── public │ │ └── favicons │ │ │ └── icon.png │ ├── styles │ │ ├── fonts.styl │ │ ├── index.styl │ │ └── palette.styl │ └── theme │ │ ├── 404.vue │ │ ├── Layout.vue │ │ ├── PostLayout.vue │ │ ├── ResumeLayout.vue │ │ └── index.js ├── categories │ └── .gitignore ├── cv-en.md ├── cv.md └── posts │ └── .gitignore ├── template ├── custom.js ├── cv.md └── main.yml └── tools ├── .gitignore ├── config.template.js ├── deploy.js └── run.js /.github/workflows/blog.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - source 7 | issues: 8 | types: 9 | [ 10 | opened, 11 | closed, 12 | edited, 13 | milestoned, 14 | labeled, 15 | unlabeled, 16 | reopened, 17 | demilestoned, 18 | ] 19 | 20 | jobs: 21 | build: 22 | runs-on: ubuntu-latest 23 | 24 | strategy: 25 | matrix: 26 | node-version: [19.x] 27 | 28 | steps: 29 | - uses: pnpm/action-setup@v2 30 | with: 31 | version: latest 32 | - uses: actions/checkout@v3 33 | - name: Download Issue and Publish 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | run: | 37 | pnpm i 38 | pnpm action 39 | pnpm build 40 | pnpm run deploy 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | dist 3 | package-lock.json 4 | 5 | cates.json 6 | issues.json 7 | 8 | tmp 9 | .idea 10 | 11 | yarn-error.log -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2012 Romain Lespinasse 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 |

ISSUE BLOG

2 | 3 |
4 | 5 | [English](./README.md) / [中文](./README-zh.md) 6 | 7 | 易于使用、免服务器部署、响应式设计的博客主题。 8 |
9 | 10 | 截图 11 | 12 | ## 特性 13 | - 响应式设计,适配多种设备尺寸; 14 | - 支持 LaTex 公式; 15 | - 为打印特别优化的样式; 16 | - 支持 SEO 优化; 17 | - 直接使用 Github 的 Issue 功能书写和发布你的博客; 18 | - 使用 Github Actions 即时部署,无需额外的服务器; 19 | - 游客可以使用 Github 账号登陆并评论你的博文; 20 | - 附送一个精心设计的简历页面; 21 | - 这一切,只需要花费你的**三分钟**时间来配置。 22 | 23 | ## 使用 24 | 无论你是编程新手还是老鸟,本项目都提供了多种配置方式供你使用,可以根据自身情况选择安装方式。 25 | 26 | ### 最简安装 27 | 本小节所示的安装方法可以满足大多数人的需求,你只需要在你的 `.github.io` 仓库中新建三个配置文件,即可开始使用,具体步骤如下: 28 | ``` bash 29 | .github 30 | |- workflows 31 | |- custom.js # 项目配置文件 32 | |- cv.md # 简历模板配置文件 33 | |- main.yml # github actions 配置文件 34 | ``` 35 | 1. 按照如上结构在你的 Github.io 仓库目录中新建文件,文件内容参考 [`./template`](./template) 下的同名文件; 36 | 2. 按照[配置说明](#配置说明)修改 `custom.js` 和 `cv.md`; 37 | 3. 修改 `main.yml` 文件中所有的 `` 占位符为你的 Github ID。 38 | 39 | ### 普通安装 40 | 本小节内容面向对 Github 不熟悉的新手,在阅读本节之前,请确保你已经注册有自己的 Github 账号并已登录,如果你已经拥有了一个 Github.io 仓库,请使用[自定义安装](#自定义安装)或[最简安装](#最简安装)。 41 | 1. 点击本项目右上角的 `Fork` 按钮,获取本项目的备份; 42 | 2. 在自己的 Github 仓库页,找到上一步 `Fork` 出来的仓库,在仓库的 `Settings` 页面,将项目名称重命名为符合 Github Pages 要求的名字格式,以作者为例,作者的 Github ID 是 `Yidadaa`,则仓库名字应该为 `Yidadaa.github.io`; 43 | 3. 注意到项目的默认 `Branch` 是 `source`,这是因为 Github 默认使用 `master` 分支作为 Github Pages 主页,所以本项目将源码托管在 `source` 分支,在项目中找到 `/src/.vuepress/custom.js` 文件进行编辑,即可开始配置,各配置项说明见[配置说明](#配置说明)。 44 | 45 | ### 自定义安装 46 | 本小节面向有 Github 使用经验,并且已经拥有自己的 Github Pages 的用户。 47 | 48 | 如果你想完全舍弃原来的 Github Pages 内容,只需要将原来的 Github.io 仓库删除,然后参照[最简安装](#最简安装)进行安装即可;如果你想保留原有的 Github Pages 内容,并与本项目构建出的文件共存,那么可以遵循以下步骤进行安装: 49 | ```bash 50 | # 1. 将本项目 clone 到本地 51 | git clone https://github.com/Yidadaa/Issue-Blog-With-Github-Action.git 52 | 53 | # 2. 修改远程仓库地址为你的 Github.io 仓库 54 | git remote set-url origin your-remote-github.io-repo.git 55 | 56 | # 3. 推送代码到远程仓库的 source 分支 57 | git push origin -u source 58 | ``` 59 | 60 | 经过以上步骤后,去远程仓库的浏览器页面,找到 `Settings -> Branches`,修改 `Default branch` 为刚刚推送的 `source` 分支,然后找到 `/src/.vuepress/custom.js` 文件进行编辑,即可开始配置,各配置项说明见[配置说明](#配置说明)。 61 | 62 | ### 配置说明 63 | 本小节将对本项目用到的各个配置项进行说明,这些配置项对定制化你的页面至关重要。 64 | 65 | #### `vssueConfig` 66 | 评论系统配置,本项目使用 [Vssue](https://vssue.js.org) 作为评论系统,`vssueConfig` 中的配置项与 [Vssue 文档](https://vssue.js.org/guide/github.html) 保持一致,请按照该文章进行配置,只需要注意 `repo` 一项填写你的 `github.io` 仓库名称即可; 67 | ```js 68 | { 69 | repo: String, // your github.io repo name 70 | owner: String, // your github id 71 | clientId: String, 72 | clientSecret: String 73 | } 74 | ``` 75 | 76 | #### `repoConfig` 77 | 构建出的静态页面推送配置,其中 `repo` 和 `owner` 应与 `vssueConfig` 中保持一致,`pushBranch` 保留为主分支即可(github之前的默认主分支是 `master`,现在是 `main` ),`email` 填写为你的 Github 账号绑定的邮箱,用于填写 commit message。 78 | 79 | 如果你不想让其他人发布的 issue 出现在你的主页,可以在 `filterUsers` 字段设置用户 ID 白名单,若设置为空或者不设置,则表示任何人发布的 issue 都会被发布出来。 80 | ```js 81 | { 82 | repo: String, // same as vssueConfig.repo 83 | owner: String, // same as vssueConfig.owner 84 | pushBranch: String, // which branch to deploy static pages, default is 'master' or 'main' 85 | email: String, // your email of github account, just for commit message 86 | filterUsers: Array // filter issues according to github account ids 87 | } 88 | ``` 89 | 90 | #### `title` 91 | 网站标题。 92 | 93 | #### `description` 94 | 网站描述。 95 | 96 | #### `customDomain` 97 | 自定义域名,如果你有自己的域名,请将域名填写到此处。 98 | 99 | #### `base` 100 | 自定义根路径,**注意:** 本选项与你的网站 url 配置有关,如果你的博客地址是 `xxxxx.com/blog`,则此项应该填写为 `/blog/`;如果你的博客地址采用了子域名的方式,如 `blog.xxxxx.com`,则配置为 `/`。详情可查看 [vuepess 关于此项配置的说明](https://vuepress.vuejs.org/zh/config/#base)。 101 | 102 | #### `slogan` 103 | 网站首页的文字,`main` 为第一行,`sub` 为第二行,不建议留空。 104 | ```js 105 | { 106 | main: String, // top line 107 | sub: String // bottom line 108 | } 109 | ``` 110 | 111 | #### `themeConfig` 112 | 主题的配置,其中各个配置项的作用为: 113 | - `nav`:头部导航栏,数组类型,结构为 `[{ name: String, link: String }]`; 114 | - `headTitle`:头部文字,可留空; 115 | - `friendLinks`:底部友情链接,数组类型,结构与 `nav` 保持一致; 116 | - `extraFooters`:底部额外信息项,数组类型,结构为 `[{ title: String, text: String }]`,可存放网站备案号等信息; 117 | - `pageCount`:是否在页脚显示 pv、uv 等信息,网页计数功能由 [busuanzi](http://busuanzi.ibruce.info/) 提供。 118 | ```js 119 | { 120 | nav: [{ 121 | name: String, 122 | link: String 123 | }], // navigation 124 | headTitle: [String], // Decorative texts in site header 125 | friendLinks: [{ 126 | name: String, 127 | link: String 128 | }], // friend links in bottom footer 129 | extraFooters: [{ 130 | title: String, 131 | text: String 132 | }], // extra texts in bottom footer 133 | pageCount: true // whether to show page report on footer or not 134 | } 135 | ``` 136 | 137 | #### `head` 138 | 这里存放了一些元信息,详情可见 [vuepress 关于此项的说明](https://vuepress.vuejs.org/zh/config/#head),可以在此处添加网站 icon。 139 | 140 | ### 简历模板的配置 141 | 本项目提供了一个样例简历,可以直接在该简历基础上进行修改,直接编辑 `/src/cv.md` 即可,该配置使用 `yaml` 语法。 142 | 143 | ### 开始书写博客 144 | 1. 在你的 `github.io` 仓库的 Issue 区新开一个 Issue,书写博客内容并保存,Github Actions 会自动触发并构建新增的博文; 145 | 2. 你可以使用 Issue 的 `milestone` 来归档博文,可以查看作者的[样例](https://github.com/Yidadaa/Yidadaa.github.io/milestones); 146 | 3. 你可以在仓库的 Actions 选项卡中查看构建进度。 147 | 148 | ## 开发 149 | 在本地开发之前,请先在[此处](https://github.com/settings/tokens)新增一个用于调试的 token 备用,然后按照以下步骤进行开发: 150 | ```bash 151 | # 1. 将 token 放置到 ./tools/config.js 中 152 | cp ./tools/config.template.js ./tools/config.js 153 | # 把你的 token 写入 ./tools/config.js 154 | 155 | # 2. 安装必要的依赖项 156 | yarn install 157 | yarn global add vuepress 158 | 159 | # 3. 拉取 issue 并保存在本地 160 | yarn run local 161 | 162 | # 4. 启动开发服务器 163 | yarn run dev 164 | ``` 165 | 其余开发说明,请参阅 [vuepress 官方文档](https://vuepress.vuejs.org/)。 166 | 167 | ## 常见问题 168 | ### 1. 如果防止别人发布的 issue 出现在我的主页? 169 | 你可以配置 `repoConfig.filterUsers` 字段来设置白名单。 170 | 171 | ### 2. 更新配置代码时,github action未自动执行? 172 | 173 | 你可以检查仓库的 `.github/workflows/main.yml` 下 `on->push->branches` 是否是你代码变动的分支。默认该配置为 `master`, 174 | 但是现在 github 的默认分支为 `main`。 175 | 176 | ### 3. 可以成功执行 github action, 但是仓库代码未更新并添加静态页面文件? 177 | 178 | 请查看 github action 的日志,确认 GITHUB_TOKEN 是否拥有写的权限,若没有,请参考 [GITHUB_TOKEN官方文档](https://docs.github.com/zh/actions/security-guides/automatic-token-authentication),在 `.github/workflows/main.yml` 文件中赋予对仓库的读写权限。 179 | 模板 [`./template/main.yml`](./template/main.yml) 默认赋予所有读写权限。 180 | 181 | ## 鸣谢 182 | - 本项目基于 [vuepress](https://vuepress.vuejs.org/) 开发。 183 | - 网页计数功能由 [busuanzi](http://busuanzi.ibruce.info/) 提供。 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

ISSUE BLOG

2 | 3 |
4 | 5 | [English](./README.md) / [中文](./README-zh.md) 6 | 7 | An easy-to-use, serverless-deploying, github-based blog theme. 8 |
9 | 10 | 11 | screenshot 12 | 13 | ## Features 14 | - Modern responsive design. 15 | - Fully LaTex math support. 16 | - Print friendly. 17 | - SEO friendly. 18 | - Use Github issues to organize your blog. 19 | - No need for a server to host or deploy the blog pages. 20 | - Login with Github accounts and comment to the posts. 21 | - Well-designed resume page. 22 | - Build your personal homepage in **3 minutes**. 23 | 24 | ## Why ISSUE BLOG? 25 | With ISSUE BLOG, a web browser is the only tool you need to use to setup, deploy and write your personal blog. 26 | 27 | ## How to Use 28 | Below are just some of the methods for installing ISSUE BLOG. Do not follow all of these instructions; just pick your favorite one. 29 | 30 | ### Simple Installation (without Fork) 31 | ``` bash 32 | .github 33 | |- workflows 34 | |- custom.js # site config 35 | |- cv.md # resume config 36 | |- main.yml # github actions config 37 | ``` 38 | 1. Create the above files in your `github.io` repo, you can find the templates of these files at [`./template`](./template); 39 | 2. Edit `custom.js` and `cv.md` according to [Config Reference](#config-reference); 40 | 3. Edit `main.yml`, replace all `` placeholder to your github account id. 41 | 42 | ### Common Installation (with Fork) 43 | 1. Fork this project, and rename it to `.github.io`; 44 | 2. Edit `/src/.vuepress/custom.js` to config your site, follow [Config Reference](#config-reference). 45 | 46 | ### Custom Installation 47 | If you don't want to override your existing github.io repo, you can push the code to the `source` branch of your repo. 48 | ```bash 49 | # 1. clone this project 50 | git clone https://github.com/Yidadaa/Issue-Blog-With-Github-Action.git 51 | 52 | # 2. change the remote url 53 | git remote set-url origin your-remote-github.io-repo.git 54 | 55 | # 3. push code 56 | git push origin -u source 57 | ``` 58 | Then go to `Settings -> Branches`, and change `Default branch` to `source` branch, we host the source code in `source` branch and deploy the static pages to `master` branch. 59 | 60 | Finally, edit `/src/.vuepress/custom.js` to config your site, please follow [this section](#config-reference). 61 | 62 | ### Config Reference 63 | #### `vssueConfig` 64 | Config for comment system, we use [Vssue](https://vssue.js.org), so this part is same as [Vssue doc](https://vssue.js.org/guide/github.html). 65 | ```js 66 | { 67 | repo: String, // your github.io repo name 68 | owner: String, // your github id 69 | clientId: String, 70 | clientSecret: String 71 | } 72 | ``` 73 | 74 | #### `repoConfig` 75 | Config for push repo, here is the example: 76 | ```js 77 | { 78 | repo: String, // same as vssueConfig.repo 79 | owner: String, // same as vssueConfig.owner 80 | pushBranch: String, // which branch to deploy static pages, default is 'master' or 'main' 81 | email: String, // your email of github account, just for commit message 82 | filterUsers: Array // filter issues according to github account ids 83 | } 84 | ``` 85 | 86 | #### `title` 87 | Your site's name. 88 | 89 | #### `description` 90 | Your site's description. 91 | 92 | #### `customDomain` 93 | Your personal domain, if you do not have a domain, fill it with empty string. 94 | 95 | #### `base` 96 | Root path for your site, refer [vuepress guide](https://vuepress.vuejs.org/config/#base) for details. 97 | 98 | #### `slogan` 99 | Decorative texts in your home page. 100 | ```js 101 | { 102 | main: String, // top line 103 | sub: String // bottom line 104 | } 105 | ``` 106 | 107 | #### `themeConfig` 108 | Config for site theme. 109 | ```js 110 | { 111 | nav: [{ 112 | name: String, 113 | link: String 114 | }], // navigation 115 | headTitle: [String], // Decorative texts in site header 116 | friendLinks: [{ 117 | name: String, 118 | link: String 119 | }], // friend links in bottom footer 120 | extraFooters: [{ 121 | title: String, 122 | text: String 123 | }], // extra texts in bottom footer 124 | pageCount: true // whether to show page report on footer or not 125 | } 126 | ``` 127 | 128 | #### `head` 129 | Please refer [vuepress guide](https://vuepress.vuejs.org/config/#head) for details. 130 | 131 | **Hints:** you can define the icon of the site here. 132 | 133 | ## How to Develop 134 | You need to create a new token [here](https://github.com/settings/tokens) to develop and debug in local machine. 135 | 136 | ```bash 137 | # 1. write your token to ./tools/config.js 138 | cp ./tools/config.template.js ./tools/config.js 139 | # edit ./tools/config.js with your favorite text editor, and copy your token to the file 140 | 141 | # 2. install depencies 142 | yarn install 143 | yarn global add vuepress 144 | 145 | # 3. fetch issues and save them to files 146 | yarn run local 147 | 148 | # 4. start to develop 149 | yarn run dev 150 | ``` 151 | You can refer [vuepress doc](https://vuepress.vuejs.org/) for more details. 152 | 153 | ## FAQ 154 | ### 1. How to prevent others from publishing issues to the site? 155 | You can set a white-list by setting `repoConfig.filterUsers` to `['Your Github ID', 'Another Friend's ID']`, default setting allows everyone to post a blog to your site. 156 | 157 | ### 2. When updating the configuration, why GitHub Actions did not automatically run? 158 | 159 | You can check the `.github/workflows/main.yml` file in your repository and ensure that the `on->push->branches` section corresponds to the branch where your code changes are made. Default branch was `master`, but now is `main` on GitHub. 160 | 161 | ### 3. GitHub Actions run successfully, but the repository code is not updated, and static page files are not added? 162 | 163 | Please check the logs of your GitHub Actions and verify if the `GITHUB_TOKEN` has write permissions. If it does not, please refer to the [official documentation about GITHUB_TOKEN](https://docs.github.com/zh/actions/security-guides/automatic-token-authentication) and grant read and write permissions to your repository in `.github/workflows/main.yml`. Template file [`./template/main.yml`](./template/main.yml) define read or write access for all of the available scopes. 164 | 165 | ## Acknowledgment 166 | - This project is based on [vuepress](https://vuepress.vuejs.org/). 167 | - Visitor report is powered by [busuanzi](http://busuanzi.ibruce.info/). 168 | -------------------------------------------------------------------------------- /img/screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yidadaa/Issue-Blog-With-Github-Action/da07330fb35576098e6ebf8af0155e032dd8cbd5/img/screenshot.jpg -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@vssue/api-github-v4": "^1.4.7", 4 | "@vssue/vuepress-plugin-vssue": "^1.4.8", 5 | "markdown-it-katex": "^2.0.3", 6 | "markdown-it-task-checkbox": "^1.0.6", 7 | "medium-zoom": "^1.0.8", 8 | "vue": "^2.7.14", 9 | "vue-server-renderer": "^2.7.14", 10 | "vuepress": "^1.9.9" 11 | }, 12 | "devDependencies": { 13 | "@actions/github": "^5.1.1", 14 | "cross-env": "7.0.3", 15 | "shelljs": "^0.8.5", 16 | "simple-git": "^3.17.0" 17 | }, 18 | "scripts": { 19 | "dev": "vuepress dev ./src ", 20 | "local:build": "vuepress build ./src --dest ./dist ", 21 | "local:run": "cross-env NODE_ENV=local node ./tools/run.js", 22 | "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider pnpm run local:build", 23 | "action": "cross-env NODE_ENV=action node ./tools/run.js", 24 | "push": "cross-env NODE_ENV=local node ./tools/deploy.js", 25 | "deploy": "cross-env NODE_ENV=action node ./tools/deploy.js", 26 | "test-env": "cross-env custom={\\\"base\\\":\\\"/\\\"} vuepress dev ./src " 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | README.md -------------------------------------------------------------------------------- /src/.vuepress/components/Category.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | 26 | -------------------------------------------------------------------------------- /src/.vuepress/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 82 | 83 | 200 | -------------------------------------------------------------------------------- /src/.vuepress/components/Header.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 34 | 35 | -------------------------------------------------------------------------------- /src/.vuepress/components/LoadingCard.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /src/.vuepress/components/LoadingCategory.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | -------------------------------------------------------------------------------- /src/.vuepress/components/PostCard.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 29 | 30 | -------------------------------------------------------------------------------- /src/.vuepress/components/SearchBox.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 206 | 207 | 310 | -------------------------------------------------------------------------------- /src/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | const mk = require("markdown-it-katex"); 2 | const ck = require("markdown-it-task-checkbox") 3 | const customConfig = require("./custom") 4 | 5 | module.exports = { 6 | ...customConfig, 7 | head: [ 8 | [ 9 | "link", 10 | { 11 | rel: "stylesheet", 12 | href: "https://cdn.bootcss.com/prism/9000.0.1/themes/prism.min.css" 13 | } 14 | ], 15 | [ 16 | "link", 17 | { 18 | rel: "stylesheet", 19 | href: "https://cdn.bootcss.com/KaTeX/0.5.1/katex.min.css" 20 | } 21 | ], 22 | [ 23 | "script", 24 | { 25 | charset: "utf-8", 26 | src: "https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js", 27 | async: true 28 | } 29 | ], 30 | ...customConfig.head 31 | ], 32 | 33 | themeConfig: { 34 | ...customConfig.themeConfig, 35 | base: customConfig.base 36 | }, 37 | 38 | // dev config 39 | host: "0.0.0.0", 40 | plugins: [ 41 | [ 42 | "@vssue/vuepress-plugin-vssue", 43 | { 44 | platform: "github-v4", 45 | ...customConfig.vssueConfig 46 | } 47 | ] 48 | ], 49 | markdown: { 50 | extendMarkdown: md => { 51 | md.use(mk); 52 | md.use(ck); 53 | } 54 | } 55 | }; 56 | -------------------------------------------------------------------------------- /src/.vuepress/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @file: custom config 3 | */ 4 | 5 | let mainConfig = { 6 | vssueConfig: { 7 | owner: "Yidadaa", 8 | repo: "Issue-Blog-With-Github-Action", 9 | clientId: "2783a4b752f56c0ed912", 10 | clientSecret: "c8d9116fcade901567ff34aa1fb09216731683a3" 11 | }, 12 | 13 | repoConfig: { 14 | owner: "Yidadaa", 15 | repo: "Issue-Blog-With-Github-Action", 16 | pushBranch: "master", 17 | email: "yidadaa@qq.com", 18 | filterUsers: ['Yidadaa'] 19 | }, 20 | 21 | title: "YiFei Zhang's Blog", 22 | description: "在这里了解我的一切,对编程的热爱永不停歇。", 23 | customDomain: "", 24 | base: "/Issue-Blog-With-Github-Action/", 25 | 26 | slogan: { 27 | main: "有逻辑的灵魂,", 28 | sub: "造就有温度的编码。" 29 | }, 30 | 31 | themeConfig: { 32 | nav: [ 33 | { 34 | name: "首页", 35 | link: "/Issue-Blog-With-Github-Action" 36 | }, 37 | { 38 | name: "Github", 39 | link: "https://github.com/Yidadaa" 40 | }, 41 | { 42 | name: "CV", 43 | link: "/Issue-Blog-With-Github-Action/cv.html" 44 | } 45 | ], 46 | headTitle: ["暮春早夏的月亮", "原是情人的月亮,不比秋冬是诗人的月亮"], 47 | friendLinks: [ 48 | { 49 | name: "watercow", 50 | link: "https://github.com/watercow/watercow.github.io/issues" 51 | }, 52 | { 53 | name: "ycjgg", 54 | link: "https://ycjgg.github.io" 55 | } 56 | ], 57 | extraFooters: [ 58 | { 59 | title: "ABOUT", 60 | text: "@ 蜀 ICP 备 19000509 号 - 1", 61 | link: "https://beian.miit.gov.cn/" 62 | } 63 | ], 64 | pageCount: true 65 | }, 66 | 67 | head: [ 68 | [ 69 | "link", 70 | { 71 | rel: "icon", 72 | type: "image/png", 73 | href: "https://avatars2.githubusercontent.com/u/16968934?s=460&v=4" 74 | } 75 | ] 76 | ] 77 | } 78 | 79 | module.exports = mainConfig 80 | -------------------------------------------------------------------------------- /src/.vuepress/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/.vuepress/public/favicons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yidadaa/Issue-Blog-With-Github-Action/da07330fb35576098e6ebf8af0155e032dd8cbd5/src/.vuepress/public/favicons/icon.png -------------------------------------------------------------------------------- /src/.vuepress/styles/fonts.styl: -------------------------------------------------------------------------------- 1 | font-hei() 2 | font-family -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, "WenQuanYi Zen Hei Sharp", sans-serif 3 | font-kai() 4 | font-family Baskerville, Georgia, "Liberation Serif", "Kaiti SC", STKaiti, "AR PL UKai CN", "AR PL UKai HK", "AR PL UKai TW", "AR PL UKai TW MBE", "AR PL KaitiM GB", KaiTi, KaiTi_GB2312, DFKai-SB, "TW\-Kai", serif 5 | font-song() 6 | font-family Georgia, "Nimbus Roman No9 L", "Songti SC", "Noto Serif CJK SC", "Source Han Serif SC", "Source Han Serif CN", STSong, "AR PL New Sung", "AR PL SungtiL GB", NSimSun, SimSun, "TW\-Sung", "WenQuanYi Bitmap Song", "AR PL UMing CN", "AR PL UMing HK", "AR PL UMing TW", "AR PL UMing TW MBE", PMingLiU, MingLiU, serif 7 | font-fang-song() 8 | font-family Baskerville, "Times New Roman", "Liberation Serif", STFangsong, FangSong, FangSong_GB2312, "CWTEX\-F", serif -------------------------------------------------------------------------------- /src/.vuepress/styles/index.styl: -------------------------------------------------------------------------------- 1 | @import "./fonts.styl" 2 | 3 | body 4 | margin: 0 5 | padding: 0 6 | font-hei() 7 | 8 | a 9 | text-decoration:none 10 | 11 | pad = 50px 300px 12 | 13 | .page 14 | box-sizing: border-box 15 | width: 90% 16 | max-width 900px 17 | margin: auto 18 | 19 | .loading-light 20 | position relative 21 | 22 | .loading-light:after 23 | content '' 24 | position absolute 25 | height 20px 26 | width 1000px 27 | background-color #fff 28 | opacity .4 29 | left -500px 30 | animation fly-to-right 2s ease infinite 31 | 32 | @keyframes fly-to-right 33 | from 34 | transform translateX(0px) rotate(45deg) 35 | 36 | to 37 | transform translateX(1000px) rotate(45deg) -------------------------------------------------------------------------------- /src/.vuepress/styles/palette.styl: -------------------------------------------------------------------------------- 1 | // 颜色 2 | $accentColor = darken(red, 20) 3 | $textColor = #2c3e50 4 | $borderColor = #eeeeee 5 | $codeBgColor = #282c34 6 | $arrowBgColor = #ccc 7 | $badgeTipColor = #42b983 8 | $badgeWarningColor = darken(#ffe564, 35%) 9 | $badgeErrorColor = #DA5961 10 | 11 | // 布局 12 | $navbarHeight = 3.6rem 13 | $sidebarWidth = 20rem 14 | $contentWidth = 740px 15 | $homePageWidth = 960px 16 | 17 | // 响应式变化点 18 | $MQNarrow = 959px 19 | $MQMobile = 719px 20 | $MQMobileNarrow = 576px -------------------------------------------------------------------------------- /src/.vuepress/theme/404.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 49 | 50 | -------------------------------------------------------------------------------- /src/.vuepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 70 | 71 | -------------------------------------------------------------------------------- /src/.vuepress/theme/PostLayout.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 44 | 45 | 320 | -------------------------------------------------------------------------------- /src/.vuepress/theme/ResumeLayout.vue: -------------------------------------------------------------------------------- 1 | 70 | 71 | 108 | 109 | -------------------------------------------------------------------------------- /src/.vuepress/theme/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yidadaa/Issue-Blog-With-Github-Action/da07330fb35576098e6ebf8af0155e032dd8cbd5/src/.vuepress/theme/index.js -------------------------------------------------------------------------------- /src/categories/.gitignore: -------------------------------------------------------------------------------- 1 | *.md -------------------------------------------------------------------------------- /src/cv-en.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: ResumeLayout 3 | 4 | content: 5 | header: 6 | author: 'YiFei Zhang' 7 | contact: 8 | - 'Mail: flynn.zhang@foxmail.com' 9 | - 'Home Page: blog.simplenaive.cn' 10 | - 'Github: github.com/Yidadaa' 11 | interst: '' 12 | dob: '1997/01/20' 13 | city: 'Chengdu, China' 14 | education: 15 | name: 'Education' 16 | content: 17 | - degree: 'MSc.' 18 | school: 'UESTC' 19 | major: 'Computer Science, Dept. of Computer Science and Engineering' 20 | time: '2018.09 - 2021.06' 21 | - degree: 'B.Eng.' 22 | school: 'UESTC' 23 | major: 'Computer Science, Yincai Honors College of UESTC' 24 | time: '2014.09 - 2018.06' 25 | honor: 26 | name: 'Honor' 27 | content: 28 | - name: 'Second Prize for Postgraduate Scholarship' 29 | time: '2019.10' 30 | - name: 'OPPO AI Challenge Segmantation Track Excellence Prize' 31 | time: '2019.04' 32 | - name: 'First Prize for Postgraduate Scholarship' 33 | time: '2018.10' 34 | - name: 'MCM Honorable Mention' 35 | time: '2017.02' 36 | experience: 37 | name: 'Experience' 38 | content: 39 | - name: 'Real-Time 3D Reconstruction Intern @ Tencent Robotics X' 40 | time: 'from 2019.11' 41 | content: 42 | - In this project, there are a control client and a robot, human could control the robot remotely on the control client, the robot reconstructs the surrounding environment in real-time and sends the reconstructed data to the control client. Once the data is received, the control client will display the reconstructed environment in virtual reality as soon as possible, so the human can take further actions to interact with the environment, for example, to open a door. 43 | - My job is to ensure the network connection stability between the robot and the control client, I designed a robust data transmission algorithm for the project, it substantially reduced the transimission delay and packet loss rate. In addition, we adapts a 3D-reconstruction algorithm(KinectFusion) to make it work well in dynamic environments. 44 | - name: 'Accelerate reinforcement algorithm training in Unity @ Thesis' 45 | time: '2017.10 - 2018.06' 46 | content: 47 | - Reinforcement learning agent requires a large number of exploration data to optimize policy by interacting with the environment. It will take a high time and material cost in the real world. We propose a framework that allows existing written-in-python algorithms to interact with Unity environment to collect data and optimize policy in real-time. 48 | - name: 'Front End Web Developer Intern @ Baidu' 49 | time: '2016.12 - 2017.05' 50 | content: 51 | - During this internship, I was responsible for implementing new features of Baidu advertisement system, I worked with UI/UC designer, PM, QA and backend developer and bridged the gap between graphical design and technical implementation, optimized application for maximum speed and scalability, and built reusable code for future use. 52 | coding: 53 | name: 'Projects & Skills' 54 | content: 55 | - name: 'github.com/Yidadaa/Issue-Blog-With-Github-Action' 56 | link: 'https://github.com/Yidadaa/Issue-Blog-With-Github-Action' 57 | info: '(JavaScript / Vue) ~ over 1000 lines' 58 | time: '2020.02' 59 | desc: 'A well-designed blog theme based on Vuepress and hosted on Github Actions.' 60 | - name: 'github.com/Yidadaa/Pytorch-Video-Classification' 61 | link: 'https://github.com/Yidadaa/Pytorch-Video-Classification' 62 | info: '(Python / Pytorch) ~ 500 lines' 63 | time: '2019.04' 64 | desc: 'Make Action Classification on Videos using CNN-RNN, achieves 80% accuracy on UCF101 Dataset.' 65 | - name: 'github.com/Yidadaa/Satellite-Imagery-Segmantation-Deeplab' 66 | link: 'https://github.com/Yidadaa/Satellite-Imagery-Segmantation-Deeplab' 67 | info: '(Python / Pytorch) ~ 1000 lines' 68 | time: '2019.05' 69 | desc: 'Satellite Imagery Segmantation using Deeplabv3.' 70 | - name: 'github.com/Yidadaa/Parallel-Programming-On-GPU' 71 | link: 'https://github.com/Yidadaa/Parallel-Programming-On-GPU' 72 | info: '(CUDA / C++) ~ 200 lines' 73 | desc: 'Accelerate simulation of n-body problem using CUDA, 3000x faster after accelerating.' 74 | time: '2018.11' 75 | - name: 'github.com/Yidadaa/Captcha-Deep-Learning' 76 | link: 'https://github.com/Yidadaa/Captcha-Deep-Learning' 77 | info: '(Python / Keras / Tensorflow) ~ 500 lines' 78 | desc: 'Recognize captcha using an End-to-End CNN pipeline, achieves 98% accuracy on custom Dataset.' 79 | time: '2018.01' 80 | - name: 'github.com/Yidadaa/OPPO-Human-Segmentation' 81 | link: 'https://github.com/Yidadaa/OPPO-Human-Segmentation' 82 | info: '(C++ / Dart) ~ 1000 lines' 83 | desc: 'Deploy deeplabv3 human segmantation model to mobile platform using Tencent NCNN framework.' 84 | time: '2019.03' 85 | - name: 'github.com/Yidadaa/HUAWEI-Codecraft-2019' 86 | link: 'https://github.com/Yidadaa/HUAWEI-Codecraft-2019' 87 | info: '(C++) ~ 1000 lines' 88 | desc: 'Code for HUAWEI Codecraft 2019, contains unit testing, following Google C++ Style Guide.' 89 | time: '2019.05' 90 | --- -------------------------------------------------------------------------------- /src/cv.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: ResumeLayout 3 | 4 | content: 5 | header: 6 | author: '张义飞' 7 | contact: 8 | - 邮箱:flynn.zhang@foxmail.com 9 | - 主页:blog.simplenaive.cn 10 | - Github:github.com/Yidadaa 11 | interst: '三维视觉' 12 | dob: '1997/01/20' 13 | city: 'Chengdu, China' 14 | education: 15 | name: '教育背景' 16 | content: 17 | - degree: '硕士' 18 | school: '电子科技大学' 19 | major: '计算机科学与工程学院,计算机科学专业' 20 | time: '2018.09 - 2021.06' 21 | - degree: '学士' 22 | school: '电子科技大学' 23 | major: '英才实验学院,计算机科学专业' 24 | time: '2014.09 - 2018.06' 25 | honor: 26 | name: '荣誉奖项' 27 | content: 28 | - name: '研究生二等学业奖学金' 29 | time: '2019.10' 30 | - name: 'OPPO AI 挑战赛人像分割任务 决赛优秀奖' 31 | time: '2019.04' 32 | - name: '研究生一等学业奖学金' 33 | time: '2018.10' 34 | experience: 35 | name: '实习 & 研究经历' 36 | content: 37 | - name: '单目深度估计算法 @ 未来媒体研究中心' 38 | time: 'from 2019.04' 39 | content: 40 | - 研究⽅向是基于单目视频序列的无监督深度估计算法,基于深度神经⽹络的无监督训练流程可以很快地被迁移到全新环境中,并且训练时只需要单⽬摄像头视频数据,⾮常有应⽤前景。 41 | - 当前的想法:现有的无监督训练流程有着收敛过慢的缺点,尝试从以下⼏个⽅⾯改进:Co-attention 模块已被证明可以很好地挖掘相邻视频帧中具有较⾼相似度的特征区域,所以尝试在特征图层⾯对相邻帧的特征进⾏ attention,使得特征相似度较⾼的区域产⽣更相近的深度图;其次⽬前无监督流程中的 PoseNet 的⾃监督信号完全来⾃于与残差图估计⽹络联合建⽴的重建损失,所以提出尝试使⽤ SLAM 系统后端中的滤波⽅法对 PoseNet 的输出做约束,以期提升 PoseNet 的性能。 42 | - name: '基于 Unity 虚拟环境和强化学习的机械臂控制算法 @ 毕业设计' 43 | time: '2017.10 - 2018.06' 44 | content: 45 | - 强化学习算法在机械智能控制中愈发重要,然而强化学习算法往往需要在训练阶段通过大量地 exploration 与环境交互取得数据来优化策略,这种训练策略将会在真实世界带来极高的时间和物料成本,本文提出了一种架构,可以使得现有强化学习模型可以实时与 Unity 中的虚拟环境交互并获取训练数据,为迁移至真实环境提供预训练基础。 46 | - 本文主要工作如下:1) 构建了一个沟通 Unity 运行时和 Python 运行时的中间层,使得基于 Tensorflow 和 Pytorch 的构建的深度学习模型可以与 Unity 虚拟环境交互;2) 实现了强化学习中经典的 PPO 算法,并分别在二维和三维环境中设计对应的任务来验证算法和中间层的可用性;3) 基于本文提出的架构,探讨了多线程以及离屏或低分辨率渲染等手段对训练任务的加速能力。 47 | - name: '前端开发实习生 @ 百度' 48 | time: '2016.12 - 2017.05' 49 | content: 50 | - 在实习期间负责了广告智能推荐前端界面的开发,并参与了该需求的正式上线和后续维护工作,工作期间与其他部门紧密合作,对 Bug 响应迅速,产出的代码可维护性强且十分健壮,受到 mentor 的一致好评。 51 | coding: 52 | name: '开源项目 & 编程能力' 53 | content: 54 | - name: 'github.com/Yidadaa/Pytorch-Video-Classification' 55 | link: 'https://github.com/Yidadaa/Pytorch-Video-Classification' 56 | info: '(Python / Pytorch) ~ 500 lines' 57 | time: '2019.04' 58 | desc: '基于 CNN-RNN 架构的视频动作分类⽹络,在 UCF101 上达到 80% 的准确率。' 59 | - name: 'github.com/Yidadaa/Satellite-Imagery-Segmantation-Deeplab' 60 | link: 'https://github.com/Yidadaa/Satellite-Imagery-Segmantation-Deeplab' 61 | info: '(Python / Pytorch) ~ 1000 lines' 62 | time: '2019.05' 63 | desc: '阿里天池比赛代码,使用 Deeplabv3 对超大卫星图做分割。' 64 | - name: 'github.com/Yidadaa/Parallel-Programming-On-GPU' 65 | link: 'https://github.com/Yidadaa/Parallel-Programming-On-GPU' 66 | info: '(CUDA / C++) ~ 200 lines' 67 | desc: '使用 CUDA 加速 n-body 模拟程序,成功加速到原来的 3000 多倍。' 68 | time: '2018.11' 69 | - name: 'github.com/Yidadaa/Captcha-Deep-Learning' 70 | link: 'https://github.com/Yidadaa/Captcha-Deep-Learning' 71 | info: '(Python / Keras / Tensorflow) ~ 500 lines' 72 | desc: '搭建端到端的验证码识别网络,分别使用 Keras 和 Tensorflow 实现,在验证集上达到 98% 的准确率。' 73 | time: '2018.01' 74 | - name: 'github.com/Yidadaa/OPPO-Human-Segmentation' 75 | link: 'https://github.com/Yidadaa/OPPO-Human-Segmentation' 76 | info: '(C++ / Dart) ~ 1000 lines' 77 | desc: 'OPPO AI 挑战赛 Demo 源码,将人像语义分割网络经过腾讯开源的 ncnn 框架转换后部署到移动端。' 78 | time: '2019.03' 79 | - name: 'github.com/Yidadaa/HUAWEI-Codecraft-2019' 80 | link: 'https://github.com/Yidadaa/HUAWEI-Codecraft-2019' 81 | info: '(C++) ~ 1000 lines' 82 | desc: '华为软件精英挑战赛代码,车辆路径智能规划,包含完整的单元测试,严格遵循 Google C++ Style Guide 规范。' 83 | time: '2019.05' 84 | --- -------------------------------------------------------------------------------- /src/posts/.gitignore: -------------------------------------------------------------------------------- 1 | *.md -------------------------------------------------------------------------------- /template/custom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @file: custom config 3 | */ 4 | 5 | let mainConfig = { 6 | vssueConfig: { 7 | owner: "Yidadaa", 8 | repo: "Issue-Blog-With-Github-Action", 9 | clientId: "2783a4b752f56c0ed912", 10 | clientSecret: "c8d9116fcade901567ff34aa1fb09216731683a3" 11 | }, 12 | 13 | repoConfig: { 14 | owner: "Yidadaa", 15 | repo: "Issue-Blog-With-Github-Action", 16 | pushBranch: "master", 17 | email: "yidadaa@qq.com", 18 | filterUsers: [] 19 | }, 20 | 21 | title: "YiFei Zhang's Blog", 22 | description: "在这里了解我的一切,对编程的热爱永不停歇。", 23 | customDomain: "", 24 | base: "/Issue-Blog-With-Github-Action/", 25 | 26 | slogan: { 27 | main: "有逻辑的灵魂,", 28 | sub: "造就有温度的编码。" 29 | }, 30 | 31 | themeConfig: { 32 | nav: [ 33 | { 34 | name: "首页", 35 | link: "/Issue-Blog-With-Github-Action" 36 | }, 37 | { 38 | name: "Github", 39 | link: "https://github.com/Yidadaa" 40 | }, 41 | { 42 | name: "CV", 43 | link: "/Issue-Blog-With-Github-Action/cv.html" 44 | } 45 | ], 46 | headTitle: ["暮春早夏的月亮", "原是情人的月亮,不比秋冬是诗人的月亮"], 47 | friendLinks: [ 48 | { 49 | name: "watercow", 50 | link: "https://github.com/watercow/watercow.github.io/issues" 51 | }, 52 | { 53 | name: "ycjgg", 54 | link: "https://ycjgg.github.io" 55 | } 56 | ], 57 | extraFooters: [ 58 | { 59 | title: "", 60 | text: "@ 蜀 ICP 备 19000509 号 - 1", 61 | link: "https://beian.miit.gov.cn/" 62 | } 63 | ], 64 | pageCount: true 65 | }, 66 | 67 | head: [ 68 | [ 69 | "link", 70 | { 71 | rel: "icon", 72 | type: "image/png", 73 | href: "https://avatars2.githubusercontent.com/u/16968934?s=460&v=4" 74 | } 75 | ] 76 | ] 77 | } 78 | 79 | module.exports = mainConfig -------------------------------------------------------------------------------- /template/cv.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: ResumeLayout 3 | 4 | content: 5 | header: 6 | author: 张义飞 7 | contact: 8 | - 邮箱:flynn.zhang@foxmail.com 9 | - 主页:blog.simplenaive.cn 10 | - Github:github.com/Yidadaa 11 | interest: Just Code It 12 | dob: 1997/01/20 13 | city: Chengdu, China 14 | education: 15 | name: 教育背景 16 | content: 17 | - degree: 硕士 18 | school: 电子科技大学 19 | major: 计算机科学与工程学院,计算机科学专业 20 | time: 2018.09 - 2021.06 21 | - degree: 学士 22 | school: 电子科技大学 23 | major: 英才实验学院,计算机科学专业 24 | time: 2014.09 - 2018.06 25 | honor: 26 | name: 荣誉奖项 27 | content: 28 | - name: 研究生二等学业奖学金 29 | time: '2019.10' 30 | - name: OPPO AI 挑战赛人像分割任务 决赛优秀奖 31 | time: '2019.04' 32 | - name: 研究生一等学业奖学金 33 | time: '2018.10' 34 | - name: 美国大学生数学建模竞赛 H 奖 35 | time: '2017.02' 36 | experience: 37 | name: 工作经历 38 | content: 39 | - name: 前端开发工程师 @ 猿辅导北京 40 | time: 2021.07 - 2021.09 41 | content: 42 | - 负责猿辅导基础架构平台的开发工作,使用 React + Typescript + RxJS 为公司开发人员提供一站式项目管理平台,包括前后端服务的 43 | CI/CD、报警管理、服务治理、监控等功能。 44 | - 负责猿辅导基础架构的基建能力建设,为公司内部各个业务项目提供静态文档站的技术方案支持,开发基于Gitlab API 的文档系统。负责猿辅导基础架构的基建能力建设,为公司内部各个业务项目提供静态文档站的技术方案支持,开发基于 45 | Gitlab API 的文档系统。 46 | - name: 软件开发实习生 @ 亚马逊北京 47 | time: 2020.07 - 2020.11 48 | content: 49 | - 负责移动端基础架构部存储相关的功能调研、设计和开发,基于微信开源的 MMKV 框架重构亚马逊购物客户端的本地存储机制。 50 | - name: 算法开发实习生 @ 腾讯深圳 AI Lab Robotics X 实验室 51 | time: 2019.11 - 2020.06 52 | content: 53 | - 负责设计并开发基于三维重建算法的虚拟现实同步展示系统,使用三维重建算法对现实世界进行实时重建并在 Steam VR 中高效渲染。优化 Elastic 54 | Fusion 三维重建算法,编写 C++ 版本的 Kinect 相机驱动,同时负责 VoxBlox 三维重建算法与 ORB-SLAM 系统对接,使用 55 | C++ 编写高性能 ROS 数据传输接口。 56 | - 负责优化 GPU 到 CPU 之间的数据同步性能,开发实时点云数据流传输以及渲染算法,配合实时动态标定,实现虚拟环境下的机器臂控制操作,并对其实时性、丢包率等性能设计实验进行验证。 57 | - name: '前端开发工程师(在校远程兼职)@ 尘微科技 ' 58 | time: 2017.12 - 2019.03 59 | content: 60 | - 主要负责小程序首屏和社区动态流页面的开发,协调团队进行需求分析并开发上线的全套流程,在 mp-vue 技术栈下解决高性能 CSS 动效实现、首屏动态布局和 61 | Feed 流长列表优化等技术难点。 62 | - name: 前端开发实习生 @ 百度北京 63 | time: 2016.12 - 2017.05 64 | content: 65 | - 参与百度凤巢的广告智能推荐系统的前端页面开发,负责智能词条推荐界面的开发并参与该功能的上线和后续维护工作,使用 React & Redux 构建用户页面。 66 | coding: 67 | name: 开源项目 & 编程能力 68 | content: 69 | - name: github.com/Yidadaa/Learn-uGit 70 | link: https://github.com/Yidadaa/Learn-uGit 71 | info: "(Python) ~ 500 lines" 72 | time: '2021.08' 73 | desc: 使用 Python 实现 git 的基础功能,包括 commit / branch / merge / push / pull 等能力。 74 | - name: github.com/Yidadaa/Eye-Tracking-Mouse 75 | link: https://github.com/Yidadaa/Eye-Tracking-Mouse 76 | info: "(Python) ~ 1200 lines" 77 | time: '2021.05' 78 | desc: 用神经网络来估计面部朝向和视线注视方向,从而取代实体鼠标,双手无需离开键盘即可操作任何 GUI 软件。 79 | - name: github.com/Yidadaa/Issue-Blog-With-Github-Action 80 | link: https://github.com/Yidadaa/Issue-Blog-With-Github-Action 81 | info: "(Vue / Javascript) ~ 1000 lines" 82 | time: '2020.01' 83 | desc: 基于 VuePress 和 Github Actions 功能构建的免服务器部署、SEO 友好的博客系统。 84 | - name: github.com/Yidadaa/Pytorch-Video-Classification 85 | link: https://github.com/Yidadaa/Pytorch-Video-Classification 86 | info: "(Python / Pytorch) ~ 500 lines" 87 | time: '2019.04' 88 | desc: 基于 CNN-RNN 架构的视频动作分类⽹络,在 UCF101 上达到 80% 的准确率。 89 | - name: github.com/Yidadaa/Parallel-Programming-On-GPU 90 | link: https://github.com/Yidadaa/Parallel-Programming-On-GPU 91 | info: "(CUDA / C++) ~ 200 lines" 92 | desc: 使用 CUDA 加速 n-body 模拟程序,加速比 ~ 3000 93 | time: '2018.11' 94 | - name: github.com/Yidadaa/Captcha-Deep-Learning 95 | link: https://github.com/Yidadaa/Captcha-Deep-Learning 96 | info: "(Python / Keras / Tensorflow) ~ 500 lines" 97 | desc: 端到端的动态验证码识别网络,分别使用 Keras 和 Tensorflow 实现,可以达到 98% 的准确率。 98 | time: '2018.01' 99 | - name: github.com/Yidadaa/OPPO-Human-Segmentation 100 | link: https://github.com/Yidadaa/OPPO-Human-Segmentation 101 | info: "(C++ / Dart) ~ 1000 lines" 102 | desc: OPPO AI 挑战赛 Demo 源码,将人像语义分割网络经过腾讯开源的 ncnn 框架转换后部署到移动端。 103 | time: '2019.03' 104 | - name: github.com/Yidadaa/HUAWEI-Codecraft-2019 105 | link: https://github.com/Yidadaa/HUAWEI-Codecraft-2019 106 | info: "(C++) ~ 1000 lines" 107 | desc: 华为软件精英挑战赛代码,车辆路径智能规划,包含完整的单元测试,严格遵循 Google C++ Style Guide 规范。 108 | time: '2019.05' 109 | - name: github.com/Yidadaa/P2P-Message 110 | link: https://github.com/Yidadaa/P2P-Message 111 | info: "(Dart) ~ 1000 lines" 112 | desc: 基于 Flutter 开发的 P2P 聊天程序,在良好的 NAT 环境下实现纯文字聊天。 113 | time: '2018.11' 114 | 115 | --- 116 | -------------------------------------------------------------------------------- /template/main.yml: -------------------------------------------------------------------------------- 1 | name: Blog 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | issues: 8 | types: 9 | [ 10 | opened, 11 | closed, 12 | edited, 13 | milestoned, 14 | labeled, 15 | unlabeled, 16 | reopened, 17 | demilestoned, 18 | ] 19 | 20 | jobs: 21 | build: 22 | runs-on: ubuntu-latest 23 | 24 | permissions: write-all 25 | 26 | strategy: 27 | matrix: 28 | node-version: [19.x] 29 | 30 | steps: 31 | - uses: pnpm/action-setup@v2 32 | with: 33 | version: latest 34 | - uses: actions/checkout@v3 35 | with: 36 | repository: Yidadaa/Issue-Blog-With-Github-Action 37 | ref: source 38 | - name: Build 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 41 | run: | 42 | wget https://raw.githubusercontent.com//.github.io/master/.github/workflows/cv.md -O ./src/cv.md 43 | wget https://raw.githubusercontent.com//.github.io/master/.github/workflows/custom.js -O ./src/.vuepress/custom.js 44 | pnpm i 45 | pnpm action 46 | pnpm build 47 | pnpm run deploy 48 | -------------------------------------------------------------------------------- /tools/.gitignore: -------------------------------------------------------------------------------- 1 | config.js -------------------------------------------------------------------------------- /tools/config.template.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @file: place dev config here 3 | * @desc: to develop in local, run `cp config.template.js config.js` and write your token below. 4 | */ 5 | 6 | module.exports = { 7 | token: '' // your develop token here 8 | } -------------------------------------------------------------------------------- /tools/deploy.js: -------------------------------------------------------------------------------- 1 | const Git = require('simple-git') 2 | const path = require('path') 3 | const shell = require('shelljs') 4 | const fs = require('fs') 5 | const { repoConfig, customDomain } = require('../src/.vuepress/config') 6 | 7 | const { owner, repo, email, pushBranch } = repoConfig 8 | 9 | let token = null 10 | let actor = null 11 | if (process.env.NODE_ENV == 'local') { 12 | token = require('./config').token 13 | actor = owner 14 | } else if (process.env.NODE_ENV == 'action') { 15 | token = process.env.GITHUB_TOKEN 16 | actor = process.env.GITHUB_ACTOR 17 | } else { 18 | throw error("Wrong Enviorment Params!") 19 | } 20 | 21 | async function main() { 22 | const rootPath = path.resolve(__dirname, '../') 23 | const distPath = path.resolve(__dirname, '../dist') 24 | const nowStr = new Date().toLocaleString() 25 | 26 | // write CNAME 27 | if (customDomain && customDomain.length > 0) { 28 | fs.writeFile(path.resolve(distPath, 'CNAME'), customDomain, () => console.log('[host] on ' + customDomain)) 29 | } 30 | 31 | const remote = `https://${actor}:${token}@github.com/${owner}/${repo}.git` 32 | 33 | console.log(`[remote] ${remote}`) 34 | 35 | // git clone old files 36 | const tmpPath = path.resolve(rootPath, 'tmp') 37 | if (fs.existsSync(tmpPath)) { 38 | shell.rm('-rf', tmpPath) 39 | console.log(`[rm] ${tmpPath} is removed`) 40 | } 41 | fs.mkdirSync(tmpPath) 42 | console.log(`[mkdir] ${tmpPath} is created`) 43 | 44 | console.log('[git] cloning') 45 | Git(tmpPath).clone(remote, ['-b', pushBranch], () => { 46 | console.log('[git] clone done') 47 | const repoPath = path.resolve(tmpPath, repo) 48 | // delete old files and copy new file 49 | shell.ls(distPath).forEach(v => { 50 | let gitFile = path.resolve(repoPath, v) 51 | if (fs.existsSync(gitFile)) { 52 | shell.rm('-rf', gitFile) 53 | } 54 | shell.cp('-r', path.resolve(distPath, v), repoPath) 55 | console.log(`[cp] ${gitFile}`) 56 | }) 57 | 58 | console.log('[git] deploying...') 59 | Git(repoPath).addConfig('user.name', owner) 60 | .addConfig('user.email', email) 61 | .add('.') 62 | .commit(`deploy(blog): version ${nowStr}`) 63 | .push(() => console.log('[git] delploy done')) 64 | }) 65 | } 66 | 67 | main() 68 | -------------------------------------------------------------------------------- /tools/run.js: -------------------------------------------------------------------------------- 1 | const github = require("@actions/github"); 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | const { repoConfig, slogan, base } = require("../src/.vuepress/config"); 5 | 6 | const { owner, repo } = repoConfig; 7 | const issueFile = path.resolve(__dirname, "./issues.json"); 8 | const cateFile = path.resolve(__dirname, "./cates.json"); 9 | 10 | let token = null; 11 | if (process.env.NODE_ENV == "local") { 12 | token = require("./config").token; 13 | } else if (process.env.NODE_ENV == "action") { 14 | token = process.env.GITHUB_TOKEN; 15 | } else { 16 | throw error("Wrong Enviorment Params!"); 17 | } 18 | 19 | /** 20 | * Make a log. 21 | * @param {String} str log string 22 | */ 23 | function log(str) { 24 | console.log(str); 25 | } 26 | 27 | /** 28 | * Format date string to YYYY/MM/DD 29 | * @param {String} date a date string 30 | */ 31 | function fmtDate(date) { 32 | const theDate = new Date(date); 33 | const year = theDate.getFullYear(); 34 | const month = (theDate.getMonth() + 1).toString().padStart(2, "0"); 35 | const day = theDate.getDate().toString().padStart(2, "0"); 36 | return [year, month, day].join("/"); 37 | } 38 | 39 | /** 40 | * Write issues to markdown file. 41 | * @param {Object} rawData raw request data object. 42 | */ 43 | function formatDocument(rawData) { 44 | const data = rawData; 45 | log(`[summary] ${data.length} issues`); 46 | 47 | const postPath = path.resolve(__dirname, "../src/posts"); 48 | 49 | // process post file 50 | data.forEach((issue, i) => { 51 | log( 52 | `[processing ${i + 1} of ${data.length}] ${issue.number}.${issue.title}` 53 | ); 54 | const fm = [ 55 | `layout: PostLayout`, 56 | `id: ${issue.number}`, 57 | `date: ${fmtDate(issue.created_at)}`, 58 | `author: ${issue.user.login}`, 59 | ].join("\n"); 60 | const markdownText = `---\n${fm}\n---\n# ${issue.title}\n\n${issue.body}`; 61 | fs.writeFile( 62 | path.resolve(postPath, `./${issue.number}.md`), 63 | markdownText, 64 | () => {} 65 | ); 66 | }); 67 | 68 | log("[post] issues have been written to md files."); 69 | } 70 | 71 | /** 72 | * Process post data. 73 | * @param {Array} data 74 | */ 75 | function processPost(data) { 76 | // process post summary 77 | const postsData = data.map((issue) => { 78 | return { 79 | title: issue.title, 80 | desc: (issue.body || "").slice(0, 200), 81 | tag: issue.milestone ? issue.milestone.title : "", 82 | date: fmtDate(issue.created_at), 83 | number: issue.number, 84 | link: `${base}posts/${issue.number}.html`, 85 | }; 86 | }); 87 | 88 | return postsData; 89 | } 90 | 91 | /** 92 | * Process category data. 93 | * @param {Array} rawData raw request data of milestones 94 | */ 95 | function processCategory(rawData) { 96 | const data = rawData; 97 | 98 | const dataPath = path.resolve(__dirname, "../src/.vuepress/data"); 99 | 100 | const mData = data.map((m) => { 101 | return { 102 | name: m.title, 103 | count: m.open_issues, 104 | desc: m.description, 105 | link: `${base}categories/${m.title}.html`, 106 | }; 107 | }); 108 | 109 | return mData; 110 | } 111 | 112 | async function download() { 113 | const tools = github.getOctokit(token); 114 | 115 | log("[download] requesting issues"); 116 | try { 117 | let data = await tools.request("GET /repos/{owner}/{repo}/issues", { 118 | owner, 119 | repo, 120 | }); 121 | 122 | // filter issues 123 | if (repoConfig.filterUsers && repoConfig.filterUsers.length > 0) { 124 | const filterUsers = repoConfig.filterUsers; 125 | const count = data.data.length; 126 | data.data = data.data.filter((v) => filterUsers.includes(v.user.login)); 127 | log(`[filter] filtered ${count - data.data.length} issues`); 128 | } 129 | 130 | log("[download] writing Issues Data"); 131 | const rawData = JSON.stringify(data); 132 | fs.writeFileSync(issueFile, rawData); 133 | log("[download] done"); 134 | } catch (error) { 135 | log(error); 136 | return; 137 | } 138 | 139 | log("[download] requesting milestones"); 140 | try { 141 | const cates = await tools.request("GET /repos/{owner}/{repo}/milestones", { 142 | owner, 143 | repo, 144 | }); 145 | 146 | log("[download] writing milestones data"); 147 | const mData = JSON.stringify(cates); 148 | fs.writeFileSync(cateFile, mData); 149 | log("[download] done"); 150 | } catch (error) { 151 | log(error); 152 | return; 153 | } 154 | } 155 | 156 | /** 157 | * Write data to home page read me. 158 | * @param {Array} issues issue list 159 | * @param {Array} milestones milestone list 160 | */ 161 | function writeHomePageReadMe(issues, milestones) { 162 | const postsData = processPost(issues); 163 | const mData = processCategory(milestones); 164 | log("[writing] writing data to ReadMe"); 165 | 166 | const readMeMeta = JSON.stringify({ 167 | slogan, 168 | posts: postsData, 169 | categories: mData, 170 | }); 171 | const readMeText = `---\n${readMeMeta}\n---`; 172 | const readmePath = path.resolve(__dirname, "../src"); 173 | fs.writeFile(path.resolve(readmePath, "./README.md"), readMeText, () => {}); 174 | 175 | // group issues by milestone 176 | let issuesGounpByMs = {}; 177 | issues.forEach((issue) => { 178 | if (!issue.milestone) return; 179 | const { number } = issue.milestone; 180 | if (!issuesGounpByMs[number]) issuesGounpByMs[number] = []; 181 | issuesGounpByMs[number].push(issue); 182 | }); 183 | 184 | // merge issues to milestones 185 | milestones = milestones.map((m) => { 186 | return { 187 | ...m, 188 | issues: issuesGounpByMs[m.number] || [], 189 | }; 190 | }); 191 | 192 | // write milestones 193 | const mPath = path.resolve(__dirname, "../src/categories"); 194 | const files = fs.readdirSync(mPath); 195 | // delete old files 196 | files.forEach((filename) => { 197 | if (filename.endsWith("md")) { 198 | fs.unlinkSync(path.resolve(mPath, filename), () => {}); 199 | } 200 | }); 201 | 202 | log("[writing] writing categories"); 203 | // write new files 204 | milestones.forEach((m) => { 205 | const issueData = processPost(m.issues); 206 | const mRawData = { 207 | slogan: { 208 | main: m.title, 209 | sub: m.description, 210 | }, 211 | posts: issueData, 212 | categories: mData, 213 | }; 214 | const mText = ["---", JSON.stringify(mRawData), "---"].join("\n"); 215 | fs.writeFile(path.resolve(mPath, `${m.title}.md`), mText, () => {}); 216 | }); 217 | } 218 | 219 | async function saveToFile() { 220 | const pData = JSON.parse(fs.readFileSync(issueFile)); 221 | const mData = JSON.parse(fs.readFileSync(cateFile)); 222 | formatDocument(pData.data); 223 | writeHomePageReadMe(pData.data, mData.data); 224 | } 225 | 226 | async function main() { 227 | await download(); 228 | await saveToFile(); 229 | } 230 | 231 | main(); 232 | --------------------------------------------------------------------------------