最新

阿里云 - 开发者云招聘 Java 研发/专家(3个坑、北京杭州均可)

周梦康 发表于 2019-11-26 417 次浏览
工作经验大中型项目三年到五年
学历统招本科
主要技能PHP / Java
工作地点北京 / 杭州
级别P6~P7
想做业务负责阿里云开发者云的业务支撑
想做架构整个阿里云用户生态底层架构与服务支撑(挑战巨大)

有兴趣的简历直接发我邮箱 mengkang.zmk@alibaba-inc.com

薪资大家得自己谈,P6~P7的薪资范围很大,阿里云基本上16~19薪
不管合适与否我一定及时给大家回复

PHP 中通过 getopt 解析 GNU C 风格命令行选项

周梦康 发表于 2019-11-16 99 次浏览

在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。

比如使用命令wget下载文件时,使用下面的一些方式来指定option都可以

wget http://mengkang.net/a.jpg -O b.jpg
wget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -b
wget http://mengkang.net/a.jpg -Ob.jpg --tries=3 -bvd

我们整理下command line options的规则,首先参数分为短选项名和完整选项名,而且一些还有映射关系。

总结 options 使用规范

  • 短选项名,有一个限制,只能是一个char字符,只能1字节,不能超过1字节,比如上面的第四个命令的最后一个参数就不知道是一个选项还是三个选项了。
  • 短选项名用单个连字符(-)开始
  • 短选项可以一个-后面跟多个选项名
  • 长选项名,则是多字节的的,两个连字符(--)开始
  • 选项与实参之间,可以直接连接,也可以用空格隔开,还可以用等号连接
  • 但是短选项用等号连接值,等号会被视为值的一部分(但是在 php 里面却又兼容了这一点)
  • 选项分为没有值,必须传值,可选传值(也就是可传可不传)

如何定制一款属于程序员的卫衣

周梦康 发表于 2019-10-19 330 次浏览

我翻开自己的 git commit 一查,这代码没有年代,歪歪斜斜的每行都写着 "业务驱动" 四个字。我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满屏都写着两个词是 "CURD Boy"!

WechatIMG143.png

彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值

周梦康 发表于 2019-10-10 482 次浏览 标签 : C 汇编

最近准备一个教程,案例的过程中准备了如下代码碎片,演示解析http scheme

char *parse_scheme(const char *url)
{
    char *p = strstr(url,"://");
    return strndup(url,p-url);
}

上面是通过strndup的方式,实际就是malloc,所以最后也需要free
我们知道栈上的数组也能用来存储字符串,那我们可以改写成下面这样吗?

char *parse_scheme(const char *url)
{
    char *p = strstr(url,"://");
    long l = p - url + 1;
    char scheme[l];
    strncpy(scheme, url, l-1);
    return scheme;
}

大多数人都知道不能这样写,因为返回的是栈上的地址,当从该函数返回之后,那段栈空间的操作权也释放了,当再次使用该地址的时候,值就是不确定的了。

那我们今天就一起探讨下出现这样情况的背后的真正原理。

http client 实现 keep-alive 源码探究

周梦康 发表于 2019-10-04 261 次浏览

前几天在分享"实现自己的wget"的时候,因为我们的请求是一次性的,http 头里设置的Connection: Close。在HTTP/1.1为了提升HTTP 1.0的网络性能,增加了keepalive的特性。那么浏览器在请求的时候都会加上Connection: Keep-Alive的头信息,是如何实现的呢?
我们知道在服务端(nginx)可以通过设置keepalive_timeout来控制连接保持时间,那么http连接的保持需要浏览器(客户端)支持吗?今天咱们一起来通过java.net.HttpURLConnection源码看看客户端是如何维护这些http连接的。

Phper 学 C 兴趣入门 -为什么有时候字符串可以截取有时候又不行

周梦康 发表于 2019-09-09 555 次浏览

需求

假如有这样的一个需求,有个日期,想要截取获得其年份。我们用 php 可以使用explode,也可以使用strtok

