











分享个人经验,保留阅读记录,做时间的朋友












亲爱的妞妞:
暑假已过,爸爸想写一封信给你。
给你写这封信的原因,缘起姑姑说你的神通都是被我和你妈给磨灭掉了。
神通,神奇的能力,指特别高超的手段和本领。
即使一个人天生有神通,也要经过刻苦的修行,才能运用自如。
要神通何用?定是使自己成为一个出众的人。
像你这样读书的年纪,学习好是出众的重要指标。
当然,相貌气质、能歌善舞以及其他特长,都可以算作出众的重要指征。
你也许会问,为何要出众?为啥要这么拼?这么卷?这么苦?我小小少女,难道就不能拥有自由,过自己想要过的生活吗?
当然可以的。
但丫头,记住:这世界上所有的选择,都是有代价的。
这个代价不一定今天支付,但在明天、在未来,你一定会为你现在的选择,支付这个代价。
人生除非死亡,没有哪一件事情可定终生。
学习好的孩子,即使考上清华北大,也不一定有一个美好的人生,但至少会是一个不太差的人生。
然而,今天不努力,明天起点低,在社会的筛选和分层中,就没啥竞争力,就难以过上自己想要的生活。
选择躺平的话,别说生活了,甚至会出现生存危机。
如你躺平,必然贫穷。
丫头,永远记住黑格尔这句深刻的话:“财产即人格”。
这是什么意思?
人和动物的区别在于自由。
Free 这个词,第一层意思就是free from want(免于匮乏的自由) ,匮乏、贫穷,是带着流血的身体和灵魂在生活,有时,还会招致猎物。
所以要努力,提升自己在社会上的竞争力,万不可陷入这个泥潭。
你也许又会问:将来再努力不行吗?
可以。
白云苍狗、野马尘埃,人生短暂。女孩子的青春更如白驹过隙。
何必走那一段不得不走的弯路呢?
丫头,我们今天的努力,都是为了将来的独立、尊严,有能力更自由、更从容地观赏人生美丽的风景。
你也可以说,我不需要!我不想爬山,不想看壮丽的日出。我只要简单的生活就可以了,就满足了。幸福是我的感受,我感觉幸福就是幸福的。
爸爸这样回答你吧。
你们学过的《论语》中的颜回,“一箪食,一瓢饮,在陋巷,人不堪其忧,回也不改其乐”。
他是历史上第一个因为学习态度被记住的,历史只会记住第一个,后者还有谁?
再者,在现代,如果爸爸这样,你愿意吗?
躺平生活古人早有讨论:“日出而作、日落而息,帝力于我何有哉?”
这是隐士的生活,在今天社会分工细化,高度竞争的现代社会,当一个隐士几乎没有可能。
接下来,爸爸想从自己的人生经验出发,和你讨论以下问题,只是我的观点,不一定正确,你姑且听听。
我们究竟要什么样的人生?什么样的生活?活出怎样的自己?怎样才能活出自己想要的自己?
“一千个读者心中有一千个哈姆雷特”,不同的人会有不同的答案,但有趣的生活,精彩的人生,内心幸福的人们,他们有没有共同点呢?我尽量抽象出来吧。
人生最可怕的不是失败、不是悲伤、甚至不是痛苦,因为这些都是短暂的,很少会是生命的常态。
生活中,这些不好的事情一定会发生,只要不造成难以恢复的伤害,也是有正向作用的。
有了坏,才能凸显好,才能赋予生命的意义感。

