不会飞的章鱼

熟能生巧,勤能补拙,静能生慧;念念不忘,必有回响。

How it started

Yesterday, I listened to a talk by a PhD who has learned five foreign languages. He said:

  • Be brave to speak and don’t be afraid of making mistakes;
  • Do some preparation before coming to the English corner.

Therefore, I am writing this blog to record the preparations I am making for today’s English corner.

Introduce myself

阅读全文 »

致未来的念念,你好,好久不见,我是过去的你,当你看到这篇文章的时候,你应该是一个中年人了吧。你完成我们的梦想了吗?还记得我们的十年之约吗?还是,被生活打倒了呢?
我不知道。但是,念念,永远不要停止追逐,我知道这也许很艰难,无论如何努力,希望的火苗都始终无法点燃。但是,念念,假如有一天我放弃了,把梦想埋起来了,那么,无论多少次都好,请你一定要再鼓起勇气,重新拿起铲子,把梦想再挖出来!
我们的故事不应该深埋在地底,而是应该飞向蓝天之上!无论被打倒多少次,都不要忘记梦想的力量。去地球的尽头看看吧,但又不止地球的尽头,去看看一望无际的荒原,去看看连绵千里的高山,去看看飞流直下的瀑布,去看看清澈碧绿的湖面,不为什么,只因为想去就去了,那不就是最棒的人生吗?

那么,曾经的你,如何定义最棒的人生呢?

小学五年级,你说你要成为像杨利伟一样的宇航员,飞向太空,万人瞩目;你说要成为一名老师,受人尊敬,同时像蜡烛一样,燃烧自己,照亮他人;你说要成为一名科学家,造福人类。你觉得只要成为对社会有用的事,这就是最棒的人生。

初中一年级,你上课打闹,暗恋班里的某位女生,放学后打一局台球,再去游戏厅打一局PS2和反恐精英,学习无压力。你觉得每天开心,做自己想做的事,这应该就是向往的生活。

高中一年级,你被你理想的市重点高中录取了,你觉得一只脚已经踏入了名校,你认为只要保持高考分数大于等于中考分数就没问题。于是,你在上课的同时,报名参加了全国的机器人竞赛,开始提前学习编程知识,同时你在乒乓球比赛中战胜了多个对手,100多人选8个,很幸运你是其中之一。你对自己的学业充满信心,同时有精力发展自己的爱好,且有所成就,你的眼里充满了追逐梦想的光。

阅读全文 »

任务描述

本次任务是解决出租车计费问题。某市出租车计费标准见表3-1,请根据此标准完成一个出租车计费模拟功能,能够计算总费用和列出产生费用项目详细情况说明,帮助出租车师傅和乘客了解计费标准。

  • 早高峰为7∶00(含)~9∶00(不含); 晚高峰为17∶00(含)~19∶00(不含)。
  • 出租车结算以元为单位,元以下四舍五入。
  • 过路、过桥费由乘客负担。

目标

  • 掌握if语法。
  • 掌握switch语法。
  • 使用字符串常用方法。
阅读全文 »

任务描述

程序是如何帮助人类提高生产效率的?程序世界是由什么组成的?想在Java程序中如鱼得水,首先需要了解Java程序的基本语法。通过本次任务线索的学习,完成薪资转换工具。
需求如下:当用户输入月薪时,计算出对应的日薪(每月工作日22天)和年薪(1年13薪)并进行输出显示。

目标

  • 掌握Java的基本输入输出。
  • 掌握Java的基本数据类型和变量。
  • 掌握Java运算符。
  • 掌握格式化输出。

任务线索

阅读全文 »

miniblog 实现的功能

  • 用户管理: 支持 用户注册、用户登录、获取用户列表、获取用户详情、更新用户信息、修改用户密码、注销用户 7 种用户操作;
  • 博客管理: 支持 创建博客、获取博客列表、获取博客详情、更新博客内容、删除博客、批量删除博客 6 种博客操作。

