分类目录归档:未分类

狂暴的欢愉必将有狂暴的结局

狂暴的欢愉必将有狂暴的结局,这句话是从《西部世界》里听到的,用来形容我对这一波数字化货币行情的感受再切合不过了。

并不是在这几天得知政府会将所有数字化货币交易关闭的消息后才有这样的感受。我是在这一波经历的末端才参与的,当时高潮已过,但一些八九月份ICO的项目仍存在极大投机性,便投了一点钱,目前当然是亏损了很多,但投入量很小,损失也在预期之内。

在2016年初的时候,开始关注到区块链相关的技术,当时这个概念还没有那么普及,但几乎不到半年时间这个概念被迅速放大并普及。大概也是2016年二三月份的时候还去上海静安寺附近的一家咖啡馆参加过一次以太坊的技术聚会,但那个时候完全是出于对其技术方面的好奇。与会的一半是区块链领域开发者,一半是投机者。有不少人现在已经在这个圈子较有影响力,比如后来的imtoken钱包的创始人何斌、秘猿科技的创始人Jan、暴走恭亲王、还有一些其他区块链创业公司的核心开发者等等。坐在我身边的好像还有果仁宝CTO,以及一位做智能跑步机的创业者(他在考虑将用户的跑步积分与挖矿虚拟货币兑换,当时令我很惊讶)。

只可惜那次聚会除了对一些技术概念熟悉了些,因为后续没有应用场景,就没有再对区块链进行关注。以太坊之后经历过被黑客攻击以及分叉等曲折的故事。等我再次关注关注到它的时候,已经是2017年的六七月,这时以太坊的价格已经增长了近一百倍。

并没有过懊悔什么,这个机会并不属于没有准备的人。我之前的好奇只是关注它的技术层面,从没有想到在投机性方面还存在如此巨大的可能,对它背后的经济学理论也懵懵懂懂、半信半疑。所以这一波行情跟我没什么关系。只是仍没有经住ICO的一些诱惑,尽管对行情走势看跌,但万一ICO的项目撞上一个爆发的呢?

蛮荒时代必有超常规的手段,政府的干预让这个事情变得如何还不一定,当我看着那些T恤上印着“一切才刚刚开始”或“Decentralize Everything”的九零后小伙子目光中充满笃信的神态时,迟疑自己是否有些老了,或许DAO时代真的可能会到来?

继续招聘

我们在招Java/Scala的资深工程师(或技术专家),你将有机会跟我们共同参与一些挖财基础设施的开发。整体上我们算是偏中庸的一个技术团队,形成一套适合自己的技术栈,相对务实。这次招聘的岗位有面向中间件岗位的开发(消息、分布式事务、存储等),以及面向信贷业务的开发。

对于中间件开发岗位,如果你有Akka的应用经验更好,不过掌握Scala/Akka并不是必要条件,基本的要求是功底扎实,对分布式有一定的了解。至少有三年以上的工作经验,熟悉Java/Scala/C++其中之一。

对于业务开发岗位,希望你有较扎实的基本功和责任心,熟悉Spring生态和SOA,善于沟通和团队协作,有支付或互联网金融相关的工作背景会有加分。

工作地点在杭州。对职位感兴趣的请发邮件到: cuodao(at)wacai.com

本站已支持https访问

几个月前已经配置了https,已经支持使用https方式访问本站,否则你可能在访问时遇到运营商广告劫持的情况,类似下图右下角的这个广告(宽带运营商篡改了http植入了广告):

不过以前的blog里有些图片使用的url仍是http的,所以在chrome浏览器里可能看到有图片内容的文章时,并没有在地址栏展示一个绿色Secure锁的标记。

WassUp Real Time Analytics

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

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

如何持续的写博客?

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

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

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

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

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

有道词典的异常堆栈

碰巧抓住了有道词典的异常页面,从堆栈里能看出他们的一些技术栈,他们使用的是Resin-3.0.21,一个十多年前曾流行过现在不太主流的应用容器,但在网易、搜狐、人人等公司这个容器依然很常见。他们用http去访问cassandra?

