slan's blog

Loneliness or short time relief?

让我宁静的地方

让我宁静的地方

曾经为了能让自己安静的学学东西,高效的做做事情,想过很多办法,包括弄个专门的书房,高性能的台式机,双屏显示器,为了能更舒适的看书,把沙发从阳台弄到书房,然后从书房弄到阳台。为了能更有精神,还跑步,早睡早起。做GTD,目标,执行,回顾,想尽办法却不如人意。总是在艰巨的反复斗争中败下阵来。

后来有一次,下班后去了一次西湖区图书馆,虽然是一个很小的地方,但是却有很多人在那边看书,很安静,离家也不远,那次虽然只有一个多小时,但是还是能沉浸在那样的环境中,安静的看带过去的书。就这样感受并喜欢上了这样的环境,听说浙图,杭图环境更好,有电源有wifi,杭图太远,浙图还好,不过苦于当时没有笔记本,想法一直没有成行。

十一回家,买了个macbook,在家里休息了几天,没去挤景点,在家里上网折腾,感觉笔记本真的很方便,续航很久,不用带电源,在楼顶,月光与山色在你眼前,山风拂过身子,很是惬意。家里虽然舒服,不过终究不太适合做事情,太安逸,需要用意志力来让自己做事,再者免不了很多事情,还感冒+醉酒,在床上躺了一天。

回来之后,休息一天,就来到了图书馆,初来的时候很忐忑,有没有电源,wifi,自习室会不会人满,要不要买票,假期有没有开门。来了之后回应了那句话,just do it, 生活总有新的精彩。我是一个内向的人,不善交际,有些自闭,如果有一个自己轻车熟路的事情,我很难做出改变,比如在买macbook之前,将自己的windows环境调得极度好用,遇到什么事情,都能折腾得很顺手,从此觉得自己用windows就够了,倒不是觉得mac不好用,而是极度缺乏动力对自己不熟悉的东西进行尝试。mac到了之后,顿时mac黑转粉,极度好用,很是顺手,从此进入mac的舒适区。包括其他方面,去哪里玩,去之前都是无兴趣状态,走走路拍拍照,有什么好出去的,去了之后,( ⊙o⊙ )哇,awesome!!! 扯多了,像我这样自闭的人,还是多尝试新的东西比较好。太容易进入舒适区。

回到浙图,在这待了几天,很是宁静,没有那种需要用意志力来让自己做事情的感觉,什么都是自主发生的,清净,没有干扰,一张桌子,一台电脑,一个水杯,便是一天。空气很好,可能是靠近景区的原因,也可能这几天朦胧细雨。浙图人很多,自习室八点半开门,十点之前是有位子的,之后一般就满了,需要去地下室了,地下室空气不好,网络也不好。不用钱不用证,来了找个位子坐下就好,中午有食堂,十块一餐,一荤两素,对于我这样不挑剔的人,能吃得惯。晚上八点半关门。

环境对人的影响还是蛮大的,意志力毕竟有限,好的环境能让你付出很少的挣扎就能很有效的做事情,如果在家里,需要抵制美剧,睡觉,美食,新闻等各种诱惑,就算有书房也没用。在这里什么都不用考虑了。很羡慕在这里的人,从小就在这样的环境,看到很多初高中生,在这里自习做题,想想当年自己有空余时间,就是电视,玩,网吧。差距常年累月下来,就不是一般的大了。

加油!

2015-10-07 09:48:00 +0000 UTC

Win10 search function not working

Win10 search function not working

the windows's firewall is a useless function for me ,so I stop and disable it in services management .

but it casue a lot of trouble .

first ,I can't install a fonts download from other place.it soved by temporary start the firewall service.

and, the Win+s shortcut not working ,even I click the search btn at taskbar ,it get stuck and respone nothing.

I have google this trouble ,there are many information but no one can solve this problem .

I have spend many times want to fix it ,finally i find the system log have many firewall error,

then I start the firewall service ,the problem goes away ,what the fuck!.......

what a amazing relationship between firewall and Search function and install fonts!

2015-09-04 20:13:00 +0000 UTC

golang 交叉编译在1.5版本变得非常简单了

golang 交叉编译在1.5版本变得非常简单了

golang1.5正式版如期发布了,带来了一大波激动人心的新东西。

