2016年度小结

回看射雕处,千里暮云平。

自2016年初就已辞掉之前关于app后端开发相关的工作,转向企业级Docker PaaS平台相关的工作。前半年依然在学校一边上课一边远程完成工作,到7月份学校同意不再上课后正式开始全职地在公司工作,相比上半年的工作模式,在企业中还是过得较为充实,每个月做了哪些事情都历历在目。去年在航桓科技,同事都是年纪相仿的,且公司规模不大,扁平化的管理模式相当自由,工作经常会和大家一起慷慨激昂地讨论问题、解决问题 。今年先在硬件分销商工作,后入职传统IT行业 EMC,EMC的同事都是已经在IT行业摸爬滚打十年的前辈,和前辈们一起工作则是完全不同的体验,少了盲目的开坑入坑,多了长期的计划、规范、商业战略。

在工作中很多时候会使用到各种各样方方面面的知识,这一年阅读文档的能力加强了不少。同时也有幸接触得到到像省级移动、联通这种级别的大型业务系统,了解Oracle、Weblogic、Dubbo等java方面怎么给大型的IT公司提供服务。基于EMC本身在企业里面的立足点出发、逐渐了解客户的业务,从存储出发到业务争取为客户提供更贴合实际、更稳定、可靠的企业级服务。

业余花费了一些功夫学习Java中间件,了解java怎么以一个巨大的完整体系去为企业提供商业价值,在大型企业中虽然已经有点落后,但是拿到有两台自己机器中小型企业里来用还是绰绰有余的。同时在前端方面学了ReactJs、Emberjs等js框架,emberjs作为一整套前端的框架体系,包括测试、调试、代码结构规范都有规定,非常方便。

最后,祝我的2017 有所思、有所行。

.NET Core 初试水

什么是.NET Core

项目地址: .NET Core

.NET Platform 是一个windows上的一个开发平台规范总称, 刚开始只有windows上的.NET Framework实现,后面出现了跨平台的实现,分别是Mono Platform.Net Core Platform,它们都提供了CLR运行时和C#编译器等的实现, 后者是官方给出的实现。

.NET CoreCoreCLRCoreFx两大部分组成,Roslyn ComplierLLILC是 用于和.NET Core 一起支持 .NET Core Platform的项目。

综上所述,.NET Core Platform 的组件有

  • 基本类库 (CoreFx提供)
  • CoreCLR 运行时 和 RyuJIT 编译器(CoreCLR 项目提供)
  • Roslyn compiler (Roslyn 项目 提供)
  • CLI tools

所有的这些项目都在:https://github.com/dotnet/

NOTE:根据官方的文档,有的时候.NET Core 是指 .Net Core 这个单独的项目,但是更多的时候它是指整个平台(.NET Core Platform)的实现。还有注意.NET Platform.NET Framework是两码事,如果说.NET Platform是一个API标准集,.NET Framework.NET Core 分别是他的实现。

引用:官方解释

方法一:直接安装二进制包

使用编译好的sdk即可:
https://dotnetcli.blob.core.windows.net/dotnet/beta/Binaries/Latest/dotnet-dev-ubuntu-x64.latest.tar.gz.

最新来这里下载:https://github.com/dotnet/cli#installers-and-binaries

Read More

yield 编写web服务程序

php在php5.5的时候引入了generator和coroutine,当然这和node的event loop还是有比较大的区别的。 yield 表达式 和php封装过系统底层的函数(select函数)可以一起写出非阻塞的io。

0x1: yield表达式是什么?

非常简单,描述yield表达式的只有两个关键词: 中断点 和 占位符(自己总结的两点,只属于一种感性的记忆方式,并不是官方给出的专业词汇)。
举个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

function gen() {
$tid = (yield 1 + 1);
for ($i = 1; $i <= 10; ++$i) {
echo "This is $tid task iteration $i.\n";
yield $i;
}
}

//$t1是[generator](http://php.net/manual/en/class.generator.php)类的实例(instance)
$t1 = gen();
//取出yield后面的表达式的结构,并没有进行赋值就暂停了当前的操作 `$tid = (yield 1 + 1) `,(特性一:中断点)
$r1 = $t1->current();
//结果为 2
echo $r1;
//将字符'+++'(特性二:占位符),替换到刚才暂停的地方 `$tid = '+++++'`,并进入for循环,遇见yield表达式,获取yield 表达式后面的值,并保存当前的局部变量的值,yield后面是$i,返回$i
var_dump($t1->send('+++'));

