wuhuaji | blog

wuhuaji | blog

尽量写一点有用的代码

深入挖掘 C 语言 static 关键字
C 语言的 static 关键字与其他面向对象语言中的 static 并不一样 。做个笔记,以防忘记。 搜索一下就知道了,C 语言中的 static 有两个作用,修饰变量 和 修饰函数 ,以下具体来分析。 修饰变量被 static 修饰的变量成为 静态变量 ,那么什么是静态变量 呢? 我们知道,函数内的变量,其生命周期随函数存在,也就是函数调用过后,变量也就销毁了。所谓静态变量,就是不随函数销毁而销毁的变量。 代码示例就很清晰: #include <stdio.h> void foo() { int normal_var = 0; static int sta...
【译】Ruby 在 Basecamp 运营中的开销
翻译自 DHH 的文章 《Only 15% of the Basecamp operations budget is spent on Ruby》。主要表达,相比于开发效率和程序员的开发体验,语言和Web框架性能几乎不值一提。很有意思,试着翻译一下。由于我本人水平有限,本文不免存在遗漏或错误之处。如有疑问,请查阅原文。原文链接 以下为译文:我们每年花费3百万刀来运营所有版本的 Basecamp 和 一些老应用。这3百万包括本地数据中心(on-premise data centers)和云服务。不包含我们超强的7人运维团队,只是网络(connectivity)、机器、电费 等等。 这包含很...
【译】现代PHP
这是一篇翻译文章,介绍了现代PHP开发的诸多,作者Brent,原文名《PHP in 2019》,原文链接:https://stitcher.io/blog/php-in-2019 相信国内很多开发者都还停留在”老式“PHP代码中(我也不例外),从这篇文章中了解了不少新东西,征得作者同意后,试着翻译成中文。由于第一次翻译文章,如果发现表达不清或者有误,请指出:) 以下是原文还记得那篇流行的文章:“PHP: a fractal of bad design” 么,第一次读到的时候这篇文章,那是我正在一堆PHP老项目上写着蹩脚的代码,我很困惑是否该转行从事别的行业。 幸运的是,之后不久我就换了新...
Web 服务器演化之路
本文试图简洁扼要地总结 Web 服务器发展之路,如有错误请指正。 单进程我们从最基本的单进程考虑。一个 Web 服务器的最基本功能:接受请求并处理响应。 那么自然可以得出处理逻辑:服务器建立 socket 监听,随后一直循环检测是否 有客户端请求,如果有客户端请求,那么则处理请求。 伪代码如下: //服务器端处理程序 socket.listen(8080) while(client = socket.accept()){ client.read(client); //从客户端读出请求信息 // do something client.write(response...
MySql bing log 简单笔记
上周工作上发生了一次”不可思议”的数据丢失问题,应该存在的数据却不见了,最后通过MySQL bin log 日志成功找了回来。之前只是听闻但没机会接触这块内容,趁着周末看了一些 bin log 日志的资料 , 包括如何将 bin log 如何用于 主从同步,记录一下。 什么是 bin logbin log 也就是二进制日志(binary),记录了数据库的所有变化。就是 insert、update、delete 这类可能会更改数据的语句,会记录其中。而Select语句则不会记录。 由此可以看出,bin log 可以用于: 审查看数据库曾发生了什么事情 像我这次”数据丢失”状态,我曾怀疑...
我配置的一些有用的 shell alias
善于给Shell配置alias,可以把日常中一些繁琐的命令简化,从而提高效率。这里记录一下我积累的一些alias。 更新:后面我把这篇博文分享到v2ex , 不少人指出 ssh 快捷登录应配置在~/.ssh/config 中。确实如此,配在~/.ssh/config 中不仅更方便集中管理,而且有更多可自定义的配置项,还有一点好处可以简化scp这样通过ssh协议传输的命令 :) 原文: 善于给Shell配置alias,可以把日常中一些繁琐的命令简化,从而提高效率。这里记录一下我积累的一些alias。 首先查看一下我的alias个数 12cat ~/.zshrc | grep a...
http服务器是如何判断一个请求报文发送结束
继挖坑 tinyshell 之后,又挖新坑tinyserver, 主要是想深入研究一下网络编程的一些细节,多进程/多线程/select/poll/epoll 这些。这里记录一下我的思考,可能有误,请谨慎参考: 问题:服务器如何判断请求报文发送结束?要想清楚这个问题,就要从http报文结构入手,一个http请求报文是长这样: 123456请求行\r\n若干头部字段\r\n若干头部字段\r\n若干头部字段\r\n\r\n请求体(下图中的请求数据) 找张网上流传图片,看得更清晰 所以这里可以分为两种情况: 没有请求体 有请求体 对于没有请求体的请求,在报文最后就是:最后一个头字段后面的...
孤儿进程和僵尸进程
其实这两个概念并不难理解,只要明白了以下两个关键点就可以了: 除了init进程(进程号为1,从名字就能知道负责系统启动后的相关的初始化工作)外,其他所有的进程都有父进程。也就是进程是一个树形结构,树的顶端是init进程 一个进程都会占用系统资源(内存、文件描述符等),当进程结束后就需要由其父进程来释放它占用的资源 那么父进程如何释放子进程资源呢?父进程需要通过wait/waitpid等系统调用函数来等待进程结束,并且可以通过这些函数来获取子进程的退出状态(正常退出,信号杀死等等) 孤儿进程明白了父子进程的关系,那么有一个问题:如果父进程先于子进程终止,子进程的资源岂不是没人来释放了?...
tinyshell:学习写一个简单的Shell
最近三周实现了一个简单的shell: tinyshell 最近三周的空闲时间,我都在学习写一个shell,虽然只完成了一些基础的功能,很多特性尚未实现,代码写的也很挫,而且可以确定的是还藏有不少bug。但我觉得这个项目第一个阶段已告一段落,值得写一篇博客纪念一下。 代码地址:https://github.com/WuHuaJi0/tinyshell。正如其名:tinyshell,到目前为止也只有五百多行的代码。除了实现最基础的:读取用户输出的一串命令并执行的功能外,还实现了:管道,重定向,history,cd 这些特性。还有一些想实现的特性写在readme中,就不复制过来了。 为什么想...
C拾遗:字符串常量在内存中如何存储?
碰到这样一个问题,代码简化之后如下: 123456789#include <stdio.h>char *get_string(){ char *string = "hello world"; return string;}int main(int argc, char *argv[]){ char *result = get_string(); printf("%s\n",result); //会输出:hello world} 代码很简单,在 main 中调用 get_string 函数,这个函数返回一个指向”...
avatar
吴化吉