日记24.12.14
一、webserver
这两天没这么写webserver,所以就今天晚上写了一点,主要是完善一下前面的内容。
首先是完成了时间戳的编写(名字的英文貌似搞错了),还是比较简单,但是还是写了一会,因为主要不是很清楚应用场景,具体实现的时候不知道哪些函数是必要的,因为作者的实现相对较全面,而仿写的时候不用全部实现,就要挑一些必要的功能实现。话不多说直接代码
Timestmp.h
namespace MW {
class Timestmp {
public:
using sec_t = int64_t;
static constexpr sec_t _microSecondsPerSecond = 1000 * 1000;
static Timestmp now();
public:
explicit Timestmp(sec_t microSecondsEpoch) {
_microSecondsSinceEpoch = microSecondsEpoch;
}
sec_t microSecondsSinceEpoch() const { return _microSecondsSinceEpoch; }
sec_t secondsSinceEpoch() const {
return _microSecondsSinceEpoch / _microSecondsPerSecond;
}
sec_t microSecondsModSecond() const {
return _microSecondsSinceEpoch & _microSecondsPerSecond;
}
bool valid() const { return _microSecondsSinceEpoch > 0; }
std::string toString() const;
std::string toFormattedString(bool mircroShow = false) const;
Timestmp addTime(double seconds) {
_microSecondsSinceEpoch +=
static_cast<sec_t>(seconds * _microSecondsPerSecond);
return *this;
}
private:
sec_t _microSecondsSinceEpoch;
};
inline bool operator<(const Timestmp &lhs, const Timestmp &rhs) {
return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch();
}
inline bool operator>(const Timestmp &lhs, const Timestmp &rhs) {
return lhs.microSecondsSinceEpoch() > rhs.microSecondsSinceEpoch();
}
inline bool operator==(const Timestmp &lhs, const Timestmp &rhs) {
return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch();
}
inline bool operator!=(const Timestmp &lhs, const Timestmp &rhs) {
return lhs.microSecondsSinceEpoch() != rhs.microSecondsSinceEpoch();
}
} // namespace MW
Timestmp.cc
#include "Timestmp.h"
#include <cstdio>
#include <inttypes.h>
#include <sys/time.h>
#include <time.h>
namespace MW {
Timestmp Timestmp::now() {
struct timeval tv;
gettimeofday(&tv, NULL);
return Timestmp(
static_cast<sec_t>(tv.tv_sec * _microSecondsPerSecond + tv.tv_usec));
}
std::string Timestmp::toString() const {
char buf[32] = {0};
sec_t seconds = _microSecondsSinceEpoch / _microSecondsPerSecond;
sec_t microSeconds = _microSecondsSinceEpoch % _microSecondsPerSecond;
snprintf(buf, sizeof(buf),
"%" PRId64 "d"
".%06" PRId64 "d",
seconds, microSeconds);
return buf;
}
std::string Timestmp::toFormattedString(bool microShow) const {
char buf[64] = {0};
time_t seconds =
static_cast<time_t>(_microSecondsSinceEpoch / _microSecondsPerSecond);
struct tm tm_time;
gmtime_r(&seconds, &tm_time);
if (microShow) {
int microSeconds =
static_cast<int>(_microSecondsSinceEpoch / _microSecondsPerSecond);
snprintf(buf, sizeof(buf), "%4d%02d%02d %02d:%02d%02d.%06d",
tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, microSeconds);
} else {
snprintf(buf, sizeof(buf), "%4d%02d%02d %02d:%02d:%02d",
tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec);
}
return buf;
}
// namespace net
} // namespace MW
然后就是把日志系统改了一下,因为之前没实现时间戳,日志系统用到时间戳的时候都是其它方法替代的。然后就是改了一下各个文件的命名空间,不是很难,纯苦力活。但是日志系统Bug没有修,因为大概率是日志流那里我偷懒了,找时间改一下就行。
后面去看了一下channel类、EpoolPooler、EventLoop、tcpconncetin,没有完全看完,但是整体实现逻辑看懂了,今天就只实现了部分框架内容,明天会继续去实现。实现的时候发现了神奇的事情,就是weak_ptr< void>居然可以指向所有类型,惊了(学艺不精呀)。
二、网页设计
今天早上看了一下html、css,学了一下侧面导航栏,其它没有学什么了,本来想学继续一下flask的,但是没什么时间了,下午考六级,晚上写server。
本来想找tp妹妹谈一下网页设计需求的,但是tp妹妹太忙了,就算了。
三、学校
惬意的周末,顺手裸考六级,不得不说东边的风景真美,骑车在绝望心情舒畅,绝望坡的路延伸到青山脚下,山顶的北面有座塔。
这张是考完六级在东九拍的
六级好难,听力不懂,填单词认不到单词,难受~~~ 作文乱写,翻译乱写
希望能过吧。
晚上很冷,但是还是坚持跑步了,给自律的自己点赞(今天英语作文就是self-discipline真巧)
睡了bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb