五度空间

今早从中山公园跑步回来的路上突然想到这么一个问题,我们现在所处的世界,六度空间理论还适应么?

六度空间理论指的是:你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个中间人你就能认识到任何一个陌生人,也叫小世界理论。1967年哈佛大学的心理学教授坦利·米尔格拉姆根据这个概念做过一次连锁信件实验,尝试证明平均只需要五个中间人就可以联系任何两个互不相识的美国人。

那还是半个世纪前做的实验,现在随着互联网的发展,人与人之间的连接方式越来越多,连接路径也越来越短,也许五度空间理论甚至以后四度空间理论也会变成现实。
假如我要认识英国女王,我只需要通过阿里的小伙伴,认识到jack.ma,然后通过jack.ma认识英国上层贵族,然后认识英国女王。
假如我要认识非洲的一个小黑妞,我只需要微博上认识一个跟中建几局相关的人,然后就可以认识到非洲本地政府相关的人,进而认识到这个小黑妞。
假如我要认识互联网中一个从业者,嗯,这个就太容易了。


从某一方面讲,互联网的发展可以分为三个阶段。人与人的连接,人与服务的连接,人与物的连接。

以前是人与人的阶段,已经基本结束。QQ、微信、Facebook、WhatsApp等等。但是以后人与人的连接,小范围的,去中心化的,相同特质和爱好等的人与人的连接会继续进行,而且更具活力,是一个以后的发展趋势。如罗辑思维,各种垂直社区。

现在是人与服务的时代,如创业者服务36K、创业邦、缘创派,投资者服务创投圈,开发者服务七牛云存储、开发者工具社区devstore.cn,海底捞,河狸家等等等等,体验经济的时代,服务即体验嘛。

以后将是人与物的时代,物联网,小米智能家居,格力海尔等智能电器,低功耗的局域网通信协议ZigBee,蓝牙也慢慢的走向低功耗了。


创业变得简单,基础服务设施已经搭建好,只要有好的创意和高效的执行力,都可以尝试去创业,或者利用业余时间做一些项目。

边缘创新,从0到1而不是从1到N,不重复造轮子。

Xmind支持Evernote了

xmind_evernote.png

Xmind6激活版才有这个功能。希望有money的童鞋支持正版。
下载地址:XMind Pro 6 v3.5.1 中文专业破解注册版 + 多语言 Multi

操作步骤:

  1. 在xmind首选项里面连接至evernote帐号。
    xmind_step_1.png
  2. 创建编写并保存思维导图文件,然后选择保存到Evernote。
    xmind_step_2.png
  3. 选择要保存的笔记本,点击保存按钮。
    xmind_step_2_2.png
  4. 看到屏幕底部显示成功信息。
    xmind_step_3.png
  5. 打开Evernote软件,点击同步,更新后就可以看到了。

读用面向对象的思维方式来设计数据库之所想

刷微博的时候无意中看到一篇讲用面向对象的思维方式来设计数据库的文章(链接地址),突然想到之前在AILK呆的三年,不论是电信的资源系统还是后来的电信ITSP3.0大类建模,都是基于面向对象的思维方式来设计的数据库啊。

对某一类型资源的管理,抽象出基础和共有的属性作为主表,对于不同子类型的特有属性则放入扩展表进行管理。扩展表可以是横表(进一步抽象子类型共有属性)和纵扩展表,纵扩展表方便扩展,通过增加属性ID的方式可以给不同类型的资源增加属性数据,动态可扩展。模型这样来设计的话,可以节省很多的代码开发量,接口的设计也更加简单。

回顾之前做过的资源系统,觉得还是有点强大的。这个系统的有个特别的地方,在于它的可配置思想。
系统管理部分,系统菜单和权限、界面的显示控件、不同类型资源的显示内容等等一切都是可以配置的,可以快速开发新的功能响应新的需求。
后面ITSP3.0的大类建模思想又在这个基础上更进一步,综合了几个不同公司的系统模型进行统一和优化。现在想想,如果让我来设计有电信这么多复杂业务的系统,我怕是还得修炼几年。

一个系统的架构设计包含它的技术架构和业务架构,资源系统的技术架构没什么特别的地方,数据模型和业务上的设计才是这个系统的精髓。以前身在其中没有多少感受,现在离开AILK后慢慢回想,渐渐的有所收获。