其中有个比较方便的功能,就是直接支持了交叉编译,之前要用源码编译各个环境。

现在下载安装版也能直接编译了,比如我在windows上编译64位linux的命令:

env GOOS=linux GOARCH=amd64 go build

前面env是设置环境变量,GOOS是系统,可以为下面的值:

darwin freebsd linux windows

GOARCH是架构,可以是:

386 amd64 arm arm64

相比与之前实在是方便了太多太多

2015-08-21 22:56:00 +0000 UTC

hacking team 415G 被黑文件种子

hacking team 415G 被黑文件种子

没事研究下黑客是怎么黑别人可以涨下见识。

里面全是各自攻击内幕,交易细节,以及各种威力强大的0day漏洞利用工具。

实在太震撼了,不愧为国家队。看来以后不能惹黑客。

感想就是以前单打独斗的黑客已经军团化,武装组织化了,不知道这样的组织全球还有多少,国内好像也有,咳咳。个人在这种组织面前是毫无安全可言的,就算平常注意上网习惯,不装360,勤打补丁,每个网站一个密码,手机验证,证书一堆。然并卵!!!

种子文件因为之前存储在sae中,项目收费销毁就丢了,抱歉

2015-07-08 12:11:00 +0000 UTC

配置超级方便的windows命令行开发环境

配置超级方便的windows命令行开发环境

windows一向以图形界面著称,命令行环境就不怎么为人所知了,最多知道有个cmd,众所周知cmd并不好用,比linux mac下的命令行环境差一截,所以这也是经常用来说明mac的开发环境比windows好的一个证明,mac下提供了更加强大的命令行操作环境,不过windows真的这么不堪么,其实windows作为一个受众面如此之广的系统,可以用得很简单,也可以玩得非常高端。

本文的目的在教你怎么打造一套命令行环境,媲美linux,mac,并且比其他系统有更强的可定制型,方便。

先分析需求:

我想在每个我打开的目录下,直接右键打开命令行,路径在当前目录(linux,mac下基本功能)

我想提示能智能一点,能自动补全,不要cmd那傻傻的补全,要linux那种

我不要windows下傻傻的C: D: E: 切来切去,一个根目录才是正常人

我要能用git ls grep 等各种shell命令,linux下命令行已经把我惯坏了

很多人以为这样的需求,在windows下就是痴人做梦,这是linux才有的功能,windows玩不了这么高端,不是的,工具只是工具,在程序员的世界里,应该是一切皆有可能。

来看本文的方案,工具链:git(mingw) +ConEmu,来实现以上所有功能,并且还能实现在一个窗口管理多个命令行界面的功能。

conemu界面

这是conEmu的界面,开了2个命令行,在一个窗口tab栏显示,支持linux常见命令,ls grep 等等,同时还能用windows下的命令,很强大的组合。

右键菜单,在当前目录打开命令行:

conemu右键界面

这样就可以方便的在多个目录下进程命令行操作了,git 执行程序都很方便

那么下面是搭建这套环境的教程:

一、安装git

git是程序员常用的工具,打包了一个小的mingw环境,直接装mingw太麻烦了,git只有一个安装包,安装一下就行,环境变量也自动配好,下载地址:https://git-scm.com/

二、安装ConEmu

这是一个管理命令行程序的工具,可以支持自定义命令行环境,自定义配色方案等

下载地址:https://github.com/Maximus5/ConEmu

三、git和ConEmu都装好了之后,进入ConEmu 设置

conemu设置

注册右键菜单,用来在目录中右键打开环境,Menu Item是右键菜单的名称,Command是执行的命令,这里我们执行git bash环境(可以在开始菜单查询git bash 右键属性查看)的命令。然后点Register,随便在什么目录右键,你会发现可以打开了。

现在你会发现打开多个命令行,任然是在多个窗口打开,怎么在一个窗口打开呢?一样在ConEmu中配置:

conemu多窗口配置

勾上这里,就单用一个窗口打开多个命令行了。

ConEmu还有很多自定义的功能,非常强大,可以自己摸索。

2015-06-01 14:15:00 +0000 UTC

web app是一条好路

web app是一条好路

最近刷了美版google play之后,找应用更方便了,经常习惯性的去这里下国外的应用。