java.lang.NoSuchFieldError: INSTANCE
 at org.apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>(SSLConnectionSocketFactory.java:144)
 at org.apache.http.client.fluent.Executor.<clinit>(Executor.java:78)
 at org.apache.http.client.fluent.Request.execute(Request.java:177)
 at toolbox.cassandra.client.CassandraClient.httpGet(CassandraClient.java:47)
 at toolbox.cassandra.client.CassandraClient.init(CassandraClient.java:129)
 at toolbox.cassandra.client.CassandraClient.getInstance(CassandraClient.java:75)
 at outfox.dict.front.data.ugc.AsynUgcClient.<clinit>(AsynUgcClient.java:88)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
 at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
 at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1000)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:953)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
 at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
 at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
 at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
 at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
 at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
 at javax.servlet.GenericServlet.init(GenericServlet.java:69)
 at outfox.dict.front.web.DictServlet.init(DictServlet.java:57)
 at com.caucho.server.dispatch.ServletConfigImpl.createServletImpl(ServletConfigImpl.java:646)
 at com.caucho.server.dispatch.ServletConfigImpl.createServlet(ServletConfigImpl.java:587)
 at com.caucho.server.dispatch.ServletManager.init(ServletManager.java:154)
 at com.caucho.server.webapp.Application.start(Application.java:1654)
 at com.caucho.server.deploy.DeployController.startImpl(DeployController.java:621)
 at com.caucho.server.deploy.StartAutoRedeployAutoStrategy.startOnInit(StartAutoRedeployAutoStrategy.java:72)
 at com.caucho.server.deploy.DeployController.startOnInit(DeployController.java:509)
 at com.caucho.server.deploy.DeployContainer.start(DeployContainer.java:153)
 at com.caucho.server.webapp.ApplicationContainer.start(ApplicationContainer.java:670)
 at com.caucho.server.host.Host.start(Host.java:420)
 at com.caucho.server.deploy.DeployController.startImpl(DeployController.java:621)
 at com.caucho.server.deploy.StartAutoRedeployAutoStrategy.startOnInit(StartAutoRedeployAutoStrategy.java:72)
 at com.caucho.server.deploy.DeployController.startOnInit(DeployController.java:509)
 at com.caucho.server.deploy.DeployContainer.start(DeployContainer.java:153)
 at com.caucho.server.host.HostContainer.start(HostContainer.java:504)
 at com.caucho.server.resin.ServletServer.start(ServletServer.java:971)
 at com.caucho.server.deploy.DeployController.startImpl(DeployController.java:621)
 at com.caucho.server.deploy.AbstractDeployControllerStrategy.start(AbstractDeployControllerStrategy.java:56)
 at com.caucho.server.deploy.DeployController.start(DeployController.java:517)
 at com.caucho.server.resin.ResinServer.start(ResinServer.java:546)
 at com.caucho.server.resin.Resin.init(Resin.java)
 at com.caucho.server.resin.Resin.main(Resin.java:625)

Sierra三宗罪

1) Sierra下很多原有软件无法运行

有些通过mac store下载的需要重新下载才可运行:

搜狗拼音无法使用,需要下载最新版本重新安装。

2) 有个photoanalysisd的进程在后台分析你的图片,导致cpu占用率很高,可以用下面方式停止:

 ➜  cat stop-photoanalysisd.sh
#!/bin/bash

launchctl stop com.apple.photoanalysisd
launchctl unload -w /System/Library/LaunchAgents/com.apple.photoanalysisd.plist

3) 原先VPN配置里的PPTP模式都丢失了

招聘资深Java/Scala工程师

我们在招Java/Scala的资深工程师(或技术专家),你将有机会跟我们共同参与一些挖财基础设施的开发。如果你有Akka的应用经验更好,不过掌握Scala/Akka并不是必要条件,基本的要求是功底扎实,对分布式有一定的了解。至少有三年以上的工作经验,本科或以上学历。工作地点在杭州。

关于挖财的技术你可以通过InfoQ或ArchSummit搜到一些相关的分享,业务开发语言以Java为主Scala为辅。现阶段技术人员有两百多人的规模,这几年早已从初创时期的个人英雄主义转变为中等规模的集团军作战方式。整体上我们算是偏中庸的一个技术团队,也形成了一套适合自己的技术栈,相对务实,没有太多花活。

业务当前发展比较快,对技术的要求也是不断在提升,对该职位感兴趣的请发邮件到: cuodao(at)wacai.com ,每封邮件一定回复。

执行quit命令codis返回结果缺失数据的问题

记录一下codis遇到的这个情况,在客户端连接销毁时如果执行quit命令,有较高概率返回的数据不完整,导致客户端解析出错。具体的说是缺少了”+OK”这几个字符,在redis里执行quit命令返回的结果里会有”+OK”:

$ telnet redis-server 6379
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
quit
+OK
Connection closed by foreign host.

而在codis上有时返回的数据缺乏“+OK”

$ telnet codis-server 19000
Trying yyy.yyy.yyy.yyy...
Connected to yyy.yyy.yyy.yyy.
Escape character is '^]'.
quit
Connection closed by foreign host.

还没有去查codis服务器端,先做个记录。

lantern的bug导致safari/mail无法访问网络

lantern似乎一直存在bug,有时将其退出后会导致mac上某些自带的应用(比如safari和mail)无法正常访问网络,而chrome等非mac自带的工具却正常。在我的机器上这种情况经常发生,影响了mail应用不及时收取邮件,不得不通过kill networkd重启网络来解决,谁要是知道更好的方式请告知我。

➜  cat ~/bin/restart-network
#!/bin/bash

pid=$( ps -ef | grep "/usr/libexec/networkd$" | awk '{print $2}' )
sudo kill -9 $pid