既没有特别好的事情发生,也没有特别坏的事情发生,这是一种平静的中间状态,这是生活的常态。
如同你日复一日,上学放学,这是常态。
如果你在常态中敢于平庸,那么,中考、高考的成绩注定也是平庸的。
不好不坏的中间生活状态,容易让人滑入一种无知觉的,无意识的放任自流,最后陷入平庸,自己都觉得自己“泯然众人矣”,这就是最可怕的就是平庸。
无聊,年复一年,没有心气、没有与众不同的斗志,最后,心灵之泉干涸,灵魂之花枯萎。
生活无生气、心灵无灵气,极端的情况就是“行尸走肉”。
回到前面的问题:“有趣的生活,精彩的人生,内心丰富的人们,他们有没有共同点呢?”
上帝给了每个人独一无二的头脑和特质。
别人再优秀,再完美,也没有人愿意湮灭自己成为别人。
世界上没有人愿意成为一个没有特征的平均人,都想过上理想的生活,活出所愿的人生,拥有有趣的灵魂。
怎样才能打败平庸,活出最好的自己呢?有标准?有方法?有实现的路径吗?
这个问题很大!我只能从我的认知角度来回答,不一定正确。

我们这片土地上的人大多是活在比较之中的。
“人人平等”,没错,在法律意义和价值意义上,爸爸坚信人人平等。
但这个现实的世界呢?所有人都能考出一样的分数吗?每个人都能同样聪明吗?每个人同样有钱吗?所有的具有同样的社会地位吗?
你上次说过,爸爸很势利,瞧不起学习差的同学。
现在我回答你这个疑问:只要相同事物出现,人们一定会不由自主地去比较。
有比较,就有选择,有选择就一定有歧视,歧视无处不在,无刻不在。
因为,歧视和选择是一回事儿。
差生,因为考试成绩差,而被称为差生,这也是他们的选择。
考试的意义你知道吗?在爸爸看来,考试是对学生的自律能力、勤奋程度、专注度、理解力、记忆力、逻辑推理能力等一系列能力的全面考察,成绩只是上述能力的考察结果。
不是爸爸歧视学习差的学生,是差生通过自己的表现,造成了自己被歧视。
我们生活在一个现实的世界。
在这个世界中,我们常常拿成功、优秀这些词来评价一个人。
在这个世界现实中,虽然我们都是平等的人,但人和人的生活质量却判若云泥。
他人轻我,那么我身上必有他人可轻之处。
贫穷,这个问题比较复杂。
不是说穷人不好。一般情况下,当一个人在物质上捉襟见肘的时候,有心情去追求美吗?去追求一种自己理想的生活吗?即使想,也缺乏物质条件。
由于贫穷,就不得不向现实生活妥协。
好了,问题来了,妥协的底线在哪里?
在小学三年级的时候,我和你讨论过一个问题:人类社会是不是“物竞天择、适者生存”?
当时我们有很明确的结论,这是野蛮的丛林法则,不适用于人类社会。不适用,和现实没有这种现象是两回事。
你又会说:爸爸,世界上有人能做到没有任何差别地对待每一个人,没有任何歧视地绝对平等吗?
有的,那是佛陀。
所以,保持在竞争中胜出的斗志,取得好的结果,是打败平庸的重要标准。

首先,说一下最高级的打败平庸的方式。
你看过的电影《寻梦环游记》吧,人只有被遗忘了,才是真正的死亡。
我们读的《红楼梦》,曹雪芹在某种意义上实现了永生。
地球上一共累积出现了1060亿的人口,只有那些今天依然被我们记起的人,他们灿若流星,却又寥若晨星,这些人真正的“天选之子”,以在人世间长期保持影响力的方式实现了永生,以最高级的方式实现了“打败平庸”。
我们作为普通人,要成为他们,除了天资、努力,更需要时代的挑选,这里面有太多的机缘巧合了,单纯的靠个人意愿很难实现。
但我们可以通过阅读他们的作品或生平传记,了解他们的事迹,学习他们最具智慧的方法,感受他们抒发的最感人情绪,了解他们最惊世骇俗的事情。
学习他们的事迹,有利于加持我们远离平庸,摆脱低俗的渴望。
我们普通人如何打败平庸?
你可以是一个平凡的人, 但不能成为一个平庸的人。
形式和内容,这是一对我们常用的词。
人多相貌身形,是人的皮囊。
一个女孩子长得漂亮,是形式但没啥文化知识,甚至愚蠢,被人叫做花瓶。
一个人见多识广、思维缜密、聪明有趣,这是精神层面,是一个人的内容。
上面的只是简单的例子,生活要比这复杂得多。
如果我们把生活的物质条件看成外在形式,比如,相貌、财富、社会地位这些是外在的,有形或者有一定标准的东西是一个人的形式。
那么,性格、思辨、见识、幽默,这些无形的精神层面的东西,就是一个人的内容。
内容决定形式。
相貌不可选择,但气质缺可提升,财富要靠大时代和机遇,修养可以通过学习提升。
有一个不停生长、追求真善美、不被现实绑架、装得下整个宇宙的灵魂,你就已经实现了打败平庸。