刷reddit比较多,想这么火的一个网站应该有app吧,这样我就可以在手机上看了,吃惊的是上play上一搜,居然没有官方app,于是只能用手机浏览器上看了,折腾来折腾去,无意间发现一个碉堡的chrome功能,添加到主屏幕 ,试了下把reddit直接放到了手机桌面。

顿时桌面出现了reddit的图标,点开之后是全屏的,没有浏览器的导航栏,没有任何浏览器的信息,就这样网页直接进入了应用级别,而且体验好到爆,不用安装,不用更新,不用担心乱七八糟的权限问题,而且reddit的网页做的很流畅,导航加载跟app一样的效果。完美

chrome这功能真心做得不错,直接解决了web app的入口问题,对于只用html5的应用,完全没有必要用hybird再打一个apk,把web app的轻量,优雅都给打没了。

web app无法取代native app,就像在pc平台上上演的一样,虽然浏览器的功能越来越强大,但是应用程序还是无法替代,但是这毫不影响网页的应用趋势。

2015-05-25 16:57:00 +0000 UTC

怎么强制使用google.com而不是google.com.hk

怎么强制使用google.com而不是google.com.hk

在墙内使用google.com 一般会被重定向到google.com.hk

有个简单的方法来禁止重定向

访问一次: http://www.google.com/ncr

带上ncr之后,google在之后就不会重定向你了

2015-05-22 12:28:00 +0000 UTC

多一点设计,少一点烦恼

多一点设计,少一点烦恼

这是团队发生的一起事故。

需求是这样的,在用户个人中心,有一个将本地的视频上传到第三方存储库的需求,需求不复杂,但是出了很多岔子。 前后经过大概三个多冲刺,时间跨度一个月,仍然有很多问题,没有发布。

验证阶段: 开发人员是进行了前期验证的,将市面上的上传控件测试了一次,并有相关的demo,然而这个demo在后来 并没有起到加快任务进度的作用,实际上,实验的demo,后端接口并不是需求相关的第三方api,开发人员并没有对 api作验证

构建阶段: 没有相关设计,直接开始编码,开发人员对整个需求,所需要做的东西不了解,没有技术方案,只凭感觉 开始了切图,编码,随后陷入了地狱,demo不能直接拿过来用,因为上传的地方并不是业务服务器,而是第三方存储。 而第三方存储也没有api,几经沟通,给出直接用iframe嵌套页面的方案,这个方案验证也不行,因为有各种跨域, 交互等问题,在多次调试,耗费时间快2周的时候,终于调出一个勉强能用的方案。不过地狱还是没有结束,仍然有 一些需求没有确认,没有解决。

需求是会变的,这是铁律,产品人员的设计会根据市场的反馈发生改变,就算市场不变,整个团队成员对产品的理解会 在不断的沉浸中加深理解,更加的适应需求,就像开发人员写一些功能的时候,经常会有重构重写的情况发生,这是 好事,能提高代码的复用性,性能等,所以需求的变更是必然,有时候也是必要的。但不断变化的需求对开发人员来说, 是一个极度讨厌的恶魔,它延误了进度,增加了成本,消磨了耐心,降低了成就。这就需要一个平衡,尽量少的需求 变更来迭代更适应需求的产品。

敏捷是一个好方法,给了开发人员一个固定的冲刺时间,无打扰,无变更,所有的需求变更都在冲刺开始前确定, 在冲刺结束之前,无反悔机会。除非结束冲刺,重新制定冲刺计划。但这条护城河不是咒语,喊一声敏捷就抑制了 变更,这对开发提出了更高的要求:主动提前确认需求,提前做好架构,验证。否则,当发现技术方案有问题, 无法实现,实现成本过大等需要变更的时候,主动打破计划的就不是产品,而是研发人员。这同样对项目是危险。

