月度归档:2017年03月

进程被debug时的状态

在mac/bsd和linux上ps展示进程状态的字符与linux可能含义不同,比如我的java进程在mac上ps看到是"TX+"状态

➜  ps aux | grep "[j]ava"
hongjiang  60387  0.0  0.4  6072548  36516 s001  TX+  7:28PM  0:00.19 java Daemon

Linux上man ps看到 X 表示 "dead (should never be seen)", 而Mac/BSD下则是 “The process is being traced or debugged” 的含义。 Linux上当一个进程被debug中,状态跟stopped一样都使用T表示(在某些高版本linux内核里会区分开,使用小写t表示进程是被debugger跟踪)

final object?

使用final修饰object的场景极少见,需要显式打开-Yoverride-objects编译选项才行:

 ➜  scala -Yoverride-objects
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_51).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class A { object B }
defined class A

scala> class C extends A  { override object B {}  }
defined class C

如果A内部对object B使用final修饰了,子类C就不能覆盖这个object,不过它的意义是什么?这里object B是一个module,要解释object为何被当作module来设计,需要整理一下,等有时间再说。

PS,我刚发现2.11版本之后repl下,当你定义一个object时,提示已经不同了,在2.11版本之前,repl下会显示 "defined module XXX", 而 2.11 里已经变成了 "defined object XXX",可能隐含着设计者对module(早期scala中module应该是借鉴ML语言的module)这个术语可能存在理解不一致的担心,所以不再使用这个名词(只是我的猜测)。

socketRead0阻塞2个半小时?

前几个月我们遇到过某些http请求会在本机会阻塞2个半小时左右最后成功返回的情况。经过排查发现问题并不在对方服务器,而是这2个半小时基本都是在自己的网络环境阻塞,通过dns端日志发现请求到达dns服务器也是2个半小时后。

在geek talk群里有人指出,glibc的低版本会在查完域名后把拿到的ip反过来查域名,dns服务器都不支持反解就一层层的传给其他dns,可能会变慢。redhat在6u fix了这个问题。但跟我们的情况不符。

当时的堆栈显示阻塞在socket的读取上(我不确定这里的连接是复用上次HttpURLConnection创建过的连接,还是首次跟对方建立连接),我google到有些人也遇到过相似的问题,hang在同样的代码上,疑似是虚拟机(kvm/vmware)或jdk网络层面的bug (JDK 1.8.0_65), 因为无法稳定的重现,没有进一步验证,记录一下这个诡异的问题

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:335)
- locked <0x0000000c868c460> (a java.io.BufferedInputStream)
at sun.net.www.MeteredStream.read(MeteredStream.java:134)
- locked <0x0000000c868c420> (a sun.net.www.http.KeepAliveStream)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3336)
at java.io.FilterInputStream.read(FilterInputStream.java:133)

回顾2016

看着小家伙一点一点的变化,从7个月开始无意识的冒出一些词语,到慢慢懂得叫爸爸妈妈,以及说出更多的词语和你不知所谓的句子。从爬行到第一次走路再到满地的跑,成长的过程中总会带给你一些惊喜。

我的境况没有什么变化,除了徒增一丝中年人的焦虑。生活本身就有诸多问题要去面对,处在这个时代的洪流中,被冲击的无招架之力,或许稍一松手你可能就错过了搭乘末班车的机会。

WassUp Real Time Analytics

独立blog的一个麻烦之处是维护成本,你需要投入额外的金钱和精力,其实vps一年的费用不过几百块(经常有折扣),更多可能是系统维护对普通人(非IT工作者)来说代价略高。我在系统维护方面投入的精力极少,一方面是阿里云的vps确实稳定,另一方面是我折腾的也较少,一直使用的固定模板和写作方式。

独立系统难避免的一点是容易受到攻击,对于wordpress来说你需要尽可能保证它是最新的版本。另外有一个很好的插件: WassUp Real Time Analytics,能够帮你做一些访问统计,并在管理界面上很容易发现疑似的攻击。

如何持续的写博客?

如何能持久的写博客?这是个挺难回答的问题,这个blog建立4年了,不长也不短;不过把之前在第三方博客平台上的记录也算进来,我写blog的时间也有十多年了。

博客有两种功能,第一是记录(或收集)信息,第二是社交。多数人没法持续下去可能是社交的期望更多,而写博客在社交方面得到的反馈是比较延迟的,也没法保证你的好友会读到,跟微博或朋友圈比起来传递速度和即时反馈感太滞后。

于我而言,博客作为信息整理(知识管理)的功能更突出一些。记录的过程常常会对内容重构,尤其对技术类文章,过程中会重新梳理可能遗漏或理解错误的地方。这些记录下来的内容更多是给自己提供便利的。

写作时尽量不要去在意别人的意见,甚至需不需要读者的反馈,也是个人的事。有些新的平台,比如微信的公众号或知乎专栏一类的交互方式可能更有利于传递和交互,但如果你的才思文笔不足以支撑起看客们围观喝彩,就不必声张。大部分人并不具备长期输出优质内容的能力,这种互动可能迫使你过多的想要展示好的一面,而难以维持。

独立平台的好处就在于你不会受到它的氛围以及审查影响;另外,这些新的平台未经过长时间的验证,或许五年后它们都消失掉了,而你的独立博客则可以长存。