涉及技术栈,点击github

miniblog 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
├── api # Swagger / OpenAPI 文档存放目录
│ └── openapi
│ └── openapi.yaml # OpenAPI 3.0 API 接口文档
├── cmd # main 文件存放目录
│ └── miniblog
│ └── miniblog.go
├── configs # 配置文件存放目录
│ ├── miniblog.sql # 数据库初始化 SQL
│ ├── miniblog.yaml # miniblog 配置文件
│ └── nginx.conf # Nginx 配置
├── docs # 项目文档
│ ├── devel # 开发文档
│ │ ├── en-US # 英文文档
│ │ └── zh-CN # 中文文档
│ │ ├── architecture.md # miniblog 架构介绍
│ │ ├── conversions # 规范文档存放目录
│ │ │ ├── api.md # 接口规范
│ │ │ ├── commit.md # Commit 规范
│ │ │ ├── directory.md # 目录结构规范
│ │ │ ├── error_code.md # 错误码规范
│ │ │ ├── go_code.md # 代码规范
│ │ │ ├── log.md # 日志规范
│ │ │ └── version.md # 版本规范
│ │ └── README.md
│ ├── guide # 用户文档
│ │ ├── en-US # 英文文档
│ │ └── zh-CN # 中文文档
│ │ ├── announcements.md # 动态与公告
│ │ ├── best-practice # 最佳实践
│ │ ├── faq # 常见问题
│ │ ├── installation # 安装指南
│ │ ├── introduction # 产品介绍
│ │ ├── operation-guide # 操作指南
│ │ ├── quickstart # 快速入门
│ │ └── README.md
│ └── images # 项目图片存放目录
├── examples # 示例源码
├── go.mod
├── go.sum
├── init # Systemd Unit 文件保存目录
│ ├── miniblog.service # miniblog systemd unit
├── internal # 内部代码保存目录,这里面的代码不能被外部程序引用
│ ├── miniblog # miniblog 代码实现目录
│ │ ├── biz # biz 层代码
│ │ ├── controller # controller 层代码
│ │ │ └── v1 # API 接口版本
│ │ │ ├── post # 博客相关代码实现
│ │ │ │ ├── create.go # 创建博客
│ │ │ │ ├── delete_collection.go #批量删除博客
│ │ │ │ ├── delete.go # 删除博客
│ │ │ │ ├── get.go # 获取博客详情
│ │ │ │ ├── list.go # 获取博客列表
│ │ │ │ ├── post.go # 博客 Controller 结构定义、创建
│ │ │ │ └── update.go # 更新博客
│ │ │ └── user
│ │ │ ├── change_password.go # 修改用户密码
│ │ │ ├── create.go #创建用户
│ │ │ ├── delete.go # 删除用户
│ │ │ ├── get.go # 获取用户详情
│ │ │ ├── list.go # 获取用户列表
│ │ │ ├── login.go # 用户登录
│ │ │ ├── update.go # 更新用户
│ │ │ └── user.go # 用户 Controller 结构定义、创建
│ │ ├── helper.go # 工具类代码存放文件
│ │ ├── miniblog.go # miniblog 主业务逻辑实现代码
│ │ ├── router.go # Gin 路由加载代码
│ │ └── store # store 层代码
│ └── pkg # 内部包保存目录
│ ├── core # core 包,用来保存一些核心的函数
│ ├── errno # errno 包,实现了 miniblog 的错误码功能
│ │ ├── code.go # 错误码定义文件
│ │ └── errno.go # errno 包功能函数文件
│ ├── known # 存放项目级的常量定义
│ ├── log # miniblog 自定义 log 包
│ ├── middleware # Gin 中间件包
│ │ ├── authn.go # 认证中间件
│ │ ├── authz.go # 授权中间件
│ │ ├── header.go # 指定 HTTP Response Header
│ │ └── requestid.go # 请求 / 返回头中添加 X-Request-ID
│ └── model # GORM Model
├── LICENSE # 声明代码所遵循的开源协议
├── Makefile # Makefile 文件,一般大型软件系统都是采用 make 来作为编译工具
├── _output # 临时文件存放目录
├── pkg # 可供外部程序直接使用的 Go 包存放目录
│ ├── api # REST API 接口定义存放目录
│ ├── proto # Protobuf 接口定义存放目录
│ ├── auth # auth 包,用来完成认证、授权功能
│ │ ├── authn.go # 认证功能
│ │ └── authz.go # 授权功能
│ ├── db # db 包,用来完成 MySQL 数据库连接
│ ├── token # JWT Token 的签发和解析
│ ├── util # 工具类包存放目录
│ │ └── id # id 包,用来生成唯一短 ID
│ └── version # version 包,用来保存 / 输出版本信息
├── README-en.md # 英文 README
├── README.md # 中文 README
├── scripts # 脚本文件
│ ├── boilerplate.txt # 指定版权头信息
│ ├── coverage.awk # awk 脚本,用来计算覆盖率
│ ├── make-rules # 子 Makefile 保存目录
│ │ ├── common.mk # 存放通用的 Makefile 变量
│ │ ├── golang.mk # 用来编译源码
│ │ └── tools.mk # 用来完成工具的安装
│ └── wrktest.sh # wrk 性能测试脚本
└── third_party # 第三方 Go 包存放目录
阅读全文 »

课程简介

MIT出的Java入门课程,总共7节课程,每节课大概一个小时。
课程包括入门Java所需的基础知识概念,Java代码风格,以及如何Debug
第五节和第六节会将结合所学知识做一个简单的绘图软件,很有趣。

作业展示

阅读全文 »

课程简介

  • 所属大学:UC Irvine
  • 先修要求:无
  • 编程语言:Go
  • 课程语言:英语
  • 课程难度:🌟🌟
  • 预计学时:50小时
  • Github: UCI Programming with Google Go

UC Irvine在Coursera上出的Go语言入门课程,分成了三门课程来讲授Go语言的基础语法,特性和并发。
一门课程分四周,每周都会有测验,作业和学生互评。文档齐全,适合自学。

学完感受

起因是受到一位大佬PKUFlyingPig的影响,他说

阅读全文 »

前置条件

确定机器上已具备以下部署条件:

  • 2c4g
  • Docker

容器化部署

在Debian 12环境下

阅读全文 »

先决条件

两台服务器,配置如下:

  • 4GB以上的内存
  • 20GB以上的存储
  • Ubuntu Server 18.04 LTS

安装

确保是root权限

阅读全文 »

Docker安装Kafka服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker pull wurstmeister/zookeeper

docker run -d --name zookeeper -p 2181:2181 -e TZ="Asia/Shanghai" --restart always wurstmeister/zookeeper

docker pull wurstmeister/kafka


# docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=<这里换成你的zookeeper地址和端口> -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<这里换成你的kafka地址和端口> -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e TZ="Asia/Shanghai" wurstmeister/kafka
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e TZ="Asia/Shanghai" wurstmeister/kafka



docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.17.0.3:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka


  • -e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181:指定 Zookeeper 的地址和端口,这里使用本地地址 127.0.0.1 和默认端口 2181。
  • -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092:将 Kafka 服务器的地址和端口设置为 127.0.0.1:9092。
  • -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092:指定 Kafka 监听的地址和端口为 0.0.0.0:9092,允许外部访问。
  • -p 9092:9092:将容器内部的 9092 端口映射到主机的 9092 端口,允许通过主机的 127.0.0.1:9092 访问 Kafka 服务器。

安装Kafka客户端

1
2
3
docker pull nickzurich/efak:latest

docker run -d --name kafka-eagle -p 8048:8048 -e EFAK_CLUSTER_ZK_LIST="172.17.0.3:2181" nickzurich/efak:latest
阅读全文 »