13年的时候华为打了两次电话没去,留在AILK呆满了三年,现在回想起来还是值得的。

附:
各种大型网站技术架构(文章:51CTO)
大型网站技术架构(书籍:豆瓣)

移动开发工具合集

开发者服务商店:DevStore

代码托管:
Github:https://github.com/
GitCafe:https://gitcafe.com/ 基于github的项目托管和协作社区。
Coding:https://coding.net/home.html 云端开发方式,项目协作、代码托管,环境搭建和部署等。

App内测托管:
Fly It Remotely:http://fir.im/ 方便发布应用程序,极大简化App内测的过程。

App测试:
Testin云测:http://www.testin.cn/
百度移动云测试:http://mtc.baidu.com/

App即时通信:
环信:http://www.easemob.com/ 快速为你的App添加聊天通信模块

团队协作:
Worktitle:https://worktile.com/ 试用了一段时间,相当好用。

产品原型设计:
Mockup:https://www.mockplus.cn/app

网站分析:
性能魔方:http://www.mmtrix.com/
阿里测:http://alibench.com/

图片压缩:
腾讯智图:http://zhitu.tencent.com/

浏览器JS和CSS兼容性测试:http://caniuse.com/

蹦跶出一个小身体

run_in_the_city.jpg

不知道什么时候开始,关注健身和健康的时间越来越多,也越来越感受到身体大大不如以往。偶尔和同学喝酒聊天谈谈过去和现在,也经常会提及身体状态,以前篮球可以打满全场,现在来几个三步上篮可能就需要多喘气。

工作三年多,加班尤其多,运动的时间少得可怜,刚毕业那会还会打打篮球赛,现在只能去健身房里锻炼一下或者公园里跑跑步了。
最近慢慢的也在调整,从睡眠到饮食。
如果没有特殊情况,晚上十一点开台灯看看书,刷刷手机,十二点前一定关灯睡觉。
吃饭只吃八分饱,少点些菜就不会因为担心浪费而把它们全部吃掉。
工作保持高效率,减少加班的时间。最近效率的还不错,到点就准时下班,不过他们一个个都加班啊啊啊,华为式的D效率工作模式啊啊啊,感觉好另类啊啊啊,一个人走好像很不够兄弟啊啊啊。

加班到九点十点,回来就十一点,基本都没有时间锻炼或者学习下其他的东西了。第二天效率又不高,事情没干完又要加班,恶性循环。我还是继续我自己的节奏就好,做个锻炼计划,重在实行和坚持。


锻炼计划:

  • 周一至周五:
    早起半个小时,做一小圈体操伸展一下身体,两组俯卧撑。《万有引力》里文章那样,规律和坚持其实是一种了不得的力量。

晚上二十分钟锻炼,囚徒健身六艺十式的简约三氏组合+深蹲三组+健腹轮+俯卧撑,或者HIIT二十分钟。

  • 周六周日:
    中山公园跑步一个小时,素食斋菜。

两个不错的健身微信公众号:

  • 硬派健身:oh-hard
    干货比较多,适合新手学习,徒手训练的知识比较多,家里练习很有效果。
  • 天涯健身:tyyjjs
    有一款Android的健身应用,健身专家,做得相当好,合适经常去健身房锻炼的童鞋。

开发人员自助SQL查询

应用背景:
很多公司项目上线以后,线上环境是由专门的人员去维护的,包括服务器和数据库的配置、操作,开发人员是没有权限登录数据库的。

一个是防止开发人员误操作导致异常情况出现,影响系统运行,因为开发人员多了水平可能参差不齐。
二是线上环境的数据涉及到公司机密,不可泄漏,像电商公司的用户、订单、商品等数据就属于机密,供应链系统的订单、物流、发票数据等等。不给开发人员权限,防止因为人员流动导致公司遭受损失。

问题描述:
但很多时候出现了问题,我们需要查看线上环境的数据来定位问题出现在哪里,这个时候往往是程序代码已经排查没有发现问题,本机环境、镜像环境也都运行正常。
比如A系统定时从B系统获取一部分数据过来,用spring定时器定时执行存过,拉取数据,但上线时候总发现一些数据没有同步过来,查找代码又没有发现问题。这时候如果知道哪部分数据,哪个时间段的数据没有同步过来,就好定位问题了。

