移动互联网确实在影响我的注意力
在内心里,我一直自诩为传统互联网时代的残党(其实我是个内心戏很多的人),在互联网上获取信息还是尽可能多地依赖主动的检索和订阅,还有QQ群和贴吧等社群内的讨论。个人觉得还是很好地保持了自己的喜好不完全受自动化推荐算法支配吧。
今天打开QQ,偶然间扫到登录状态的小绿点,突然意识到自己的注意力从另一个角度被改变了。手机$7\times24$小时不离手之后,加入了各种学生组织之后,总是时不时地抬起手机收消息。明明从前QQ的在线状态都会设成“隐身”的,现在却要默认我随时能够应答消息,社交软件焦虑越来越严重了。
想来自动化推荐算法和即时通讯软件恰恰分别针对了两种人性的弱点:人会更想看到自己喜欢的东西、人是群居生物,有社交需求。只能说事物的出现都有必然性在里面
对于生活的困难,天气之子是比铃芽之旅更好的药
前一段时间看完铃芽之旅,技术上各方面(作画,超流畅3D转描,音乐,剧情张弛有度的节奏)都是近期商业剧场版动画的典范。但是看过之后感觉差点意思。想起天气之子,才发觉缺的味道在哪。
铃芽之旅的故事中,虽然也有灾难,但是还是洋溢着一种青春的活力,一种人与人之间的温暖,一种灾难之下掩盖不住的乐观。すずめ有着爱着他的家人,遇到灾难和亲友努力就可以解决,可以没有负担地爱上一个突然闯进生活的人。这固然很美好,但问题是这太美好了,以至于不真实。而天气之子,男女主的生长环境无疑是不健康的,并且灾难也没有结束(甚至可以说是放弃了结束灾难),但是在这灾难之中,却有两人互相支持。对于这两人来说,有这两人相互支持就够了。这样的设计,无疑更有剧情张力,也更得我心,足以抵过后期故事逻辑的一些问题(在看故事的时候,我是那种更注意感情而非逻辑的人)。
在生活中,铃芽之旅那种童话一般的故事几乎不可能发生在我的身上,但是像天气之子一样和我的家人,三五朋友一起,在风波中相互支持,受伤了相互舔舐伤口,这个是我们触手可及也最该去做的。
(更不动了)某冠以原神之名的程序课程杂记
序言
不玩原神老师是一位很负责,编程功底(从非科班的角度来看)也很强的老师。但是有一个问题:他太强了,从写代码时候敲键盘的速度就可见一斑。课后问老师助教问题的人很多,不敢问的则更多。于是有了写这个东西的想法,不敢说给老师作注,就当是我学习过程的杂记吧。这门课比我码力高强得多的人也大有人在,还请老师助教(如果他们看到了的话)和各位大佬多多批评指正。
Bash脚本
不谈这个,老师的幻灯片提供了很好的讲解。在此基础之上,没有必要系统学习bash,用到时候搜索就好。
From C to C++ (before C++11?)
why c++
- 主流,网络资源较多,从c过渡相对容易
- 性能比纯手写没有优化的Python组件高
- 支持面向对象
drawbacks
- 短时间掌握面向对象还是比较困难,并且面向对象对于很多计算任务来说包袱太重了
- c++缺少好用的包管理,使用外部库比较繁琐
至于fortran,老东西爆金币吧
类与对象踩坑合集
不同于bash,c++面向对象部分边写边搜是十分耗费精力的,建议还是稍稍系统地学一下。下面仅提及一些比较重要的特性和比较隐蔽的问题。
如果要选课学c++,大部分人第一个会想到程设(程序设计实习)。这门课在屑课颇多的信科确实算是值得跨院系选的课,不过这门课迭代版本软设已经来了,会增加c++11以后的新特性训练(看了一眼他们的上机题,有比较多的分量是讲lambda表达式等特性的),不急的话等这门课成熟了也好。
构造函数、重载赋值与浅拷贝
当你的对象里分配了动态内存的时候,一个往往让初学者很头疼的问题是:我的赋值,复制相关的功能总是报错。是的,你遇到了臭名昭著的浅拷贝问题。
在没有定义复制构造函数,并且没有重载赋值运算符的时候,c++调用默认的会默认直接进行指针的赋值,而不会复制内存空间。因此,我们需要实现自己的赋值和复制构造函数。
不要以为不赋值就可以避开问题,c++在函数调用和返回时会自动调用复制构造函数,这是隐式的,很容易忽略,个人认为也是短短的几节课很难覆盖的问题。
class demo
{
char *p;
int size;
public:
demo(const demo &d)
{
p = new char[size];
for(/* range */) // 赋值……
}
demo &operator=(const demo &d)
{
if (!p) delete[] p;
p = new char[size];
for(/* range */) // 赋值……
return *this;
}
};
这里,函数的调用和返回类型可以理解为一种约定俗成的规范,重载赋值这样写是为了保证demo
对象的赋值和c++基本数据类型的赋值行为一致。
const限定符
举个例子
// 在上面的demo类里面补上成员函数len(),返回size的值。
int demo::len()
{
return demo.size;
}
bool cmp(const demo &d1, const demo &d2)
{
return d1.len() < d2.len()
}
这样会遇到问题!
test.cpp:32:13: error: 'this' argument to member function 'len' has type 'const demo', but function is not marked const
cout << d1.len() < d2.len();
^~
test.cpp:25:9: note: 'len' declared here
int len()
^
解决方法:
int demo::len() const
{
return demo.size;
}
简单地加一个const
就可以。
MPI编程记录
MPI传递结构体
如若写C/C++有一定封装的结构体(特别是结构体数组),在MPI中需要做一些处理。
- 不要使用任何变长容器(
vector
, stack
, std::string
),因为在定义MPI结构体时每个数据的大小需要确定;请使用C数组(type_t[]
)。 - 对于传递类,我的习惯是先定义一个结构体,仅包含类内的所有数据,内部不含任何变长容器,然后按照传结构体的方式传递。创建一个结构体数组,储存原来对象容器的所有内容,然后传递这个结构体数组。
示例代码:
// tbd
资料卡
私货:我为什么推荐Arch系发行版
其实初用起来,Arch和一般发行版没什么特殊区别。个人用Arch系(WSL是Arch,实机是Manjaro)的主要原因是AUR(Archlinux User Repository)。与内置的pacman
, apt
源不同,AUR源是用户上传的,把一些二进制/Github项目/多个软件的集合打包成一个包,便于管理(安装/卸载)。上课有讲过从源码编译安装openblas
,而在AUR上被简化成yay -S openblas-git
,会自动编译、安装、添加到路径。
// tbd
为什么开了个博客
缘起
这一学期写代码比较多,奈何轻薄笔记本和平板相比还是重且续航差,平板又很难配置多种多样的运行环境,于是租了个小服务器跑ssh端口转发。服务器一个月也要花些钱,一个很自然的想法是在上面搞点东西物尽其用。想起先前看到那位哥哥回忆高中生活的文章,最近的coding中又积攒了一些想要分享的想法,于是搞了这么一个小博客,权当自娱自乐,还请大家多多支持🥵。
为什么用Typecho?
主要是原生支持Markdown语法,而且比较轻量。(似乎可以添加$\LaTeX$支持的样子)
以后写什么?
🥵那位哥哥的令人感怀的经历我并没有太多,我在写叙事性的文字方面也堪称灾难,就写点技术,谈谈风月聊聊动画我也不知道聊什么了😂。
总之,堂堂开张!