机缘
- 让自己记住一些知识,尤其是大部分网上的教程其实在真正实操的过程中会因为系统配置、其他软件等各种原因导致无法100%按照教程完全实现,中间有一部分问题是需要自己解决的;这个时候,将这部分的内容记录下来就方便下次自己再需要参考类似内容时可以直接翻阅自己的笔记了;
- 突然有一个好点子或者灵感,激发了我写作的欲望;
- 工作中有些内容是需要让新入职的同事看的,可以直接写下来这样方便其他同事阅读;
收获
- 获得了许多从事该领域的粉丝,看来Rhino/Grasshopper的二次开发还是有许多人关注,也有很多大学在校生愿意尝试
- 在与大家的私信/回复交流过程中,自己也学到了许多新的知识,更多地了解了每个人的需求
- 通过交流加入了许多的交流群,在里面认识了行业大佬们
- 最重要的收货还是提高了自己。尤其是在写文章的时候,自己会更加仔细地思考每个步骤背后的具体逻辑,有时候这种思考会推翻最开始的想法,从而将需求以一种更好的方式实现;而另一些时候我为了写透一个知识点,需要去查阅相关资料,扩展自己的知识面,增加知识积累。
写文章给别人看,与仅仅自己实操一遍自己私下里“看懂记住”还是有很大区别的,站在一个小白读者的角度去思考自己写的文章,会有另一番天地。
日常
- 创作是已经是我生活的一部分,闲下来的时候,就会想着“要不把前几天看到的XXX总结出一个文章吧”;
- 工作忙的时候自然是没有办法抽出时间来写作的,这个时候我就会将灵感点记录在我平时用的一个日程软件里;在闲暇的时候就会看这个本子,整理思绪来写作;
- 不忙的时候,除了写作,我也会玩游戏;写作与游戏是两种类型的放松,游戏可以调动大脑的激情,而写作则让大脑获得宁静。
成就
- 最大的成就来自于自己的文章阅读量在不断地增长,很多时候还会被反复看,这说明写的还是可以的;
- 写的最好的一段代码感觉就是C++模版元编程的一段,让某个函数只能被具备“Foo”成员函数才可以被使用:
// 具备成员函数Foo
class HasFoo
{
public:
int Foo();
};
// 不具备成员函数Foo,仅有静态函数Foo
class StaticFoo
{
public:
static int Foo();
};
// 啥也没有
class NoFoo { };
template <typename, typename = void >
struct has_foo_function_member_or_static : false_type {};
template <typename T>
struct has_foo_function_member_or_static<T, void_t<decltype(&T::Foo)>> : true_type {};
template <typename T>
using has_foo_function_member =
std::conditional_t<
has_foo_function_member_or_static<T>::value,
std::is_member_function_pointer<decltype(&T::Foo)>,
false_type>;
int main()
{
static_assert(has_foo_function_member<HasFoo>::value, "");
//static_assert(has_foo_function_member<StaticFoo>::value, ""); // compile time err
//static_assert(has_foo_function_member<NoFoo>::value, ""); // compile time err
static_assert(has_foo_function_member_or_static<HasFoo>::value, "");
static_assert(has_foo_function_member_or_static<StaticFoo>::value, "");
//static_assert(has_foo_function_member_or_static<NoFoo>::value, ""); // compile time err
}
憧憬
未来将会继续完善【Grasshopper二次开发】这个系列,写一些更加深入的内容;工作上则希望能够将最新的AI技术引入到目前的专业领域里,带来一些新的灵感与激情。