init
|
|
@ -0,0 +1,26 @@
|
|||
name: Node CI
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [10.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Build and Deploy
|
||||
uses: JamesIves/github-pages-deploy-action@master
|
||||
env:
|
||||
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
|
||||
BASE_BRANCH: master # The branch the action should deploy from.
|
||||
BRANCH: gh-pages # The branch the action should deploy to.
|
||||
FOLDER: docs/.vuepress/dist # The folder the action should deploy.
|
||||
BUILD_SCRIPT: npm install && npm run docs:list && npm run docs:build:gitpage # The build script the action should run prior to deploying.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
node_modules
|
||||
dist/
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
// 使用 IntelliSense 了解相关属性。
|
||||
// 悬停以查看现有属性的描述。
|
||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "启动程序",
|
||||
"program": "${workspaceFolder}\\utils\\getFilenames.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
# Codingyang Blog
|
||||
|
||||
## Intro 介绍
|
||||
|
||||
Use vuepress build static personal Blog.
|
||||
|
||||
Just create or edit \*.md markdown document,
|
||||
|
||||
quickly build it to static html site with good SEO.
|
||||
|
||||
使用 vuepress 创建 SEO 友好的静态博客站。一键发布到 github page,内置 github action 自动部署脚本。
|
||||
|
||||
vuepress 通过一定*号称简单*的配置之后,为每一个 md 文件生成静态 html 脚本,并通过主题挂接起来。
|
||||
用来写文档是非常不错的。写博客就要做一点工作,踩**一点**坑。
|
||||
|
||||
[demo 演示](http://www.codingyang.com/)
|
||||
|
||||
[document 文档](http://www.codingyang.com/article_tech/)
|
||||
|
||||
[github 源码](https://github.com/Rackar/codingyang)
|
||||
|
||||
## 相关技术
|
||||
|
||||
[vuepress](https://v1.vuepress.vuejs.org/zh/guide/)
|
||||
|
||||
Github Aciton
|
||||
|
||||
## how to use 使用
|
||||
|
||||
1. 克隆项目后进入
|
||||
|
||||
`git clone https://github.com/Rackar/codingyang`
|
||||
|
||||
`cd codingyang`
|
||||
|
||||
2. 安装依赖并运行开发服务:
|
||||
|
||||
`yarn install` 或者 `npm i`
|
||||
|
||||
(没有安装 yarn 的,把以下命令中的 yarn 替换为 npm run:
|
||||
|
||||
```
|
||||
yarn docs:dev
|
||||
```
|
||||
|
||||
3. 编辑
|
||||
|
||||
编辑或新增\*.md,以及修改 docs/.vuepress/config.js 中的 nav 导航栏等信息。具体可查看上面的 vuepress 文档,重新运行`yarn docs:dev`并 ctrl+f5 刷新浏览器查看设置更改。
|
||||
|
||||
4. 打包
|
||||
|
||||
```
|
||||
yarn docs:list
|
||||
yarn docs:built
|
||||
```
|
||||
|
||||
第一个命令将文章栏目下三个文件夹中的文件加入侧边栏(文章索引),
|
||||
第二个打包为部署在根路径下的 index.html 文件和其他所有静态页面资源。
|
||||
|
||||
5. 或者利用自动持续集成发布到 github page
|
||||
|
||||
这里需要:开启项目 action,开启 page,设置 secret,修改脚本中的/codingyang/为自己的项目名。然后 git push 就好,CI 脚本自动发布。
|
||||
|
||||
## 小提示
|
||||
|
||||
#### 注意 yaml
|
||||
|
||||
必须放在 md 文件在最上方才能生效
|
||||
|
||||
#### 无法热更新
|
||||
|
||||
修改 config.js 后,是没办法热更新的,只能 ctrl+c 结束任务然后重新 yarn docs:dev
|
||||
|
||||
#### 想要自动发现新 md 文件并加入侧边栏索引列表?
|
||||
|
||||
BLOG 的最基本功能,需要加一点 node 的脚本来更新 sidebar:[]的配置。
|
||||
放在了 utils/getFilenames.js 了。
|
||||
脚本运行时会查找/article_child/等 3 个文件夹下的所有目录和文件,将名称列表置入.vuepress/config/sidebar.json。
|
||||
之后重新 yarn docs:list,列表更新
|
||||
|
||||
#### 百度统计代码
|
||||
|
||||
加入了
|
||||
"vuepress-plugin-baidu-autopush"
|
||||
"vuepress-plugin-baidu-tongji"
|
||||
两个包,统计功能虽然正常,但是首页检测代码失败。所以增加了一个 utils/db_hm.js 脚本,在 build 之后手动复制统计代码到首页。
|
||||
|
||||
#### 如何打包为部署到非根目录下
|
||||
|
||||
```
|
||||
docs:build:gitpage
|
||||
docs:push:gitpage
|
||||
```
|
||||
|
||||
使用这两条命令,编译为 github page 或其他部署到非根目录下的 html。
|
||||
|
||||
要 **修改** package.json 中 docs:build:gitpage 命令里的: VUEPRESS_BASE=/codingyang/为自己要部署的子目录名,
|
||||
其中 github page 即为项目名,发布方式为分支名 gh-pages 方式推送。
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
var sidebar = require('./config/sidebar.json')
|
||||
module.exports = {
|
||||
title: 'Coding Yang BLOG',
|
||||
description: 'Just playing around',
|
||||
base: process.env.VUEPRESS_BASE || '/',
|
||||
themeConfig: {
|
||||
nav: [
|
||||
{text: '首页', link: '/'},
|
||||
{
|
||||
text: '文章',
|
||||
items: [
|
||||
{text: '儿童编程教育', link: '/article_child/'},
|
||||
{text: '技术文章', link: '/article_tech/'},
|
||||
{text: '个人', link: '/article_self/'}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: '教育软件',
|
||||
items: [
|
||||
{text: '识字率测试', link: 'http://www.codingyang.com/word/'},
|
||||
{
|
||||
text: '奖励记录星',
|
||||
link: 'http://www.codingyang.com/stars/'
|
||||
},
|
||||
|
||||
{text: '相关介绍', link: '/child/'}
|
||||
]
|
||||
},
|
||||
{text: '其他程序', link: '/code/'},
|
||||
{
|
||||
text: '联系我',
|
||||
ariaLabel: '其他技术博客',
|
||||
items: [
|
||||
{text: '联系我', link: '/about/'},
|
||||
{text: 'CSDN', link: 'https://blog.csdn.net/henjuewang'},
|
||||
{text: '简书', link: 'https://www.jianshu.com/u/2d95604f4b82'},
|
||||
{text: '微博', link: 'https://weibo.com/u/1828163444'},
|
||||
{text: 'github', link: 'https://github.com/rackar'},
|
||||
{text: '码云', link: 'https://gitee.com/rackar'}
|
||||
]
|
||||
}
|
||||
],
|
||||
// sidebar: 'auto', //自动侧边栏
|
||||
sidebar: sidebar
|
||||
// displayAllHeaders: true // 默认值:false
|
||||
},
|
||||
locales: {
|
||||
// 键名是该语言所属的子路径
|
||||
// 作为特例,默认语言可以使用 '/' 作为其路径。
|
||||
'/': {
|
||||
lang: 'zh-CN', // 将会被设置为 <html> 的 lang 属性
|
||||
title: 'CodingYang 博客',
|
||||
description:
|
||||
'博客文章列表,包括儿童编程、儿童教育及程序开发、个人感悟等主题 '
|
||||
},
|
||||
'/en/': {
|
||||
lang: 'en-US',
|
||||
title: 'CodingYang BLOG',
|
||||
description:
|
||||
"children's programming, children's education and program development"
|
||||
}
|
||||
},
|
||||
plugins: [
|
||||
'vuepress-plugin-baidu-autopush',
|
||||
[
|
||||
'vuepress-plugin-baidu-tongji',
|
||||
{
|
||||
hm: '19a1f669e77c8a8c0bf92f95cca4c782'
|
||||
}
|
||||
]
|
||||
],
|
||||
configureWebpack: {
|
||||
//webpack别名 如
|
||||
resolve: {
|
||||
alias: {
|
||||
'@alias': 'path/to/some/dir'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"/article_child/":["","rules","shizi","star"],"/article_tech/":[""],"/article_self/":[""],"/child/":["","code"],"/code/":["","other"],"/about/":[""],"/":[""]}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
export default ({
|
||||
Vue, // VuePress 正在使用的 Vue 构造函数
|
||||
options, // 附加到根实例的一些选项
|
||||
router, // 当前应用的路由实例
|
||||
siteData // 站点元数据
|
||||
}) => {
|
||||
// ...做一些其他的应用级别的优化
|
||||
}
|
||||
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
|
@ -0,0 +1,192 @@
|
|||
<template>
|
||||
<main class="home" aria-labelledby="main-title">
|
||||
<header class="hero">
|
||||
<img v-if="data.heroImage" :src="$withBase(data.heroImage)" :alt="data.heroAlt || 'hero'" />
|
||||
|
||||
<h1 v-if="data.heroText !== null" id="main-title">{{ data.heroText || $title || 'Hello' }}</h1>
|
||||
|
||||
<p class="description">{{ data.tagline || $description || 'Welcome to your VuePress site' }}</p>
|
||||
|
||||
<p class="action" v-if="data.actionText && data.actionLink">
|
||||
<NavLink class="action-button" :item="actionLink" />
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div class="features" v-if="data.features && data.features.length">
|
||||
<div class="feature" v-for="(feature, index) in data.features" :key="index">
|
||||
<a :href="$withBase(feature.url)">
|
||||
<img class="image_title" :src="$withBase('/pic'+feature.imgname)" :alt="feature.title" />
|
||||
<h2>{{ feature.title }}</h2>
|
||||
<p>{{ feature.details }}</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Content class="theme-default-content custom" />
|
||||
|
||||
<div class="footer" v-if="data.footer">{{ data.footer }}</div>
|
||||
</main>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import NavLink from "@theme/components/NavLink.vue";
|
||||
|
||||
export default {
|
||||
components: { NavLink },
|
||||
|
||||
computed: {
|
||||
data() {
|
||||
return this.$page.frontmatter;
|
||||
},
|
||||
|
||||
actionLink() {
|
||||
return {
|
||||
link: this.data.actionLink,
|
||||
text: this.data.actionText
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="stylus">
|
||||
.home {
|
||||
padding: $navbarHeight 2rem 0;
|
||||
max-width: 960px;
|
||||
margin: 0px auto;
|
||||
display: block;
|
||||
|
||||
.hero {
|
||||
text-align: center;
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
max-height: 280px;
|
||||
display: block;
|
||||
margin: 3rem auto 1.5rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
h1, .description, .action {
|
||||
margin: 1.8rem auto;
|
||||
}
|
||||
|
||||
.description {
|
||||
max-width: 35rem;
|
||||
font-size: 1.6rem;
|
||||
line-height: 1.3;
|
||||
color: lighten($textColor, 40%);
|
||||
}
|
||||
|
||||
.action-button {
|
||||
display: inline-block;
|
||||
font-size: 1.2rem;
|
||||
color: #fff;
|
||||
background-color: $accentColor;
|
||||
padding: 0.8rem 1.6rem;
|
||||
border-radius: 4px;
|
||||
transition: background-color 0.1s ease;
|
||||
box-sizing: border-box;
|
||||
border-bottom: 1px solid darken($accentColor, 10%);
|
||||
|
||||
&:hover {
|
||||
background-color: lighten($accentColor, 10%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.features {
|
||||
border-top: 1px solid $borderColor;
|
||||
padding: 1.2rem 0;
|
||||
margin-top: 2.5rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: flex-start;
|
||||
align-content: stretch;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.feature {
|
||||
flex-grow: 1;
|
||||
flex-basis: 30%;
|
||||
max-width: 30%;
|
||||
|
||||
.image_title {
|
||||
width: 14rem;
|
||||
height: 10rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 500;
|
||||
border-bottom: none;
|
||||
padding-bottom: 0;
|
||||
color: lighten($textColor, 10%);
|
||||
}
|
||||
|
||||
p {
|
||||
color: lighten($textColor, 25%);
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
padding: 2.5rem;
|
||||
border-top: 1px solid $borderColor;
|
||||
text-align: center;
|
||||
color: lighten($textColor, 25%);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $MQMobile) {
|
||||
.home {
|
||||
.features {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.feature {
|
||||
max-width: 100%;
|
||||
padding: 0 2.5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: $MQMobileNarrow) {
|
||||
.home {
|
||||
padding-left: 1.5rem;
|
||||
padding-right: 1.5rem;
|
||||
|
||||
.hero {
|
||||
img {
|
||||
max-height: 210px;
|
||||
margin: 2rem auto 1.2rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
h1, .description, .action {
|
||||
margin: 1.2rem auto;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.action-button {
|
||||
font-size: 1rem;
|
||||
padding: 0.6rem 1.2rem;
|
||||
}
|
||||
}
|
||||
|
||||
.feature {
|
||||
h2 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = {
|
||||
extend: '@vuepress/theme-default'
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# 联系方式
|
||||
|
||||
## 社交媒体
|
||||
|
||||
微信:Sabercon
|
||||
|
||||
[微博](https://weibo.com/u/1828163444) :Rackar
|
||||
|
||||
## 外部博客
|
||||
|
||||
[CSDN](https://blog.csdn.net/henjuewang) :henjuewang
|
||||
|
||||
[简书](https://www.jianshu.com/u/2d95604f4b82) :Rackar
|
||||
|
||||
## 源代码平台
|
||||
|
||||
[github](https://github.com/rackar) :Rackar
|
||||
|
||||
[码云](https://gitee.com/rackar) :Rackar
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
# 育儿轶事
|
||||
|
||||
## 迷你粉丝
|
||||
|
||||
和天天说起来,要给他买个儿童手表,还得配一个手机号码。
|
||||
“那我要自己选一个号码,1887828。。。。”
|
||||
“那可能不行,联通前面的号码不能自己选,只能后四位或者后六位自己来选”
|
||||
“那后四位就选 1056。‘1056,快乐你左右~~’”
|
||||
“哈哈哈,坐车才听了那么几次,就变成了这个广播台的忠实听众了呀。”
|
||||
恭喜内蒙古交通之声,收获一只 6 岁迷你粉丝。
|
||||
|
||||
## 可爱的小猫咪
|
||||
|
||||
小区超市里有一只一两个月的小猫咪,我们去买菜的时候看到了。天天兴奋的不行,凑近了仔细看。
|
||||
|
||||
因为管的太多,这孩子从小没碰过猫和狗,平时看到狗都要绕着走或者抱起来。我摸了下猫咪偷偷给他做示范,然后他也鼓起勇气去摸了摸猫。
|
||||
“好绵好可爱啊!”
|
||||
也是历史性的第一次,可喜可贺。但是可不能告诉天天妈。还得回家猛洗手。
|
||||
|
||||
## 薛定谔的爱
|
||||
|
||||
天天和天天妈经常会有意见不合的争执,比如先看电视还是先做作业,先吃饭还是先吃菜。特别生气的时候一下就哭了,边哭边嘟囔着:“再也不要妈妈了。再也不要妈妈了。” 好像母子关系有多么惨淡。
|
||||
|
||||
有一日天天妈去刀架上取菜刀的时候,不小心手指撞上了刀刃,划了一道开始滴血,天天跑来看了下,瘪嘴就开始伤心痛哭:“我的妈妈……我的妈妈呀……”
|
||||
“妈妈还没哭呢,你这儿凑啥热闹。”
|
||||
|
||||
看来还是疼爱着妈妈,只是不知道是为妈妈遭受疼痛而哭,还是担心这点小伤会导致严重的后果而哭。
|
||||
|
||||
## 童言无忌
|
||||
|
||||
昨天幼儿园放学后,几个小同学又抓着枪一路猛跑到院子开始疯玩玩,没课外培训课时的固定节目。
|
||||
|
||||
天天忽然对着旁边的家长说了起来:“宇晨爸爸,宇晨在幼儿园说你是大骗子。”
|
||||
|
||||
宇晨爸爸惊讶的说“啊?为什么?”
|
||||
|
||||
“因为骗他说家里没吃的了,冰箱是空的。但他偷偷看过了,冰箱里明明有很多好吃的。”
|
||||
|
||||
“宇晨,你在幼儿园是这么说的?”
|
||||
|
||||
“我…我没说啊” 旁边忙着玩的宇晨不知是真的说者无心还是会避锋芒,没接这茬。
|
||||
|
||||
我在旁边哭笑不得听他表演完,赶紧找了个好玩的支开他省得尴尬。
|
||||
|
||||
## 小暖男
|
||||
|
||||
天天,宇晨和可儿三人玩篮球玩了好半天,这几个男孩很少和女孩一起玩这么开心。
|
||||
|
||||
然后转头一起去了宇晨家一楼的小院里玩玩具。宇晨突然领地意识发作,使劲关住栅栏门不让可儿进去,说:“院子里只能两个人玩,不能进来了。”
|
||||
|
||||
可儿妈妈赶紧过来牵走可儿,“今天得早点做饭,我们回家吧。”可儿也乖乖的没哭,一起往家走。
|
||||
|
||||
宇晨爸爸刚开始数落宇晨,天天打开门一下猛冲出院子,张开双臂朝可儿拥抱过去,然后头贴头的搂着告诉可儿:“我陪你一起玩吧”
|
||||
|
||||
我发誓没给天天看过任何言情偶像剧,这娃哪学来这一套,比他爹强…
|
||||
|
||||
宇晨也跑出来道歉,三人又去院子里一起快乐的玩起了玩具。
|
||||
|
||||
可儿妈妈说:“这么体贴,像个小男子汉。” 我傻笑一下没敢接茬。
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# 育儿准则
|
||||
|
||||
## 不要生气
|
||||
|
||||
## 要耐心
|
||||
|
||||
## 不要敷衍
|
||||
|
||||
## 不要只会指责
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# 识字测试
|
||||
|
||||
## 说明
|
||||
|
||||
天天明年就要上小学了。从小只给天天报过英语班,没有系统的教过汉字。平时在绘本点读的时候明显感觉他认识不少常见字,虽然经常会搞混词组里的单字。比如看到“什”老念“么”。
|
||||
|
||||
老看到别人说自己的孩子几岁就认识了多少多少字,一直很好奇是如何统计测试出来的。莫非是对着字典一个个数的吗?太不科学了。
|
||||
|
||||
于是花了一晚上写了一个程序,点开就能测测小学常用 2500 字的认识情况,实时显示识字率,并且自动保存,下次打开可以接着测。
|
||||
|
||||
## 地址
|
||||
|
||||
[识字率测试](http://www.codingyang.com/word/)
|
||||
|
||||
## 其他
|
||||
|
||||
现在免费发出来,有需要的家长也让小朋友试试看吧~欢迎分享到微信和提出改进意见。
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# 让孩子自觉学习
|
||||
|
||||
## 背景
|
||||
|
||||
天天 5 岁以后,明显开始不好说服和指挥了。之前随意指挥一下“该做 Book Room 了”(英语 app 阅读任务),他就颠颠的配合你做,可现在会找理由、会拖延了。天天妈又是个急性子,要是指挥了没动或者一句读错了立马就要火药桶爆炸一样提高音量吼,很容易弄个鸡飞狗跳鬼哭狼嚎。任务没做成,还气的气哭的哭。这时只好亲自出马,花好一会儿时间哄平静了,再一边鼓励一边引导。生词难就先念上 10 遍,句子难就拆上 3 段,还要不间断夸着顺着,努力把这点任务完成。
|
||||
|
||||
开始练习写汉字和字母就更痛苦了,姿势不对、笔画不对、歪歪扭扭、一写就累,连闹几天我的脾气也搞到爆炸边缘了。真不敢想上了学前班和小学以后,真正的作业来了是不是要每天一遍世界大战了。
|
||||

|
||||
|
||||
这样不行。我前三十年对学习的最大心得就是,**自觉**学习主动学习可以受益终生。这么点大就把学习变成一个**大负担**,这种做法绝对不行。
|
||||
|
||||
以前一直对靠物质奖励诱惑孩子来达到大人目的做法嗤之以鼻,但是英语学校、音乐学校、绘画教室、跆拳道馆都在用这招,而且效果不错,让我开始慎重考虑这种手段。
|
||||
|
||||
## 方法
|
||||
|
||||
通过设定规则:完成每一个小挑战赢得几个的星星/贴纸,达到一定数量的星星可以兑换玩具,让孩子从对自己有利的角度想问题、做决策。而父母在这个决策过程中弱化自己的倾向,仅做规则的制定和执行。
|
||||
|
||||
目前的积分规则是上一天幼儿园、上一次校外课、完成一次英语作业、练一篇字都可以加一个星星。兑换规则是 60 个星星兑换 1-150 元玩具,120 个兑换 150-300 元玩具,200 个兑换 300-500 元玩具。惩罚则是针对性的制定,当前是吃手指甲和歇斯底里的大哭大闹会扣 1 星。当然惩罚不是目的,做错事后道理讲到点上就行,滥用或强调惩罚会本末倒置,增加对抗情绪,让奖励系统崩塌。
|
||||
|
||||

|
||||
|
||||
## 实践
|
||||
|
||||
以前拒绝天天买玩具的要求比较多,但还是不知不觉买了一大堆玩具。规则公布之后,平时不买玩具,想要买什么就等星星数量够了以后执行兑换。
|
||||
和天天谈了这个规则后,他也很高兴,已经在计划自己要用星星换什么了。果然任务完成度比以前要高,主动性也要好。
|
||||
执行以后如果遇到阅读或写字因故未完成,也不多做批评,只提一下明天完成后才能加星。逐步的形成正向激励的机制。
|
||||
|
||||
刚开始星星数量记录的比较随意,后来看到执行效果不错,[我专门做了个小网页用来记录和兑换](http://codingyang.com/stars/),每天睡前或第二天早上很有仪式感的让他自己来点击加星,让规则固化。合计下来买玩具花的钱还没之前多,也能让他选自己喜欢的类型(家长只提供分析意见,不强制反对)。算是多赢。
|
||||

|
||||
|
||||
## 长效作用分析
|
||||
|
||||
这几点有空了再展开
|
||||
|
||||
- 积攒和计划
|
||||
把星星看做工资的话,这是对合理存款和计划消费的提前锻炼。
|
||||
- 延迟满足
|
||||
将收获玩具的流程拉长,体验忍耐和延迟满足,来适应更大的挑战。
|
||||
- 功利性
|
||||
借用连岳一句话:“太功利有错”的点在“太”而不是“功利”,人类的本质就是功利,追求对自己有利是永恒的目标。
|
||||
- 正向激励
|
||||
通过正向的肯定和认同,增添自信和乐观,直面挑战。
|
||||
|
||||
## 免费使用
|
||||
|
||||
自用的加星网站做好以后,还额外增加了用户功能,可以推广给其他家庭,有意向的家长可以试试。微信扫码或者浏览器直接打开http://codingyang.com/stars/即可,加入收藏方便每日加星操作。有问题建议可以评论或联系我(微信号sabercon)。
|
||||
**愿大家育儿路上保持平和和喜悦。**
|
||||
|
||||

|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# 个人感悟
|
||||
|
||||
## 终身学习
|
||||
|
||||
## 珍惜每天
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
# Codingyang Blog
|
||||
|
||||
## Intro 介绍
|
||||
|
||||
Use vuepress build static personal Blog.
|
||||
|
||||
Just create or edit \*.md markdown document,
|
||||
|
||||
quickly build it to static html site with good SEO.
|
||||
|
||||
使用 vuepress 创建 SEO 友好的静态博客站。一键发布到 github page,内置 github action 自动部署脚本。
|
||||
|
||||
vuepress 通过一定*号称简单*的配置之后,为每一个 md 文件生成静态 html 脚本,并通过主题挂接起来。
|
||||
用来写文档是非常不错的。写博客就要做一点工作,踩**一点**坑。
|
||||
|
||||
[demo 演示](http://www.codingyang.com/)
|
||||
|
||||
[document 文档](http://www.codingyang.com/article_tech/)
|
||||
|
||||
[github 源码](https://github.com/Rackar/codingyang)
|
||||
|
||||
## 相关技术
|
||||
|
||||
[vuepress](https://v1.vuepress.vuejs.org/zh/guide/)
|
||||
|
||||
Github Aciton
|
||||
|
||||
## how to use 使用
|
||||
|
||||
1. 克隆项目后进入
|
||||
|
||||
`git clone https://github.com/Rackar/codingyang`
|
||||
|
||||
`cd codingyang`
|
||||
|
||||
2. 安装依赖并运行开发服务:
|
||||
|
||||
`yarn install` 或者 `npm i`
|
||||
|
||||
(没有安装 yarn 的,把以下命令中的 yarn 替换为 npm run:
|
||||
|
||||
```
|
||||
yarn docs:dev
|
||||
```
|
||||
|
||||
3. 编辑
|
||||
|
||||
编辑或新增\*.md,以及修改 docs/.vuepress/config.js 中的 nav 导航栏等信息。具体可查看上面的 vuepress 文档,重新运行`yarn docs:dev`并 ctrl+f5 刷新浏览器查看设置更改。
|
||||
|
||||
4. 打包
|
||||
|
||||
```
|
||||
yarn docs:list
|
||||
yarn docs:built
|
||||
```
|
||||
|
||||
第一个命令将文章栏目下三个文件夹中的文件加入侧边栏(文章索引),
|
||||
第二个打包为部署在根路径下的 index.html 文件和其他所有静态页面资源。
|
||||
|
||||
5. 或者利用自动持续集成发布到 github page
|
||||
|
||||
这里需要:开启项目 action,开启 page,设置 secret,修改脚本中的/codingyang/为自己的项目名。然后 git push 就好,CI 脚本自动发布。
|
||||
|
||||
## 小提示
|
||||
|
||||
#### 注意 yaml
|
||||
|
||||
必须放在 md 文件在最上方才能生效
|
||||
|
||||
#### 无法热更新
|
||||
|
||||
修改 config.js 后,是没办法热更新的,只能 ctrl+c 结束任务然后重新 yarn docs:dev
|
||||
|
||||
#### 想要自动发现新 md 文件并加入侧边栏索引列表?
|
||||
|
||||
BLOG 的最基本功能,需要加一点 node 的脚本来更新 sidebar:[]的配置。
|
||||
放在了 utils/getFilenames.js 了。
|
||||
脚本运行时会查找/article_child/等 3 个文件夹下的所有目录和文件,将名称列表置入.vuepress/config/sidebar.json。
|
||||
之后重新 yarn docs:list,列表更新
|
||||
|
||||
#### 百度统计代码
|
||||
|
||||
加入了
|
||||
"vuepress-plugin-baidu-autopush"
|
||||
"vuepress-plugin-baidu-tongji"
|
||||
两个包,统计功能虽然正常,但是首页检测代码失败。所以增加了一个 utils/db_hm.js 脚本,在 build 之后手动复制统计代码到首页。
|
||||
|
||||
#### 如何打包为部署到非根目录下
|
||||
|
||||
```
|
||||
docs:build:gitpage
|
||||
docs:push:gitpage
|
||||
```
|
||||
|
||||
使用这两条命令,编译为 github page 或其他部署到非根目录下的 html。
|
||||
|
||||
要 **修改** package.json 中 docs:build:gitpage 命令里的: VUEPRESS_BASE=/codingyang/为自己要部署的子目录名,
|
||||
其中 github page 即为项目名,发布方式为分支名 gh-pages 方式推送。
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# sirix
|
||||
|
||||
## 运行环境
|
||||
|
||||
linux- centOS 7
|
||||
|
||||
安装 docker
|
||||
|
||||
安装 git
|
||||
|
||||
```
|
||||
yum -y install git
|
||||
```
|
||||
|
||||
docker-compose
|
||||
|
||||
```
|
||||
yum -y install epel-release
|
||||
yum -y install python-pip
|
||||
pip install --upgrade pip
|
||||
pip install docker-compose
|
||||
```
|
||||
|
||||
## 后端服务开启
|
||||
|
||||
```
|
||||
service docker restart
|
||||
docker run -d --name keycloak -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e KEYCLOAK_LOGLEVEL=DEBUG jboss/keycloak
|
||||
```
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# 儿童编程
|
||||
|
||||
## Scratch
|
||||
|
||||
Scratch 儿童编程
|
||||
|
||||
## SWIFT
|
||||
|
||||
儿童编程
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# 教育软件
|
||||
|
||||
以下都是前端网页版程序,可以直接点击使用,微信和浏览器都可打开。
|
||||
|
||||
## 小学识字测试
|
||||
|
||||
#### 介绍
|
||||
|
||||
测小学常用 2500 字的认识情况,实时显示识字率,并且自动保存,下次打开可以接着测。
|
||||
|
||||
#### 地址
|
||||
|
||||
点击进入[识字率测试](http://www.codingyang.com/word/)
|
||||
|
||||
## 奖励记录星
|
||||
|
||||
#### 介绍
|
||||
|
||||
用微小的进步感和获得感激励孩子前进。
|
||||
激励制度化、可视化软件。可记录每日奖励加星数量,够一定数量可以消费使用。
|
||||
|
||||
#### 地址
|
||||
|
||||
点击进入[奖励记录星](http://www.codingyang.com/stars/)
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# 办公工具
|
||||
|
||||
## 学习强国小助手
|
||||
|
||||
#### 介绍
|
||||
|
||||
学习强国小助手 app,可以自动切换文章和视频,设定停留时间。刷牙时,吃饭时,洗碗时,任何时候都可以不占用双手随时学习。需要安卓手机开启 root,或者使用雷电模拟器。
|
||||
|
||||
#### 地址
|
||||
|
||||
点击进入教程和下载[学习强国小助手](https://www.jianshu.com/p/f30f3490ebcb)
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 测绘工具
|
||||
|
||||
## 航测参数计算工具
|
||||
|
||||
#### 介绍
|
||||
|
||||
航空摄影中工作量和参数的计算。通过选择预设好的相机类型和飞机类型,输入分辨率和测区面积,得到相关参数如相对航高,基线和航线条数及飞行总小时。
|
||||
|
||||
#### 地址
|
||||
|
||||
点击进入[航测参数计算工具](http://www.codingyang.com/calc/)
|
||||
|
||||
## 航空影像统计树木数量
|
||||
|
||||
#### 介绍
|
||||
|
||||
通过加载航飞影像,软件自动提取和人工交互增补检查的流程,精确测定树木数量的软件。管理的公园、保护区、开发区、山头有多少棵树?当前主要采用抽样和统计的计算方法,数量统计准确率不高,不利于精细化管理。软件使用步骤见链接,桌面端软件暂未提供下载链接,请联系我获取。
|
||||
|
||||
#### 地址
|
||||
|
||||
桌面端,暂未提供下载
|
||||
|
||||
点击进入教程[航空影像统计树木数量](https://jingyan.baidu.com/article/9faa7231e3f687473d28cb77.html)
|
||||
|
||||
## 航空影像快速质检
|
||||
|
||||
#### 介绍
|
||||
|
||||
仅使用概略 POS,快速评定航摄飞行质量。航摄质量检查的主要方法为传统人工检查法和软件自动检查法。人工检查耗时较长、效率偏低、容易漏检。自动检查效率较高,但需要准备相应的 POS 数据、影像数据和其他参数文件,其中影像数据需要一定时长,进行拼接匀色等处理才能得到结果。本软件仅使用 POS 数据直接定向,来快速评估飞行质量,定位可疑点。
|
||||
|
||||
#### 地址
|
||||
|
||||
桌面端,暂未提供下载
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 测绘工具
|
||||
|
||||
## 航测参数计算工具
|
||||
|
||||
#### 介绍
|
||||
|
||||
航空摄影中工作量和参数的计算。通过选择预设好的相机类型和飞机类型,输入分辨率和测区面积,得到相关参数如相对航高,基线和航线条数及飞行总小时。
|
||||
|
||||
#### 地址
|
||||
|
||||
点击进入[航测参数计算工具](http://www.codingyang.com/calc/)
|
||||
|
||||
## 航空影像统计树木数量
|
||||
|
||||
#### 介绍
|
||||
|
||||
通过加载航飞影像,软件自动提取和人工交互增补检查的流程,精确测定树木数量的软件。管理的公园、保护区、开发区、山头有多少棵树?当前主要采用抽样和统计的计算方法,数量统计准确率不高,不利于精细化管理。软件使用步骤见链接,桌面端软件暂未提供下载链接,请联系我获取。
|
||||
|
||||
#### 地址
|
||||
|
||||
桌面端,暂未提供下载
|
||||
|
||||
点击进入教程[航空影像统计树木数量](https://jingyan.baidu.com/article/9faa7231e3f687473d28cb77.html)
|
||||
|
||||
## 航空影像快速质检
|
||||
|
||||
#### 介绍
|
||||
|
||||
仅使用概略 POS,快速评定航摄飞行质量。航摄质量检查的主要方法为传统人工检查法和软件自动检查法。人工检查耗时较长、效率偏低、容易漏检。自动检查效率较高,但需要准备相应的 POS 数据、影像数据和其他参数文件,其中影像数据需要一定时长,进行拼接匀色等处理才能得到结果。本软件仅使用 POS 数据直接定向,来快速评估飞行质量,定位可疑点。
|
||||
|
||||
#### 地址
|
||||
|
||||
桌面端,暂未提供下载
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
home: true
|
||||
heroText: CodingYang Blog
|
||||
tagline: Registered surveyor / Amateur coder / Father
|
||||
|
||||
features:
|
||||
- title: Articles
|
||||
details: Article lists, including children's programming, children's education and program development, personal perception and other topics.
|
||||
url: /article/
|
||||
imgname: /article.jpg
|
||||
- title: Children
|
||||
details: Softwares coded by myself for children's growth.
|
||||
url: /child/
|
||||
imgname: /child.jpg
|
||||
- title: Software
|
||||
details: Survey tools and others.
|
||||
url: /code/
|
||||
imgname: /code.jpg
|
||||
footer: Copyright © 2018-present CodingYang | 蒙ICP备19000275号-1
|
||||
---
|
||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
home: true
|
||||
heroText: CodingYang博客
|
||||
tagline: 注册测绘师 / 业余码农 / 儿童成长陪伴员
|
||||
|
||||
features:
|
||||
- title: 文章
|
||||
details: 博客文章列表,包括儿童编程、儿童教育及程序开发、个人感悟等主题。
|
||||
url: /article_child/
|
||||
imgname: /article.jpg
|
||||
- title: 儿童教育程序
|
||||
details: 自己在陪伴孩子成长过程中开发的一些程序软件。
|
||||
url: /child/
|
||||
imgname: /child.jpg
|
||||
- title: 其他程序
|
||||
details: 测绘工具、辅助工具等自编软件。
|
||||
url: /code/
|
||||
imgname: /code.jpg
|
||||
footer: Copyright © 2018-present CodingYang | 蒙ICP备19000275号-1
|
||||
---
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "codeevan",
|
||||
"version": "1.0.0",
|
||||
"scripts": {
|
||||
"docs:dev": "vuepress dev docs",
|
||||
"docs:list": "node utils/getFilenames.js",
|
||||
"docs:build": "vuepress build docs && node utils/bd_hm.js",
|
||||
"docs:build:gitpage": "export VUEPRESS_BASE=/codingyang/|| set VUEPRESS_BASE=/codingyang/&&vuepress build docs && node utils/bd_hm.js",
|
||||
"docs:push:gitpage": "push-dir --dir=docs/.vuepress/dist --branch=gh-pages --allow-unclean"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"push-dir": "^0.4.1",
|
||||
"vuepress": "^1.1.0",
|
||||
"vuepress-plugin-baidu-autopush": "^1.0.1",
|
||||
"vuepress-plugin-baidu-tongji": "^1.0.1"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
var fs = require('fs')
|
||||
var baidu = `<script>
|
||||
var _hmt = _hmt || [];
|
||||
(function() {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "https://hm.baidu.com/hm.js?19a1f669e77c8a8c0bf92f95cca4c782";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
</script>`
|
||||
|
||||
function writeJson() {
|
||||
//现将json文件读出来
|
||||
fs.readFile('./docs/.vuepress/dist/index.html', function(err, data) {
|
||||
if (err) {
|
||||
return console.error(err)
|
||||
}
|
||||
var person = data.toString() //将二进制的数据转换为字符串
|
||||
var pos = person.indexOf('<meta charset="utf-8">')
|
||||
person = person.slice(0, pos) + baidu + person.slice(pos)
|
||||
fs.writeFile('./docs/.vuepress/dist/index.html', person, function(err) {
|
||||
if (err) {
|
||||
console.error(err)
|
||||
}
|
||||
console.log('----------新增成功-------------')
|
||||
})
|
||||
})
|
||||
}
|
||||
writeJson() //执行一下;
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
const {readdir, readFile, writeFile} = require('fs')
|
||||
// const {resolve} = require('path')
|
||||
|
||||
// const FOLDERPATH = './docs/article'
|
||||
const PathsIn = [
|
||||
'./docs/article_child/',
|
||||
'./docs/article_self/',
|
||||
'./docs/article_tech/'
|
||||
]
|
||||
|
||||
function pReadFile(filepath) {
|
||||
return new Promise((resolve, reject) => {
|
||||
readdir(filepath, (err, files) => {
|
||||
let filenames = []
|
||||
files.forEach(file => {
|
||||
if (file.toLowerCase() === 'readme.md') {
|
||||
file = ``
|
||||
} else {
|
||||
file = file.replace('.md', '')
|
||||
file = `${file}`
|
||||
}
|
||||
filenames.push(file)
|
||||
})
|
||||
|
||||
filenames.sort() // 排序
|
||||
resolve(filenames)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Promise.all([
|
||||
pReadFile(PathsIn[0]),
|
||||
pReadFile(PathsIn[1]),
|
||||
pReadFile(PathsIn[2])
|
||||
]).then(
|
||||
arr => {
|
||||
console.log(arr)
|
||||
var params = {
|
||||
'/article_child/': arr[0],
|
||||
'/article_self/': arr[1],
|
||||
'/article_tech/': arr[2]
|
||||
}
|
||||
writeJson(params)
|
||||
},
|
||||
err => console.log(err)
|
||||
)
|
||||
|
||||
function writeJson(params) {
|
||||
//现将json文件读出来
|
||||
readFile('./docs/.vuepress/config/sidebar.json', function(err, data) {
|
||||
if (err) {
|
||||
return console.error(err)
|
||||
}
|
||||
var person = data.toString() //将二进制的数据转换为字符串
|
||||
|
||||
person = JSON.parse(person) //将字符串转换为json对象
|
||||
// person['/article_child/'] = params['/article_child/']
|
||||
for (let key in params) {
|
||||
person[key] = params[key]
|
||||
}
|
||||
console.log(person)
|
||||
var str = JSON.stringify(person) //因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
|
||||
writeFile('./docs/.vuepress/config/sidebar.json', str, function(err) {
|
||||
if (err) {
|
||||
console.error(err)
|
||||
}
|
||||
console.log('----------新增成功-------------')
|
||||
})
|
||||
})
|
||||
}
|
||||