解决办法:
出现这种情况一般是申请数据库权限查看线上数据情况,当然还有一种办法,·就是系统前台功能提供一个查询功能的界面,可以让开发人员执行sql查看数据。·其实这个现在已经很普遍了,像支持wordpress程序的后台服务器管理系统,就提供了wordpress相关表的数据查询等操作。

这个功能简单一点就是一个页面,里面有一个查询文本框和查询按钮,然后是一个列表用于展示数据。通过判断sql中前面6个字符是insert还是update、delete、select来调用对应的方法来执行SQL语句。


`当然提供这个功能也是有一定风险的,权限控制很重要。
哪些人哪些帐号可以使用这个功能,是可以增删改查,还是只能简单查询,都需要仔细评估。`

MyBatis之批量增删

mybatis-logo.png

1.创建表和序列

create table USER_INFO
(
id NUMBER(12),
user_name VARCHAR2(40),
password VARCHAR2(40),
status NUMBER(1),
sex NUMBER(1),
age NUMBER(3),
birth_date DATE,
create_date DATE,
version_date DATE
);

create sequence SEQ_USER_INFO
minvalue 1
maxvalue 99999999999999999999
start with 1
increment by 1
cache 20;
数据库表一般都要有数据的生成时间以及修改时间,用于记录数据变动情况。数据是否有效可以通过一个表状态字段来判断,或者加一个数据有效时间的字段。

为什么要说这点,因为现在就遇到了这样的情况,公司的几个后台管理系统,数据模型里都没有这些字段。有时候程序出了问题,熟悉业务流程和逻辑的话只需要看看数据库里面的数据就可以定位问题在哪里,但是如果没有时间参数,有时候就变得有点困难。

2.增、删、改
parameterType可以是HashMap,也可以是自定义的Java Bean。
增:

<select id="insert" parameterType="java.util.HashMap">

<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
    select seq_user_info.nextval from dual
</selectKey>
insert into user_info(id,user_name,password,status,sex,age,birth_date,create_date,version_date)
values(#{id},#{userName},#{password},#{status},#{sex},#{age},#{birthDate},sysdate,sysdate)

</select>
删:

<delete id="delete" parameterType="java.util.HashMap">

delete from user_info where id = #{id}

</delete>
改:

<update id="update" parameterType="java.util.HashMap">

update user_info
   set status = #{status},
    sex = #{sex},
    age = #{age},
    birth_date = #{birthDate},
    version_date = sysdate
 where id = #{id} 

</update>

<update id="updatePassword" parameterType="java.util.HashMap">

update user_info 
   set password = #{password},
       version_date = sysdate
 where id = #{id}

</update>
3.批量增、删
批量新增数据,mysql和oracle因为语法支持不一样,所以略有不同。
mysql:

<insert id="insertBatch" parameterType="java.util.HashMap">

<selectKey keyProperty="id" resultType="java.lang.Integer" order="BEFORE">
    select seq_user_info.nextval from dual
</selectKey>
insert into user_info(id,user_name,password,status,sex,age,birth_date,create_date,version_date)
values
<foreach collection="userList" item="item" index="index" separator=",">
     (#{item.id} id,
      #{item.userName} user_name,
       #{item.password} password,
       #{item.status} status,
       #{item.sex} sex,
       #{item.age} age,
       #{item.birthDate} birth_date,
       #{item.createDate} create_date,
       #{item.versionDate} version_date)
</foreach> 

</insert>
oracle:
oracle不支持values后批量插入,需修改为select + union

<insert id="insertBatch" parameterType="java.util.HashMap">

insert into user_info(id,user_name,password,status,sex,age,birth_date,create_date,version_date)
select seq_user_info.nextval id,t.* from (
<foreach collection="userList" item="item" index="index" separator="union all">
    select #{item.userName} user_name,
            #{item.password} password,
            #{item.status} status,
            #{item.sex} sex,
            #{item.age} age,
            #{item.birthDate} birth_date,
            #{item.createDate} create_date,
            #{item.versionDate} version_date
    from dual
</foreach> 
) t

</insert>
删:
idList是map里面的key值,用map方便以后加参数,比如只能删除不可用的用户

<delete id="deleteBatch" parameterType="java.util.HashMap">

delete from user_info where id in
<foreach item="id" index="index" collection="idList" open="(" separator="," close=")">
    #{id}
</foreach>

</delete>