在这个失控中学到什么:

  1. 对开发人员来说,在冲刺开始之前,需要明确这次冲刺的目标是什么,我如何实现这些目标,以及验证相应 技术方案,在方案仍然有疑问之前,绝不启动冲刺计划。在前期挣扎比在后期推倒对项目的影响要小得多。
  2. 对冲刺大师来说,大师是冲刺的守护,需要保证冲刺能正常顺利进行,尽量减少冲刺的风险,所以需要和开发 人员沟通,确认所有需求,技术方案细节,然后才能放行,开始冲刺。
  3. 对团队来说,需求变更的最小代价是需求刚开始的时候,越往后成本越大,所以尽量保持目标的简短很重要, 将大的需求,分解成小的冲刺目标,就算在冲刺周期内,也要保持持续交付,持续测试,继续验证的节奏。 如有条件,可以做到每日发布,每日验证。
  4. 沟通在冲刺过程中是非常非常重要的,在冲刺遇到障碍时,大师要及时发现问题,协助成员解决,当发现项目 失控,要想办法将冲刺拉到轨道上来,如有必要,重新评估任务,确认方案细节再重新开始冲刺。
2015-04-17 15:32:00 +0000 UTC

使用tita插件quicktable对单表进行快速增删改查

使用tita插件quicktable对单表进行快速增删改查

简介

quicktable 是tita框架的辅助插件,用来快速完成对单个表进行增删改差的功能。

示例

如何对这张表money_subject 进行增删改查

[抱歉上次服务器没续费图挂了]

最终的查询界面

[抱歉上次服务器没续费图挂了]

实现上面的功能,只需要2个控制器方法,一个显示页面,一个提供数据、操作接口,另外一个view页面

控制器方法

public function actionSubject()
{
    $table=new SearchTable('money_subject');
 
    $table->set_edit_able('parent_type',true);
    $table->set_edit_able('child_type',true);
    $table->set_edit_able('trade_type',true);
    $table->set_edit_able('parent_name',true);
    $table->set_edit_able('child_name',true);
    $table->set_edit_able('desc',true);
    $table->set_edit_able('group',true);
    $table->set_edit_able('status',true);
 
    $table->set_enum('group',['kmoney'=>'现金','coupon'=>'代金券']);
    $table->set_enum('status',['0'=>'关闭','1'=>'正常']);
    $table->set_enum('trade_type',['1'=>'划入','2'=>'划出']);
 
    $this->assign('fields',$table->fields());
    $this->display();
}

quicktable 有两个类,一个SearchTable,用来设置表单的属性,参数。

还有一个是SearchField用来表示单个列的属性,上面的方法将SearchTable中所有的SearchField传递到了fields变量

增删改查ajax接口

public function actionAjaxSubject()
{
    $action = $_GET['action'];
    if (empty($action)) {
        echo json_encode(['Flag' => 101, 'status' => 'n', 'info' => '参数错误','hasError'=>true,'error'=>'参数错误']);
        return;
    }
 
    $table = new SearchTable('money_subject');
 
    if ($action == 'list') {
        $ret = $table->search_from_post();
    } elseif ($action == 'add') {
        $ret = $table->add_from_post();
        if ($ret['hasError']) {
            $ret['error'] = '添加失败';
        }
    } elseif ($action == 'modify') {
        $ret = $table->modify_from_post();
        if ($ret['hasError']) {
            $ret['error'] = '修改失败';
        }
    } elseif ($action == 'del') {
        $ret = $table->del_from_post();
    } else {
        $ret['hasError'] = true;
        $ret['error']    = '非法参数';
    }
    echo json_encode($ret);
}

这个是用来bui来请求数据的接口,基本除了表名,都可以复制粘贴

视图文件

<div class="row">
    <form id="searchForm" class="form-horizontal span24">
        <div class="row">
 
            <?php foreach ($fields as $field): ?>
                <?php if(!$field->search) continue;?>
                <div class="control-group span4">
                    <label class="control-label"><?php echo $field->name;?>:</label>
                    <div class="controls">
                        <input type="text" class="control-text" name="<?php echo $field->field;?>">
                    </div>
                </div>
            <?php endforeach;?>
            <div class="span3 offset2">
                <button  type="button" id="btnSearch" class="button button-primary">搜索</button>
            </div>
        </div>
    </form>
</div>
 
<div id="grid"></div>
 