$a = "2019-09-10 00:00:00";
echo strtok($a,"-"); // 2019

可能大家对strtok不太熟悉,它的作用是用-来分割$a获取子串,循环调用可以达到和explode差不多的效果。具体可以看下官方手册里面的 demo https://www.php.net/manual/zh/function.strtok.php

实验

实验1

我之所以用strtok呢,是因为C 语言里也有这个函数,这个函数比较“怪”,每一次调用,是将字符串中找到的-替换为\0,然后返回标记字符串的首地址。

Phper 学 C 兴趣入门 - 为什么 php 手册里经常说某个字符串函数是二进制安全的

周梦康 发表于 2019-09-05 495 次浏览 标签 : C php

引子

为什么 php 手册里经常说某个函数是二级制安全的?我们平常使用函数的时候也没发现有什么区别呀,那么二进制安全到底是什么意思呢?

Php 实验

<?php
echo strlen("abc"); // 3
echo strlen("abc\0"); // 4
echo strlen("abc\0d"); // 5
echo strlen("abc\0def"); // 7

受邀参加阿里云某业务线 2019 篮球赛

周梦康 发表于 2019-08-09 705 次浏览

临时收到某部门的盛情邀请作为他们部门篮球赛的强力外援,不用说,肯定是我得分能力吸引了他们。最后才知道原来是本不能邀请外援,但才6人,少一个,正好他们组妹子也有一套球服,其他人也穿不了,所以邀请了我。
IMG_1471.JPG

PHP 异常任重而道远

周梦康 发表于 2019-06-18 2283 次浏览 标签 : php 原创

作为一名深度 phper,我如果要黑咱们 php,就像说自己母校差一样,大家不要见外。

故事的开始

这几天观察错误日志发现有一个数据反序列化的notice错误,实际情况我是从缓存中读取数据然后反序列化,因为反序列化失败,所以实际每次都是去数据库取的值。背后性能影响还是挺大的。

一次 group by + order by 性能优化分析

周梦康 发表于 2019-03-18 4624 次浏览 标签 : Mysql 原创

最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家帮忙解答下

主要包含如下知识点

  • 用数据说话证明慢日志的扫描行数到底是如何统计出来的
  • 从 group by 执行原理找出优化方案
  • 排序的实现细节
  • gdb 源码调试

如何成为一名优秀的工程师(语义篇)

周梦康 发表于 2019-03-03 4170 次浏览 标签 : 原创

好的语义表达是团队协作中高效迭代的润滑剂,好的语义表达是线上未知代码问题排查的指南针。

不要让其他人读不懂你的代码,其他人可能就是一周后的你。时刻以“如果你写的这段代码出现故障,一个陌生人接手你的代码需要多久能处理完这个bug”来监督自己。

日常中应该多多刻意提升自己语义表达,百利而无一害。那么我们应该从哪些细节去做好语义表达呢?

Mysql 使用 optimizer_trace 查看执行流程,分析、验证优化思路

周梦康 发表于 2019-01-22 2080 次浏览 标签 : Mysql 原创

使用 optimizer_trace 可以更加详细的看到 mysql 的整个执行流程,作为分析优化思路,验证优化思路非常有帮助。

需求:现在需要统最近一个月阅读量最大的10篇文章
Mysql 版本 :5.7

mysql> show create table article_rank\G;
*************************** 1. row ***************************
       Table: article_rank
Create Table: CREATE TABLE `article_rank` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `aid` int(10) unsigned NOT NULL,
  `pv` int(11) unsigned NOT NULL DEFAULT '1',
  `day` int(8) NOT NULL COMMENT '日期 例如 20171016',
  PRIMARY KEY (`id`),
  KEY `idx_day` (`day`),
  KEY `idx_day_aid_pv` (`day`,`aid`,`pv`),
  KEY `idx_aid_day_pv` (`aid`,`day`,`pv`)
) ENGINE=InnoDB AUTO_INCREMENT=240776593 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)