2015年1月

移动开发工具合集

开发者服务商店: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>