<script type="text/javascript">
    BUI.use(['common/search','bui/calendar'],function (Search,Calendar) {
 
        var <?php foreach ($fields as $field): ?>
            <?php if(!$field->display) continue;?>
            <?php if(!empty($field->enum)):?>
            <?php echo $field->field;?>EnumObj= <?php echo json_encode($field->enum,JSON_FORCE_OBJECT);?>,
            <?php endif;?>
            <?php endforeach;?>
            editing = new BUI.Grid.Plugins.RowEditing({
                triggerCls : 'btn-edit', //触发编辑的时候不选中行
                autoSave:true
            }),
            columns = [
                <?php foreach ($fields as $field): ?>
                <?php if(!$field->display) continue;?>
                {title:'<?php echo $field->name;?>',dataIndex:'<?php echo $field->field;?>',<?php if($field->width!=0):?>
                    width:<?php echo $field->width;?>,
                    <?php endif;?><?php if($field->editAble):?>
                    <?php if(!empty($field->enum)):?>
                    editor : {xtype :'select',items : <?php echo $field->field;?>EnumObj},
                    <?php else:?>
                    editor : {xtype : 'text',rules:{required:true}},
                    <?php endif;?>
                    <?php endif;?><?php if(!empty($field->enum)):?>
                    renderer:BUI.Grid.Format.enumRenderer(<?php echo $field->field;?>EnumObj),
                    <?php endif;?><?php if($field->renderer!=''):?>
                    renderer:<?php echo $field->renderer;?>,
                    <?php endif;?>},
                <?php endforeach;?>
            ],
            store = Search.createStore('<?php echo \core\Tita::entry();?>?a=AjaxSubject&action=list&type=<?php echo $type;?>',{
                proxy : {
                    save : { //也可以是一个字符串,那么增删改,都会往那么路径提交数据,同时附加参数saveType
                        addUrl : '<?php echo \core\Tita::entry();?>?a=AjaxSubject&action=add&type=<?php echo $type;?>',
                        updateUrl : '<?php echo \core\Tita::entry();?>?a=AjaxSubject&action=modify&type=<?php echo $type;?>',
                        removeUrl : '<?php echo \core\Tita::entry();?>?a=AjaxSubject&action=del&type=<?php echo $type;?>'
                    },
                    method : 'POST'
                },
                remoteSort: true,  // 开启异步排序
                autoSync : true, //保存数据后,自动更新
                pageSize : 10
            }),
            gridCfg = Search.createGridCfg(columns,{
                forceFit: true,
                plugins : [editing,BUI.Grid.Plugins.AutoFit] // 插件形式引入多选表格
            });
 
        var  search = new Search({
                store : store,
                gridCfg : gridCfg
            }),
            grid = search.get('grid'),
            store=search.get('store');
 
 
        function addFunction(){
            var newData = {name : ''};
            store.addAt(newData,0);
            editing.edit(newData,'name'); //添加记录后,直接编辑
        }
 
        //删除操作
        function delFunction(){
            var selections = grid.getSelection();
            delItems(selections);
        }
 
        function delItems(items){
            var ids = [];
            BUI.each(items,function(item){
                ids.push(item.id);
            });
 
            if(ids.length){
                BUI.Message.Confirm('确认要删除选中的记录么?',function(){
                    store.save('remove',{ids : ids});
                },'question');
            }
        }
 
        //监听事件,删除一条记录
        grid.on('cellclick',function(ev){
            var sender = $(ev.domTarget); //点击的Dom
            if(sender.hasClass('btn-del')){
                var record = ev.record;
                delItems([record]);
            }
        });
 
        var datepicker = new Calendar.DatePicker({
            trigger:'.calendar-time',
            showTime:true,
            autoRender : true
        });
 
 
    });
 
 
</script>
</script>

这是一个bui表单搜索页面,前面的searchForm 用来搜索表中的字段

后面是表单的配置,需要该的就是增删改查对应的地址url。

主要变动的地方,就是对field的配置,需要设置字段的名次,是否搜索,是否显示,枚举数据等。

例如设置trade_type的显示,数据库里是1 2,界面里面需要显示划入划出,就在控制器里,加上配置:

$table->set_enum('trade_type',['1'=>'划入','2'=>'划出']);

完整的功能配置,可以直接查看源代码。需要配合tita框架,bui前端框架使用

2015-04-09 11:40:00 +0000 UTC

php-resque 长时间运行 redis cpu占用过高的问题

php-resque 长时间运行 redis cpu占用过高的问题

前些天,公司有台队列服务器,用的是php-resque方案,redis进程cpu占用居高不下,后来到一个核心跑满,系统负载报警多了起来。

本来以为是用这个队列服务的业务大增导致的性能问题,好在能水平拓展,加了一台服务器来一起扛。

神奇的是,新加的服务器cpu使用率在3%以内徘徊,老的服务器cpu使用率依然在50%左右,而访问已经平均分流了。

区别就是老的服务器redis服务跑了大半年了,新的是刚装的。

查看老的redis服务,发现数据居然有好几G,不太正常,因为redis只是用来做存队列数据的,队列完成之后数据应该是删除的,应该只有很小的数据,

进入redis-cli 执行keys * 发现不断跳出类似resque:job:2fee271769ffdca0715f3b45d6ec1005:status的key

这是php-resque用来保存队列任务状态的key,查看php-resque源代码

lib/Resque/Job/Status.php

/**
 * Update the status indicator for the current job with a new status.
 *
 * @param int The status of the job (see constants in Resque_Job_Status)
 */
public function update($status)
{
    if(!$this->isTracking()) {
        return;
    }
 
    $statusPacket = array(
        'status' => $status,
        'updated' => time(),
    );
    Resque::redis()->set((string)$this, json_encode($statusPacket));
 
    // Expire the status for completed jobs after 24 hours
    if(in_array($status, self::$completeStatuses)) {
        Resque::redis()->expire((string)$this, 86400);
    }
}

更新状态的方法中,设置了已经完成的key 1天以后删除

如果key真的是一天过期,那也没有什么问题,只是稍微存多一点,不过这好几g的数据,就有些异常了。

其实redis的过期删除机制是这样的:

第一种,如果有访问这个key,并且key过期,删除,我们队列的数据,程序不会去访问昨天的数据,所以这个机制没法保证我们的队列数据能删除

第二种,抽样过期,每秒十次随机查找20个key,发现过期删除,当找到大于25个key过期之后,继续执行这一过程,详细介绍见 http://redis.io/commands/expire

我们的数据量是非常大,新增非常快的,不知道第二种过期算法,在这样的数据场景下是不是有问题,结果就是运行快半年后,负载异常了。

其实在我们的业务场景中,已经完成的任务是可以直接删除的,所以将php-resque的代码做了修改,将expire直接改成del,这样就没有负载异常的问题了。

/**
 * Update the status indicator for the current job with a new status.
 *
 * @param int The status of the job (see constants in Resque_Job_Status)
 */
public function update($status)
{
    if(!$this->isTracking()) {
        return;
    }
 
    $statusPacket = array(
        'status' => $status,
        'updated' => time(),
    );
    Resque::redis()->set((string)$this, json_encode($statusPacket));
 
    // 直接删除已经完成的任务
    if(in_array($status, self::$completeStatuses)) {
        Resque::redis()->del((string)$this);
    }
}
2015-03-20 09:53:00 +0000 UTC

ripple馅饼最终挣了121块

ripple馅饼最终挣了121块

13年比特币很火的时候,很多山寨币也跟着火起来了。

当时github送ripple活动的时候,领了2000ripple币,一看市价70块。

对这种山寨币是没什么好感的,ripple没比特币那种不增发的物理保证,公司想发多少就发多少,肯定最终圈钱走人。

但是想看看这种东西最终会怎么样,70块也买不了几个鸭脖,于是留了下来没兑换人民币。

一年多过去了,偶然看到比特币的新闻,在政策的封杀下,币坚强最终还是的活了下来,还一千多块钱一个。

想到自己的ripple币,于是跑上去看看,ripple的论坛非常冷清,都没几个活人,感觉这东西应该不长远了,出乎意料的是,我的2000个币,居然还升值了,从70涨到了120,看来这种投机空间还是有的,年化70%,还是很牛的哈哈。

然后yy了自己在30块入比特币,3000块抛出的美好梦境,却被媳妇嘲笑了,就算捂了一年多,捡70%的馅饼,也没他十几天的余额宝挣得多。。。。。。。。。。。

得到的感触就是:信息真的是第一生产力,掌握更多的知识绝对有益处。

没有人不羡慕几块钱入,几千块抛出的那群人,我在接触比特币的时候是10年,试着挖了一下矿,有零点几个币,当时的价格是几十块钱,有很多送0.1个的活动。这应该是公众有小规模接触的时间点,新闻还是很火,那时候比特币有2个几百人的群,成天扯淡,我觉得吵就退了。

