写点啥? 最近状态其实一直挺差的,有各种各样的破事,人很烦躁的说,希望早点能调整过来吧。这学期基本上不怎么更新博客了,一个是学的内容,语言向的多一些,直接写的话很像抄书,对自己的提升基本没有。我对自己的记性还是有点信心的,记忆方面一向不出什么大问题。其实也是自己暗地里开过很多想写的内容,不过都被懒癌战胜了,有点难过。决定还是找个小一点的东西写写,找找感觉。在群博看到了一篇博客,决定拿这个入口搞一下。 在这里:http://blog.csdn.net/sanjiye/article/details/78766542 说什么? 很多时候都有这样的情况:有若干个结构形状极其相似的函数,但是由于这些函数有那么些微小的差别,因而有的时候会考虑直接复制粘贴一份出来,修改那么一小点内容。类似这样的代码: int io_write_users() { FILE *fp = fopen(IO_FILE_USER, IO_MODE_WRITE); if (fp == NULL) { 继续阅读 >>


娄泽豪 17/12/11 20:37:31
Leetcode 1: Two Sum 问题描述 给定一个整数数组和一个目标数,返回两个下标,使数组中这两个下标所代表的数字之和等于目标数。 你可以认为每组输入有且仅有一个正解,除此之外,两个下标不应当相等。 例子: 给定一数组nums = [2, 7, 11, 15],目标数target = 9 因为nums[0] + nums[1] = 2 + 7 = 9 = target,所以最后返回[0, 1]。 解题思路 显然的,本题最直接明了的方式就是暴力循环两个数组,依次算出所有和,并判定它是否与目标数相等,可以写出: class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret { 0, 1 }; for (int i = 0; i < 继续阅读 >>


娄泽豪 17/12/04 22:47:03
吐槽一下 学校这学期开始使用“SPOC+翻转课堂”的模式来教数据结构这门课。就我这段时间的体验来说,这种模式非常非常非常不负责任。虽说学习本就是自己的事情,不能寄希望于别人来督促,但这种模式让不想学习的人失去了最后的负罪感: 自己不会?组内别人帮忙解答呗~ 没写作业?反正是一组交一份作业,别人肯定会写的嘛~ 期末挂科?平时分占比那么高,拿头挂科? 当然了,我并不关心这个模式的教学效果怎样,这交给教育学家去头疼,我对此只能抱怨一下它在某种程度上加重了我不必要的课业负担(一个人做一组的作业真的是……)。 但是就这门课而言,据我在SPOC答疑区看到的一系列令人匪夷所思的问题来看,很多人,根本不知道自己在学什么。 所以,什么是数据结构? 几乎所有讲述数据结构的书中都开章明义的说: 数据结构是指对数据(操作对象)的描述。 所以,一切就这么简单,就这么一句话而已啊。计算机存储数据只能靠01两个数字,一些高级语言又为我们提供了int、double之类的基本数据类型,我们就是要靠这些东西 继续阅读 >>


娄泽豪 17/10/30 20:42:31
介绍 Gson是目前被广泛使用的一个JSON库,它由Google公司发布,完全开放源代码,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。当然,虽然它由Java编写,但它可以被JVM平台下的一切语言使用,以下以Scala作为描述语言,简单的说明如何使用Gson。 安装Gson Gson是一个开放源代码的项目,它的源代码可以在项目的github仓库找到,如果你并不关心它的源代码是如何实现的,只是想简单的使用它而已,可以在Maven Central页面中,点击gson-2.8.2.jar,下载Gson的当前版本的jar,然后我们将该jar加入到项目依赖中即可。这里我们以Scala SBT为例,加入下面的语句即可: libraryDependencies += com.google.code.gson" % "gson" % "2.8.2"` 使用Gson 从类中生成字符串 这里我们使用一个简单的例子,假如我们想要将一个点的坐标序列化为字符串 继续阅读 >>


娄泽豪 17/09/26 22:31:20
所以到底吃什么? 每天到了饭点都会莫名的焦虑,到底吃什么啊,感觉每个都想吃,每个也都不想吃的样子,非常的纠结。打开手机自带的Roll点App又要开始纠结到底点数对应啥,实在是非常的烦人,所以不如写一个程序自动帮我做决定好了。 然而自身太弱了,写不出手机应用,写Web应用的话……不也还是不会写吗!!就这么点小小的需求要等那么多东西学完才能写实在是太不Cool了。于是决定用golang自带的HTTP服务器,加上从网上10分钟水平的HTML,写个自己Roll着玩的就行了,于是一个很朴素的网页就有了: var htmlFormat = ` <html> <head> <style> a:link{text-decoration:none ; color:black;} a:visited {text-decoration:none ; color:black;} a:hover {text-decoration 继续阅读 >>


娄泽豪 17/09/14 17:42:12
纪念一下自己寒假被支配了半个月的恐惧。 Description 整天待在方块里的骑士感到特别的无聊,于是他决定来一场说走就走的旅行。 然而他只能走日字,如右图所示,如果骑士当前在棋盘的正中央,他可以走标记有白点的八个区域。 骑士知道世界是一个列数和行数均不超过8(即8×8)的棋盘。 并且骑士有一点强迫症,如果用A-Z来表示列,1-99来表示横行,他只愿意走字典序最小的一条道路。 你能帮助勇敢的骑士制定一个适合他的旅行计划,使得他可以走遍整个棋盘吗?骑士可以在任一方块出发或者结束。 Input 第一行中有一个正整数n,代表数据有n组。 对于每组数据,都含有两个正整数p和q(1 <= p * q <= 26),代表棋盘有p行q列。 Output 每组数据首先应当输出”Scenario #i:”,i代表输出的是第i组数据的结果。 然后在一行之内输出一条可以走遍棋盘的路径,如果有多条路径可以走遍棋盘,那么输出按字典序排序第一的路径。最后,留一个空行。若现在是最后一条数据,则不 继续阅读 >>


娄泽豪 17/08/02 17:06:18
常见的IO模型 在Unix Network Programming一书中提到了若干个常见的IO模型,大概有: - 同步阻塞IO(Blocking IO):即传统的IO模型。 - 同步非阻塞IO(Nonblocking IO):此时非阻塞IO的Socket应当被设定为NONBLOCK。 - IO多路复用(IO Multiplexing):也称之为异步阻塞IO,是一种Reactor设计模式。常见的用法有:select、poll和epoll。 - 异步IO(Asynchronous IO):也称之为异步非阻塞IO,是一种Proactor设计模式。 同步/异步?阻塞/非阻塞? 同步是指用户线程在发起IO请求之后需要等待或者轮询内核IO操作完成之后,才可以继续执行。相对的,异步就是指用户线程在发起IO请求之后依然继续执行,当内核IO操作完成之后通知用户线程或者调用用户线程注册的回调函数。 而阻塞则是指IO操作需要彻底完成之后才可以交由用户线程控制,而非阻塞则会在IO操作调用之后立即返回 继续阅读 >>


娄泽豪 17/08/02 16:35:46
线程特定数据 线程特定数据,也称之为线程私有数据,是一种存储和查询某个特定线程相关数据的一种机制。使用线程特定数据的原因是:我们希望每个线程可以访问它单独的数据副本,而不需要担心与其他线程的同步访问问题。 而实际上由于每一个线程都可以平等地访问进程空间里的所有内容,我们并不能完全地屏蔽掉这种访问,但我们可以设计使得很难在编码无恶意的情况下访问到不应当访问的数据。 在使用线程特定数据之前,我们需要一个键,这个键将用于对线程特定数据的访问和修改。 键 创建键 int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); 返回值:若函数执行成功则返回0,反之则返回错误码。 key:创建的新键将保存在参数所指的内存区域中。 destructor:当线程退出时,若数据地址已经被设置为非空值,则会调用这个函数指针指向的函数完成收尾工作,给予他的参数是这个数据的地址。 取消键 int pthread_ 继续阅读 >>


娄泽豪 17/07/27 11:04:30
以下内容中读写锁、自旋锁、屏障并没有在《Linux C编程实战》一书中提及,其内容来源于《Advanced Programming in the Unix Environment》中。 互斥量 Mutex 初始化、销毁 函数原型及解释 //对于静态分配的互斥量,可以通过赋特殊值的方法完成初始化,如: pthread_mutex_t one = PTHREAD_MUTEX_INITIALIZER; //对于动态分配的互斥量,必须以函数的形式初始化 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const thread_mutexattr_t *restrict attr); //对于动态分配的互斥量,在释放他的空间之前必须调用销毁函数 int pthread_mutex_destroy(pthread_mutex_t *mutex); 返回值:若函数执行成功,则返回0;函数若执行出错,则返回表示错误类型的错 继续阅读 >>


娄泽豪 17/07/26 11:33:32
线程包含的信息:每个线程中都包含有表示自身执行环境的信息,其中至少包括:标识线程的线程ID、一组寄存器的值、栈、调度优先级和策略、信号屏蔽字、errno变量和线程的私有数据。 线程函数的错误处理与返回值:与一般的POSIX函数不同,线程函数在执行发生错误的时候,一般不会设置errno全局变量值,而是直接返回表示错误类别的错误码。因此下面的函数若不特殊说明,一般不会设置errno。 线程标识符 函数原型及解释 int pthread_equal(pthread_t t1, pthread_t t2); //判断两个线程ID是否相同 pthread_t pthread_self(void); //获得自身的线程ID 返回值:pthread_equal函数两个参数表示的线程ID若相同,则返回非0值,反之则返回0;而pthread_self函数将返回调用线程的线程ID。 t1、t2:要判断的两个线程ID。 创建线程 函数原型 继续阅读 >>


娄泽豪 17/07/25 19:16:20