重构:改善既有代码的设计
基于 Refactoring: Improving the Design of Existing Code, Second Edition 编写
重构的原则
注意,重构应该是一小步一小步进行的,每一步都不应该破坏代码的功能。因此,最为理想的重构流程应当是修改-测试-提交并一步步迭代。
重构的目标是让代码更加模块化,或者探究其本质,是让代码能够被人读懂。正如作者所说:
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
任何傻瓜都会写出能够让机器理解的代码,只有好的程序员才能写出人类可以理解的代码。
添加新功能和重构应该是两个不同的过程,通常是在添加新功能之前,发现现有的的代码结构无法较好地添加新功能,所以先重构。两个过程应当是交替进行的,而不是同时进行
为什么要重构?
提高软件的设计
使软件更容易被理解
帮助寻找 bug
从长期来看,能提高编程的速度
重构类型:
准备重构:使添加新特性更容易
理解重构:使代 ...
献出心脏
墙的那边是海
直到外面的世界出现在我们眼前,笼罩在我们上头的是巨人的阴影。无论是多强的角色,在遇到巨人时都是那么地不堪一击,那么地脆弱。即使明知道是去送死,每个调查兵团的士兵都会毫不犹豫地慷慨就义。所以,他们加入调查兵团的目的是什么呢?是像艾伦一样发誓要“驱逐巨人”,还是像阿尔敏一样想要去“看海”。总之,决不可能是为了建功立业,收到万人敬仰。或许更可能是为了家人,如果我不去挺身而出,总有一天,其家人就会不得不被迫行动。当然,最可能的是他的誓词——为人类献出心脏。
海的那边是什么?
“墙的那边是海,海的那边是敌人,把海那边的敌人杀光 是不是就可以自由了”,如果说之前与巨人的战斗更多的是在讴歌人类的勇气与不屈的斗志,从此开始,巨人才真正进入了主题。原来之前被视为“天灾”的巨人是人造的,恐怖的巨人本质上竟然是人类的恶意。而且,如果是之前的巨人是绝对邪恶的,但这次的人类,双方各执一词,到底谁对谁错,已经难以评说了。正好呼应了开头所提到的有了巨人,人类得以团结起来,但如果只有人类的仇恨呢?
塔塔开
埃尔文团长
调查兵团大团长是我最喜欢的角色,这是一个卑鄙的小人。如果说别人是为了某些崇高的理想而 ...
愿你有一天能与你重要的人重逢
如果…
《可塑性记忆》讲述的是一个悲剧的故事,一个从开始就能够感受到分离时的悲伤的故事。“分离”是一个永恒的话题,而这个故事通过缩短寿命的时限,将这个问题硬生生地摆在了面前,甚至还进一步缩短至一个多月的时间,让人无法回避。
我们应该怎样做?有的人认为与其后世生活在回忆中,独自忍受着痛苦,不如尽可能避免与其接触,留下一些难忘的回忆。很多作品中禁止跨物种恋爱给出的理由都是这类。还有的人认为能够发生所谓的“奇迹”,总是会出现特例的,“爱”能够超越一切。前面提到的很多作品出总是会出现触犯规定的角色,而其结局往往如此。另有一些人认为 ta 没有死,而是活在自己的心中,会带着 ta 的那一份好好的活下去。
然而,这部作品向我们传达的并不是上述的意思。诚然,结局可以如很多人希望的那样写成出现了奇迹,艾拉记忆没有丢失,或者没有变成 wanderer,这样尽管有些庸俗,却不失为一个好结局。但是,正如作品的标题所说,记忆是可塑的,也正如艾露所说,她并不希望和失去记忆的好友去到那些充满回忆的地方,因为这完全是她的一厢情愿。相反,她要和新的好友一起去创造新的回忆,这就是“可塑性记忆”的内涵。
结尾处全程没有出 ...
我出门了
旅途与废墟
新海诚的这部作品我觉得还是挺可惜的,剧情的深度和立意都非常不错,可圈可点之处非常多。作为所谓“灾难三部曲”的最后一部,仅凭剧情上来说甚至说是最优秀的一部都不为过。然而,这里面的感情线是一大败笔,甚至导致整部作品意义不明。看了一些资料,或许新海诚原定的“双女主”的设定是更好的,但终究还是选择了更赚钱的设定。只能说他是“成也感情线,败也感情线”,在《秒速五厘米》中,感情线是最为出彩的地方,但到最近的《天气之子》和《铃芽之旅》,感情线破有些不明所以,或许现在的他已经年纪大了,“不相信爱情了”,当然更可能是因为他发现做感情线能赚很多小情侣的钱,所以每部作品都尽可能往里面添加。
“地震”,我们并不陌生,日本有“东日本大地震”、“阪神大地震”等,我们也有“汶川大地震”、“唐山大地震”等,所以不需要大加渲染就能够理解这些地点背后都代表着什么。这里面使用的所谓“蚓厄”,中国也有类似的“鲶鱼翻身地震动”的说法,还有“往门”、“常世”与“现世”的概念,都有类似的说法。把这些民间传说无缝地融入到现代都市中,带给人一种陌生又熟悉的感觉,从而消解了观众对“地震”的不适感,产生一种奇幻的感觉,也不至 ...
CMake
运行 CMake
现代 CMake 可以直接在根目录下执行指令了,而不是要进入 build 目录:
cmake -B buildcmake --build build
如果想要安装,也只需要一行命令:
cmake --install build
手动指定编译器:
CC=clang CXX=clang++ cmake ..
可以使用 -G"My Tool" 来选择自己想要用的构建工具(GNU Make,MSBuild 等)
基础介绍
CMakeLists.txt 中的第一行指明 CMake 的版本:
cmake_minimum_required(VERSION 3.7...3.29)if(${CMAKE_VERSION} VERSION_LESS 3.12) cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})endif()
设置项目:
project(MyProject VERSION 1.0 ...
Docker
安装与配置
Docker 有利于更轻松的部署,更一致的运行环境,同时相比传统的虚拟机,开销更小
基本概念:镜像 image、容器 container、仓库 repository
从仓库获取镜像,从镜像启动容器
国内镜像源:
阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器 -> 复制加速器地址)
网易云加速器 https://hub-mirror.c.163.com
百度云加速器 https://mirror.baidubce.com
Docker 也有 hello world:
docker pull hello-worlddocker run hello-world
镜像
Docker Hub 上有大量镜像,获取的方法是:
docker pull 仓库名[:标签]
docker image ls 列出镜像,docker image rm 镜像名或 ID 删除镜像
Dockerfile 定制镜像
构建方法:
docker build -t 目标镜像名 上下文路径
常见指令:
FROM 指定镜像
RUN 执行指 ...
吹尽狂沙始到金
沉舟侧畔千帆过,病树前头万木春。 ——《酬乐天扬州初逢席上见赠》
如果说起最能体现刘禹锡的“诗豪”的诗句,我大概不会选最具代表性的“我言秋日胜春朝”,而是会选这一句。正如白居易所言“亦知合被才名折,二十三年折太多”,“二十三年”,一个从今天看来并没有多大的数字,背后的辛酸又有谁能知?而“怀旧空吟闻笛赋,到乡翻似烂柯人”颇有“笑问客从何处来”之感。整首诗沉郁,却不失豪放。正如这句诗,尽管似乎并不是想要表达“杀不死我的将使我更强大”的所谓的“乐观”,而是揭示了新旧事物更迭的自然规律,但是毫无疑问能从中感受到欣欣向荣的景象。所谓的“乐观”、“豪放”,并不应该是一天到晚叫嚣着“我不在乎”、“随他们去吧”,而是常常能于别人触景感伤处寻到乐趣,如从寂寥的秋天中看到鹤的排云直上,从沉舟侧畔看到千帆竞发,因此从这个角度上来说,刘禹锡比李白、苏轼更能称为“诗豪”
玄都观里桃千树,尽是刘郎去后栽。 ——《元和十年自郎州召至京师戏赠》
种桃道士归何处,前度刘郎今又来。 ——《再游玄都观》
我觉得这也是尽显刘禹锡豪情的地方,故地重游,加之因诗获罪,或了别人,或吃一堑长一智缄口不言,或感慨一句今昔对比, ...
UNIX 网络编程
基于 UNIX Network Programming, Volume 1: The Sockets Networking API, Third Edition 编写
套接字介绍
IPv4 套接字地址结构:
struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 地址 */}struct sockaddr_in { uint8_t sin_len; /* 结构的长度 */ sa_family_t sin_family; /* 都是 AF_INET */ in_port_t sin_port; /* 16 bit TCP 或 UDP 端口号 */ struct in_addr sin_addr; /* 32 bit IPv4 地址,网络字节顺序 */ char sin_zero[8]; /* 未使用,全是 0 */}
一般只需要设置中间三个成员即可
有更广泛的 socket 地址结构:
struct sockaddr { uint8_t sa_len; ...
Test
Benchmark
JMH
jmh(Java Microbenchmark Harness) 是 Java 微基准测试框架,可以用于比较 Java 程序的性能好坏
万物皆可 hello world:
package org.openjdk.jmh.samples;import org.openjdk.jmh.annotations.Benchmark;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.RunnerException;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;public class JMHSample_01_HelloWorld { @Benchmark public void wellHelloThere() { } public static void ...
C++ Concurrency In Action
基于 C++ Concurrency In Action Second Edition 编写
C++ 并发世界
并发 concurrency 是指两件或更多分开的活动在同时发生
单核 CPU 通过 context switch 来形成多个任务在同时执行的假象
多核 CPU 原理也类似
并发的方法:
多进程
多线程
并发和并行 parallelism 概念类似,但是
并行通常更考虑效率
并发则关心关注点分离
故使用并发的情况:
关注点分离
任务和数据的并行
C++ 中原来没有关于并发的标准,和 C 语言一样使用操作系统提供的 API。从 C++11 开始,封装了较一般的 thread 等
从并发版的 hello world 开始:
#include <iostream>#include <thread>void hello() { std::cout << "Hello, World" << std::endl;}int main() { std::thread t( ...
Butterfly 博客魔改
音乐
这里直接采用 html 的格式
<div class="aplayer" data-id="760533" data-server="netease" data-type="song"></div>
效果:
参数解释:
选项
description
data-id
song id / playlist id / album id / search keyword
data-server
音乐平台:netease、tencent、kugou、xiami、baidu
data-type
song、playlist、album、search、artist
关闭 asset_inject:
_config.ymlaplayer: meting: true asset_inject: false
开启主题的 aplayerInject:
_config.butterfly.yml# Inject the css and script (aplayer/m ...
Hexo 和 Butterfly 搭建博客
Hexo 是基于 Nodejs 开发的博客框架,简单,扩展性强。尽管性能不是很强,但对于轻量使用博客来说已经足够了
第一个 Hexo 博客
安装 Hexo:npm install -g hexo-cli
初始化项目名:hexo init 项目名
生成的项目结构如下:
文件夹名
说明
node_modules
依赖包
scaffolds
生成文章的模板
source
用来存放你的文章
themes
主题
.npmignore
发布时忽略的文件
_config.landscape.yml
主题的配置文件
_config.yml
博客的配置文件
package.json
项目名称、描述、版本、运行和开发等信息
启动项目:hexo s
在 http://localhost:4000/ 中可以看到页面
这里使用 GitHub Pages 部署博客,按照说明新建用户仓库
安装 hexo-deployer-git:npm install hexo-deployer-git
修改文件:
_config.yml# Deployment## Docs: ht ...