一、对这个世界保持好奇心。
善于提出问题,甚至于提出问题之后的问题。
善于提问、探究本源,你既会发现这个世界的美好,也得知它的丑陋和不堪。
这样,会使你有一个与众不同的视野,用更加全面、包容的眼光看到时间的人和事。
二、自律。
人生是一场修行,先管理好自己,才能去影响他人。
懂得“舍与得”的道理,要有长远的目光。
放弃磨蹭,去读书、去锻炼,一段时间以后,你会发现,你惊人的变化。
三、做一个有原则的人。
遵从自己的内心感受,小事情靠理智,大事情靠自己心领。
上次你给爸爸说,你是一个现实主义者。
我要告诉你,现实主义不是啥好词,他的孪生兄弟就是功利主义。
四、追求一些“无用”的东西。
这些无用的东西,往往是涵养我们的灵魂,增加我们灵气的东西。比如音乐、绘画、诗歌哲学。
世界上,只有思想、艺术和爱才是人类真正的奢侈品。
最后,爸爸希望有仰望星空的渴望,永远热爱生活,有一个现实生活之上,诗意栖息的灵魂世界。
永远爱你的爸爸
2022年9月
作者 | 上上签。一个幽默,坦诚、宽容、不做作的朋友。
转自:https://mp.weixin.qq.com/s/LCFdoA74hRD9tbVgVIWhYg
中考加分项目

中考体艺生政策



2021年上海市招收文艺特长生的高中阶段学校名单


上下滑动查看

补充一点,政策虽然是分数打7折,但录取多少人降低多少分仍然是各学校自己决定,所以很多时候可能也就只给降分。


上下滑动查看 高考加分项目 转自:https://mp.weixin.qq.com/s/n5w8hfZprcO6RAV1al_NVw