后来一路走高,到几百,最终到快7000的高峰,如果我60入,买100个,成本6000,保险点3000出,30w,粗算算好像人生经历一次就已经赚够,可是再想想,如果你对经济一窍不通,对货币政策毫不关注,你能相信小区门口推销保险的能给你挣多少钱回来?你会拿一个月工资去买?何况就算撞到这样的大运还是首付都不够。

在比特币的盛宴中,能挣钱的主要有三类人

  1. 撞大运,这种有,概率极小,试想经常理财买彩票,知识靠新闻的,会在比特币初期发现这个东西?
  2. 经济领域专业人士,在初期根据市场运作规律,做出专业判断,长期持有,后期利用比特币的自由市场,用经济学专业技能,自动交易等挣钱。
  3. 卖矿机的,也是有强大专业背景的人。

所以最终,在这个世界上,最重要的,不是能狠多大心,能走多大运,而是要具备别人没有的知识储备,进而拥有比别人更远的眼光。

keep learning!

2015-03-09 21:50:00 +0000 UTC

life is a voyage into the unknown

life is a voyage into the unknown

经常在想,这个地球上现存的所有人,都终将在消失

就连整个人类,在十亿年之后,也会随着地球的覆灭,不再存在于地球上。

想到这,心中不免悲怆,觉得很多事情都不再有了意义。

对这个世界,我是一个纯消费者,心安理得的享受着整个人类的文明成果,贡献却略近于零。

每天循规蹈矩,按部就班的活着,然后按部就班的死去,这一生还有什么意义。

憧憬人类的未来

可控核聚变,不再向地下挖掘能源,污染环境,直接再造太阳,彻底解决能源问题。

基因技术,人造器官,直到思想与躯体的分离,彻底的晋级高阶文明

星际探索,往更多可能的宇宙深处进发,窥视更大的宇宙原理

可惜我已不能见证。

我拿到一本只有几页纸的武侠小说,开头的精彩已经让我心潮澎湃,激动万分,却找不到下一页。

我的这一生

在大学才真正开始人生,开始思考与选择未来的样子。虽然过得不怎么样,也没有啥成果,却是我最心满意足的开始。

独立的人格,自由的思想,能自由的选择,做自己喜欢做的事情。不做自己不喜欢的事情。

毕业之后几经惶惶,但是一直还在做自己喜欢做的事情,还做过很多不后悔的事情,也算万幸。

生活如此的平淡,平淡的常常让自己忘记要做什么,日复一日的工作,陷入挣钱,缺钱,再更努力挣钱的迷局。

工作娶妻生子房子养老埋葬,一条一眼就能看到未来的路,一条想逃避又不能绕过,又索然无味的路。

人生是一场通向未知的旅程。

在骨子里,人对未知的东西是有强大的探索欲的,但是逃避风险的原始本能经常主宰决策的过程。

所以在选择的时候,人们往往会按确定的流程,别人的经验,来决定自己的行为,只有在看电影等无风险的事情,才会选择未知,刺激的故事。

这在原始社会是没错的,未知就意味着风险与死亡,作死不听酋长的忠告通常会晚上回不了家。

但在现代社会,这些生存风险已经被群体防治,应该是释放更多探索的欲望时候了。

在这个高度分工的社会里,人类更多的是需要创新的价值,而不是生存的价值,所有伟大的发现都是构建在探索上面的。

我是一个普通人,也没有改变世界的梦,更多的是想改变自己,给这个世界带来更多的价值,现在所做的还是太少太少。

to be an explorer,hello world!

专门想象未来的一个网站:

http://futurehumanevolution.com/

2015-03-04 16:23:00 +0000 UTC

现实可以多美好

现实可以多美好

知乎闲逛时发现很暖心的问答,《现实可以多美好》,太多温暖落泪的回复,祝福所有人。

生活本不容易,在这渺小的生命中,可以怀疑,失落,犹豫,难过,孤单很久,也可以没心没肺的傻笑,牵起她的手,告诉她,“就这样牵着走”。

会被甩掉,会被反扣,不过总好过没有经历。

生活不是处处美好,但是向前走吧,少年!一定有让你期望激动欣喜感动的事情在远方。

2015-01-19 19:48:00 +0000 UTC