这里 current方法是暂停并返回获取当前yield表达式的值。send方法是先替换之前暂停时的yield表达式所处的位置的值,再开始执行,直到遇到下一个yield表达式,再取表达式的结果,暂停并保存当前的局部变量的值。在这里我注意到send方法总是同时得确定两个yield表达式的位置,第一个yield表达式的值被替换,再去寻找第二个表达式的值(yield $i里面的$i),再次保存当前的状态,返回 yield表达式 后面的值。依次类推。
这里有个需要思考的问题就是如果一开始就用send方法不用current()会怎么样? 答案是send方法在第一次运行之前会隐含调用rewind方法,会在函数第一个yield的地方中断保存局部变量,但是忽略它的返回值。

Read More

docker特权模式的影响

起因

本来我想在docker里面做些测试和监控,于是我用到了两个工具tcpdump和strace。想要使用strace就必须开启特权模式,但是我发现开启之后tcpdump就无法使用了。

解释

是因为有个叫做apparmor这个程序导致的。它是控制访问权限的一种系统类似于selinux。但是没有它docker就无法启动容器。我的ubuntu主机安装了tcpdump,容器也安装了tcpdump,当我开启容器里面的tcpdump的时候,会提示没有权限打开共享库。因为apparmor(/etc/apparmor.d/docker)在特权模式下,容器是没有加载/etc/apparmor.d/docker文件的,所以导致了一些比较混乱的问题(具体是为什么我也没找到答案),目前还没有被解决。所以想要搞定这个问题一个比较好的办法是把容器里面的tcpdump的路径换下。例如(Dockerfile)

RUN mv /usr/sbin/tcpdump /usr/local/bin  

参考资料:
https://github.com/docker/docker/issues/5490
http://stackoverflow.com/questions/25533666/cannot-reload-or-start-apparmor-in-docker
https://github.com/docker/docker/issues/5788
https://github.com/docker/docker/issues/7276#issuecomment-50436671

PHP扩展开发之路(二)

##0x2 hello world!,你的第一个php扩展##

阅读前必看小贴士:

如果你不想在本教程上拷贝代码,你可以clone下这个仓库github,每一小节的代码对应着每一小节的分支,当阅读到该小节的时候,你可以切换到该小节的代码分支。

$ git clone git://github.com/kchodorow/rlyeh.git

比如当前小节的代码分支名是oop,你可以这样

$ git checkout -b oop origin/oop

本章的代码的分支是master,你可以直接

$ git clone git://github.com/kchodorow/rlyeh.git

而不用切换分支。

Read More

php扩展开发之路(一)


前言:

在网上搜到了一个非常好的php扩展开发的资料,特翻译过来,并加上自己的见解,因为我跟着走过一遍,非常实用。
原文:http://www.kchodorow.com/blog/2011/08/11/php-extensions-made-eldrich-installing-php/

php扩展允许你在php中使用几乎所有的C/C++代码,这里有4个部分关于这个教程。

  1. 编译安装调试模式的PHP
  2. hello world!,你的第一个php扩展
  3. 开始简单使用C API
  4. 使用C 创建php对象

Read More

32bit下gogs的编译安装

  按照官方的文档,我并不能安装好gogs,刚开始我使用的是64位的二进制发行版,在我的虚拟机上安装成功,但是我还有一台32位的老机子,只有自己编译安装了。
  安装官方的文档使用gopm 直接安装失败,原因是需要翻墙,后来我使用cow代理,goagent代理,都发现下载一些依赖失败,主要的是golang.org上的依赖下不下来,导致安装失败。
  后来在这个地方下载gogs编译包 : http://gopm.io/github.com/gogits/gogs

Read More

2014年终总结

  年关将至,许多IT从业者都喜欢写下过去的一年里感慨,做个年终总结,那我也学习下IT前辈们,说说我在这过去的一年里我的那些遭遇。

  就在写下这篇文章前些天,我一个亲人在武汉的工地上去世了,明明是身体多么结实的人,说没了就没了,原因就是因为脑溢血突发,人生在世几多唏嘘,好好注意自己的身体才是真正要紧的。这是我第一次以晚辈的身份去参加葬礼,穿上那孝衣。

Read More