本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第二篇。
C++最佳实践:
1. 工具
2. 代码风格(本文)
3. 安全性
4. 可维护性
5. 可移植性及多线程
6. 性能
7. 正确性和脚本
代码风格最重要的是一致性,其次是遵循C++程序员习惯的阅读风格。
C++允许任意长度的标识符名称,因此在命名时没必要非要保持简洁,建议使用描述性名称,并在风格上保持一致。
CamelCase(驼峰命名法)snake_case(蛇形命名法)这两种是很常见的命名规范,snake_case的优点是,在需要的时候可以适配拼写检查器。
无论建立什么样的代码风格指南,一定要实现指定期望风格的.clang-format文件。虽然这对命名没有帮助,但对于开源项目来说,保持一致的风格尤为重要。
许多IDE、编辑器都支持内置的clang-format,或者可以很方便的通过加载项安装。
MyClass。myMethod。const double PI=3.14159265358979323。C++标准库(以及其他著名C++库,如Boost[8])使用以下指导原则:
INT_MAX。InputIterator。unordered_map。使用m_前缀命名私有数据,以区别于公共数据,m_代表“member(成员)”数据。
最重要的是保持代码库的一致性,这是一种有助于保持一致性的方式。
使用t_前缀命名函数参数,t_可以被认为是“the”,但其可以表示任意含义,关键是要将函数参数与作用域内的其他变量区分开来,同时遵循一致的命名策略。
可以为团队选择任何前缀或后缀,下面是一个例子,提出了一个有争议的建议,相关讨论见issue #11[9]。
struct Size
{
int width;
int height;
Size(int t_width, int t_height) : width(t_width), height(t_height) {}
};
// This version might make sense for thread safety or something,
// but more to the point, sometimes we need to hide data, sometimes we don't.
class PrivateSize
{
public:
int width() const { return m_width; }
int height() const { return m_height; }
PrivateSize(int t_width, int t_height) : m_width(t_width), m_height(t_height) {}
private:
int m_width;
int m_height;
};
_ 开头的名字有可能与编译器或标准库的保留名发生冲突: What are the rules about using an underscore in a C++ identifier?[10]
class MyClass
{
public:
MyClass(int t_data)
: m_data(t_data)
{
}
int getData() const
{
return m_data;
}
private:
int m_data;
};
确保构建生成的文件存放在与源文件夹分离的输出文件夹中。
nullptrC++11引入了nullptr表示空指针,应该用来代替0或NULL来指示空指针。
注释块应该使用//,而不是/* */,使用//可以更容易的在调试时注释掉代码块。
// this function does something
int myFunc()
{
}
要在调试期间注释掉这个函数块,可以这样做:
/*
// this function does something
int myFunc()
{
}
*/
如果函数头注释使用/* */,这么做就会有冲突。
using namespace这会导致正在using的命名空间被强行拉入到包含头文件的所有文件的命名空间中,从而造成命名空间污染,并可能在导致名称冲突。在实现文件中using命名空间就足够了。
头文件必须包含名称清晰的include保护符,从而避免同一头文件被多次include的问题,并防止与其他项目的头文件发生冲突。
#ifndef MYPROJECT_MYCLASS_HPP
#define MYPROJECT_MYCLASS_HPP
namespace MyProject {
class MyClass {
};
}
#endif
此外还可以考虑使用#pragma once指令,这是许多编译器的准标准,内容简短,意图明确。
{}省略{}可能会导致代码语义错误。
// Bad Idea
// This compiles and does what you want, but can lead to confusing
// errors if modification are made in the future and close attention
// is not paid.
for (int i = 0; i < 15; ++i)
std::cout << i << std::endl;
// Bad Idea
// The cout is not part of the loop in this case even though it appears to be.
int sum = 0;
for (int i = 0; i < 15; ++i)
++sum;
std::cout << i << std::endl;
// Good Idea
// It's clear which statements are part of the loop (or if block, or whatever).
int sum = 0;
for (int i = 0; i < 15; ++i) {
++sum;
std::cout << i << std::endl;
}
// Bad Idea
// hard to follow
if (x && y && myFunctionThatReturnsBool() && caseNumber3 && (15 > 12 || 2 < 3)) {
}
// Good Idea
// Logical grouping, easier to read
if (x && y && myFunctionThatReturnsBool()
&& caseNumber3
&& (15 > 12 || 2 < 3)) {
}
许多项目和编码标准都对此制定了软规则,即每行字符应该少于80或100个,这样的代码通常更容易阅读,此外还可以把两个文件并排显示在一个屏幕上,不用小字体也能看到全部代码。
""表示include本地文件…<>表示include系统文件[11]。
// Bad Idea. Requires extra -I directives to the compiler
// and goes against standards.
#include <string>
#include <includes/MyHeader.hpp>
// Worse Idea
// Requires potentially even more specific -I directives and
// makes code more difficult to package and distribute.
#include <string>
#include <MyHeader.hpp>
// Good Idea
// Requires no extra params and notifies the user that the file
// is a local file.
#include <string>
#include "MyHeader.hpp"
…使用成员初始化列表。
对于POD类型,初始化列表的性能与手动初始化相同,但对于其他类型,有明显的性能提升,见下文。
// Bad Idea
class MyClass
{
public:
MyClass(int t_value)
{
m_value = t_value;
}
private:
int m_value;
};
// Bad Idea
// This leads to an additional constructor call for m_myOtherClass
// before the assignment.
class MyClass
{
public:
MyClass(MyOtherClass t_myOtherClass)
{
m_myOtherClass = t_myOtherClass;
}
private:
MyOtherClass m_myOtherClass;
};
// Good Idea
// There is no performance gain here but the code is cleaner.
class MyClass
{
public:
MyClass(int t_value)
: m_value(t_value)
{
}
private:
int m_value;
};
// Good Idea
// The default constructor for m_myOtherClass is never called here, so
// there is a performance gain if MyOtherClass is not is_trivially_default_constructible.
class MyClass
{
public:
MyClass(MyOtherClass t_myOtherClass)
: m_myOtherClass(t_myOtherClass)
{
}
private:
MyOtherClass m_myOtherClass;
};
在C++11中,可以为每个成员初始化默认值(使用=或使用{})。
=设置默认值// ... //
private:
int m_value = 0; // allowed
unsigned m_value_2 = -1; // narrowing from signed to unsigned allowed
// ... //
这样可以确保不会出现构造函数“忘记”初始化成员对象的情况。
用大括号初始化不允许在编译时截断数据长度。
// Best Idea
// ... //
private:
int m_value{ 0 }; // allowed
unsigned m_value_2 { -1 }; // narrowing from signed to unsigned not allowed, leads to a compile time error
// ... //
除非有明确的理由,否则优先使用{}初始化,而不是=。
忘记初始化成员会导致未定义行为错误,而这些错误通常很难发现。
如果成员变量在初始化后不会更改,则将其标记为const。
class MyClass
{
public:
MyClass(int t_value)
: m_value{t_value}
{
}
private:
const int m_value{0};
};
由于不能给const成员变量赋值,拷贝赋值操作可能对这样的类没有意义。
几乎没有理由需要全局命名空间中声明标识符。相反,函数和类应该存在于适当命名的命名空间中,或者存在于命名空间里的类中。放在全局命名空间中的标识符有可能与来自其他库(主要是没有命名空间的C库)的标识符发生冲突。
标准库通常使用std::size_t来处理与尺寸相关的内容,size_t的大小由实现定义。
一般来说,使用auto可以避免大部分问题。
请确保使用正确的整数类型,并与C++标准库保持一致,否则有可能在当前使用的平台上不会发出警告,但如果切换到其他平台,可能会发出警告。
注意,在对无符号数执行某些操作时,可能会导致整数下溢。例如:
std::vector<int> v1{2,3,4,5,6,7,8,9};
std::vector<int> v2{9,8,7,6,5,4,3,2,1};
const auto s1 = v1.size();
const auto s2 = v2.size();
const auto diff = s1 - s2; // diff underflows to a very large number
.hpp和.cpp作为文件扩展名归根结底,这是个人喜好问题,但是.hpp和.cpp已被各种编辑器和工具广泛认可。因此,这是一个务实的选择。具体来说,Visual Studio只自动识别.cpp和.cxx为C++文件,而Vim不一定会把.cc识别为C++文件。
某个特别大的项目(OpenStudio[12])使用.hpp和.cpp表示用户生成的文件,而使用.hxx和.cxx表示工具生成的文件。两者都能被很好的识别,并且区分开来有很大的帮助。
某些编辑器喜欢在默认情况下使用tab和空格的混合缩进,这使得没有使用完全相同的tab缩进设置的人很难阅读代码。请配置好编辑器,确保不会发生这种情况。
assert(registerSomeThing()); // make sure that registerSomeThing() returns true
上述代码在debug模式下构建时可以成功运行,但在进行release构建时会被编译器删除,从而造成debug和release构建的行为不一致,原因在于assert()是一个宏,它在release模式下展开为空。
模板可以帮助我们坚持DRY原则[13]。由于宏有不遵守命名空间等问题,因此能用模板的地方就不要用宏。
运算符重载是为了支持表达性语法。比如让两个大数相加看起来像a + b,而不是a.add(b)。另一个常见的例子是std::string,通常使用string1 + string2连接两个字符串。
但是,使用过多或错误的操作符重载很容易写出可读性不强的表达式。在重载操作符时,要遵循stackoverflow文章[14]中描述的三条基本规则。
具体来说,记住以下几点:
operator=(),参见下面Rule of Zero章节。operator>>()和operator<<()。例如,可以重载operator<<(std::ostream &, MyClass const &),从而允许将类“写入”到一个流中,例如std::cout或std::fstream或std::stringstream,后者通常用于创建值的字符串表示。更多关于自定义操作符实现细节的技巧可以参考: C++ Operator Overloading Guidelines[18]。
可以在编译时应用单参数构造函数在类型之间自动转换,比如像std::string(const char *),这样的转换很方便,但通常应该避免,因为可能会增加额外的运行时开销。
相反,可以将单参数构造函数标记为explicit,从而要求显式调用。
与单参数构造函数类似,编译器可以调用转换操作符,同样也会引入额外开销,也应该被标记为explicit。
//bad idea
struct S {
operator int() {
return 2;
}
};
//good idea
struct S {
explicit operator int() {
return 2;
}
};
Rule of Zero规定,除非所构造的类具有某种新的所有权形式,否则不提供编译器可以提供的任何函数(拷贝构造函数、拷贝赋值操作符、移动构造函数、移动赋值操作符、析构函数)。
目标是让编译器提供在添加更多成员变量时自动维护的最佳版本。
这篇文章介绍了这一原则的背景,并解释了几乎可以覆盖所有情况的实现技术: C++’s Rule of Zero[19]。
微信公众号:DeepNoMind
C++ Best Practises: https://lefticus.gitbooks.io/cpp-best-practices/content/
[2]
Microsoft C/C++ extension for VS Code: https://github.com/Microsoft/vscode-cpptools
[3]
ClangFormat: https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.ClangFormat#review-details
[4]
Using Clang-Format: https://www.jetbrains.com/help/resharper/2017.2/Using_Clang_Format.html
[5]
Format your C family code: https://github.com/rhysd/vim-clang-format
[6]
vim-autoformat: https://github.com/chiel92/vim-autoformat
[7]
ClangFormat-Xcode: https://github.com/travisjeffery/ClangFormat-Xcode
[8]
Boost: http://www.boost.org/
[9]
issue #11: https://github.com/lefticus/cppbestpractices/issues/11
[10]
What are the rules about using an underscore in a C++ identifier?: https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
[11]
include系统文件: http://blog2.emptycrate.com/content/when-use-include-verses-include
[12]
OpenStudio: https://github.com/NREL/OpenStudio
[13]
DRY原则: http://en.wikipedia.org/wiki/Don%27t_repeat_yourself
[14]
stackoverflow文章: http://stackoverflow.com/questions/4421706/operator-overloading/4421708#4421708
[15]
操作符优先级: http://en.cppreference.com/w/cpp/language/operator_precedence
[16]
重载operator,(): http://stackoverflow.com/questions/5602112/when-to-overload-the-comma-operator?answertab=votes#tab-top
[17]
What are the basic rules and idioms for operator overloading?: https://stackoverflow.com/questions/4421706/what-are-the-basic-rules-and-idioms-for-operator-overloading?answertab=votes#tab-top
[18]
C++ Operator Overloading Guidelines: http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html
[19]
C++’s Rule of Zero: http://www.nirfriedman.com/2015/06/27/cpp-rule-of-zero
转自:https://mp.weixin.qq.com/s/aFY3cBIsucd5J0034pzRAg