-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.json
1 lines (1 loc) · 394 KB
/
content.json
1
{"meta":{"title":"简成的博客","subtitle":"城南往事","description":"一个JAVA客技术博客","author":"简成","url":"http://www.icnws.com"},"pages":[{"title":"","date":"2018-03-15T06:27:28.438Z","updated":"2018-03-15T06:27:28.438Z","comments":true,"path":"404.html","permalink":"http://www.icnws.com/404.html","excerpt":"","text":""},{"title":"博客变迁","date":"2016-11-03T14:55:00.000Z","updated":"2018-10-24T02:36:42.621Z","comments":true,"path":"about/index.html","permalink":"http://www.icnws.com/about/index.html","excerpt":"","text":"写在:2016-11-03 最早,大约三年前,用ubuntu 12搭建的博客,wordpress 坚持了一段时间,将博客内容导入开源中国博客 后来更换域名为www.icnws.com,也就是现在的主域名 后来一直想用Java的博客系统,找了很久,SOLO博客逐渐成熟起来,用它重新搭建了博客,几经折腾 因为SOLO的社区不是自己想要的,还是很局限,这时候大多是从自己的微信公号里贴出来文章 突然,有人基于jfinal搞了个博客,赶上公司web框架选型,想用JFinal的,就用它又折腾了一回! 文章更新的不快,偶尔!上个月差点断了! 现在又换回了wordpress,centOS下搭建,因为最近在看一点PHP的东西,世界上最好的开发语言! 更新:2017-08-03 现在又从ECS服务器上迁移到Github上来,一顿折腾! 更新:2018-10-24 这一年断断续续的在其他平台上、博客上写了一些东西,最终发现很折腾,但是真的写的东西很有限。 又到程序员节了,造节运动! 再过几天就是入职中宽华视满一年了,用上了Springboot,做了几个项目,看了很多书。 博客要重新捡起来,继续前行。 谢谢。"},{"title":"友情链接","date":"2017-08-03T15:20:43.000Z","updated":"2018-03-15T06:27:28.503Z","comments":true,"path":"links/index.html","permalink":"http://www.icnws.com/links/index.html","excerpt":"","text":"程序员DD: http://blog.didispace.com泥瓦匠博客: http://www.bysocket.comAny Video: https://www.ictgu.cn周立博客: http://itmuch.com梁桂钊的博客: http://blog.720ui.comChenssy: http://cmsblogs.com吕滔博客: http://www.lvtao.net依云博客: https://blog.lilydjwg.me勺子博客: http://jeepxiaozi.github.io皮皮博客: http://www.heartarea.netVultr优惠码: https://www.vultrclub.com在线做图工具: https://www.processon.com/i/56c57d13e4b0e5041c3baac6城南往事: http://www.icnws.com熊窝窝: http://www.baiyuxiong.com李阳博客: https://blog.liyang.ioSpringForAll社区: http://spring4all.com"},{"title":"categories","date":"2017-08-04T00:30:12.000Z","updated":"2018-03-15T06:27:28.502Z","comments":false,"path":"categories/index.html","permalink":"http://www.icnws.com/categories/index.html","excerpt":"","text":""},{"title":"标签","date":"2017-08-03T14:21:05.000Z","updated":"2018-03-15T06:27:28.503Z","comments":false,"path":"tags/index.html","permalink":"http://www.icnws.com/tags/index.html","excerpt":"","text":""}],"posts":[{"title":"微信小程序调研-web-view的使用","slug":"2018微信小程序调研5","date":"2018-11-27T10:29:05.000Z","updated":"2018-11-27T09:37:17.198Z","comments":true,"path":"2018/2018微信小程序调研5/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研5/","excerpt":"调研内容通过小程序和H5网页数据交互,打通小程序和对应公众号的用户关系","text":"调研内容通过小程序和H5网页数据交互,打通小程序和对应公众号的用户关系 调研结果可以通过互传openId的方式,通过加密字符串的校验,可以实现数据互通,这个数据并不是百分百准确,但是具有一定的可靠性 实例通过组件web-view来实现,属性src,具体代码如下 入口页:有一个确认跳转的弹窗 model/index.js1234567891011121314151617181920212223/** * 生命周期函数--监听页面初次渲染完成 */onReady: function() { //将小程序用户的openId保存 wx.setStorageSync('miniOpenId', '12345656777888'); wx.showModal({ title: '提示', content: '这是一个模态弹窗', success(res) { if (res.confirm) { console.log('用户点击确定') var i = 0; if (i = 1) wx.navigateTo({ url: '/index/index' }) } else if (res.cancel) { console.log('用户点击取消') } } })}, web-view加载页面 index/index.js123456789101112131415161718192021222324252627282930Page({ /** * 页面的初始数据 */ data: { miniOpenId:'', url: '' }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { var that = this; //获取保存的小程序用户openId var miniOpenId = wx.getStorageSync('miniOpenId'); //设置页面加载需要的参数 that.setData({ url: 'https://abc.cn/demo/auth2/code' }); that.setData({ miniOpenId: miniOpenId }); console.log(miniOpenId); }, //接收h5发送的数据 //需要注意,只有在特定时间点才能触发该方法 postMessage(e) { console.log(1) console.log(e.detail.data[0]) console.log(e.detail.data[0].openId) console.log(e.detail.data[0].count) }}) index/index.wxml页面1234567<view class="page-body"> <view class="page-section page-section-gap"> <web-view src="{{url}}?miniOpenId={{miniOpenId}}" bindmessage="postMessage"> <p >请稍等....</p> </web-view> </view></view> 微信授权页面 auth.html,这是在springboot下的thymeleaf页面1234567891011121314151617181920212223242526272829303132333435<!DOCTYPE html><html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" ></meta> <title>WebView测试</title> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <!-- jssdk依赖 --> <script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js" type="application/javascript"></script></head><body><div> <h1 align="center">小程序WebView测试</h1> <div align="center" style="background-color: aquamarine;margin:10px;padding: 10px;width: auto;height: 180px;align-content: center"> <button style="width: 320px;height: 180px;font-size: xx-large" onclick="comeback1()"><h1>原页面</h1></button> <button style="width: 320px;height: 180px;font-size: xx-large" onclick="comeback2()"><h1>重定向</h1></button> </div></div><script th:inline="javascript"> //后端传的openId var openId = [[${openId}]]; console.log(openId); var count = 1; //发送数据到小程序 wx.miniProgram.postMessage({ data: {"openId": openId,"count":count} }) //原路返回 function comeback1() { wx.miniProgram.navigateBack() } //重定向到新页面 function comeback2() { wx.miniProgram.redirectTo({url: '/m2/index'}) }</script></body></html> 代码放到csdn上了,https://download.csdn.net/download/defxino/10811121如果没积分就给我发邮件吧,主题中说明是干嘛的,我会给你发,mailto:[email protected] 里面有很多坑,需要慢慢踩!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序调研-支付的支持","slug":"2018微信小程序调研4","date":"2018-11-06T13:29:05.000Z","updated":"2018-11-06T02:54:01.885Z","comments":true,"path":"2018/2018微信小程序调研4/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研4/","excerpt":"调研内容对支付的支持,有哪些功能?有哪些限制?有没有突破的方法?","text":"调研内容对支付的支持,有哪些功能?有哪些限制?有没有突破的方法? 调研结果小程序支付小程序的支付可以通过APPID绑定已有微信支付或申请微信支付账号,调用小程序相关支付API,完成支付。 小程序内网页支付由于小程序嵌入的网页中,并不是JSSDK的所有API都支持,只支持部分API,而恰恰JSSDK支付不支持,所以还需要绕回到小程序的微信支付两种方式,一种是直接通过网页与小程序的交互完成交互,后端要完成相关账单对接。另一种是通过网页自己服务自己,自己生成相关的支付码,返回给用户,用户通过扫码完成支付,但是这个方案还需要进一步测试。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos7安装Mariadb","slug":"2018Centos7安装Mariadb","date":"2018-11-05T13:19:05.000Z","updated":"2018-11-05T04:43:14.123Z","comments":true,"path":"2018/2018Centos7安装Mariadb/","link":"","permalink":"http://www.icnws.com/2018/2018Centos7安装Mariadb/","excerpt":"概要简单记录在Centos7.3下安装Mariadb 10.3,及简单配置","text":"概要简单记录在Centos7.3下安装Mariadb 10.3,及简单配置 安装Repo设置vim /etc/yum.repos.d/mariadb.repo 写入内容1234567# MariaDB 10.3 CentOS repository list - created 2018-11-05 02:44 UTC# http://downloads.mariadb.org/mariadb/repositories/[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.3/centos7-amd64gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1 如果这里的镜像不满足你的系统需求,可以通过http://downloads.mariadb.org/mariadb/repositories/去选择生成自己系统的镜像配置 安装命令执行命令,等待完成即可 yum -y install MariaDB-server MariaDB-client 系统不同,命令请自行调整。 另,官方镜像下载比较慢,如需切换国内镜像请自己手动调整。 安装完成之后,用 service mysql start 命令进行启动 设置密码执行如下命令并按照步骤设置,初始密码为空,新设置的密码是root的内网访问密码,建议将内网访问密码与外网访问区分开,以防滥用。 mysql_secure_installation 执行完成之后,可以通过 mysql -uroot -p 并输入刚刚设置的密码进行验证密码是否设置成功 配置远程访问通过 mysql -uroot -p 进入数据库,创建用户 create user root@'%' identified by '123456'; 授权所有数据远程访问: grant all privileges on *.* to root@'%' identified by '123456'; 授权所有数据访问并具有授权权限: grant all privileges on *.* to root@'%' identified by '123456' with grant option; 使授权生效: flush privileges; 做好以上几步,可以通过远程客户端链接数据库了。记得打开服务器对应数据库端口的外网访问权限。 更改数据存储目录更改目录前先停掉mysql服务,service mysql stop 备份配置文件 cp /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.bak 增加数据目录 vim /etc/my.cnf.d/server.cnf12[mysqld]datadir=/data/mysql 赋予目录权限 chown -R mysql:mysql /data/mysql 复制数据文件,安装完成后的数据库存储位置是/var/lib/mysql cp -a /var/lib/mysql/* /data/mysql 重新启动mysql服务,即可访问 记录慢sql增加server配置 vim /etc/my.cnf.d/server.cnf12345[mysqld]datadir=/mnt/mysql/dataslow_query_log=onslow_query_log_file=/data/mysql/logs/slow_query_log.loglong_query_time=2 这里一定要创建logs对应的文件夹,设置完成重启服务即可 service mysql restart 特殊字符问题微信昵称、富文本编辑等有特殊字符无法存储的问题,需要数据库支持utf8mb4字符集这里需要注意一下,mysql的utf8字符集并不是我们通常所用的utf8,而是mysql自己定义的一套字符集名字叫utf8,和我们通常所用的utf8字符集对应的是utf8mb4。 增加server配置 vim /etc/my.cnf.d/server.cnf123456[mysqld]datadir=/mnt/mysql/dataslow_query_log=onslow_query_log_file=/data/mysql/logs/slow_query_log.loglong_query_time=2character_set_server=utf8mb4 设置完成重启服务即可 service mysql restart 大小写敏感问题Linux下大小写敏感,可以统一成小写 增加server配置 vim /etc/my.cnf.d/server.cnf1234567[mysqld]datadir=/mnt/mysql/dataslow_query_log=onslow_query_log_file=/data/mysql/logs/slow_query_log.loglong_query_time=2character_set_server=utf8mb4lower_case_table_names = 1 设置完成重启服务即可 到此,安装和配置都完成了。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"Mariadb","slug":"Mariadb","permalink":"http://www.icnws.com/tags/Mariadb/"},{"name":"Mysql","slug":"Mysql","permalink":"http://www.icnws.com/tags/Mysql/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序调研-打开小程序的支持","slug":"2018微信小程序调研3","date":"2018-10-30T15:19:05.000Z","updated":"2018-10-30T11:08:13.846Z","comments":true,"path":"2018/2018微信小程序调研3/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研3/","excerpt":"调研内容对打开小程序、APP的支持,有哪些功能?有哪些限制?有没有突破的方法?","text":"调研内容对打开小程序、APP的支持,有哪些功能?有哪些限制?有没有突破的方法? 调研结果小程序到小程序一个小程序要跳转到另一个小程序,两个小程序必须绑定在同一公众号上,也可以跳回来 同一个小程序最多可以跳转到10个小程序里,这是微信限制,可能后期会逐渐放开 同一个小程序可关联最多500个公众号。 公众号可关联同主体的10个小程序及不同主体的3个小程序。 小程序到APP此功能需要用户主动触发才能打开 APP,所以不由 API 来调用,需要用 open-type 的值设置为 launchApp 的 组件的点击来触发。 虽然可以打开,但是需要做很多工作,而且是特殊场景的使用。APP首先要集成相关SDK,用户通过APP分享消息卡片到微信,然后用户再通过点击消息卡片,进入小程序,通过按钮打开APP.目前看到集成SDK然后进行分享,由原来的分享微信页面改为分享微信小程序,能一定程度上提升用户体验,打开APP的功能还是比较少见。详情参见:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/launchApp.html","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序调研-网页支持","slug":"2018微信小程序调研2","date":"2018-10-25T15:19:05.000Z","updated":"2018-10-30T10:00:07.399Z","comments":true,"path":"2018/2018微信小程序调研2/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研2/","excerpt":"调研内容对网页的支持,有哪些功能?有哪些限制?有没有突破的方法?","text":"调研内容对网页的支持,有哪些功能?有哪些限制?有没有突破的方法? 调研结果小程序必须认证创建了两个小程序,通过对比发现,只有已经通过认证的小程序才可以访问外部网页。 外部网页必须是HTTPS协议在认证过的小程序的设置中可以看到设置业务域名的选项,点击启用后可以配置相关业务域名。业务域名需要先下载并配置验证文件的访问,然后再添加域名并提交修改请求。业务域名一年可以更改50次,有一定限制。 对于老的业务系统可能都是采用http的协议,一种方式,重新部署一份儿,分配一套新的域名,另一种就是做转发,将所有http请求对应的都转发到https上来,一定程度上能解决网址不是https的。 另外https协议收费也比较可观,前期可以通过阿里云、腾讯云平台获得一个免费的HTTPS证书。我们用的是阿里云的,免费期限是一年,等快过期了可以进行更换,阿里云每个账号可以申请20个免费的。 业务域名数量受限每个认证的小程序可以关联20个业务域名,在更改次数限制之下,可以随意改动,只需要保证是https即可。 JSSDK被阉割通过文档:web-view标签 可以看到一些JSSDK的接口,在小程序打开的网页里是不能使用相关的JSSDK方法的。 跳转:小程序可以跳转到网页,也可以跳转回小程序。 微信授权没有问题,已经测过了。 不支持网页自带支付因为JSSDK被阉割的部分包含支付的方法,所以直接通过微信网页的支付功能支付是调不起来对应的微信支付的,具体的解决办法放到支付的调研里进行详细说。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序调研-公众号的支持","slug":"2018微信小程序调研1","date":"2018-10-24T15:19:05.000Z","updated":"2018-10-25T01:38:16.332Z","comments":true,"path":"2018/2018微信小程序调研1/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研1/","excerpt":"调研内容对公众号的支持,有哪些功能?有哪些限制?有没有突破的方法?","text":"调研内容对公众号的支持,有哪些功能?有哪些限制?有没有突破的方法? 调研结果导流最重要的就是导流功能了!导流分两块,一个是小程序导流给公众号、其他小程序、应用网页等。 小程序到公众号小程序是即用即走,推送内容也必须是用户提交表单之后的七天内,如果超出七天,那就很难到达用户。所以如何唤起小程序,如何让用户沉淀下来是业务开发需要解决的一个重点问题。 简单的办法就是引导用户关注公众号,可以通过公众号唤起小程序的使用,同时达到对公众号导流的目的。这个功能需要公众号先进行认证,然后在设置页面的选项里打开相关按钮,当用户进入小程序之后,可以加载对应的关注组件,方便用户关注。这个地方需要注意的是,这个关注的必须是小程序同一主体的公众号,不同主体的不行。 公众号到小程序同一个小程序可以绑定到500个公众号上,需要公众号在管理后台申请并作关联操作,填上小程序的APPID,然后小程序的管理员会收到绑定邀请,审核通过后就绑定完成了。这样操作之后,小程序可以配置在微信公众号的菜单上,可以内嵌到公众号的文章里。前提是小程序必须正式上线了。 用户打通用户打通是另外一个重要功能。微信生态里最重要的之一就是用户数据。什么样的用户数据最有效最有用?能根据用户信息多维度判断一个用户,形成用户画像,完成用户认知。如何使用户更丰满更真实?那就是获取足够多的用户信息,通过不同的数据交叉获得用户的真实行为和偏好。 打通同一主体同一主体的比较好说,直接通过开放平台或者虚拟开放平台将两个账号绑定在一起就可以通过微信的unionId进行账号打通了。 打通不同主体不同主体就比较麻烦,只能是曲线救国。通过跳转的时候传参数、用户标识等,可以将两个关联在同一公众号上的小程序数据打通,然后对应的小程序可以和对应的公众号账号打通。可以在打开微信网页的时候传参数说明是哪个公众号、小程序来的,以此来打通用户。还有一种方式就是通过手机号认证、比对,手机号相同的则视为同一自然人,也是一种办法。这种打通账号的方式可以说一定上突破了微信的限制,但同时这个数据也会存在一些垃圾数据,不准确的情况。 还有其他的内容,今天就先不说了,后面再补充。 今天是1024程序员节呢,祝大家开心快乐有梦想有奔头!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序调研-概述","slug":"2018微信小程序调研0","date":"2018-10-24T10:19:01.000Z","updated":"2018-10-25T01:38:16.331Z","comments":true,"path":"2018/2018微信小程序调研0/","link":"","permalink":"http://www.icnws.com/2018/2018微信小程序调研0/","excerpt":"背景最近公司要做的一些产品想用小程序来做前端,所以做了一些调研。","text":"背景最近公司要做的一些产品想用小程序来做前端,所以做了一些调研。 场景主要用来连接多个公众号和多个应用及服务,在微信生态里,并且这些公众号很可能不是同一主体,服务有各种各样的形式。通过小程序可以打通多个小程序,以及其他微信网页服务、非微信网页服务,甚至可以打开APP,APP也可以打开小程序 所以,微信小程序比网页接入微信JSSDK要强大不少,而且在体验方面也会成为一个亮点。 调研内容 公众号的支持 打开微信网页的支持 打开小程序的支持 支付的支持","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"使用npm小技巧","slug":"2018使用npm小技巧","date":"2018-10-24T10:18:05.000Z","updated":"2018-10-25T01:38:16.330Z","comments":true,"path":"2018/2018使用npm小技巧/","link":"","permalink":"http://www.icnws.com/2018/2018使用npm小技巧/","excerpt":"背景使用npm经常会遇到加载某个依赖加载不了,所以需要用国内的淘宝镜像 然而,将npm改成cnpm是极不习惯的,所以看到nrm就赶紧记下来了,极是好用!","text":"背景使用npm经常会遇到加载某个依赖加载不了,所以需要用国内的淘宝镜像 然而,将npm改成cnpm是极不习惯的,所以看到nrm就赶紧记下来了,极是好用! 安装使用安装nrmnpm install nrm -g --registry=https://registry.npm.taobao.org 查看镜像nrm ls 结果如下1234567* npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/ taobao - https://registry.npm.taobao.org/ nj ----- https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn/ npmMirror https://skimdb.npmjs.com/registry/ edunpm - http://registry.enpmjs.org/ 使用镜像nrm use taobao 通过命令nrm ls可以看到,镜像已经是taobao了1234567 npm ---- https://registry.npmjs.org/ cnpm --- http://r.cnpmjs.org/* taobao - https://registry.npm.taobao.org/ nj ----- https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn/ npmMirror https://skimdb.npmjs.com/registry/ edunpm - http://registry.enpmjs.org/ 接下来就可以正常用npm安装依赖了,都很方便。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"NPM","slug":"NPM","permalink":"http://www.icnws.com/tags/NPM/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"一图分析小程序-人民社区lite","slug":"2018一图分析小程序-人民社区lite","date":"2018-10-24T02:19:05.000Z","updated":"2018-10-25T01:38:16.330Z","comments":true,"path":"2018/2018一图分析小程序-人民社区lite/","link":"","permalink":"http://www.icnws.com/2018/2018一图分析小程序-人民社区lite/","excerpt":"简介对小程序-人民社区lite的前后端进行了简单的分析","text":"简介对小程序-人民社区lite的前后端进行了简单的分析 思维导图","categories":[{"name":"产品","slug":"产品","permalink":"http://www.icnws.com/categories/产品/"}],"tags":[{"name":"Wechat","slug":"Wechat","permalink":"http://www.icnws.com/tags/Wechat/"},{"name":"MiniProgram","slug":"MiniProgram","permalink":"http://www.icnws.com/tags/MiniProgram/"}],"keywords":[{"name":"产品","slug":"产品","permalink":"http://www.icnws.com/categories/产品/"}]},{"title":"使用阿里云RAM的子账号管理MQ服务","slug":"152-using-aliyun-mq","date":"2017-12-27T11:31:30.000Z","updated":"2018-03-15T06:27:28.452Z","comments":true,"path":"2017/152-using-aliyun-mq/","link":"","permalink":"http://www.icnws.com/2017/152-using-aliyun-mq/","excerpt":"","text":"登录Aliyun主账号,进入访问控制页面,点击【用户管理】,选择右上角的【新建用户】 创建完成后【管理】用户,找到用户AccessKey那一列,选择创建AccessKey并将相关参数保存,结果如下:这个参数在后面访问MQ服务的时候会用到。 授权用户使用mq的权限,如下图: 开启中间件消息队列服务(MQ),创建Topic并申请发布,申请订阅,定义好对应的标识。基本流程如下: 接下来就是按照对应Producer、Consumer集成方式和接入点进行接入,完成基本配置了。如果所有的你都做了,最后一步授权忘了做,这很可能无法接入,会报错。12345Exception in thread "main" com.aliyun.openservices.ons.api.exception.ONSClientException: Receive a broker exception, Topi=kaoshi, msgId=null, com.aliyun.openservices.ons.api.impl.authority.exception.AuthenticationException: valid resource owner failed. maybe the resource kaoshi not created, com.alibaba.ons.open.auth.validator.PermissionValidator.check(PermissionValidator.java:66)See http://docs.aliyun.com/cn#/pub/ons/faq/exceptions&broker_response_exception for further details. at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.checkProducerException(ProducerImpl.java:198) at com.aliyun.openservices.ons.api.impl.rocketmq.ProducerImpl.send(ProducerImpl.java:107) at com.ksxing.tmp.MqTest.main(MqTest.java:38) 话说回来,要想相对安全的使用阿里云,真的要好好研究一下这个RAM授权机制,所以有时间还得巴拉巴拉文章!https://ram.console.aliyun.com 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Aliyun-RAM","slug":"Aliyun-RAM","permalink":"http://www.icnws.com/tags/Aliyun-RAM/"},{"name":"MQ","slug":"MQ","permalink":"http://www.icnws.com/tags/MQ/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Boot Actuator显示更多信息","slug":"151-spring-boot-actuator-more-info","date":"2017-09-15T11:31:30.000Z","updated":"2018-03-15T06:27:28.451Z","comments":true,"path":"2017/151-spring-boot-actuator-more-info/","link":"","permalink":"http://www.icnws.com/2017/151-spring-boot-actuator-more-info/","excerpt":"","text":"通过http://localhost:8100/health 访问监控信息发现只有有限的信息,如下: 1234{ "description": "Spring Cloud Eureka Discovery Client", "status": "UP"} 只展示了注册中心Eureka的信息。 经过阅读文档发现,新版本当中,actuator增加了安全机制,需要在配置文件中添加参数: 123management: security: enabled: false 默认为true,需要校验权限才能访问/env、/mappings、 /beans,这里关闭后重新启动就可以看到很多health 的信息了。更多配置需要参考:https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/#production-ready 访问http://localhost:8100/health 获得如下数据: 123456789101112131415161718192021222324252627282930313233343536{ "description": "Spring Cloud Eureka Discovery Client", "status": "UP", "discoveryComposite": { "description": "Spring Cloud Eureka Discovery Client", "status": "UP", "discoveryClient": { "description": "Spring Cloud Eureka Discovery Client", "status": "UP", "services": [ "itmuch-customer-movie", "itmuch-provider-user" ] }, "eureka": { "description": "Remote status from Eureka server", "status": "UP", "applications": { "ITMUCH-CUSTOMER-MOVIE": 1, "ITMUCH-PROVIDER-USER": 1 } } }, "diskSpace": { "status": "UP", "total": 164282499072, "free": 151694168064, "threshold": 10485760 }, "refreshScope": { "status": "UP" }, "hystrix": { "status": "UP" }} 更多参数设置参考:https://segmentfault.com/a/1190000004318360?_ea=568366 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Spring Boot","slug":"Spring-Boot","permalink":"http://www.icnws.com/tags/Spring-Boot/"},{"name":"Actuator","slug":"Actuator","permalink":"http://www.icnws.com/tags/Actuator/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"搭建一个Eureka的集群","slug":"150-simple-eureka-ha","date":"2017-09-13T11:31:30.000Z","updated":"2018-03-15T06:27:28.451Z","comments":true,"path":"2017/150-simple-eureka-ha/","link":"","permalink":"http://www.icnws.com/2017/150-simple-eureka-ha/","excerpt":"","text":"根据周立的Spring Cloud & Docker那本书学习Eureka集群搭建,含实例代码 版本如下: Spring Boot 1.5.6.RELEASE Spring Cloud Camden.SR7 JDK 1.8 配置Eureka Server配置pom.xml1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sss</groupId> <artifactId>itmuch-discovery-eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>itmuch-discovery-eureka</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Camden.SR7</spring-cloud.version> </properties> <dependencies> <!--Eureka注册中心--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> 配置application.yml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748spring: application: name: itmuch-discovery-eureka profiles: active: peer1 #创建3个项目分别peer2,peer3---server: port: 8762eureka: client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/ instance: hostname: peer2 server: enable-self-preservation: falsespring: profiles: peer2---server: port: 8761eureka: client: service-url: defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/ instance: hostname: peer1 server: enable-self-preservation: falsespring: profiles: peer1---server: port: 8763eureka: client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/ instance: hostname: peer3 server: enable-self-preservation: falsespring: profiles: peer3 注意这里: 12server: enable-self-preservation: false 增加这个参数后的Eureka Server将关闭自我保护机制,这个机制在线上一般不是这样极端的关闭,而是通过调整阀值,这里为了测试服务是否能正常注销故意关闭的。如果不关闭,Eureka虽然发现服务down掉了,但是因为服务是单点的,所以会保留实例的注册记录在表内,参考我在http:///Spring4all.com 提的问题:http://spring4all.com/question/446 修改HOST增加: 1127.0.0.1 peer1 peer2 peer3 调整Application.java123456789101112import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublic class ItmuchDiscoveryEurekaApplication { public static void main(String[] args) { SpringApplication.run(ItmuchDiscoveryEurekaApplication.class, args); }} 配置完成上边这些,项目名称分别是itmuch-discovery-eureka,itmuch-discovery-eureka-ha,itmuch-discovery-eureka-ha2,然后在IDE里启动即可 创建服务并注册创建Provider User服务参考项目itmuch-provider-user项目, 配置pom.xml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sss</groupId> <artifactId>itmuch-provider-user</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>itmuch-provider-user</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 健康检查 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 注册服务 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> 配置Application.java123456789101112import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 配置application.yml12345678910111213141516171819202122232425262728293031323334353637server: port: 8000spring: application: name: itmuch-provider-user jpa: generate-ddl: false show-sql: true hibernate: ddl-auto: none datasource: # 指定数据源 platform: h2 # 指定数据源类型 schema: classpath:schema.sql # 指定h2数据库的建表脚本 data: classpath:data.sql # 指定h2数据库的数据脚本logging: # 配置日志级别,让hibernate打印出执行的SQL level: root: INFO org.hibernate: INFO org.hibernate.type.descriptor.sql.BasicBinder: TRACE org.hibernate.type.descriptor.sql.BasicExtractor: TRACE#监控的信息配置 http://{host}:{port}/infoinfo: app: name: @project.artifactId@ encoding: @project.build.sourceEncoding@ java: source: @java.version@ target: @java.version@#注册服务eureka: client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/ instance: prefer-ip-address: true 创建配置完成后启动服务,刷新Eureka的页面即可看到对应服务已经存在。 创建Customer Movie服务该服务调用Provider User服务,参考项目itmuch-customer-movie. 配置pom.xml1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sss</groupId> <artifactId>itmuch-consumer-movie</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>itmuch-consumer-movie</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.cloud.version>Camden.SR7</spring.cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project> 配置Application.java12345678910111213141516171819import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@EnableDiscoveryClient@SpringBootApplicationpublic class Application { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 配置application.yml1234567891011121314151617181920212223242526272829server: port: 8100spring: application: name: itmuch-customer-movielogging: # 配置日志级别,让hibernate打印出执行的SQL level: root: INFO org.hibernate: INFO org.hibernate.type.descriptor.sql.BasicBinder: TRACE org.hibernate.type.descriptor.sql.BasicExtractor: TRACE#监控的信息配置 http://{host}:{port}/infoinfo: app: name: @project.artifactId@ encoding: @project.build.sourceEncoding@ java: source: @java.version@ target: @java.version@#注册服务eureka: client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/ instance: prefer-ip-address: true 创建配置完成后启动服务,刷新Eureka的页面即可看到对应服务已经存在。 至此:一个简单的Eureka服务已经搭建完成了,下面附送源码,可以直接在github上下载下来运行。 附件传送门:https://github.com/icnws/eureka-simple-ha-demo 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Spring Cloud","slug":"Spring-Cloud","permalink":"http://www.icnws.com/tags/Spring-Cloud/"},{"name":"Eureka","slug":"Eureka","permalink":"http://www.icnws.com/tags/Eureka/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"在Centos7中安装Nodejs服务","slug":"149-nodejs-in-centos7","date":"2017-09-07T11:31:30.000Z","updated":"2018-03-15T06:27:28.450Z","comments":true,"path":"2017/149-nodejs-in-centos7/","link":"","permalink":"http://www.icnws.com/2017/149-nodejs-in-centos7/","excerpt":"","text":"博客迁移到github之后,阿里云服务器闲置了,现在折腾一下,把博客同步到阿里云服务器 集成工具安装由于是新的系统,需要执行安装一些常用的软件: yum -y install gcc make gcc-c++ openssl-devel wget 安装Nodejs执行如下命令: 1yum install nodejs 遇到问题: 123456Error: Package: 1:nodejs-6.11.1-1.el7.x86_64 (epel) Requires: libhttp_parser.so.2()(64bit)Error: Package: 1:nodejs-6.11.1-1.el7.x86_64 (epel) Requires: http-parser >= 2.7.0 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest 解决办法参考:https://github.com/Icinga/icinga-vagrant/issues/87 1yum -y install https://opensource.enda.eu/packages/http-parser-2.7.1-3.el7.x86_64.rpm 再次执行yum install nodejs可以正常运行,安装完成,检查node版本 1234[root@xx xx]# node -vv6.11.1[root@xx xx]# npm -v3.10.10 至此,安装完成,可以正常使用了! 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"Nodejs","slug":"Nodejs","permalink":"http://www.icnws.com/tags/Nodejs/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"在docker中安装Mariadb","slug":"148-mariadb-in-docker","date":"2017-09-06T11:31:30.000Z","updated":"2018-03-15T06:27:28.450Z","comments":true,"path":"2017/148-mariadb-in-docker/","link":"","permalink":"http://www.icnws.com/2017/148-mariadb-in-docker/","excerpt":"","text":"简单使用Docker下安装Mariadb服务,基于Boot2Docker在windows下实现 Boot2Docker的安装参考上一篇在docker中安装redis 的前半部分 下载Mariadb镜像用docker pull mariadb下载最新的mariadb镜像 下载镜像会慢一些,需要等待,完成之后,通过docker images命令就可以看到了。 123REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEredis latest b77605993f64 6 weeks ago 105.9 MBmariadb latest b77605991234 9 weeks ago 375.9 MB 启动服务运行容器1docker run --name test-mariadb -e MYSQL_ROOT_PASSWORD=123456 -d mariadb docker命令 run 用–name指定容器的别名,mariadb是指容器的名称MYSQL_ROOT_PASSWORD指定ROOT用户的密码 端口映射1:docker 和虚拟机映射 将虚拟机的3306端口和docker的3306端口映射,port-mariadb是名称 1docker run -d -p 3306:3306 --name port-mariadb -e MYSQL_ROOT_PASSWORD=123456 -d mariadb 端口映射2:虚拟机和本机映射 打开VirtualBox找到boot2docker的虚拟机,打开设置、网络,找到【端口转发】,添加一条规则,宿主机3305和虚拟机的3306映射,如下 启动服务:这里需要启动两个服务,一个是mariadb本身的服务——test-mariadb,一个是docker和虚拟机映射服务——port-mariadb,启动方式如下123docker start test-mariadbdocker start port-mariadb 通过docker ps -a可以看到服务已经运行了1234$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3190d98286d0 mariadb "docker-entrypoint.sh" 22 minutes ago Up 22 minutes 0.0.0.0:3306->3306/tcp port-mariadbce4e5c5cee70 mariadb "docker-entrypoint.sh" 43 minutes ago Up 26 minutes 3306/tcp test-mariadb 至此,就可以通过宿主机本地的Sql客户端工具,配置127.0.0.1的3305端口进行访问了。参考:https://mariadb.com/kb/en/the-mariadb-library/installing-and-using-mariadb-via-docker/ 另外附上自己写的docker下启动服务的脚本,每次启动docker后手动启动多麻烦123456# start servicesdocker start test-redisdocker start port-redisdocker start test-mariadbdocker start port-mariadb#end start 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Docker","slug":"Docker","permalink":"http://www.icnws.com/tags/Docker/"},{"name":"Mariadb","slug":"Mariadb","permalink":"http://www.icnws.com/tags/Mariadb/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"在docker中安装Redis","slug":"147-redis-in-docker","date":"2017-09-05T11:31:30.000Z","updated":"2018-03-15T06:27:28.449Z","comments":true,"path":"2017/147-redis-in-docker/","link":"","permalink":"http://www.icnws.com/2017/147-redis-in-docker/","excerpt":"","text":"简单使用Docker下安装Redis服务,基于Boot2Docker在windows下实现 下载软件当前环境是Windows 7,所以采用Docker的Windows安装版——Boot2Docker,官网如下: http://boot2docker.io/ 下载地址(Github)如下: https://github.com/boot2docker/windows-installer/releases/download/v1.8.0/docker-install.exe 安装一路Next,全选(如果已经安装了Git客户端,这里就不用选择最后一项MSYS-git Unix tools了)、安装驱动,安装完成后会在桌面出现一个virtualBox的标,一个Docker的标,重启即可 启动后双击Docker的图标,发现用sublimeText打开了,实际上是一个.sh文件,只好在git的命令行界面来执行,./start.sh 执行后会显示执行boot2docker的一系列初始化动作,生成密钥,配置,启动VM,分配IP等动作,执行完成后会显示“You can use ‘docker‘ …’’”的字样。这时候,我们在下面键入docker命令,会提示docker的相关命令提示,至此,docker的基本准备工作已经完成,打开VirtualBox会看到一个boot2docker的虚拟机在运行 下载Redis镜像用docker images查看当前所拥有的docker镜像 用docker search keywords搜索通过关键词指定的镜像 用docker ps -a查看当前运行的服务 12CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES436284456b5a redis "docker-entrypoint.sh" 45 minutes ago Up 45 minutes 6379/tcp test-redis 用docker pull redis下载最新的redis镜像 下载镜像会慢一些,需要等待,完成之后,通过docker images命令就可以看到了。 12REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEredis latest b77605993f64 6 weeks ago 105.9 MB 启动服务运行容器1docker run --name test-redis redis docker命令 run 用–name指定容器的别名,redis是指容器的名称 端口映射1:docker 和虚拟机映射 将虚拟机的6378端口和docker的6379端口映射,port-redis是名称 1docker run -d -p 6378:6379 --name port-redis redis 端口映射2:虚拟机和本机映射 打开VirtualBox找到boot2docker的虚拟机,打开设置、网络,找到【端口转发】,添加一条规则,宿主机6378和虚拟机的6378映射,如下 启动服务:这里需要启动两个服务,一个是redis本身的服务——test-redis,一个是docker和虚拟机映射服务——port-redis,启动方式如下123docker start test-redisdocker start port-redis 通过docker ps -a可以看到服务已经运行了1234$ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe00ff120ecb1 redis "docker-entrypoint.sh" 16 hours ago Up 44 seconds 0.0.0.0:6378->6379/tcp port-redis436284456b5a redis "docker-entrypoint.sh" 16 hours ago Up About a minute 6379/tcp test-redis 至此,就可以通过宿主机本地的RDM(Redis Desktop Manager)配置127.0.0.1的6378端口进行访问了。 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Redis","slug":"Redis","permalink":"http://www.icnws.com/tags/Redis/"},{"name":"Docker","slug":"Docker","permalink":"http://www.icnws.com/tags/Docker/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Boot整合Reids","slug":"146-spring-boot-with-redis","date":"2017-08-31T04:31:30.000Z","updated":"2018-03-15T06:27:28.449Z","comments":true,"path":"2017/146-spring-boot-with-redis/","link":"","permalink":"http://www.icnws.com/2017/146-spring-boot-with-redis/","excerpt":"","text":"终于还是用了Spring Boot,主要跑定时任务。上一次写的那个定时任务就是要用的。这次主要是在定时任务中更新缓存(Redis)数据。 添加依赖当前版本是SpringBoot 1.5.4.RELEASE 12345<!-- Redis --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> 这里只需要添加这一个依赖就好了,点进去可以看到相关依赖的信息:1234567891011121314<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency></dependencies> 调整配置 application.properties增加参数 12345678910111213141516171819# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=m7ua80gbm7cdm# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=10# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=10000# 连接池中的最大空闲连接spring.redis.pool.max-idle=200# 连接池中的最小空闲连接spring.redis.pool.min-idle=3# 连接超时时间(毫秒)spring.redis.timeout=6000 使用12345import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.StringRedisTemplate;@Autowiredprivate StringRedisTemplate stringRedisTemplate; 然后通过这个类操作Redis,通过阅读源码我们发现,该类是RedisTemplate的子类,具有以下数据操作对象:1234567 // cache singleton objects (where possible)private ValueOperations<K, V> valueOps;//操作String类型的键值private ListOperations<K, V> listOps;//操作List集合类型的键值private SetOperations<K, V> setOps;//操作Set集合类型的键值private ZSetOperations<K, V> zSetOps;//操作有序Set集合类型的键值private GeoOperations<K, V> geoOps;//操作GEO类型的键值private HyperLogLogOperations<K, V> hllOps;//这个没有关注 比如操作String类型的键值可以:stringRedisTemplate.opsForValue().set(key,value);操作Zset集合类型的键值可以:stringRedisTemplate.opsForZSet().add(key,value,double); 这里需要注意,不要使用import org.springframework.data.redis.core.RedisTemplate;这个类,虽然上面的StringRedisTemplate是其子类,但是它操作的redis数据会产生一些额外的二进制数值,如果其他项目读取该数据会略有不便。 简单记录,有待深入挖坑!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Spring Boot","slug":"Spring-Boot","permalink":"http://www.icnws.com/tags/Spring-Boot/"},{"name":"Redis","slug":"Redis","permalink":"http://www.icnws.com/tags/Redis/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Boot整合Quartz实现定时任务表配置","slug":"145-spring-boot-quartz-editable","date":"2017-08-26T02:31:30.000Z","updated":"2018-03-15T06:27:28.449Z","comments":true,"path":"2017/145-spring-boot-quartz-editable/","link":"","permalink":"http://www.icnws.com/2017/145-spring-boot-quartz-editable/","excerpt":"","text":" 最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务。需求就是,当项目启动的时候,如果有定时任务则加载进来,生成scheduler,通过后台表配置可以随时更新定时任务状态(启动、更改、删除)。 添加依赖1234567891011<!-- spring's support for quartz --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId></dependency><!--quartz--><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version></dependency> 一个是Spring框架的支持,一个是Quartz的依赖,有的博客会加上quartz-jobs,在当前示例中没有用到,这里不做添加。 调整配置 application.properties增加参数 12#quartz enabled 设置在当前项目是否运行quartz定时任务quartz.enabled=true 增加quartz配置文件quartz.properties 12345# thread-poolorg.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount=2# job-storeorg.quartz.jobStore.class=org.quartz.simpl.RAMJobStore 这些参数可以不设置,有一些默认值,threadCount的默认值是10,spring mvc下定时任务的默认值是1,所以如果某个定时任务卡住了,肯会影响其后的多个定时任务的执行。 任务表配置 Entity 实体类,这里是JobConfig,这里没有做过多的设计,只是实现了cron类型的定时任务及任务状态,fullEntity是执行任务的类全名,如我们用的com.example.demo.jobs.MyJob 1234567891011121314151617181920212223242526272829import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import java.util.Date;/** * Created by Administrator on 2017/8/25. */@Entity@Data@AllArgsConstructor@NoArgsConstructorpublic class JobConfig { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; private String fullEntity; private String groupName; private String cronTime; private Integer status; private Date createAt; private Date updateAt;} 代码没有set/get是因为使用了lombok,@Data注解实现set/get/toString等工作 Repository 这里主要是定义了一个根据定时任务状态获取对应的定时任务的方法,JobConfigRepository 1234567891011import com.example.demo.dto.JobConfig;import org.springframework.data.jpa.repository.JpaRepository;import java.util.List;/** * Created by Administrator on 2017/8/25. */public interface JobConfigRepository extends JpaRepository<JobConfig, Integer> { List<JobConfig> findAllByStatus(int status);} Service 调用Repository的方法,提供查询,JobConfigService 12345678910111213141516171819import com.example.demo.dto.JobConfig;import com.example.demo.repositories.JobConfigRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * Created by Administrator on 2017/8/25. */@Servicepublic class JobConfigService { @Autowired private JobConfigRepository jobConfigRepository; public List<JobConfig> findAllByStatus(Integer status) { return jobConfigRepository.findAllByStatus(status); }} 添加自动注入支持源于https://gist.github.com/jelies/5085593的解决方案,解决的问题就是在org.quartz.Job的子类里无法直接使用Service等依赖,具体如下: 123456789101112131415161718192021222324252627282930import org.quartz.spi.TriggerFiredBundle;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.AutowireCapableBeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.scheduling.quartz.SpringBeanJobFactory;/** * Adds auto-wiring support to quartz jobs. * @see "https://gist.github.com/jelies/5085593" */public final class AutoWiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { beanFactory = applicationContext.getAutowireCapableBeanFactory(); } @Override protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); beanFactory.autowireBean(job); return job; }} Scheduler工具类实现Scheduler的增删改功能以及JobDetail、CronTrigger的创建,需要注意,这里的数据都是源于JobConfig这个表,name是FullEntity+Id拼接而成的。具体看代码可知: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186import com.example.demo.config.AutoWiringSpringBeanJobFactory;import com.example.demo.dto.JobConfig;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;import org.springframework.context.ApplicationContext;import org.springframework.core.io.ClassPathResource;import org.springframework.scheduling.quartz.CronTriggerFactoryBean;import org.springframework.scheduling.quartz.JobDetailFactoryBean;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import java.text.ParseException;public class SchedulerUtil { //定时任务Scheduler的工厂类,Quartz提供 private static StdSchedulerFactory schedulerFactory = new StdSchedulerFactory(); //CronTrigger的工厂类 private static CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean(); //JobDetail的工厂类 private static JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); //自动注入Spring Bean的工厂类 private static AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory(); //定时任务Scheduler的工厂类,Spring Framework提供 private static SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); static { //加载指定路径的配置 schedulerFactoryBean.setConfigLocation(new ClassPathResource("quartz.properties")); } /** * 创建定时任务,根据参数,创建对应的定时任务,并使之生效 * @param config * @param context * @return */ public static boolean createScheduler(JobConfig config, ApplicationContext context) { try { //创建新的定时任务 return create(config, context); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 删除旧的定时任务,创建新的定时任务 * @param oldConfig * @param config * @param context * @return */ public static Boolean modifyScheduler(JobConfig oldConfig,JobConfig config, ApplicationContext context) { if (oldConfig == null || config == null || context == null) { return false; } try { String oldJobClassStr = oldConfig.getFullEntity(); String oldName = oldJobClassStr + oldConfig.getId(); String oldGroupName = oldConfig.getGroupName(); //1、清除旧的定时任务 delete(oldName, oldGroupName); //2、创建新的定时任务 return create(config, context); } catch (SchedulerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 提取的删除任务的方法 * @param oldName * @param oldGroupName * @return * @throws SchedulerException */ private static Boolean delete(String oldName, String oldGroupName) throws SchedulerException { TriggerKey key = new TriggerKey(oldName, oldGroupName); Scheduler oldScheduler = schedulerFactory.getScheduler(); //根据TriggerKey获取trigger是否存在,如果存在则根据key进行删除操作 Trigger keyTrigger = oldScheduler.getTrigger(key); if (keyTrigger != null) { oldScheduler.unscheduleJob(key); } return true; } /** * 提取出的创建定时任务的方法 * @param config * @param context * @return */ private static Boolean create(JobConfig config, ApplicationContext context) { try { //创建新的定时任务 String jobClassStr = config.getFullEntity(); Class clazz = Class.forName(jobClassStr); String name = jobClassStr + config.getId(); String groupName = config.getGroupName(); String description = config.toString(); String time = config.getCronTime(); JobDetail jobDetail = createJobDetail(clazz, name, groupName, description); if (jobDetail == null) { return false; } Trigger trigger = createCronTrigger(jobDetail, time, name, groupName, description); if (trigger == null) { return false; } jobFactory.setApplicationContext(context); schedulerFactoryBean.setJobFactory(jobFactory); schedulerFactoryBean.setJobDetails(jobDetail); schedulerFactoryBean.setTriggers(trigger); schedulerFactoryBean.afterPropertiesSet(); Scheduler scheduler = schedulerFactoryBean.getScheduler(); if (!scheduler.isShutdown()) { scheduler.start(); } return true; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SchedulerException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return false; } /** * 根据指定的参数,创建JobDetail * @param clazz * @param name * @param groupName * @param description * @return */ public static JobDetail createJobDetail(Class clazz, String name, String groupName, String description) { jobDetailFactory.setJobClass(clazz); jobDetailFactory.setName(name); jobDetailFactory.setGroup(groupName); jobDetailFactory.setDescription(description); jobDetailFactory.setDurability(true); jobDetailFactory.afterPropertiesSet(); return jobDetailFactory.getObject(); } /** * 根据参数,创建对应的CronTrigger对象 * * @param job * @param time * @param name * @param groupName * @param description * @return */ public static CronTrigger createCronTrigger(JobDetail job, String time, String name, String groupName, String description) { factoryBean.setName(name); factoryBean.setJobDetail(job); factoryBean.setCronExpression(time); factoryBean.setDescription(description); factoryBean.setGroup(groupName); try { factoryBean.afterPropertiesSet(); } catch (ParseException e) { e.printStackTrace(); } return factoryBean.getObject(); }} Scheduler初始化配置通过Spring Boot的@Configuration及@ConditionalOnExpression(“‘${quartz.enabled}’==’true’”)实现初始化时是否加载项目的定时任务——SchedulerConfig,这里的参数quartz.enabled的值即是我们上面在配置文件里配置的。代码如下: 1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.example.demo.config;import com.example.demo.dto.JobConfig;import com.example.demo.service.JobConfigService;import com.example.demo.util.SchedulerUtil;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration@ConditionalOnExpression("'${quartz.enabled}'=='true'")public class SchedulerConfig { Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private ApplicationContext applicationContext; @Autowired private JobConfigService jobConfigService; @Bean public StdSchedulerFactory stdSchedulerFactory() { StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory(); //获取JobConfig集合 List<JobConfig> configs = jobConfigService.findAllByStatus(1); logger.debug("Setting the Scheduler up"); for (JobConfig config : configs) { try { Boolean flag = SchedulerUtil.createScheduler( config, applicationContext); System.out.println("执行结果:" + (flag == true ? "成功" : "失败")); } catch (Exception e) { e.printStackTrace(); } } return stdSchedulerFactory; }} Job实现这里定义了一个简单的Job继承org.quartz.Job,主要是查询当前的定时任务表配置数据,MyJob,具体代码如下: 1234567891011121314151617181920212223242526272829303132package com.example.demo.jobs;import com.example.demo.dto.JobConfig;import com.example.demo.service.JobConfigService;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;@Componentpublic class MyJob implements Job { @Autowired private JobConfigService jobConfigService; public void execute(JobExecutionContext context) { System.out.println(); System.out.println(); //是哪个定时任务配置在执行,可以看到,因为在前面我们将描述设置为了配置类的toString结果 System.out.println(context.getJobDetail().getDescription()); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(this.toString() + ":" + f.format(new Date()) + "正在执行Job executing..."); List<JobConfig> configs = jobConfigService.findAllByStatus(1); for (JobConfig config : configs) { System.out.println(config.toString()); } }} 数据库表job_config 表创建 1234567891011121314CREATE TABLE `job_config` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `create_at` DATETIME DEFAULT NULL, `cron_time` VARCHAR(255) DEFAULT NULL, `full_entity` VARCHAR(255) DEFAULT NULL, `group_name` VARCHAR(255) DEFAULT NULL, `name` VARCHAR(255) DEFAULT NULL, `status` INT(11) DEFAULT NULL, `update_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8; 表数据 12345/*Data for the table `job_config` */INSERT INTO `job_config` (`id`, `create_at`, `cron_time`, `full_entity`, `group_name`, `name`, `status`, `update_at`)VALUES (1, '2017-08-25 21:03:35', '0/8 * * * * ?', 'com.example.demo.jobs.MyJob', 'test', 'My test', 1, NULL), (2, '2017-08-25 21:12:02', '0/23 * * * * ?', 'com.example.demo.jobs.MyJob', 'test', 'My Job', 1, NULL); 运行结果123456789101112JobConfig(id=1, name=My test, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/8 * * * * ?, status=1, createAt=2017-08-25 21:03:35.0, updateAt=null)com.example.demo.jobs.MyJob@7602fe69:2017-08-26 10:43:16正在执行Job executing...Hibernate: select jobconfig0_.id as id1_1_, jobconfig0_.create_at as create_a2_1_, jobconfig0_.cron_time as cron_tim3_1_, jobconfig0_.full_entity as full_ent4_1_, jobconfig0_.group_name as group_na5_1_, jobconfig0_.name as name6_1_, jobconfig0_.status as status7_1_, jobconfig0_.update_at as update_a8_1_ from job_config jobconfig0_ where jobconfig0_.status=?JobConfig(id=1, name=My test, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/8 * * * * ?, status=1, createAt=2017-08-25 21:03:35.0, updateAt=null)JobConfig(id=2, name=My Job, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/23 * * * * ?, status=1, createAt=2017-08-25 21:12:02.0, updateAt=null)JobConfig(id=2, name=My Job, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/23 * * * * ?, status=1, createAt=2017-08-25 21:12:02.0, updateAt=null)com.example.demo.jobs.MyJob@4a49530:2017-08-26 10:43:23正在执行Job executing...Hibernate: select jobconfig0_.id as id1_1_, jobconfig0_.create_at as create_a2_1_, jobconfig0_.cron_time as cron_tim3_1_, jobconfig0_.full_entity as full_ent4_1_, jobconfig0_.group_name as group_na5_1_, jobconfig0_.name as name6_1_, jobconfig0_.status as status7_1_, jobconfig0_.update_at as update_a8_1_ from job_config jobconfig0_ where jobconfig0_.status=?JobConfig(id=1, name=My test, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/8 * * * * ?, status=1, createAt=2017-08-25 21:03:35.0, updateAt=null)JobConfig(id=2, name=My Job, fullEntity=com.example.demo.jobs.MyJob, groupName=test, cronTime=0/23 * * * * ?, status=1, createAt=2017-08-25 21:12:02.0, updateAt=null) 到这里,Spring Boot与quartz的整合已经完成了,可以通过配置表job_config以及配置quartz.enabled参数来灵活使用定时任务了! 后续还会继续实践、丰富这个示例,如果上文有什么问题,欢迎留言指正,谢谢! 源码:https://github.com/icnws/spring-data-jpa-demo 定时任务的路还有很长,想更灵活?可能需要elastic-job等框架吧!欢迎留言交流!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Spring Boot","slug":"Spring-Boot","permalink":"http://www.icnws.com/tags/Spring-Boot/"},{"name":"Quartz","slug":"Quartz","permalink":"http://www.icnws.com/tags/Quartz/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"读《非暴力沟通》","slug":"144-read-nonviolent-communication","date":"2017-08-21T14:31:30.000Z","updated":"2018-03-15T06:27:28.448Z","comments":true,"path":"2017/144-read-nonviolent-communication/","link":"","permalink":"http://www.icnws.com/2017/144-read-nonviolent-communication/","excerpt":"","text":" 最近,比较忙也比较懒,所以读书不太多,只是读了这本鸡汤成分略大的书,《非暴力沟通》,讲的就是如何去避免直接使用暴力去诉诸对抗的行为方法论。有一定的启发,毕竟,我们的文化形态,惯用的是指责、问责,很少关注其他的东西。 书名:非暴力沟通看书名就知道,和沟通有关,大多数急于在社交上、生活上沟通有问题的,或者觉得有问题的,一般会寻求这类书籍的帮助。我呢,是因为这本书在微信读书APP里躺了很久,而且不会因为时间不连续导致思路跟不上的问题,所以就看了。 书中大部分篇幅就是将什么是非暴力沟通,如何体验非暴力沟通,以及怎么持续下去,最终讲了关于一个长辈一辈子践行非暴力沟通的例子,也道出了作者非暴力沟通的榜样。 事实事实就是,这本书用起来需要勇气,大多数时间感觉沟通拖拖拉拉,不能快速的解决问题。然而,从作者的例子我们有一个这样的体验,慢即是快。这是怎么样的体验呢?就是说通过慢的沟通表达抓住主要的问题和症结,对症下药了,然后很多问题和需要就迎刃而解。 这个很好理解,越来越多的时候,我们发现做事情很容易,将事情表达清楚却很困难。程序员经常遇到产品、美工、领导说的A,实际他们想要的是B,结果是我们做的C,再三沟通才能回到最初的需求,最初的想法,最终的目的,这时候浪费了很多时间。这中间如果出了问题,也大多是指责某一环节的某个人的决策,而很少考虑自己是否真正承担了应该承担的角色以及责任。 收获这本书的最大收获就是,换一个视角,表达和发现需要,而不是指责和狂怒,甚至逃避责任。 我们在工作的时候,大多数是对结果负责,实际上,大多数结果我们需要由别人替我们承担。这是为什么? 原因无他,我们只知道最终要实现一个什么东西,不知道这个东西是哪个需求来的,最终目的是什么,只是知道完成系统中的那一环,其他的并不怎么关注。因此,我们把失败归功于上层的决定,推诿给其他人。这是很多人的做法,也是很多人平庸甚至沦为平庸的根源之一。 换一个角度,从源头去思考我们做的每一件事情,试图去追溯事情的根源,明白发生了什么,需要我们去做什么,怎么才能将我们的工作做的更好更出色,这也是我想告诉你的。 你的每一次偷懒都会有人给你记着,都会成为未来你成长发展的坎坷,所以春光大好多努力呀! 你有没有想看这本书?欢迎留言交流!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"},{"name":"沟通","slug":"沟通","permalink":"http://www.icnws.com/tags/沟通/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"我是怎么阅读新闻的","slug":"143-how-do-I-read-the-news","date":"2017-08-17T04:31:30.000Z","updated":"2018-03-15T06:27:28.448Z","comments":true,"path":"2017/143-how-do-I-read-the-news/","link":"","permalink":"http://www.icnws.com/2017/143-how-do-I-read-the-news/","excerpt":"","text":"1、通常做法:大多数人的做法是安装N个客户端,比如网易新闻、今日头条、腾讯新闻等,这些新闻APP的运营会不定时的推送一些新鲜资讯,我们在手机上收到推送之后,点开消息,接着就进入APP,一进去就半个小时过去了,最终可能发现自己只是看了几个搞笑或者故意吸引眼球的各种奇闻疑案,并没有太多的收获。 特别是像进入头条这种APP,根据用户的“喜好”来匹配内容,判断你喜好的标准可能是自己贴的标签,自己浏览的信息(包括误点操作),我用了几次,感觉都是TM的垃圾信息,很难看到有用的,于是,我就不浪费生命,直接将所有这类新闻APP。 2、事实事实是,每家新闻APP都以各种方式留住你,给你广告,给你垃圾信息,让你长时间的呆在他们的APP里,沉浸下去,为他们的广告用户做背书,然后消磨掉你的时间,为APP公司挣钱。如果你从中得到了益处,那也还好,但是事实是,为了吸引你的眼球,各种性的暗示图文,各种清宫疑案,城市琐事等等,没有什么有营养的东西。 很多运营人员,为了业绩,为了KPI好看,不择手段,甚至虚假信息,这是我最厌恶的地方。 3、我的做法卸载这些新闻APP,选择通过邮件定义的方式阅读有用的资讯,比如好奇心日报,这样可以少阅读百分之九十的垃圾信息,对一些重要的信息并不怎么遗漏,只是少了一些花边新闻可将而已。话说回来,花边新闻只能让你的逼格降低,并无益处,一时的附和可能是背后的厌恶,说你恶趣味,提升品位也很重要。 为什么是好奇心日报? 好奇心日报也不是我的第一选择,像爱范儿、36Kr等我都有试过,事实是很不理想,不能达到我对新闻资讯纯净高效率的要求,好奇心日报可以很好的满足。 好奇心日报的推送频率不高,手机端自适应排版,信息相对有效性高,热点话题、大公司头条、看图等都是很好看的栏目,一文看尽时鲜,用了有两周吧,很舒爽,所以要些这篇文章推荐给你,提高你的效率,为有限的生命增值。 4、实现方案微信+QQ邮箱+IFTTT服务,即RSS订阅好奇心日报,通过IFTTT推送到QQ邮箱,在微信内打开设置里的QQ邮箱提醒,这样好奇心日报一发布订阅消息,我们很快就能在微信的QQ邮箱提醒里看到邮件了,方便的时候就阅读吧。具体步骤如下: 4.1、注册IFTTT用QQ邮箱在网站https://ifttt.com/ 注册一个账号,注意要完整实现有效订阅阅读,这一步很重要。注册成功后登录网站。 4.2、添加Applet找到顶部的“My Applets”并点击,然后找到New Applet,创建一个RSS订阅,点击会出现下图: 点击“+this”,然后选择“RSS Feed”,然后选择一个trigger,这里选择第一个“New feed item”,填写Feed URL:http://www.qdaily.com/feed.xml ,点击create trigger,会出现下图: 我们看得“+this”已经被替换成RSS的icon了,然后选择“+that”,在新的页面选择Email,在Choose action页面选择“Send me an email”,然后会出现新的界面,如下所示,会有基本的推送样式,推送邮箱是Base Email,这也是为啥用QQ邮箱注册。 在这个页面下,选择“Create Action”即生成对应的订阅,进入最终页面,点击Finish即完成创建: 至此,我们就完成了IFTTT订阅RSS的所有操作,等待新的Feed发出后,我们就能收到对应的邮件。 重要的提醒:IFTTT默认是将所有URL转换成短链接的,因此要手动关闭掉,方法如下: 在IFTTT的右上角点击用户名,选择Setting,进入新页面后下拉,找到URL shortening,将默认自动转成短链接的复选框点掉即可,然后保存设置,这样收到的邮件才是在国内能正常打开的。 当然,IFTTT还有很多强大的功能,他其实就是一个搬运工,帮我们做一些需要费时费力的搬运工作,像快递一样,我还会配合IFTTT的Do Note客户端进行发推,这个你可以自己摸索。 4.3、微信设置打开微信的设置,找到通用,选择功能,找到QQ邮箱提醒功能并开启就可以等着新鲜有用的资讯新闻了。 这就是我阅读新闻资讯的方法,你学到了吗?欢迎留言交流!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"},{"name":"Feed","slug":"Feed","permalink":"http://www.icnws.com/tags/Feed/"},{"name":"RSS","slug":"RSS","permalink":"http://www.icnws.com/tags/RSS/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"Thymeleaf强制闭合标签解决方法","slug":"142-thymeleaf-setting-1st","date":"2017-08-14T04:21:30.000Z","updated":"2018-03-15T06:27:28.448Z","comments":true,"path":"2017/142-thymeleaf-setting-1st/","link":"","permalink":"http://www.icnws.com/2017/142-thymeleaf-setting-1st/","excerpt":"","text":"错误信息:1org.xml.sax.SAXParseException: 元素类型 "meta" 必须由匹配的结束标记 "</meta>" 终止。 解决方案增加依赖: 1234567<!-- https://mvnrepository.com/artifact/net.sourceforge.nekohtml/nekohtml --><!-- 使thymeleaf不强制闭合标签 --><dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version></dependency> 参数配置: 12#不强制关闭HTML标签spring.thymeleaf.mode = LEGACYHTML5","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Thymeleaf","slug":"Thymeleaf","permalink":"http://www.icnws.com/tags/Thymeleaf/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"IDEA+Github+OSC-Git+Typora才是好搭档","slug":"135-writing-with-md","date":"2017-08-05T17:21:30.000Z","updated":"2018-03-15T06:27:28.447Z","comments":true,"path":"2017/135-writing-with-md/","link":"","permalink":"http://www.icnws.com/2017/135-writing-with-md/","excerpt":"最近在社区Spring For All( http://www.spring4all.com )群友的帮助下,完成了Github的网站博客搭建,刚开始我没有意识到md等文件要单独存起来,所以弄了一个乌龙,在家弄的很好,结果去公司电脑就不能很好的玩耍了。 所以,做了个方案,既可以在家玩,也可以同步到公司的电脑上,而这些博客的md等文件又不能公开,所以选用了开源中国的git做源文件仓库,编译完成的html文件同步到github上,相当于发布文章了。","text":"最近在社区Spring For All( http://www.spring4all.com )群友的帮助下,完成了Github的网站博客搭建,刚开始我没有意识到md等文件要单独存起来,所以弄了一个乌龙,在家弄的很好,结果去公司电脑就不能很好的玩耍了。 所以,做了个方案,既可以在家玩,也可以同步到公司的电脑上,而这些博客的md等文件又不能公开,所以选用了开源中国的git做源文件仓库,编译完成的html文件同步到github上,相当于发布文章了。 1、搭建好Github之后需要配置一下脚本,我叫init.sh,主要是用来管理不同机器的环境,因为一旦缺少一些插件,可能会导致最终发布到github的静态页面不一致,因此,要千万注意,这里给出我的是以代码。 1234567891011121314151617181920# 在当前目录初始化hexonpm install hexo-cli -g# 安装hexo依赖的node模块npm install# 安装发布到github的git部署插件npm install hexo-deployer-git --save# 创建索引的插件npm install --save hexo-generator-index# 创建目录的插件npm install --save hexo-generator-archive# 创建Tag的插件npm install --save hexo-generator-tag# 搜索插件npm install hexo-generator-search --save# 生成搜索库npm install hexo-generator-searchdb --save# RSS订阅npm install hexo-generator-feed --save# 生成sitemap的插件npm install hexo-generator-seo-friendly-sitemap --save 再配置一个编译启动脚本,测试常用,我叫hexo.sh,代码如下: 123456# 清除原有编译代码hexo clean# 编译最新代码,生成对应文件hexo g# 启动服务,通过localhost:4000访问hexo s 每次写完可以即时运行一下,看看效果,如果确定没有问题,那就发布吧,命令是: hexo d 2、使用开源中国Git托管网站博客源码OSC的Git服务有了独立域名,即http://www.gitee.com ,新版3.0也发布了,越来越好用了。如果你还没有账号,不妨注册一个,可以创建私有项目,这样存放博客源码就比较方便,多台机器随意切换。 用Hexo驱动写博客的好处就是可以让我们随时再部署一套自己的网站出来,不用担心网站数据问题,而开源中国的私有项目服务,可以让这个更无后顾之忧。 3、IDEA的使用IDEA虽然对MD的支持有限,但是对于代码管理还是很方便的,从OSC-Git上检出,同步等非常方便,也可以定义一些写作的模板,方便生成基本文件。 4、Typora的使用Typrora是一款跨平台(Mac、Windows、Linux)的Markdown编辑器,最大的特点就是简洁方便,很多MD工具不能很方便的使用,而这款非常方便。你用一次就会喜欢上,我现在就是用Typora在写这篇文章。 Typora的网址是:https://typora.io/","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"写作","slug":"写作","permalink":"http://www.icnws.com/tags/写作/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"音视频周刊推荐","slug":"134-audo-and-video-weekly","date":"2017-08-04T16:21:30.000Z","updated":"2018-10-23T10:56:20.411Z","comments":true,"path":"2017/134-audo-and-video-weekly/","link":"","permalink":"http://www.icnws.com/2017/134-audo-and-video-weekly/","excerpt":"经常会遇到一些人,在学习音视频相关技术的时候资料甚少,也源于很多大牛没时间来分享,音视频领域的技术火了有很长一段时间了,大神们都忙着挣钱呢!有一个喜欢系统分享音视频的大牛雷霄华雷神也不幸离世了,哎,以后的路还是需要靠自己来走。 今天呢,给大家介绍一个音视频的周刊,这个周刊是以邮件的方式订阅,我虽然最近不怎么搞了,但是还一直订阅着他们的邮件,每周会汇集一些很好的文章,包括前端、架构、后端、活动等等,内容丰富且精彩,如果你在学习音视频,一定不要错过了。","text":"经常会遇到一些人,在学习音视频相关技术的时候资料甚少,也源于很多大牛没时间来分享,音视频领域的技术火了有很长一段时间了,大神们都忙着挣钱呢!有一个喜欢系统分享音视频的大牛雷霄华雷神也不幸离世了,哎,以后的路还是需要靠自己来走。 今天呢,给大家介绍一个音视频的周刊,这个周刊是以邮件的方式订阅,我虽然最近不怎么搞了,但是还一直订阅着他们的邮件,每周会汇集一些很好的文章,包括前端、架构、后端、活动等等,内容丰富且精彩,如果你在学习音视频,一定不要错过了。 1、示例 2、订阅点击订阅连接 订阅完成之后,你每周都会受到一些关于音视频的精彩内容了。 话说,现在深耕音视频方面的人才,都是收入狂飙,同样是程序猿,差别也是挺大的。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"推荐","slug":"推荐","permalink":"http://www.icnws.com/tags/推荐/"},{"name":"音视频","slug":"音视频","permalink":"http://www.icnws.com/tags/音视频/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"分析网络资源的DNS解析","slug":"133-trace-route-dns","date":"2017-08-04T04:21:30.000Z","updated":"2018-03-15T06:27:28.446Z","comments":true,"path":"2017/133-trace-route-dns/","link":"","permalink":"http://www.icnws.com/2017/133-trace-route-dns/","excerpt":"分析网络资源的DNS解析要分析一些资源的来源和信息,所以要通过DNS来追踪,这里做一些简单记录","text":"分析网络资源的DNS解析要分析一些资源的来源和信息,所以要通过DNS来追踪,这里做一些简单记录 1、traceroute方式这是Linux下的方式,直接用命令 traceroute domain 即可获得对应的解析记录 更常用的可能是traceroute -m 10 domain 更多信息参考http://www.cnblogs.com/peida/archive/2013/03/07/2947326.html 写的很详细,很有参考价值。 2、tracert方式这是Windows下的方式,直接使用命令 tracert domain 即可获得对应的解析记录,可以参考http://www.cnblogs.com/godtrue/p/5882541.html这个博文。 3、IPIP提供的Traceroute工具网址:http://www.ipip.net/traceroute.php 直接将资源地址粘贴进输入框并点击查看,稍等片刻就可以了,很方便","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"DNS","slug":"DNS","permalink":"http://www.icnws.com/tags/DNS/"},{"name":"Traceroute","slug":"Traceroute","permalink":"http://www.icnws.com/tags/Traceroute/"},{"name":"Tracert","slug":"Tracert","permalink":"http://www.icnws.com/tags/Tracert/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"密码生成器","slug":"132-generation-password-desigin-1st","date":"2017-08-02T23:34:16.000Z","updated":"2018-03-15T06:27:28.446Z","comments":true,"path":"2017/132-generation-password-desigin-1st/","link":"","permalink":"http://www.icnws.com/2017/132-generation-password-desigin-1st/","excerpt":"","text":"最近让同事帮忙做了个密码生成器,随机字符串,大小写字母(52),0到9(10)再加上!*总共是64个字符,生成8位/12位/16位密码,配合网络笔记使用,手机本地加密使用网络笔记软件!已经用起来了,还挺好用,需要什么密码直接通过笔记查了发到QQ或者微信上就可以了!目前只有安卓版本的,而且比较土,想用的可以留言!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"高考","slug":"高考","permalink":"http://www.icnws.com/tags/高考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"在github上创建站点","slug":"create-website-on-github-pages","date":"2017-08-02T17:20:15.000Z","updated":"2018-03-15T06:27:28.460Z","comments":true,"path":"2017/create-website-on-github-pages/","link":"","permalink":"http://www.icnws.com/2017/create-website-on-github-pages/","excerpt":"","text":"在群友的帮助下,参考一些博文,最终搞定了在github.com部署博客的实践。 1、参考博客http://blog.liuxianan.com/build-blog-website-by-hexo-github.html 2、安装nodejs去 https://nodejs.org/en/download/ 下载LTS版本,我的是windows7系统x64。下载完成后直接安装即可。 3、安装git去 https://git-scm.com/downloads 下载或者去 https://git-for-windows.github.io/ 下载然后一路next安装即可 4、创建github账号及项目去 https://github.com 创建或登录你的账号,然后创建一个项目,项目名称就是 ${username}.github.io比如我的是icnws.github.io,创建完成之后,隔几分钟就可以通过http://icnws.github.io 进行网站访问了,这时候网站除了标题以外基本上都是空的。 5、配置域名映射通过ping icnws.github.io,获得对应项目的IP地址,在域名解析通过A记录配置,然后配置CNAME记录,对www解析到icnws.github.io在github的对应项目根目录创建CNAME文件,注意这里的文件没有后缀,然后将要映射的域名写入即可,比如我这里写了http://www.icnws.com到这里,映射就配置完成了,稍等片刻就可以直接通过域名www.icnws.com进行访问新生成的博客了。 6、配置github访问的SSH密钥在github账号的设置页面可以看到左侧的SSH and GPG keys菜单,选择,然后会看见SSH Key的管理操作按钮。首先在本地,通过git的keygen生成密钥对,然后将公钥内容copy并添加新的SSH Key保存即可配置完成通过 ssh -T [email protected] 来测试是否成功,出现successfully字样就说明成功了。然后配置本地的git全局用户名及邮箱地址,参数为github的用户名和注册邮箱即可。 7、安装hexoHexo的官网:https://hexo.io中文用户:https://hexo.io/zh-cn/通过命令:npm install -g hexo-cli进行安装,原有的命令是npm install -g hexo不是安装最新版本。安装完成之后,创建一个hexo的工作目录,比如/d/nodejs/hexo在D盘nodejs目录下创建,然后切换目录至该文件夹执行hexo init,有可能无法生成更新到文件夹node_modules,修改根目录的.gitignore文件并重新执行命令即可。后面的内容可以直接参考官网的手册了,有一点需要注意的就是,在设置deploy的参数时,我在冒号后面少了空格,导致hexo d部署到github的时候反复提交,既不报错也不成功,千万注意,别犯类似的错误了。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"hexo","slug":"hexo","permalink":"http://www.icnws.com/tags/hexo/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"亚马逊联盟调研","slug":"survey-for-Amazon-Product-Advertising-API","date":"2017-08-01T10:04:11.000Z","updated":"2018-03-15T06:27:28.493Z","comments":true,"path":"2017/survey-for-Amazon-Product-Advertising-API/","link":"","permalink":"http://www.icnws.com/2017/survey-for-Amazon-Product-Advertising-API/","excerpt":"","text":"这几天在看亚马逊联盟的相关服务,从在主界面定义一些链接、页面等方式接入联盟,为网站和APP带来盈利的可能,到通过Product Advertising API来实现相关搜索、查询、购物车操作等,还是有一些收获的。 1、创建账号:通过https://affiliate-program.amazon.com 来加入联盟,这里接受你的广告展示可以是网站(website)或者APP(amazon market,google play,apple store),如果都不是,那就无法申请,国内应用市场发布的APP,在这里是不受认可的。账号注册完成后即可以进行操作了。需要注意到,注册这个的同时,如果没有开通AWS服务会开通相关服务,已经开通并关闭了是无法直接使用相关Product Advertising API的 2、简单使用:在https://affiliate-program.amazon.com/home 页面的导航中找到Product Linking,在其下拉菜单中可以获得单个商品的链接(Product Links),定制各种尺寸的横幅(Banner Links),通过搜索等定制亚马逊提供的广告(Native Shopping Ads),还有就是可以通过在mobile的网页中嵌入弹出广告(Mobile Popover),再就是定制任意亚马逊链接的方式,以文本链接展示( Link To Any Page),以上所有的使用,需要自己查询商品或者设置查询条件以及copy页面链接,然后在操作页面会生成对应的iframe代码或者JavaScript代码。可以将这些代码直接嵌套或者优化后嵌套到我们的网站上,这样别人通过网站的广告点击购买就可以获得收益了。 3、进阶使用3.1、快速加入商品在联盟的管理页面操作商品总是略有不便,所以亚马逊提供了一个工具SiteStripe,当你登录联盟账号之后,再在浏览器标签打开亚马逊(www.amazon.com)的时候,顶部会出现这个插件,可以在浏览商品的时候方便快捷的生成文本URL(短链接及长链接),生成商品的图片代码以及图文代码,这些可以快速的作为推广材料 3.2、使用Publisher Studio Management 插件然而没有FQ,所以插件安装不方便,没有细细探究。 3.3、Link Checker检测推广链接是否失效,商品是亚马逊提供的,难免因产品变动而链接失效,有时间久check一下好了 4、高级使用高级的使用,叫我说就是使用Product Advertising API,这个工具已经很强大了,当然,也非常不错,这里简单介绍一下功能,具体实践还没有进行。使用这个功能需要开通AWS服务,并且生成对应的AccessKey ID 和 Secret Key,否则无法使用。 4.1、搜索功能(ItemSearch)通过API可以直接查询商品列表,返回商品信息,多种查询条件,多种返回数据格式,可以任意定制,总之,功能很强大。 4.2、查询功能(Lookup)可以通过API查询指定节点的浏览节点信息,包括子节点及父节点信息可以通过API查询指定商品的详细信息,详情等,参数比较多,返回格式数据多样可以通过API查询指定商品的相关商品,返回相关商品的标识和名称等,多种返回数据格式 4.3、购物车功能(Cart)这里提供了购物车的初始化及增删改查加清空,以及支付链接,详细信息太多,不能一一言表,还是去看API吧。备注:搜索功能的数据都是以XML格式返回的.一个简单的说明图示:参考:https://affiliate-program.amazon.comhttps://affiliate-program.amazon.com/homehttp://docs.aws.amazon.com/zh_cn/AWSECommerceService/latest/DG/Welcome.htmlhttp://webservices.amazon.com/scratchpad/index.html?rw_useCurrentProtocol=1","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Amazon","slug":"Amazon","permalink":"http://www.icnws.com/tags/Amazon/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos配置JAVA环境","slug":"centos7-setting-the-java-env","date":"2017-07-24T09:18:03.000Z","updated":"2018-03-15T06:27:28.458Z","comments":true,"path":"2017/centos7-setting-the-java-env/","link":"","permalink":"http://www.icnws.com/2017/centos7-setting-the-java-env/","excerpt":"","text":"便利贴记录123456JAVA_HOME=/usr/jdk8PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport JAVA_HOMEexport PATHexport CLASSPATH","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"JAVA","slug":"JAVA","permalink":"http://www.icnws.com/tags/JAVA/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"基于JPA的Specification查询的工具类SpecificationFactory","slug":"spring-data-jpa-specificationfact-util","date":"2017-07-24T02:34:14.000Z","updated":"2018-03-15T06:27:28.490Z","comments":true,"path":"2017/spring-data-jpa-specificationfact-util/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-specificationfact-util/","excerpt":"","text":"一个简单的Specification查询的工具类,可以自行扩展,扩展方法就是将一些手写创建的Specification语句抽象到一个方法内,写到工具类里。 1、代码如下:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647import org.springframework.data.jpa.domain.Specification;import java.util.Collection;/** * Created by Administrator on 2017/7/13 0013. */public final class SpecificationFactory { /** * 模糊查询,匹配对应字段 * @param attribute * @param value * @return */ public static Specification containsLike(String attribute, String value) { return (root, query, cb) -&gt; cb.like(root.get(attribute), "%" + value + "%"); } /** * 某字段的值等于value的查询条件 * @param attribute * @param value * @return */ public static Specification equal(String attribute, Object value) { return (root, query, cb) -&gt; cb.equal(root.get(attribute),value); } /** * 获取对应属性的值所在区间 * @param attribute * @param min * @param max * @return */ public static Specification isBetween(String attribute, int min, int max) { return (root, query, cb) -&gt; cb.between(root.get(attribute), min, max); } public static Specification isBetween(String attribute, double min, double max) { return (root, query, cb) -&gt; cb.between(root.get(attribute), min, max); } /** * 通过属性名和集合实现in查询 * @param attribute * @param c * @return */ public static Specification in(String attribute, Collection c) { return (root, query, cb) -&gt; root.get(attribute).in(c); }} 2、用法Specification&lt;Customer&gt; spec2 = Specifications .where(SpecificationFactory.containsLike("firstName","bau")) .or(SpecificationFactory.containsLike("lastName","bau"));","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Boot配置文件中的参数配置参考手册","slug":"spring-boot-properties-setting-handbook","date":"2017-07-21T09:09:23.000Z","updated":"2018-03-15T06:27:28.485Z","comments":true,"path":"2017/spring-boot-properties-setting-handbook/","link":"","permalink":"http://www.icnws.com/2017/spring-boot-properties-setting-handbook/","excerpt":"","text":"经常会看到群里有人问怎么配置Spring Boot的配置文件及对应参数,这里可以做一个参考。 参考文档:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"configure","slug":"configure","permalink":"http://www.icnws.com/tags/configure/"},{"name":"spring boot","slug":"spring-boot","permalink":"http://www.icnws.com/tags/spring-boot/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Security 系列:A Starter","slug":"spring-security-a-starter","date":"2017-07-19T08:57:00.000Z","updated":"2018-03-15T06:27:28.491Z","comments":true,"path":"2017/spring-security-a-starter/","link":"","permalink":"http://www.icnws.com/2017/spring-security-a-starter/","excerpt":"","text":"Spring Security为基于Java的企业软件应用程序提供了一个全面的安全解决方案。正如您将在这个参考指南中发现的那样,我们已经尝试为您提供一个有用的、高度可配置的安全系统。参考文档:(持续更新)https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Spring Security","slug":"Spring-Security","permalink":"http://www.icnws.com/tags/Spring-Security/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"基于JPA的分页查询PageRequest的工具类PageUtil","slug":"spring-data-jpa-pageutil","date":"2017-07-19T07:27:58.000Z","updated":"2018-03-15T06:27:28.489Z","comments":true,"path":"2017/spring-data-jpa-pageutil/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-pageutil/","excerpt":"","text":"学习Spring Data JPA有一段时间了,今天开始整理基于JPA的一些东西,比如这篇文章要分享的PageUtil。解决的问题是,通过静态实现快速构造Pageable的实例,在分页查询的时候,写代码也更简单。 1、代码如下:123456789101112131415161718192021222324252627282930import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Sort;public class PageUtil { public static PageRequest getPageRequest(Integer pageIndex, Integer pageSize, Sort sort){ //默认页面为0, if(pageIndex==null || pageIndex&lt;1){ pageIndex = 0; }else{ pageIndex = pageIndex-1; } //默认页面大小20 if(pageSize==null || pageSize&lt;1){ pageSize = 20; } //默认采用ID倒叙排列 if(sort==null){ sort = new Sort(Sort.Direction.DESC,"id"); } return new PageRequest(pageIndex,pageSize,sort); } public static PageRequest getPageRequest(){ return getPageRequest(null,null,null); } public static PageRequest getPageRequest(Integer pageIndex,Integer pageSize){ return getPageRequest(pageIndex,pageSize,null); }} 2、使用方法Pageable page = PageUtil.getPageRequest(pageIndex,pageSize,null); 3、解说通过不同参数的重载,实现方便灵活的构建Pageable的实例,设置一些默认参数: 默认第一页,pageIndex=0 默认每页数据二十条,pageSize=20 默认查询为ID倒序,new Sort(Sort.Direction.DESC,”id”) 比较简单,如有建议,欢迎留言","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"PageUtil","slug":"PageUtil","permalink":"http://www.icnws.com/tags/PageUtil/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:数据查询(Specification)(二)","slug":"spring-data-jpa-Specification-2nd","date":"2017-07-18T08:11:47.000Z","updated":"2018-03-15T06:27:28.486Z","comments":true,"path":"2017/spring-data-jpa-Specification-2nd/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-Specification-2nd/","excerpt":"","text":"写了一系列入门文章之后,博客也有了一些访问量,按照计划,对数据查询进行深入一些的探究,包括 inner join查询 连接对象的属性值查询 in条件查询 left join查询还是入门级的示例,更深入的用法需要在实际场景中深化。 1、更改Customer类增加@OneToMany注解的订单对象需要注意的是,这次增加了Lombok依赖,一个简化对象类定义的插件,详见:https://projectlombok.org/123456789101112131415161718192021222324252627282930313233import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import org.hibernate.annotations.NamedQuery;import javax.persistence.*;import java.util.List;@Entity@Data@AllArgsConstructor@NoArgsConstructor@NamedQuery(name="Customer.findByFirstName",query = "select c from Customer c where c.firstName = ?1")public class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; //一对多,一个客户对应多个订单,关联的字段是订单里的cId字段 @OneToMany @JoinColumn(name = "cId") private List&lt;MyOrder&gt; myOrders; public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); }} 2、增加MyOrder类我的订单对象 12345678910111213141516171819202122232425262728293031323334import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.*;import java.math.BigDecimal;/** * Created by Administrator on 2017/7/17 0017. */@Entity@Data@AllArgsConstructor@NoArgsConstructorpublic class MyOrder { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String code; private Long cId; private BigDecimal total; //实体映射重复列必须设置:insertable = false,updatable = false @OneToOne @JoinColumn(name = "cId",insertable = false,updatable = false) private Customer customer; @Override public String toString() { return "MyOrder{" + "id=" + id + ", code='" + code + '\\'' + ", cId=" + cId + ", total=" + total + ", customer=" + customer + '}'; }} 3、新增MyOrderRepository类12345678910这里主要是继承JpaSpecificationExecutor接口,进行Specification查询import com.example.demo.dto.MyOrder;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.repository.CrudRepository;/** * Created by Administrator on 2017/7/17 0017. */public interface MyOrderRepository extends JpaSpecificationExecutor&lt;MyOrder&gt;,CrudRepository&lt;MyOrder,Long&gt; {} 4、新增ShoppingController类123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126import com.example.demo.dto.Customer;import com.example.demo.dto.MyOrder;import com.example.demo.repositories.MyOrderRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Sort;import org.springframework.data.jpa.domain.Specification;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import javax.persistence.criteria.*;@Controller@RequestMapping("/shop")public class ShoppingController { @Autowired private MyOrderRepository myOrderRepository; /** * 内连接查询 */ @RequestMapping("/q1") public void specification1(){ //根据查询结果,声明返回值对象,这里要查询用户的订单列表,所以声明返回对象为MyOrder Specification&lt;MyOrder&gt; spec = new Specification&lt;MyOrder&gt;() { //Root&lt;X&gt; 根查询,默认与声明相同 @Override public Predicate toPredicate(Root&lt;MyOrder&gt; root, CriteriaQuery&lt;?&gt; query, CriteriaBuilder cb) { //声明并创建MyOrder的CriteriaQuery对象 CriteriaQuery&lt;MyOrder&gt; q1 = cb.createQuery(MyOrder.class); //连接的时候,要以声明的根查询对象(这里是root,也可以自己创建)进行join //Join&lt;Z,X&gt;是Join生成的对象,这里的Z是被连接的对象,X是目标对象, // 连接的属性字段是被连接的对象在目标对象的属性,这里是我们在MyOrder内声明的customer //join的第二个参数是可选的,默认是JoinType.INNER(内连接 inner join),也可以是JoinType.LEFT(左外连接 left join) Join&lt;Customer,MyOrder&gt; myOrderJoin = root.join("customer",JoinType.INNER); //用CriteriaQuery对象拼接查询条件,这里只增加了一个查询条件,cId=1 q1.select(myOrderJoin).where(cb.equal(root.get("cId"),1)); //通过getRestriction获得Predicate对象 Predicate p1= q1.getRestriction(); //返回对象 return p1; } }; resultPrint(spec); } /** * 增加查询条件,关联的对象Customer的对象值 */ @RequestMapping("/q2") public void specification2(){ Specification&lt;MyOrder&gt; spec = new Specification&lt;MyOrder&gt;() { @Override public Predicate toPredicate(Root&lt;MyOrder&gt; root, CriteriaQuery&lt;?&gt; query, CriteriaBuilder cb) { CriteriaQuery&lt;MyOrder&gt; q1 = cb.createQuery(MyOrder.class); Join&lt;Customer,MyOrder&gt; myOrderJoin = root.join("customer"); q1.select(myOrderJoin) .where( cb.equal(root.get("cId"),1),//cId=1 cb.equal(root.get("customer").get("firstName"),"Jack")//对象customer的firstName=Jack ); Predicate p1= q1.getRestriction(); return p1; } }; resultPrint(spec); } /** * in的条件查询 * 需要将对应的结果集以root.get("attributeName").in(Object.. values)的方式传入 * values支持多个参数,支持对象(Object),表达式Expression&lt;?&gt;,集合Collection以及Expression&lt;Collection&lt;?&gt;&gt; */ @RequestMapping("/q3") public void specification3(){ Specification&lt;MyOrder&gt; spec = new Specification&lt;MyOrder&gt;() { @Override public Predicate toPredicate(Root&lt;MyOrder&gt; root, CriteriaQuery&lt;?&gt; query, CriteriaBuilder cb) { CriteriaQuery&lt;MyOrder&gt; q1 = cb.createQuery(MyOrder.class); Join&lt;Customer,MyOrder&gt; myOrderJoin = root.join("customer"); q1.select(myOrderJoin) .where( cb.equal(root.get("cId"),1) ,root.get("id").in(1,2,4) ); Predicate p1= q1.getRestriction(); return p1; } }; resultPrint(spec); } /** * 左外链接查询,对比inner join, * 这里只是改了一个参数,将JoinType.INNER改成JoinType.LEFT * * 注意,当前示例不支持JoinType.RIGHT,用的比较少,没有探究 */ @RequestMapping("/q4") public void specification4(){ Specification&lt;MyOrder&gt; spec = new Specification&lt;MyOrder&gt;() { @Override public Predicate toPredicate(Root&lt;MyOrder&gt; root, CriteriaQuery&lt;?&gt; query, CriteriaBuilder cb) { CriteriaQuery&lt;MyOrder&gt; q1 = cb.createQuery(MyOrder.class); Join&lt;Customer,MyOrder&gt; myOrderJoin = root.join("customer",JoinType.LEFT); q1.select(myOrderJoin).where(cb.equal(root.get("cId"),1)); Predicate p1= q1.getRestriction(); return p1; } }; resultPrint(spec); } /*** *输出分页信息 **/ private void resultPrint(Specification&lt;MyOrder&gt; spec) { //分页查询 Pageable pageable = new PageRequest(0,10, Sort.Direction.DESC,"id"); //查询的分页结果 Page&lt;MyOrder&gt; page =myOrderRepository.findAll(spec,pageable); System.out.println(page); System.out.println(page.getTotalElements()); System.out.println(page.getTotalPages()); for (MyOrder c:page.getContent()){ System.out.println(c.toString()); } }} 内容已经写进注释了,请读源码,有问题请留言。 5、测试1)、内连接查询及结果: URL:http://localhost:8080/shop/q1 结果:12345678910Hibernate: select myorder0_.id as id1_1_, myorder0_.c_id as c_id2_1_, myorder0_.code as code3_1_, myorder0_.total as total4_1_ from my_order myorder0_ inner join customer customer1_ on myorder0_.c_id=customer1_.id where myorder0_.c_id=1 order by myorder0_.id desc limit ?Hibernate: select customer0_.id as id1_0_0_, customer0_.first_name as first_na2_0_0_, customer0_.last_name as last_nam3_0_0_ from customer customer0_ where customer0_.id=?Page 1 of 1 containing com.example.demo.dto.MyOrder instances51MyOrder{id=5, code='123455', cId=1, total=55.23, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=4, code='123459', cId=1, total=9.99, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=3, code='123458', cId=1, total=11.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=2, code='123457', cId=1, total=20.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=1, code='123456', cId=1, total=11.10, customer=Customer[id=1, firstName='Jack', lastName='Bauer']} 2)、关联对象条件查询及结果: URL:http://localhost:8080/shop/q2 结果:12345678910Hibernate: select myorder0_.id as id1_1_, myorder0_.c_id as c_id2_1_, myorder0_.code as code3_1_, myorder0_.total as total4_1_ from my_order myorder0_ inner join customer customer1_ on myorder0_.c_id=customer1_.id where myorder0_.c_id=1 and customer1_.first_name=? order by myorder0_.id desc limit ?Hibernate: select customer0_.id as id1_0_0_, customer0_.first_name as first_na2_0_0_, customer0_.last_name as last_nam3_0_0_ from customer customer0_ where customer0_.id=?Page 1 of 1 containing com.example.demo.dto.MyOrder instances51MyOrder{id=5, code='123455', cId=1, total=55.23, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=4, code='123459', cId=1, total=9.99, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=3, code='123458', cId=1, total=11.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=2, code='123457', cId=1, total=20.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=1, code='123456', cId=1, total=11.10, customer=Customer[id=1, firstName='Jack', lastName='Bauer']} 3)、in条件查询测试及结果: URL:http://localhost:8080/shop/q3 结果:12345678Hibernate: select myorder0_.id as id1_1_, myorder0_.c_id as c_id2_1_, myorder0_.code as code3_1_, myorder0_.total as total4_1_ from my_order myorder0_ inner join customer customer1_ on myorder0_.c_id=customer1_.id where myorder0_.c_id=1 and (myorder0_.id in (1 , 2 , 4)) order by myorder0_.id desc limit ?Hibernate: select customer0_.id as id1_0_0_, customer0_.first_name as first_na2_0_0_, customer0_.last_name as last_nam3_0_0_ from customer customer0_ where customer0_.id=?Page 1 of 1 containing com.example.demo.dto.MyOrder instances31MyOrder{id=4, code='123459', cId=1, total=9.99, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=2, code='123457', cId=1, total=20.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=1, code='123456', cId=1, total=11.10, customer=Customer[id=1, firstName='Jack', lastName='Bauer']} 4)、左外连接测试及结果: URL:http://localhost:8080/shop/q4 结果:12345678910Hibernate: select myorder0_.id as id1_1_, myorder0_.c_id as c_id2_1_, myorder0_.code as code3_1_, myorder0_.total as total4_1_ from my_order myorder0_ left outer join customer customer1_ on myorder0_.c_id=customer1_.id where myorder0_.c_id=1 order by myorder0_.id desc limit ?Hibernate: select customer0_.id as id1_0_0_, customer0_.first_name as first_na2_0_0_, customer0_.last_name as last_nam3_0_0_ from customer customer0_ where customer0_.id=?Page 1 of 1 containing com.example.demo.dto.MyOrder instances51MyOrder{id=5, code='123455', cId=1, total=55.23, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=4, code='123459', cId=1, total=9.99, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=3, code='123458', cId=1, total=11.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=2, code='123457', cId=1, total=20.90, customer=Customer[id=1, firstName='Jack', lastName='Bauer']}MyOrder{id=1, code='123456', cId=1, total=11.10, customer=Customer[id=1, firstName='Jack', lastName='Bauer']} 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"specification","slug":"specification","permalink":"http://www.icnws.com/tags/specification/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Redis: OOM command not allowed when used memory > ‘maxmemory’","slug":"redis-oom-memory","date":"2017-07-17T07:07:55.000Z","updated":"2018-03-15T06:27:28.482Z","comments":true,"path":"2017/redis-oom-memory/","link":"","permalink":"http://www.icnws.com/2017/redis-oom-memory/","excerpt":"","text":"1、事故:检查服务器,发现redis无法正常写入,大多数时候写入失败,打开redis的日志信息发现:Redis: OOM command not allowed when used memory &gt; ‘maxmemory’意思是Redis内存不足,可以在命令行中,通过 info memory查看当前redis 的内存设置信息,如下:12345678910111213141516# Memoryused_memory:2365344used_memory_human:2.26Mused_memory_rss:9953280used_memory_rss_human:9.49Mused_memory_peak:2483552used_memory_peak_human:2.37Mtotal_system_memory:16725504000total_system_memory_human:15.58Gused_memory_lua:37888used_memory_lua_human:37.00Kmaxmemory:4194304maxmemory_human:4.00Mmaxmemory_policy:noevictionmem_fragmentation_ratio:4.21mem_allocator:jemalloc-4.0.3 可以看到已用的和当前的设置,我这里是调整之后的数据,单位是byte 2、方案:通过whereis redis.conf找到redis的配置文件打开文件并找到memory配置项,设置你需要的大小,比如:4194304,这是4GB的大小,注意memory的说明信息,这里的单位是byte 修改完成之后,reload当前redis服务,可能用到service redis-server reload或者service redis-server force-reload这样基本上就能解决上述问题了,如有其他问题还需一一对应解决之。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"redis","slug":"redis","permalink":"http://www.icnws.com/tags/redis/"},{"name":"redis OOM","slug":"redis-OOM","permalink":"http://www.icnws.com/tags/redis-OOM/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:数据查询(Specification)(一)","slug":"spring-data-jpa-Specification-1st","date":"2017-07-12T14:36:54.000Z","updated":"2018-03-15T06:27:28.486Z","comments":true,"path":"2017/spring-data-jpa-Specification-1st/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-Specification-1st/","excerpt":"","text":"在JPA中,如果用@Query查询有诸多不便,因此JPA提供了基于Criteria API的查询,比@Query查询更灵活方便,这篇文章就简单说说Specification的简单使用。这篇文章是参考:Useing JPA Criteria API ,相关代码如下所示: 1、定义一个继承JpaSpecificationExecutor的接口:12345678910import com.example.demo.dto.Customer;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;/** * Created by Administrator on 2017/7/12 0012. */public interface CustomerSpecificationRepository extends JpaRepository&lt;Customer,Long&gt;, JpaSpecificationExecutor&lt;Customer&gt; {} 这里只是继承接口声明的方法,比如 12345T findOne(Specification<T> spec);List<T> findAll(Specification<T> spec);Page<T> findAll(Specification<T> spec, Pageable pageable);List<T> findAll(Specification<T> spec, Sort sort);long count(Specification<T> spec); 包含了常用的查询单个对象,查询数据集合,查询分页数据集合,查询带排序参数的数据集合,查询数据的大小,这些都是常用的数据结果集,因此可以不用做其他定义即可直接使用。 2、创建SpecificationFactory工具类12345678910111213141516171819202122232425import org.springframework.data.jpa.domain.Specification;import javax.persistence.criteria.Path;/** * Created by Administrator on 2017/7/13 0013. */public final class SpecificationFactory { public static Specification containsLike(String attribute, String value) { return (root, query, cb) -&gt; cb.like(root.get(attribute), "%" + value + "%"); } public static Specification isBetween(String attribute, int min, int max) { return (root, query, cb) -&gt; cb.between(root.get(attribute), min, max); } public static Specification isBetween(String attribute, double min, double max) { return (root, query, cb) -&gt; cb.between(root.get(attribute), min, max); } public static &lt;T extends Enum&lt;T&gt;&gt; Specification enumMatcher(String attribute, T queriedValue) { return (root, query, cb) -&gt; { Path&lt;T&gt; actualValue = root.get(attribute); if (queriedValue == null) { return null; } return cb.equal(actualValue, queriedValue); }; }} 这个工具类定义了一些基本的查询,包括模糊匹配(containsLike),数值区间(isBetween)以及枚举类参数匹配(enumMatcher),这些也是在查询中常用的方法,在查询的时候,通过Specifications进行调用组织参数,即可获得接口Specification的实例,然后用于查询。 3、在CustomerController中添加测试方法 初始化 12@Autowiredprivate CustomerSpecificationRepository csr; 单一条件查询 123456789101112@RequestMapping("/spec")public void specificationQuery(){ Specification&lt;Customer&gt; spec = SpecificationFactory.containsLike("lastName","bau"); Pageable pageable = new PageRequest(0,5, Sort.Direction.DESC,"id"); Page&lt;Customer&gt; page = csr.findAll(spec,pageable); System.out.println(page); System.out.println(page.getTotalElements()); System.out.println(page.getTotalPages()); for (Customer c:page.getContent()){ System.out.println(c.toString()); }} 复合条件查询 1234567891011121314@RequestMapping("/spec2")public void specificationQuery2(){ Specification&lt;Customer&gt; spec2 = Specifications .where(SpecificationFactory.containsLike("firstName","bau")) .or(SpecificationFactory.containsLike("lastName","bau")); Pageable pageable = new PageRequest(0,5, Sort.Direction.DESC,"id"); Page&lt;Customer&gt; page = csr.findAll(spec2,pageable); System.out.println(page); System.out.println(page.getTotalElements()); System.out.println(page.getTotalPages()); for (Customer c:page.getContent()){ System.out.println(c.toString()); }} 至此,使用Specification通过Criteria API进行查询,获得查询的结果集。相较于@Query方式的查询定义,更人性化和方便操作,后面在对Criteria API的使用进一步深入,会继续给出相关实践,敬请期待。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"specification","slug":"specification","permalink":"http://www.icnws.com/tags/specification/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Java看源码如何方便看注释文档?","slug":"how-to-read-original-code-convenient","date":"2017-07-12T05:34:30.000Z","updated":"2018-03-15T06:27:28.464Z","comments":true,"path":"2017/how-to-read-original-code-convenient/","link":"","permalink":"http://www.icnws.com/2017/how-to-read-original-code-convenient/","excerpt":"","text":"现在的JAVA项目大多用maven管理依赖,在maven的导入选项旁边有下载源码和文档,执行这个操作可以在看相关项目依赖的时候直接看对应的源码及文档注释很方便。很多人对于问题都是求之于搜索引擎给出的答案,这样不是说不行,只是很浪费时间。开始的时候我们没有入门可以借助文档和搜索引擎来达到快速入门的目的,在入门之后,很多问题应该求之于源码上,这个阶段,看源码是必经之路,如果你没有经过,那总有一天死都不知道怎么死的,就是这样。继续说看源码,在IDEA内,按住Ctrl然后点击引用的类名即可进入对应的源码,然后在源码内有方法的定义和文档的说明,比如:123456789101112131415161718192021222324252627282930313233343536373839404142/** * The &lt;code&gt;CriteriaQuery&lt;/code&gt; interface defines functionality that is specific * to top-level queries. * * @param &lt;T&gt; the type of the defined result * @since Java Persistence 2.0 */public interface CriteriaQuery&lt;T&gt; extends AbstractQuery&lt;T&gt; { /** * Specify the item that is to be returned in the query result. * Replaces the previously specified selection(s), if any. * * &lt;p&gt; Note: Applications using the string-based API may need to * specify the type of the select item when it results from * a get or join operation and the query result type is * specified. * * &lt;pre&gt; * For example: * * CriteriaQuery&lt;String&gt; q = cb.createQuery(String.class); * Root&lt;Order&gt; order = q.from(Order.class); * q.select(order.get("shippingAddress").&lt;String&gt;get("state")); * * CriteriaQuery&lt;Product&gt; q2 = cb.createQuery(Product.class); * q2.select(q2.from(Order.class) * .join("items") * .&lt;Item,Product&gt;join("product")); * * &lt;/pre&gt; * * @param selection selection specifying the item that * is to be returned in the query result * * @return the modified query * * @throws IllegalArgumentException if the selection is * a compound selection and more than one selection * item has the same assigned alias */ CriteriaQuery&lt;T&gt; select(Selection&lt;? extends T&gt; selection); 这里会遇到一个问题,一些example的代码并不好读,这个时候可以在对应的方法上,按Ctr+q即可看到该方法的文档如下:1234567891011121314javax.persistence.criteria.CriteriaQueryCriteriaQuery&lt;T&gt; select(Selection&lt;? extends T&gt; selection)Specify the item that is to be returned in the query result. Replaces the previously specified selection(s), if any.Note: Applications using the string-based API may need to specify the type of the select item when it results from a get or join operation and the query result type is specified. For example: CriteriaQuery&lt;String&gt; q = cb.createQuery(String.class); Root&lt;Order&gt; order = q.from(Order.class); q.select(order.get("shippingAddress").&lt;String&gt;get("state")); CriteriaQuery&lt;Product&gt; q2 = cb.createQuery(Product.class); q2.select(q2.from(Order.class) .join("items") .&lt;Item,Product&gt;join("product")); 同时在这个弹框里可以看到一个向上的箭头,点击这个箭头可以进入浏览器像阅读JAVA API一样阅读当前对象的API文档","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"读源码","slug":"读源码","permalink":"http://www.icnws.com/tags/读源码/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:数据更新(Update)","slug":"spring-data-jpa-update","date":"2017-07-11T03:13:25.000Z","updated":"2018-03-15T06:27:28.490Z","comments":true,"path":"2017/spring-data-jpa-update/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-update/","excerpt":"","text":"上次通过《Spring Data JPA系列:使用@Modifying修改(Modifying queries)》介绍了数据更新的方式,这种更新方式会很不方便,写的时候也比较麻烦,可以为更新密码、更新用户名等一些特殊的更新单独定义,但是对大多数数据操作是不方便的,比如我要更新一条有一百个字段的数据,这时候如果要通过Modifying方式就非常的不方便,因此,我们需要一种新的方式来解救。通过阅读Spring-Data-JPA相关的文档和博客,找到了对应的解决方案,就是使用save()方法,经过测试,可用。我们平时对save()方法的理解,大多是等同于insert(),主要是指新增一条数据,而JPA的save()方法包含了merge()的概念,就是说,如果save的对象不存在primary key或者primary key值在database内不存在的时候会新添加一条数据,如果primary key 存在并且primary key已经在database中存在,那就会依据primary key对该条数据进行更新,这是我们乐意见到的。 参考的文章:https://stackoverflow.com/questions/11881479/how-do-i-update-an-entity-using-spring-data-jpa 相关描述如下: Identity of entities is defined by their primary keys. Since firstname and lastname are not parts of the primary key, you cannot tell JPA to treat Users with the same firstnames and lastnames as equal if they have different userIds. So, if you want to update a User identified by its firstname and lastname, you need to find that User by a query, and then change appropriate fields of the object your found. These changes will be flushed to the database automatically at the end of transaction, so that you don’t need to do anything to save these changes explicitly. EDIT:Perhaps I should elaborate on overall semantics of JPA. There are two main approaches to design of persistence APIs: insert/update approach. When you need to modify the database you should call methods of persistence API explicitly: you call insert to insert an object, or update to save new state of the object to the database. Unit of Work approach. In this case you have a set of objects managed by persistence library. All changes you make to these objects will be flushed to the database automatically at the end of Unit of Work (i.e. at the end of the current transaction in typical case). When you need to insert new record to the database, you make the corresponding object managed. Managed objects are identified by their primary keys, so that if you make an object with predefined primary key managed, it will be associated with the database record of the same id, and state of this object will be propagated to that record automatically. JPA follows the later approach. save() in Spring Data JPA is backed by merge() in plain JPA, therefore it makes your entity managed as described above. It means that calling save() on an object with predefined id will update the corresponding database record rather than insert a new one, and also explains why save() is not called create().","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"Update","slug":"Update","permalink":"http://www.icnws.com/tags/Update/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Boot:@RestController中.(点号)导致截断的问题","slug":"spring-boot-restcontroller-with-dot-soulutions","date":"2017-07-10T06:27:23.000Z","updated":"2018-03-15T06:27:28.485Z","comments":true,"path":"2017/spring-boot-restcontroller-with-dot-soulutions/","link":"","permalink":"http://www.icnws.com/2017/spring-boot-restcontroller-with-dot-soulutions/","excerpt":"","text":"在测试/api/v1/user/info/email/{email}这个方法的时候@PathVariable无法正常接收参数,邮件地址中(.)后的值会被截断,在社区http://www.spring4all.com 中通过小马哥和@杨小强的帮助下解决了这个问题,记录一下。 1、局部修改比如当前的这个path中就确定一定会包含(.)这样的符号,可以通过配置路径为/api/v1/user/info/email/{email:.*}来解决 2、全局配置全局配置是指在项目的Config文件里配置,代码如下:1234567891011121314import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/** * Created by Administrator on 2017/7/10 0010. */@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); }} 通过这个,我发现,对WebMvcConfigurerAdapter不太熟悉,后面需要加深一下。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring boot","slug":"spring-boot","permalink":"http://www.icnws.com/tags/spring-boot/"},{"name":"PathVariable","slug":"PathVariable","permalink":"http://www.icnws.com/tags/PathVariable/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"OKHTTP3简单工具类分享","slug":"okhttp3-util-share","date":"2017-07-09T16:07:34.000Z","updated":"2018-03-15T06:27:28.473Z","comments":true,"path":"2017/okhttp3-util-share/","link":"","permalink":"http://www.icnws.com/2017/okhttp3-util-share/","excerpt":"","text":"1、官网:https://square.github.io/okhttp/ 2、工具类代码如下: import okhttp3.*; import org.apache.commons.lang.StringUtils; import java.io.IOException; import java.util.Map; public class OkHttpUtil { private static final OkHttpClient mOkHttpClient = new OkHttpClient(); private static RequestBody staticRequestBoday = new FormBody.Builder().build(); private static String reqMethod="GET"; /** * 不会开启异步线程。 * @param request * @return * @throws IOException */ public static Response execute(Request request) throws IOException{ return mOkHttpClient.newCall(request).execute(); } /** * 开启异步线程访问网络 * @param request * @param responseCallback */ public static void enqueue(Request request, Callback responseCallback){ mOkHttpClient.newCall(request).enqueue(responseCallback); } public static String getStringFromServer(String url) throws IOException{ Request request = new Request.Builder().url(url).build(); Response response = execute(request); if (response.isSuccessful()) { String responseUrl = response.body().string(); return responseUrl; } else { throw new IOException("Unexpected code " + response); } } private static final String CHARSET_NAME = "UTF-8"; /*** * 返回Client对象 * @return */ public static OkHttpClient getClient() { return mOkHttpClient; } public static RequestBody staticRequestBoday(){ if(staticRequestBoday==null){ staticRequestBoday = new FormBody.Builder().build(); } return staticRequestBoday; } /** * 根据给定的值,创建Request对象 * 默认方法是GET,默认requestBody为空 * @param method * @param kvs * @param requestBody * @return */ public static Request buildRequest(String method, Map&lt;String,String&gt; kvs,RequestBody requestBody){ if(StringUtils.isBlank(method)){ method = reqMethod; } if(requestBody==null){ requestBody=staticRequestBoday; } String url =""; if(kvs!=null){ url=formatMap(kvs); }else{ return null; } Request request = new Request.Builder().method(method,requestBody) .url(url) .build(); return request; } /** * * @param kvs * @return */ public static Request buildRequest(Map&lt;String,String&gt; kvs){ return buildRequest(null,kvs,null); } /** * * @param method * @param kvs * @return */ public static Request buildRequest(String method,Map&lt;String,String&gt; kvs){ return buildRequest(method,kvs,null); } /** * * @param kvs * @param requestBody * @return */ public static Request buildRequest(Map&lt;String,String&gt; kvs,RequestBody requestBody){ return buildRequest(null,kvs,requestBody); } private static String formatMap(Map&lt;String, String&gt; map) { StringBuffer sb = new StringBuffer(""); for(String key:map.keySet()){ if(key.equals("url")){ continue; } sb.append(key+"="+map.get(key)+"&amp;"); } System.out.println(sb.toString()); String url = map.get("url")+"?"+sb.toString(); return url; } }","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"JAVA","slug":"JAVA","permalink":"http://www.icnws.com/tags/JAVA/"},{"name":"OKHTTP3","slug":"OKHTTP3","permalink":"http://www.icnws.com/tags/OKHTTP3/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:投影(Projection)的用法","slug":"spring-data-jpa-Projection","date":"2017-07-09T15:42:55.000Z","updated":"2018-03-15T06:27:28.486Z","comments":true,"path":"2017/spring-data-jpa-Projection/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-Projection/","excerpt":"","text":"在JPA的查询中,有一个不方便的地方,@Query注解,如果查询直接是Select C from Customer c,这时候,查询的返回对象就是Customer这个完整的对象,包含所有字段,对于我们的示例并没有什么问题,但是对于比较庞大的domain类,这个查询时就比较要命,并不是所有的字段都能用到,比较头疼。另外,如果定义select c.firstName as firstName,c.lastName as lastName from Customer c这个查询结果,返回的对象是Object类型,而且无法直接转换成Customer对象,这样用起来就不是很方便。对于这种情况,JPA提供了一种声明方式来解决,即声明一个接口类,然后直接使用这个接口类接受返回的数据即可。下面奉上代码: 1、增加CustomerProjection接口类12345678910111213package com.example.demo.dto;import org.springframework.beans.factory.annotation.Value;/** * Created by Administrator on 2017/7/9 0009. */public interface CustomerProjection { @Value("#{target.firstName + ' ' + target.lastName}") String getFullName(); String getFirstName(); String getLastName();} 这里声明的方式是可以直接通过get+属性名,这是普通的,另外也可以通过@Value注解来实现指定字段,除了指定字段也可以做聚合展示,比如有些地方需要展示客户的全名,这里定义的getFullName()方法及注解@Value即完成这一操作。需要注意这里的@Value中的target表达式写法及拼接方法。 2、增加CustomerRepository方法12@Query("SELECT c.firstName as firstName,c.lastName as lastName from Customer c")Collection&lt;CustomerProjection&gt; findAllProjectedBy(); 3、增加CustomerController方法1234567891011121314/** * find by projections */@RequestMapping("/findAllProjections")public void findAllProjections(){ Collection&lt;CustomerProjection&gt; projections = repository.findAllProjectedBy(); System.out.println(projections); System.out.println(projections.size()); for (CustomerProjection projection:projections){ System.out.println("FullName:"+projection.getFullName()); System.out.println("FirstName:"+projection.getFirstName()); System.out.println("LastName:"+projection.getLastName()); }} 这里只是做了简单示意,深入的内容需要自己去挖掘探索。不过关于Projection的资料比较少,我也是扒了不少资料才理解的差不多了,还需要多多实践。 另外spring-data-examples项目中有一些JPA的例子,可以用来学习,梳理思路。https://github.com/spring-projects/spring-data-examples/tree/master/jpa 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Projection","slug":"Projection","permalink":"http://www.icnws.com/tags/Projection/"},{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:分页(Pageable)","slug":"spring-data-jpa-pageable","date":"2017-07-09T15:15:46.000Z","updated":"2018-03-15T06:27:28.489Z","comments":true,"path":"2017/spring-data-jpa-pageable/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-pageable/","excerpt":"","text":"在JPA中提供了很方便的分页功能,那就是Pageable(org.springframework.data.domain.Pageable)以及它的实现类PageRequest(org.springframework.data.domain.PageRequest),详细的可以见示例代码: 1、改变CustomerRepository方法123456789101112/** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和=:后面的参数匹配,但不需要和方法名对应的参数值对应 * 这里增加了@QueryHints注解,是给查询添加一些额外的提示 * 比如当前的name值为HINT_COMMENT是在查询的时候带上一些备注信息 */@QueryHints(value = { @QueryHint(name = HINT_COMMENT, value = "a query for pageable")})@Query("select c from Customer c where c.firstName=:name or c.lastName=:name")Page&lt;Customer&gt; findByName(@Param("name") String name2,Pageable pageable); 2、增加CustomerController方法pageable123456789101112131415161718192021/** * 分页 * 应用查询提示@QueryHints,这里是在查询的适合增加了一个comment * 查询结果是lastName和firstName都是bauer这个值的数据 */@RequestMapping("/pageable")public void pageable(){ //Pageable是接口,PageRequest是接口实现 //PageRequest的对象构造函数有多个,page是页数,初始值是0,size是查询结果的条数,后两个参数参考Sort对象的构造方法 Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id"); Page&lt;Customer&gt; page = repository.findByName("bauer",pageable); //查询结果总行数 System.out.println(page.getTotalElements()); //按照当前分页大小,总页数 System.out.println(page.getTotalPages()); //按照当前页数、分页大小,查出的分页结果集合 for (Customer customer: page.getContent()) { System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 从示例代码的注释当中可以看到Page对象的相关参数及值的说明,更详细的用法,参考PageRequest源码。 小结:怎么样,是不是很简单很方便?!另:PageRequest.java源码在上一篇文章已经有了。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"Pageable","slug":"Pageable","permalink":"http://www.icnws.com/tags/Pageable/"},{"name":"分页","slug":"分页","permalink":"http://www.icnws.com/tags/分页/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos7:系统用户","slug":"centos7-setting-the-system-users","date":"2017-07-06T06:38:48.000Z","updated":"2018-03-15T06:27:28.459Z","comments":true,"path":"2017/centos7-setting-the-system-users/","link":"","permalink":"http://www.icnws.com/2017/centos7-setting-the-system-users/","excerpt":"","text":"1、用户创建useradd username 2、更改密码passwd username然后输入密码即可,两次","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:应用查询提示(Applying query hints)","slug":"spring-data-jpa-applying-query-hints","date":"2017-07-04T16:16:56.000Z","updated":"2018-03-15T06:27:28.487Z","comments":true,"path":"2017/spring-data-jpa-applying-query-hints/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-applying-query-hints/","excerpt":"","text":"这一节讲应用查询提示,学这一节比较波折,文档上的介绍太简单了,而且面对示例不知道如何下手,所以拖了一下,才有点头绪。123456public interface UserRepository extends Repository&lt;User, Long&gt; { @QueryHints(value = { @QueryHint(name = "name", value = "value")}, forCounting = false) Page&lt;User&gt; findByLastname(String lastname, Pageable pageable);} 对name和value的值我一直以为是自定义的,最后发现不完全是,是有一组定义好的值供我们选择。 1、QueryHints源码如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or &lt;http://www.gnu.org/licenses/lgpl-2.1.html&gt;. */package org.hibernate.jpa;import java.util.HashSet;import java.util.Set;import static org.hibernate.annotations.QueryHints.CACHEABLE;import static org.hibernate.annotations.QueryHints.CACHE_MODE;import static org.hibernate.annotations.QueryHints.CACHE_REGION;import static org.hibernate.annotations.QueryHints.COMMENT;import static org.hibernate.annotations.QueryHints.FETCHGRAPH;import static org.hibernate.annotations.QueryHints.FETCH_SIZE;import static org.hibernate.annotations.QueryHints.FLUSH_MODE;import static org.hibernate.annotations.QueryHints.LOADGRAPH;import static org.hibernate.annotations.QueryHints.NATIVE_LOCKMODE;import static org.hibernate.annotations.QueryHints.READ_ONLY;import static org.hibernate.annotations.QueryHints.TIMEOUT_HIBERNATE;import static org.hibernate.annotations.QueryHints.TIMEOUT_JPA;/** * Defines the supported JPA query hints * * @author Steve Ebersole */public class QueryHints { /** * The hint key for specifying a query timeout per Hibernate O/RM, which defines the timeout in seconds. * * @deprecated use {@link #SPEC_HINT_TIMEOUT} instead */ @Deprecated public static final String HINT_TIMEOUT = TIMEOUT_HIBERNATE; /** * The hint key for specifying a query timeout per JPA, which defines the timeout in milliseconds */ public static final String SPEC_HINT_TIMEOUT = TIMEOUT_JPA; /** * The hint key for specifying a comment which is to be embedded into the SQL sent to the database. */ public static final String HINT_COMMENT = COMMENT; /** * The hint key for specifying a JDBC fetch size, used when executing the resulting SQL. */ public static final String HINT_FETCH_SIZE = FETCH_SIZE; /** * The hint key for specifying whether the query results should be cached for the next (cached) execution of the * "same query". */ public static final String HINT_CACHEABLE = CACHEABLE; /** * The hint key for specifying the name of the cache region (within Hibernate's query result cache region) * to use for storing the query results. */ public static final String HINT_CACHE_REGION = CACHE_REGION; /** * The hint key for specifying that objects loaded into the persistence context as a result of this query execution * should be associated with the persistence context as read-only. */ public static final String HINT_READONLY = READ_ONLY; /** * The hint key for specifying the cache mode ({@link org.hibernate.CacheMode}) to be in effect for the * execution of the hinted query. */ public static final String HINT_CACHE_MODE = CACHE_MODE; /** * The hint key for specifying the flush mode ({@link org.hibernate.FlushMode}) to be in effect for the * execution of the hinted query. */ public static final String HINT_FLUSH_MODE = FLUSH_MODE; public static final String HINT_NATIVE_LOCKMODE = NATIVE_LOCKMODE; /** * Hint providing a "fetchgraph" EntityGraph. Attributes explicitly specified as AttributeNodes are treated as * FetchType.EAGER (via join fetch or subsequent select). * * Note: Currently, attributes that are not specified are treated as FetchType.LAZY or FetchType.EAGER depending * on the attribute's definition in metadata, rather than forcing FetchType.LAZY. */ public static final String HINT_FETCHGRAPH = FETCHGRAPH; /** * Hint providing a "loadgraph" EntityGraph. Attributes explicitly specified as AttributeNodes are treated as * FetchType.EAGER (via join fetch or subsequent select). Attributes that are not specified are treated as * FetchType.LAZY or FetchType.EAGER depending on the attribute's definition in metadata */ public static final String HINT_LOADGRAPH = LOADGRAPH; private static final Set&lt;String&gt; HINTS = buildHintsSet(); private static Set&lt;String&gt; buildHintsSet() { HashSet&lt;String&gt; hints = new HashSet&lt;String&gt;(); hints.add( HINT_TIMEOUT ); hints.add( SPEC_HINT_TIMEOUT ); hints.add( HINT_COMMENT ); hints.add( HINT_FETCH_SIZE ); hints.add( HINT_CACHE_REGION ); hints.add( HINT_CACHEABLE ); hints.add( HINT_READONLY ); hints.add( HINT_CACHE_MODE ); hints.add( HINT_FLUSH_MODE ); hints.add( HINT_NATIVE_LOCKMODE ); hints.add( HINT_FETCHGRAPH ); hints.add( HINT_LOADGRAPH ); return java.util.Collections.unmodifiableSet( hints ); } public static Set&lt;String&gt; getDefinedHints() { return HINTS; } protected QueryHints() { }} 对应值的介绍,除了注释,我在网上也找到了一些资料,讲的很详细: https://www.thoughts-on-java.org/11-jpa-hibernate-query-hints-every-developer-know https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/jpa/QueryHints.html 2、在CustomerRepository中添加示例:导入QueryHint的name的对应的值 import static org.hibernate.jpa.QueryHints.HINT_COMMENT;123456789101112/** * 一个参数,匹配两个字段 * @param name2 * @Param pageable 分页参数 * @return * 这里Param的值和=:后面的参数匹配,但不需要和方法名对应的参数值对应 * 这里增加了@QueryHints注解,是给查询添加一些额外的提示 * 比如当前的name值为HINT_COMMENT是在查询的时候带上一些备注信息 */@QueryHints(value = { @QueryHint(name = HINT_COMMENT, value = "a query for pageable")})@Query("select c from Customer c where c.firstName=:name or c.lastName=:name")Page&lt;Customer&gt; findByName(@Param("name") String name2,Pageable pageable); 3、在CustomerController中添加示例:123456789101112131415161718192021/** * 分页 * 应用查询提示@QueryHints,这里是在查询的适合增加了一个comment * 查询结果是lastName和firstName都是bauer这个值的数据 */@RequestMapping("/pageable")public void pageable(){ //Pageable是接口,PageRequest是接口实现 //PageRequest的对象构造函数有多个,page是页数,初始值是0,size是查询结果的条数,后两个参数参考Sort对象的构造方法 Pageable pageable = new PageRequest(0,3, Sort.Direction.DESC,"id"); Page&lt;Customer&gt; page = repository.findByName("bauer",pageable); //查询结果总行数 System.out.println(page.getTotalElements()); //按照当前分页大小,总页数 System.out.println(page.getTotalPages()); //按照当前页数、分页大小,查出的分页结果集合 for (Customer customer: page.getContent()) { System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 注意到,这里除了方法调用了带有查询提示的方法以外,还对方法的Pageable参数进行了简单实现——PageRequest,这个类包含了多个构造函数,可以根据自己的需求自由定制,对于排序不分参考Sort那一篇。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo 附:PageRequest源码: /* * Copyright 2008-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.domain; import org.springframework.data.domain.Sort.Direction; /** * Basic Java Bean implementation of {@code Pageable}. * * @author Oliver Gierke * @author Thomas Darimont */ public class PageRequest extends AbstractPageRequest { private static final long serialVersionUID = -4541509938956089562L; private final Sort sort; /** * Creates a new {@link PageRequest}. Pages are zero indexed, thus providing 0 for {@code page} will return the first * page. * * @param page zero-based page index. * @param size the size of the page to be returned. */ public PageRequest(int page, int size) { this(page, size, null); } /** * Creates a new {@link PageRequest} with sort parameters applied. * * @param page zero-based page index. * @param size the size of the page to be returned. * @param direction the direction of the {@link Sort} to be specified, can be {@literal null}. * @param properties the properties to sort by, must not be {@literal null} or empty. */ public PageRequest(int page, int size, Direction direction, String... properties) { this(page, size, new Sort(direction, properties)); } /** * Creates a new {@link PageRequest} with sort parameters applied. * * @param page zero-based page index. * @param size the size of the page to be returned. * @param sort can be {@literal null}. */ public PageRequest(int page, int size, Sort sort) { super(page, size); this.sort = sort; } /* * (non-Javadoc) * @see org.springframework.data.domain.Pageable#getSort() */ public Sort getSort() { return sort; } /* * (non-Javadoc) * @see org.springframework.data.domain.Pageable#next() */ public Pageable next() { return new PageRequest(getPageNumber() + 1, getPageSize(), getSort()); } /* * (non-Javadoc) * @see org.springframework.data.domain.AbstractPageRequest#previous() */ public PageRequest previous() { return getPageNumber() == 0 ? this : new PageRequest(getPageNumber() - 1, getPageSize(), getSort()); } /* * (non-Javadoc) * @see org.springframework.data.domain.Pageable#first() */ public Pageable first() { return new PageRequest(0, getPageSize(), getSort()); } /* * (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof PageRequest)) { return false; } PageRequest that = (PageRequest) obj; boolean sortEqual = this.sort == null ? that.sort == null : this.sort.equals(that.sort); return super.equals(that) &amp;&amp; sortEqual; } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return 31 * super.hashCode() + (null == sort ? 0 : sort.hashCode()); } /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return String.format("Page request [number: %d, size %d, sort: %s]", getPageNumber(), getPageSize(), sort == null ? null : sort.toString()); } }","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:使用@Modifying修改(Modifying queries)","slug":"spring-data-jpa-modifying-query","date":"2017-06-30T17:17:05.000Z","updated":"2018-03-15T06:27:28.488Z","comments":true,"path":"2017/spring-data-jpa-modifying-query/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-modifying-query/","excerpt":"","text":"通过之前的讲解和示例,我们掌握了基本的JPA使用方法,大多数是一些查询数据的方法,这一节我们学习通过@Modifying去做数据更新的方法示例。 1、在CustomerRepository上增加新方法12345678910/** * 根据lastName去更新firstName,返回结果是更改数据的行数 * @param firstName * @param lastName * @return */@Modifying//更新查询@Transactional//开启事务@Query("update Customer c set c.firstName = ?1 where c.lastName = ?2")int setFixedFirstnameFor(String firstName, String lastName); 这里需要注意,在使用@Modifying注解的时候,一定要加上事务注解@Transactional,如果你忘了或者加错了,那很可能报如下错误: 122017-07-01 01:03:24.844 ERROR 8072 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query] with root causejavax.persistence.TransactionRequiredException: Executing an update/delete query at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 如果你发现了上述错误就去加上事务吧。 2、在CustomerController中测试:123456789101112/** * 根据FirstName进行修改 */@RequestMapping("/modifying")public void modifying(){ Integer result = repository.setFixedFirstnameFor("Bauorx","Bauer"); if(result!=null){ System.out.println("modifying result:"+result); } System.out.println("-------------------------------------------");} 至此,关于@Modifying的基本用法已经给出,希望对你有所帮助。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:使用Sort进行排序(Using Sort)","slug":"spring-data-jpa-useing-sort","date":"2017-06-29T17:09:04.000Z","updated":"2018-03-15T06:27:28.491Z","comments":true,"path":"2017/spring-data-jpa-useing-sort/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-useing-sort/","excerpt":"","text":"通过上一节的学习,我们知道了如何用@Query注解来实现灵活的查询。在上一节的示例中,我也尝试给出简单的排序,通过JPQL语句以及原生SQL来实现的。这样的实现,虽然在一定程度上可以应用,但是灵活度不够,因此结合@Query注解,我们可以使用Sort来对结果进行排序。 1、在CustomerRepository内添加方法12345678910/** * 一个参数,匹配两个字段 * @param name2 * @param sort 指定排序的参数,可以根据需要进行调整 * @return * 这里Param的值和=:后面的参数匹配,但不需要和方法名对应的参数值对应 * */@Query("select c from Customer c where c.firstName=:name or c.lastName=:name")List&lt;Customer&gt; findByName4(@Param("name") String name2,Sort sort); 方法一如既往,是声明式的,只是在原有方法的基础上,加上Sort(`org.springframework.data.domain.Sort`)作为参数即可。 2、在CustomerController中测试1234567891011121314151617181920212223242526272829303132333435363738394041424344/** * @Query注解方式查询, * 用@Param指定参数,匹配firstName和lastName */@RequestMapping("/findByName")public void findByName4(){ //按照ID倒序排列 System.out.println("直接创建sort对象,通过排序方法和属性名"); Sort sort = new Sort(Sort.Direction.DESC,"id"); List&lt;Customer&gt; result = repository.findByName4("Bauer",sort); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------"); //按照ID倒序排列 System.out.println("通过Sort.Order对象创建sort对象"); Sort sortx = new Sort(new Sort.Order(Sort.Direction.DESC,"id")); List&lt;Customer&gt; resultx = repository.findByName4("Bauer",sort); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------"); System.out.println("通过排序方法和属性List创建sort对象"); List&lt;String&gt; sortProperties = new ArrayList&lt;&gt;(); sortProperties.add("id"); sortProperties.add("firstName"); Sort sort2 = new Sort(Sort.Direction.DESC,sortProperties); List&lt;Customer&gt; result2 = repository.findByName4("Bauer",sort2); for (Customer customer:result2){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------"); System.out.println("通过创建Sort.Order对象的集合创建sort对象"); List&lt;Sort.Order&gt; orders = new ArrayList&lt;&gt;(); orders.add(new Sort.Order(Sort.Direction.DESC,"id")); orders.add(new Sort.Order(Sort.Direction.ASC,"firstName")); List&lt;Customer&gt; result3 = repository.findByName4("Bauer",new Sort(orders)); for (Customer customer:result3){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 这里总共列举了四种排序方式: 1)直接创建Sort对象,适合对单一属性做排序2)通过Sort.Order对象创建Sort对象,适合对单一属性做排序3)通过属性的List集合创建Sort对象,适合对多个属性,采取同一种排序方式的排序4)通过Sort.Order对象的List集合创建Sort对象,适合所有情况,比较容易设置排序方式对应着我们的使用场景来进行选择创建Sort对象的方式。 注意,这里并没有列举所有的Sort使用方式,还有忽略大小写,使用JpaSort.unsafe、聚合函数等进行排序,查询的属性值是Entity的属性名,不是数据库的字段,要注意到!! 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"Sort","slug":"Sort","permalink":"http://www.icnws.com/tags/Sort/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:使用@Query注解(Using @Query)","slug":"spring-data-jpa-useing-query","date":"2017-06-29T09:18:51.000Z","updated":"2018-03-15T06:27:28.491Z","comments":true,"path":"2017/spring-data-jpa-useing-query/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-useing-query/","excerpt":"","text":"经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQL的语言,略有区别,后者我们更熟悉一些。话不多说,看代码。 1、在CustomerRepository里添加12345678910111213141516171819202122232425262728293031323334353637/** * 模糊匹配 * @param bauer * @return */@Query("select c from Customer c where c.firstName=?1")Customer findByFirstName2(String bauer);@Query("select c from Customer c where c.lastName=?1 order by c.id desc")List&lt;Customer&gt; findByLastName2(String lastName);/** * 一个参数,匹配两个字段 * @param name2 * @return * 这里Param的值和=:后面的参数匹配,但不需要和方法名对应的参数值对应 */@Query("select c from Customer c where c.firstName=:name or c.lastName=:name order by c.id desc")List&lt;Customer&gt; findByName(@Param("name") String name2);/** * 一个参数,匹配两个字段 * @param name * @return * 这里的%只能放在占位的前面,后面不行 */@Query("select c from Customer c where c.firstName like %?1")List&lt;Customer&gt; findByName2(@Param("name") String name);/** * 一个参数,匹配两个字段 * @param name * @return * 开启nativeQuery=true,在value里可以用原生SQL语句完成查询 */@Query(nativeQuery = true,value = "select * from Customer c where c.first_name like concat('%' ,?1,'%') ")List&lt;Customer&gt; findByName3(@Param("name") String name); 2、在CustomerController内添加123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263/** * @Query注解方式查询 * 查询FirstName为指定字符串 */@RequestMapping("/findByFirstName2")public void findByFirstName2(){ Customer customer = repository.findByFirstName2("Bauer"); if(customer!=null){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");}/** * @Query注解方式查询 * 查询LastName为指定字符串 */@RequestMapping("/findByLastName2")public void findByLastName2(){ List&lt;Customer&gt; result = repository.findByLastName2("Bauer"); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");}/** * @Query注解方式查询, * 用@Param指定参数,匹配firstName和lastName */@RequestMapping("/findByName")public void findByName(){ List&lt;Customer&gt; result = repository.findByName("Bauer"); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");}/** * @Query注解方式查询,使用关键词like * 用@Param指定参数,firstName的结尾为e的字符串 */@RequestMapping("/findByName2")public void findByName2(){ List&lt;Customer&gt; result = repository.findByName2("e"); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");}/** * @Query注解方式查询,模糊匹配关键字e */@RequestMapping("/findByName3")public void findByName3(){ List&lt;Customer&gt; result = repository.findByName3("e"); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 可能看了上面的代码有些疑惑,这里做一下解释:?加数字表示占位符,?1代表在方法参数里的第一个参数,区别于其他的index,这里从1开始 =:加上变量名,这里是与方法参数中有@Param的值匹配的,而不是与实际参数匹配的 JPQL的语法中,表名的位置对应Entity的名称,字段对应Entity的属性,详细语法见相关文档 要使用原生SQL需要在@Query注解中设置nativeQuery=true,然后value变更为原生SQL即可 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:预定义查询(NamedQueries)","slug":"spring-data-jpa-namedqueries","date":"2017-06-28T16:15:53.000Z","updated":"2018-03-15T06:27:28.488Z","comments":true,"path":"2017/spring-data-jpa-namedqueries/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-namedqueries/","excerpt":"","text":"前面讲了Spring-data-JPA的基本配置、继承的方法和创建查询,都比较简单,本节讲预定义查询(NamedQueries)。 预定义查询有两种,一种是通过XML配置或配置@NamedQuery,另一种是通过XML配置或配置@NamedNativeQuery,实现。对于配置XML的示例,这里就不做演示了,重点是通过Annotation实现的。 1、修改实体(Entity)在@Entity下增加@NamedQuery定义,需要注意,这里的sql表达式里的表名要和当前的Entity一致,否则会找不到,报错!!!查询参数也要和实体进行对应起来,是firstName而不是first_name,切记!! 当然,有人可能会问会不会有复杂的表查询,这里不做探究,因为实际场景中这种破坏Entity的侵入式很不美感,也不方便,有更优雅的方式可选择,后面会提到。12345678910111213141516171819202122232425262728package com.example.demo.dto;import org.hibernate.annotations.NamedQuery;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entity@NamedQuery(name="Customer.findByFirstName",query = "select c from Customer c where c.firstName = ?1")public class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; protected Customer() {} public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); }} 2、修改CustomerRepository增加方法: Customer findByFirstName(String bauer); 3、修改CustomerController增加方法: 1234567891011/** * 查询FirstName为指定用户昵称 */@RequestMapping("/findByFirstName")public void findByFirstName(){ Customer customer = repository.findByFirstName("Bauer"); if(customer!=null){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 关于预定义查询(NamedQueries)的入门就到这里,如果想深入使用,需要深入的去摸索,挖坑填坑。下一节是使用@Query注解,实现查询,相对而言会更灵活一些。 参考:官方文档,https://docs.spring.io/spring-data/jpa/docs/current/reference/html,PDF官方文档下载:下载地址,API官方文档:API文档 DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"},{"name":"namedqueries","slug":"namedqueries","permalink":"http://www.icnws.com/tags/namedqueries/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"读《启示录——打造用户喜爱的产品》","slug":"read-the-book-for-product-Inspired","date":"2017-06-28T10:53:44.000Z","updated":"2018-03-15T06:27:28.480Z","comments":true,"path":"2017/read-the-book-for-product-Inspired/","link":"","permalink":"http://www.icnws.com/2017/read-the-book-for-product-Inspired/","excerpt":"","text":"这是最近刚看完的一本关于产品的书,书中主要介绍了很多关于如何优化产品管理,如何实施产品计划规划,以及在产品开发遇到的坑如何解决相关的内容! 内容丰富,干货十足,适合产品经理或产品管理以及从事过一年以上开发的人来看! 对照我们的开发过程,很容易发现一些问题是什么原因,如何应对等等。虽然可能你现在无法立即实践,但是,对分析产品研发的问题很有帮助! 推荐阅读!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"读《娱乐至死》","slug":"read-Amusing-Ourselves-to-Death","date":"2017-06-28T10:37:13.000Z","updated":"2018-03-15T06:27:28.475Z","comments":true,"path":"2017/read-Amusing-Ourselves-to-Death/","link":"","permalink":"http://www.icnws.com/2017/read-Amusing-Ourselves-to-Death/","excerpt":"","text":"娱乐至死尼尔·波兹曼 点评点评此书 ★★★★★ 娱乐致死,因为娱乐改变了我们的生活和环境,让人以为娱乐可以取代一切,而最大的错误就是用娱乐的方式去改变教育模式和行为!想起来从2001年开始,我就很少接受“电视的教育”感到庆幸,少看了很多肥皂剧,反而培养了好读书的习惯!感谢老爸老妈和寄宿学校!!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"Spring Data JPA系列:创建查询(Query creation)","slug":"spring-data-jpa-query-creation","date":"2017-06-27T16:08:49.000Z","updated":"2018-03-15T06:27:28.490Z","comments":true,"path":"2017/spring-data-jpa-query-creation/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-query-creation/","excerpt":"","text":"通常,JPA的查询创建机制如查询方法所描述的那样工作。下面是一个关于JPA查询方法的简单示例:1、在CustomerRepository接口中,有如下定义:123456/** * 根据lastName查询结果 * @param lastName * @return */List<Customer> findByLastName(String lastName); 这是通过参数lastName去解析,并将查询结果返回,语义相当于`select * from customer where last_name=${lastName}`,在controller中就可以直接进行使用该方法了。 2、在CustomerController代码中使用CustomerRepository进行数据查询操作。如下:1234567891011/** * 查询lastName为指定用户昵称 */@RequestMapping("/findByLastName")public void findByLastName(){ List&lt;Customer&gt; result = repository.findByLastName("Bauer"); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------");} 3、创建查询的方法名命名指南同时,查询创建还提供了一些基本的方法命名规则,如下: 通过以上,可以通过简单的方法命名来实现查询,但是在使用的过程中,很多时候我们会不满足这个状态,因为可能好多的数据集按照这个来实现是极其费劲的。接下来的篇幅将会讲JPA查询的重点内容,算是深入一点点,敬请期待吧。参考:官方文档,https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlDEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"企业为啥选64位操作系统?","slug":"Why-Enterprise-user-x64-OS","date":"2017-06-27T03:56:26.000Z","updated":"2018-03-15T06:27:28.454Z","comments":true,"path":"2017/Why-Enterprise-user-x64-OS/","link":"","permalink":"http://www.icnws.com/2017/Why-Enterprise-user-x64-OS/","excerpt":"","text":"我们平时做开发做什么,都选择用64位的操作系统,但是你知道为啥么?大部分人只知道64位的可以支持更多内存,而32位的只能支持到4GB大小的内存。选64位操作系统的原因如下:1、设计定位不同64位是高科技人员使用的,32位是民用的,当然现在大部分的新机器也都采用64位的,32位的机器基本上被淘汰了2、安装要求不同所谓要求不同是,很多32位的软件既能安装在32位的也能安装在64位的操作系统上,但是反过来,64位的软件只能运行在64位的操作系统上3、运算速度不同64位操作系统运行速度要远远高于32位机器的运行速度4、寻址能力不同64位操作系统寻址能力更强,支持内存更大,效率也更高","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"64位操作系统","slug":"64位操作系统","permalink":"http://www.icnws.com/tags/64位操作系统/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"Spring Data JPA系列:继承的方法","slug":"spring-data-jpa-inheirit-functions","date":"2017-06-26T15:58:05.000Z","updated":"2018-03-15T06:27:28.488Z","comments":true,"path":"2017/spring-data-jpa-inheirit-functions/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-inheirit-functions/","excerpt":"","text":"上一节讲了spring-data-jpa的基本配置,这一节主要是讲自定义Repository继承了JpaRepository相关的一些方法,包括基本的增删改查方法。 1、方法列表1)、从PagingAndSortingRepository继承的findAll方法2)、从CrudRepository继承的count, delete,deleteAll, exists, findOne, save等方法3)、从QueryByExampleExecutor继承的count, exists, findAll, findOne** 2、demo示例因为比较简单,这里只是简单写几个简单的方法进行测试,这里为了简单方便起见,我讲测试的方法放到Controller内——Customercontroller。 1)、save方法,初始化,保存Customer数据**123456789101112131415161718192021222324 @Controller @RequestMapping("/customer") public class CustomerController { @Autowired private CustomerRepository repository; /** * 初始化数据 */ @RequestMapping("/index") public void index() { // save a couple of customers repository.save(new Customer("Jack", "Bauer")); repository.save(new Customer("Chloe", "O'Brian")); repository.save(new Customer("Kim", "Bauer")); repository.save(new Customer("David", "Palmer")); repository.save(new Customer("Michelle", "Dessler")); repository.save(new Customer("Bauer", "Dessler")); }``` 这里调用了接口继承的save方法。#### 2)、findAll方法,查找出完成初始化的数据 /** * 查询所有 */ @RequestMapping("/findAll") public void findAll(){ List&lt;Customer&gt; result = repository.findAll(); for (Customer customer:result){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------"); } 1#### 3)、findOne方法,根据long型Id为参数,返回对应的人 /** * 查询ID为1的数据 */ @RequestMapping("/findOne") public void findOne(){ Customer result = repository.findOne(1L); if(result!=null){ System.out.println(result.toString()); } System.out.println("-------------------------------------------"); } 1#### 4)、delete方法,根据Id删除指定数据,也可以用批量删除方法 /** * 查询ID为1的数据 */ @RequestMapping("/delete") public void delete(){ System.out.println("删除前数据:"); List&lt;Customer&gt; customers = repository.findAll(); for (Customer customer:customers){ System.out.println(customer.toString()); } System.out.println("删除ID=3数据:"); repository.delete(3l); System.out.println("删除后数据:"); customers = repository.findAll(); for (Customer customer:customers){ System.out.println(customer.toString()); } System.out.println("-------------------------------------------"); } ` 5)、其他还有很多,用法方法,大同小异,只是在功能上不完全重叠。是不是感觉有JPA真心方便,不用谢mapper文件,不用各种配置,甚至不用定义基本的增删改查方法,写个类似DAO的类,继承一下JpaRepository或者CrudRepository,当程序运行的时候,会创建一个虚拟的实训类,然后执行相关逻辑。 这一节就到这里,下一节讲通过方法名来实现一些简单查询,有一定的局限性,但是可以学习一下这种操作,以备不时之需。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Spring Data JPA系列:基本配置","slug":"spring-data-jpa-basic-config","date":"2017-06-25T14:38:38.000Z","updated":"2018-03-15T06:27:28.487Z","comments":true,"path":"2017/spring-data-jpa-basic-config/","link":"","permalink":"http://www.icnws.com/2017/spring-data-jpa-basic-config/","excerpt":"","text":"最近在看spring boot相关的内容,在看到spring data JPA的时候,发现通过程序猿DD以及泥瓦匠的博客来看,都是基础的引入JPA依赖,且版本也不是最新的。通过搜索引擎得到的结果也大多是copy by copy,没有什么实际有深度的文章,这里将通过阅读官方文档,学到的一些东西记录一下,方便别人来学习参考。这一节讲你基础的,配置依赖: 1、在pom.xml里加入如下依赖:12345678<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> 2、当前springboot的版本信息如下:123456<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --></parent> 3、创建dto对象:12345678910111213141516171819202122232425package com.example.demo.dto;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entitypublic class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; protected Customer() {} public Customer(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } @Override public String toString() { return String.format( "Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName); }} 4、创建操作数据的Repository对象:12345package com.example.demo.repositories;import com.example.demo.dto.Customer;import org.springframework.data.jpa.repository.JpaRepository;public interface CustomerRepository extends JpaRepository&lt;Customer, Long&gt; {} 对于JpaRepository需要知道:123456789public interface JpaRepository&lt;T,ID extends Serializable&gt;extends PagingAndSortingRepository&lt;T,ID&gt;, QueryByExampleExecutor&lt;T&gt;Methods inherited from interface org.springframework.data.repository.PagingAndSortingRepositoryfindAllMethods inherited from interface org.springframework.data.repository.CrudRepositorycount, delete, delete, delete, deleteAll, exists, findOne, saveMethods inherited from interface org.springframework.data.repository.query.QueryByExampleExecutorcount, exists, findAll, findOne 从上面可以看出,CustomerRepository继承了JpaRepository之后就拥有了CrudRepository、QueryByExampleExecutor、PagingAndSortingRepository的基本能力了,包括基本的增删改查都有了。5、数据库配置需要在application.properties加上如下参数:12345spring.datasource.url=jdbc:mysql://localhost:3306/testspring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.properties.hibernate.hbm2ddl.auto=create 这里要注意到最后一行参数spring.jpa.properties.hibernate.hbm2ddl.auto=create,这个参数是为了方便处理数据库表,该属性的值一般有如下几个:1234validate 加载hibernate时,验证创建数据库表结构create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。create-drop 加载hibernate时创建,退出是删除表结构update 加载hibernate自动更新数据库结构 很多教程上写create-drop,就是每次启动都要重新创建表,如果表比较少还好,但是多了就是麻烦,还有初始化数据,我这里写的是create,只完成表的初始化创建即可,后面就不需要关注了。建议是,在测试环境慎重使用,在生产环境坚决不使用,要不然,死都不知道怎么死的。 到此,基本的配置已经完成了,下一篇文章会写如何使用,如果对你有帮助希望你也分享给你的小伙伴吧。 参考:官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/htmlAPI官方文档:http://docs.spring.io/spring-data/data-jpa/docs/current/api/JPQL文档:http://www.blogjava.net/calmJava/archive/2011/04/01/347450.html DEMO示例:https://github.com/icnws/spring-data-jpa-demo","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"spring-data-jpa","slug":"spring-data-jpa","permalink":"http://www.icnws.com/tags/spring-data-jpa/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"写作才是你的捷径","slug":"writing-is-your-shortcut","date":"2017-06-22T15:11:14.000Z","updated":"2018-03-15T06:27:28.501Z","comments":true,"path":"2017/writing-is-your-shortcut/","link":"","permalink":"http://www.icnws.com/2017/writing-is-your-shortcut/","excerpt":"","text":"写东西难上学的时候写作文,写论文,毕业之后就是写工作相关的东西。大多数人,写过会议纪要,写过PPT,偶尔写写朋友圈,但是认真的写文章的,除了工作要求,相对来说就寥寥无几了。今天听一个朋友说,写一篇博客,弄了半天,累的不行了还是写不出来,写不好,写的不满意,写作真的不是一般人能做的。我说是呀,写东西难,写有条理的东西难,写有条理且不晦涩的东西更难,写的好看还通俗易懂,那是难上加难。写东西不能是心血来潮,心血来潮的写东西,来得快也去得快,写东西要么是职业,要么是兴趣,其他的都比较扯。因此啊,那些写的一手好文章的人,无论是专业的还是业余的,都可以称得上才情俱佳,小说生成器生成的那种假作者除外。 为啥写作学东西,看东西,只有当你认真学习,认真思考,过几遍脑子,这东西才能有一部分算是你的。当你去试图用自己的方式去表达,而且要给别人看的时候,内心大多数时候是比较谨慎的。这个过程你会反复考虑自己说的东西是不是对的,有什么依据,什么可以佐证等等。就这样,一来二去,遇到事情思维也活络起来,别人想不到的角度你可以想到,别人解决不来的问题,你用脑子一转圈就能出来好几个策略,稍微一深入就是多个解决方案浮出水面。这就是写东西培养出来的素养,培养出来的能力。当然,也不是所有人都能做到,锻炼锻炼也是好的,起码你能知道别人不知道的东西。 我的历程这些年,博客系统都换了好几茬,文章也丢了好多篇,但是我还在坚持写,不是说写得好,而是说坚持写,坚持除了工作之外,有自己的一点点思考。只有这样,当你回忆的时候,不会在你的青春年华里只有朋友圈的那些照片和只言片语;不会在你回忆过去的时候,只有没有自我的工作,只是社会流水线上的一个牵线木偶。 你也要无论多难,无论怎么没有条件,现在就立刻准备开始写,不用写别的,写写你的读后感,写写最近遇到的事情,最近学到的东西,学东西过程中获得的感官是什么。你也要写作,写作才是每个人都可以拥有的进阶捷径。从来不相信有捷径的人,如果投入了时间在写作上,一定会有意外的收获,惊喜连连。","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"写作","slug":"写作","permalink":"http://www.icnws.com/tags/写作/"},{"name":"写东西","slug":"写东西","permalink":"http://www.icnws.com/tags/写东西/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"暴雨来临,忆曾经的夏","slug":"that-summer-ever-young","date":"2017-06-21T15:16:19.000Z","updated":"2018-03-15T06:27:28.494Z","comments":true,"path":"2017/that-summer-ever-young/","link":"","permalink":"http://www.icnws.com/2017/that-summer-ever-young/","excerpt":"","text":"暴雨来临南方已经下的悲恨交加了,北方盼啊盼的雨终于要来了,在这个时候,适合回忆一下年轻时候的往事,那些夏季。那些年的夏季,你在哪?有什么深刻的记忆? 西瓜之夏回忆里,年少的时光,夏天到了,放暑假了,要去地里收拾瓜秧,晚上看瓜,睡瓜庵子,看月亮,晒星星。和小伙伴们一起谈天说地,好不惬意。壮烈的事情是练习挑熟的瓜,刚开始,挑一个没熟,挑一个半熟,那叫一个浪费啊。这都是因为馋瓜,还没有真正下来的时候就想尝鲜,总得浪费点瓜学学本领,交交学费。等瓜都下来的时候,饭也不吃了,就抱着西瓜吃,一顿饭就吃一个大西瓜,吃的哪哪的都是西瓜,生怕别人不知道自己吃西瓜了。下雨的时候,躲在瓜庵子里,听着雨声,和小伙伴一起打扑克,各种玩,很多纸牌游戏,不知道现状的孩子还会不会玩,不过瓜地已经很少见了。 离开夏天后来,稍微大一些的时候,就离开家,去远一点的地方上学,见识多了,就算是暑假,也没有早年对西瓜地那么留恋了。这时候的夏天,只是一个忙碌的季节,还会有瓜吃,还会有活干,只是少了一些童真的欢乐。 如今夏天现在的夏天,每天依然忙忙碌碌,除了感觉天气变热,再也找不到什么变化,没有瓜地可以看守,难得小伙伴一起谈天说地。累了,乏了,就买个西瓜,几两花生,几瓶啤酒,三口两口下肚,恢复几分生气。有时候也怀念那些日子,无忧无虑,除了吃西瓜,和小伙伴们玩耍,基本上什么也不用顾虑太多,也没有各种各样的消费可以拥有,但是凡是拥有,都格外珍惜。从一座城市到另一座城市,充满了艰辛和光明,艰辛是真的,光明却未必。有时候就想回到那个状态的生活,但是每次回家超过四五天就有点呆不住了,似乎是,人的节奏一旦快起来,很多东西已然不愿意接受慢下来的节奏。可能会心慌,可能觉得心里没着落。","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"回忆","slug":"回忆","permalink":"http://www.icnws.com/tags/回忆/"},{"name":"夏天","slug":"夏天","permalink":"http://www.icnws.com/tags/夏天/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"今何在:《若星汉天空》","slug":"read-Jinhezai's-Book-1","date":"2017-06-20T14:50:25.000Z","updated":"2018-03-15T06:27:28.476Z","comments":true,"path":"2017/read-Jinhezai's-Book-1/","link":"","permalink":"http://www.icnws.com/2017/read-Jinhezai's-Book-1/","excerpt":"","text":"《若星汉天空》最近,读了一本小说,今何在写的,名字叫《若星汉天空》,被誉为中国版的魔戒,看着也确实挺波澜壮阔的。 地图[ 思考有一些思考,我总觉得,这不是写虚幻的世界,而是写每个人自己。我们每个人都会有正念,邪念,贪婪以及旁观者心态,此消彼长,于是就有各种争斗。书中的主人公是康德,一个听着骑士传说长大的人,在冒险的时候意外成为亡灵,被命运推动成为圣骑士,但不向魔王屈服,虽然利用魔王了的力量,但是坚持和魔王作斗争。虽然几乎所有的人都放弃了他,但是,在康德心里依然坚持着自己,永远用自己的所能去守护自己的所爱。虽然他是亡灵,但是他的心还活着。 平凡的人故事中的康德,更像平凡生活中的我们每一个人,有着梦想,被梦想折磨,甚至多次想过放弃,但是在某种情况下继续坚持下去,有着难以理解的梦想和坚持,最终虽然不被理解,但是依然可以通过自己的方式,成就自己。 打破框架书中所说,如果你不相信框架,那框架就不再具有局限性,无论信仰什么,宗教、权利、金钱都可以,但是不要为这种信仰所束缚,你之所以信仰是为了得救和自由,而不是其他的。我们在日常的生活中,会活在大大小小形形色色的圈子里,在圈子里时间久了就会忘记很多事情,以至于碌碌无为。除了在圈子里混,还要有时候跳出圈子去看看自己,审视一下自我,以及自己做的事情,这样才能找到我们自己,成为我们自己。 推荐如果你有时间,又不拒绝小说,这是一本可以有思考的书,推荐你来看,也可以和我交流。","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"},{"name":"今何在","slug":"今何在","permalink":"http://www.icnws.com/tags/今何在/"},{"name":"若星汉天空","slug":"若星汉天空","permalink":"http://www.icnws.com/tags/若星汉天空/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"沟通方式决定你是否能长久","slug":"the-way-you-communication-with-others-is-important","date":"2017-06-19T14:30:43.000Z","updated":"2018-03-15T06:27:28.496Z","comments":true,"path":"2017/the-way-you-communication-with-others-is-important/","link":"","permalink":"http://www.icnws.com/2017/the-way-you-communication-with-others-is-important/","excerpt":"","text":"新事物遇到新的事物的时候,每个人都想很快的去接触,熟悉,弄个通透,但是每件事情要做都需要时间和精力的。所以在刚开始的时候,可能是一问三不知,但是随着时间的推移,我们对事情的了解会逐渐加深,却仍然会有很多盲点。 惯性是什么?今天我们做任何一件事情,都希望找一个参照物,这是习惯性的,我们总是希望能一眼看透别人是怎么做到的,咱们能不能也实现,实现的代价是什么,能确定吗? 不痛快其实,每次别人对一个现象问,你能确定你说的就是那样实现的吗?我心里是很不舒服的,不知道你有没有这种感觉。 现象及本质我们看到的现象只是表面的东西,内在的实现,会有很多很复杂的东西,我们可以看到表面是怎么做到的,但是内在的,如何架构如何设计,怎么完成的,需要去做很多工作。很多时候,我们只能根据我们的经验,所见所闻去推敲,去校验猜测。 那种告诉你现象就希望立即得到肯定答案的人,大多数是想规避自己的风险,让别人去直接承担这个风险,这个时候,如果去纠结去争辩,无异于互怼互撕,本质上不能解决问题,只会让彼此觉得自己是不能配合的一方。 例证我们用的很多第三方的东西,尤其是像腾讯这样的企业,文档是不完善的,无论的故意的还是诚心的,很多事情不会明明白白的写在文档上,如果你想得到答案,除了花费时间去搜寻,那就只有自己深入的去踩每一个坑。无疑,后一种方式代价和周期巨大。 倾向我的倾向是,在你提出问题的时候,如果第一次,我只能给一个已知答案或者经验推测出来的答案,如果需要确切的答案,那就是不确定,需要时间来确认。我也希望提问题的人,无论什么时候,你都要充分考虑到对方的处境,否则,那就是无知,那就是故意制造不和谐,这种人,成不了大事情,也出不了大出息,一时尚可,久而久之,人就费了。 感言不能求全责备,每个人都不是完人,出来混的,岂不知早晚都是要还的么?!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"沟通","slug":"沟通","permalink":"http://www.icnws.com/tags/沟通/"},{"name":"合作","slug":"合作","permalink":"http://www.icnws.com/tags/合作/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"沟通成本上升","slug":"communication-cost-go-up","date":"2017-06-16T13:53:06.000Z","updated":"2018-03-15T06:27:28.460Z","comments":true,"path":"2017/communication-cost-go-up/","link":"","permalink":"http://www.icnws.com/2017/communication-cost-go-up/","excerpt":"","text":"事件最近,各种动乱,在公司七八年的老将,因为各种原因,提出了离职,在今天交接完成,离开了我们。这里面究竟三什么原因,真的是不得而知,也不想过多猜测,没有多大意义,该来的迟早回来,不是吗? 扎堆我们常常会注意到,领导扎堆或者抱团的时候,那就是要有大事情发生了,而这件事情可能还不足以让你知道,或者说时机不成熟。如果是领导和他的下属经常在一起,共同协商、沟通,完成工作和合作,那这个团队一定是非常积极向上而且有明显前途的团队,你可以安心的奋发图强了。 沟通人在心烦气躁的时候,是拒绝沟通的,这种拒绝表现的有些异常,尤其是那种心里藏不住事儿的人,他的躁动不安会让他身边的人也很带动,你会莫名的肾上腺激素增加。这时候,沟通成本的上升是极其明显的,原本简单的问题,就会被搞的很复杂。原本指向很明确的问题,被解释的普所迷离,这着实让人费解。 策略在沟通成本上升的过程中,要自己觉醒,警惕。生活在各种各样的小圈子里,有时候也不能过得太自我,否则,死或者不知道怎么被干掉的。步子不要太大,需要冷静分析,不急于做决定,很多事情,稍微一等,就很有机会分析明了。策略呢,也趋于保守,不要太激进,因为这时候不是冲锋陷阵的时候。 转换思维在静心分析之下,对得到的结论心里有数,对下一步的行动审时度势,该走出来的路总要迈开第一步才是开始。做转换思维的准备,让一切慢慢开动,不至于未来已来还后知后觉。想要人前神气和显贵,那就要人后多多努力,吃比别人更多的苦,更用心,才能闯出自己的未来。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"小程序思维","slug":"the-thought-of-mini-program","date":"2017-06-13T16:45:18.000Z","updated":"2018-03-15T06:27:28.496Z","comments":true,"path":"2017/the-thought-of-mini-program/","link":"","permalink":"http://www.icnws.com/2017/the-thought-of-mini-program/","excerpt":"","text":"思维的局限每个人都喜欢用自己已有的经验去套新的事物,吃再多的亏,就是不知道悔改,这是怎么了?每次都重蹈覆辙! 新的事物新的事物应该如何对待,不要直接定论,需要知道新的事物诞生的背景,发展现状,以及新事物的目标定义。知道了这些,甚至更多,才能让你在新的事物面前不至于迷失自己。 小程序思维小程序的使用场景和开发、部署方式决定了,小程序不能做很复杂的东西,不能像做原生的APP那样加各种各样的复杂效果,重要的是披露你要表达的信息,而不是加各种花里胡哨的东西。我们做的东西,需要深思熟虑,考虑到局限性,考虑到体验,考虑到我们的无知。","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"小程序","slug":"小程序","permalink":"http://www.icnws.com/tags/小程序/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"将系统更换成Deepin系统","slug":"change-system-to-deepin","date":"2017-06-11T01:17:19.000Z","updated":"2018-03-15T06:27:28.459Z","comments":true,"path":"2017/change-system-to-deepin/","link":"","permalink":"http://www.icnws.com/2017/change-system-to-deepin/","excerpt":"","text":"起始在Win7的基础上,想装个Windows和linux的双系统,于是选了选StartOS和Deepin OS,最后选择Deepin OS,不过做完U盘之后,安装完发现wifi不能正常使用。这叫一个折腾,不过还好,毕竟还有有线接口可以用,正常使用 折腾我的笔记本是HP的,无线驱动怎么都安装不上。最后折腾了很久,大概是这么个历程: 1. 安装ndisgtksudo apt-get install ndisgtk执行完成后即安装完成,在启动器里会找到Windows无线驱动程序这个图标,点击运行,显示配置windows驱动的界面。 2. 安装驱动安装驱动的时候,提示添加对应的windows驱动的.inf文件,点击安装,如果有效会展示成功字样,然后返回列表。在这里浪费了很多时间,因为没有驱动,和原有硬盘完全隔离了,所以,在网上各种翻腾,下载了一个驱动包http://daza-img.icnws.com/deepin/Ralink_RT3572_5000-w8.zip通过提取文件的方式将文件解压,然后找到.inf文件,安装完成驱动,驱动的名称rtsp2stor,如果这个是你的驱动,会提示硬件存在:是,这就是驱动安装完成了 3. 替换r8169为r8168从Realtek下载驱动:http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=5&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false#RTL8111B/RTL8168B/RTL8111/RTL8168, 选择LINUX driver for kernel up to 4.7下载,然后提取文件。进入解压文件目录,执行sudo sh autorun.sh,这里会将默认的r8169替换成r8168模块,有可能/etc/modules修改不成功,需要手动增加r8168到这里基本上完成了所有操作。重启后发现无线网络就可以用了,如果不可以,那就再重启一遍!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"deepin","slug":"deepin","permalink":"http://www.icnws.com/tags/deepin/"},{"name":"ndisgtk","slug":"ndisgtk","permalink":"http://www.icnws.com/tags/ndisgtk/"},{"name":"r8168","slug":"r8168","permalink":"http://www.icnws.com/tags/r8168/"},{"name":"r8169","slug":"r8169","permalink":"http://www.icnws.com/tags/r8169/"},{"name":"无线网卡安装","slug":"无线网卡安装","permalink":"http://www.icnws.com/tags/无线网卡安装/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"事出反常必有妖","slug":"unuaual-things-be-a-devil","date":"2017-06-09T16:13:34.000Z","updated":"2018-03-15T06:27:28.498Z","comments":true,"path":"2017/unuaual-things-be-a-devil/","link":"","permalink":"http://www.icnws.com/2017/unuaual-things-be-a-devil/","excerpt":"","text":"反常这句话说的很有意思啊,之前一直没有发现,当一个人保守秘密的时候,或者内心不安的时候,很多情绪会自然而然的表露出来,这时候你看你感觉有点异常,但是又不能很确定的说出来是什么原因 学会观察生活中、工作中,我们都需要留心观察,不是说要趋炎附势,察言观色,而是说要观察周围这些人的言行,情绪,以及相关的脉络。有了这些观察,要评价一个人的时候,自己脑子里天然就有很多素材,评价也相对客观一些,比妄想和听别人的是非来的靠谱。有了这些观察,在合作共事的时候,也知道该怎么处理事情,方法是什么,能做到什么程度都会有把握。对于那种在平时做事情都很拖拖拉拉的,一定要做好跟踪和防范工作,以免被拖下水。对于那些真正想做事情而且也很讲究方法的人可以深入的交往,除了工作上的交集,也可以发展成人生和事业的好帮手。 有妖如果你感觉这个和你接触的人,突然说话风格,说话方式,情绪都突然大变,这就是由大事情要发生或者已经发生了,只是可能还没有到你的消息渠道里面。如果可以,那就尽快分析这个妖到底在哪里?怎么发生的?对自己有什么影响?是不是要采取什么措施等等!不要无动于衷,因为忽视会让你付出惨痛的代价,大多数时候。","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"有妖气","slug":"有妖气","permalink":"http://www.icnws.com/tags/有妖气/"},{"name":"观察","slug":"观察","permalink":"http://www.icnws.com/tags/观察/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"Mysql的用户管理","slug":"mysql-user-management","date":"2017-06-08T06:43:42.000Z","updated":"2018-03-15T06:27:28.471Z","comments":true,"path":"2017/mysql-user-management/","link":"","permalink":"http://www.icnws.com/2017/mysql-user-management/","excerpt":"","text":"登录mysql -uroot -p输入用户密码,如果没有直接按回车即可 创建用户CREATE USER 'db_user' IDENTIFIED BY 'password'; db_user:数据库的用户名password:用户的密码有一些网上教程会在db_user后面加上@127.0.0.1等host字样,建议创建用户的时候可以不加,除非创建用户即指定了用户只能在某个IP上使用 执行 FLUSH PRIVILEGES;,即完成用户创建操作。 授权用户DBGRANT ALL PRIVILEGES ON db_name.* TO 'db_user'@'localhost'; db_name.*:授权的DB的所有权限,也可以指定权限, 代表所有权限,db_name也可以换成 表示所有数据库,这样 _._ 的授权就代表所有数据库的所有权限。db_user:授权的用户localhost:是授权的host值,这里是指只能在本机使用,如果要在其他机器上使用可以将localhost改成对应的host,再次授权一下执行 FLUSH PRIVILEGES;,即完成授权操作。 删除用户有时候需要删除一些账号,这时候需要通过查询并执行删除命令来完成。使用数据库mysqluse mysql;查询当前mysql服务的所有用户select * from user;执行删除用户操作,有两种情形,一种是直接删用户名对应的所有用户信息,一种是删除指定IP的用户,稍微有一些区别;DROP USER db_user;DROP USER db_user@'192.168.1.119'; 执行 FLUSH PRIVILEGES;,即完成用户删除操作。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"MYSQL","slug":"MYSQL","permalink":"http://www.icnws.com/tags/MYSQL/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"2017:高考随想","slug":"sth-of-gaokao-for-2017","date":"2017-06-06T15:13:15.000Z","updated":"2018-03-15T06:27:28.492Z","comments":true,"path":"2017/sth-of-gaokao-for-2017/","link":"","permalink":"http://www.icnws.com/2017/sth-of-gaokao-for-2017/","excerpt":"","text":"考了几次的高考,最终还是放弃了的大学,在多年以后,夜深人静仍然慢慢回味,一点随想。 高考有特殊意义对于每个中国人都有着特殊的意义,只有经历过,才会开始明白,竞争的残酷和激烈,而在所有争夺战中,这场战役还是相对公平的,对于教育资源的争夺之战。 高考是分水岭从这里开始,让我们和我们的小伙伴逐渐分开。虽然在生活、情趣等方面的距离越来越远,但是在高考之前形成的友情也往往最可靠,不会像大学的同学那样,互相之间,大多数的冷漠。 高考像拐角点在这个点上,很多人开始了真正属于自己的人生。很多考上大学的人,在学校里兢兢业业的去学习知识,有的甚至癫狂,也有不少人只是在大学里混时间,磨日子。磨时间混日子这种属于老观念了,上了大学成了村里乡里的有学问的人,这是历史,不是今天。今天,越来越多的社会岗位,除了基本的学历,更多的看重能力。大学对于大家,更像一个熔炉,去芜存菁,培养出来参与者的基本素质,形成一个质量上乘的胚子,但是很多事实证明,并不能。 大学其实没什么见过太多的人,因为没有上大学而过的非常好,有车有房、家庭幸福、儿女双全等等,很多。对比那些考上大学苦读多年的人,过的是很风光的。其实不是说大学不行,是大学教育风气坏,大学教学质量参差不齐,这是客观的原因。主观上,由于经过多年的考试压力之下,突然没有学习的压力之后,有没有理想和信念,很多东西在失去自制的时候崩溃,导致大学生活的浑浑噩噩。这也最终导致从大学出来的人,过的并不是那么好的论点形成。 重要的是自己我的大学教育,学的不好,过的任性。年轻的时候为此就付出了不小的代价。无论上或者不上大学,重要的是对自己有个交代,对未来由自己的期许,或者说梦想,这样才不至于活的如同行尸走肉。梦想这东西还是要有的,不是说万一实现了,是有梦想的人都能很好的克制自己的欲望,把握自己的生长,成就自己的人生。 画了个图","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"高考","slug":"高考","permalink":"http://www.icnws.com/tags/高考/"},{"name":"随想","slug":"随想","permalink":"http://www.icnws.com/tags/随想/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"WordPress配置Markdown并配合主题使用","slug":"wordpress-use-markdown-plugin-with-theme","date":"2017-06-05T07:20:45.000Z","updated":"2018-03-15T06:27:28.501Z","comments":true,"path":"2017/wordpress-use-markdown-plugin-with-theme/","link":"","permalink":"http://www.icnws.com/2017/wordpress-use-markdown-plugin-with-theme/","excerpt":"","text":"0x0:缘起前些天,Meek看我写的Jenkins入门,问我怎么没有用Markdown写,说越来越不喜欢非MD的写作了,建议我也用起来。其实之前也用过MD写东西,但是非常少,而且又因为博客上的写作直接并不是用MD写,所以也没坚持下来,锤子便签算是用MD练习的主要场地。之前一直没有配置好,配置的半途而废,Meek给我推荐了两个插件,JP Markdown和WP Code Highlight.js一个是MD写作,一个是代码高亮,简单看了一下,没有搞起来,后来又试了无插件高亮等等,不过也不是很好用,不舒服用起来。不过所幸,在Wordpress.org的plugins里找到了一个更好用的插件,也比较方便。这个组合就是:JP Markdown和WP Editor.md,用起来很舒服。 0x1:插件安装 JP Markdown:主页:https://wordpress.org/plugins/jetpack-markdown/下载:https://downloads.wordpress.org/plugin/jetpack-markdown.3.9.6.zip WP Editor.md主页:https://wordpress.org/plugins/wp-editormd/下载:https://downloads.wordpress.org/plugin/wp-editormd.1.7.zip官网:https://iiong.com/wordpress-plugins-wp-editormd.html作者:淮城一只猫 安装下载完成后,上传到wordpress的plugins目录下,并解压,然后进入管理后台,开启两个插件,然后配置WP Editor.md,在设置页面,详情参考WP Editor.md的官网安装说明 0x2:主题选择要在wordpress搭建的博客里使用MD写作,除了要安装上面提到的两个插件以外,还需要选一个合适的主题,有些主题是不支持代码高亮的,有些主题的代码高亮不太舒服,这里推荐个比较合适的主题:canary及下载地址这个是我正在用的主题。 另外,wordpress自带的几个主题基本上也是支持代码块和代码高亮的,如不嫌弃可以使用。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"canary","slug":"canary","permalink":"http://www.icnws.com/tags/canary/"},{"name":"Markdown","slug":"Markdown","permalink":"http://www.icnws.com/tags/Markdown/"},{"name":"MD","slug":"MD","permalink":"http://www.icnws.com/tags/MD/"},{"name":"WP","slug":"WP","permalink":"http://www.icnws.com/tags/WP/"},{"name":"代码高亮","slug":"代码高亮","permalink":"http://www.icnws.com/tags/代码高亮/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"云市场里的建站","slug":"Build-a-website-from-Ali-Cloud-Market","date":"2017-06-04T16:05:54.000Z","updated":"2018-03-15T06:27:28.452Z","comments":true,"path":"2017/Build-a-website-from-Ali-Cloud-Market/","link":"","permalink":"http://www.icnws.com/2017/Build-a-website-from-Ali-Cloud-Market/","excerpt":"","text":"试了一下阿里云的云市场服务,建站系统,比如WordPress LNMP LAMP,事实证明,还有太多需要改进的地方,建站系统产品不好用! 最终,折腾了半天又自己装回来了,搞技术的,搭个网站还是不要省事儿的好!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"阿里云","slug":"阿里云","permalink":"http://www.icnws.com/tags/阿里云/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos7部署Elasticsearch遇到的问题","slug":"centos7-setup-ES","date":"2017-05-15T07:18:48.000Z","updated":"2018-03-15T06:27:28.459Z","comments":true,"path":"2017/centos7-setup-ES/","link":"","permalink":"http://www.icnws.com/2017/centos7-setup-ES/","excerpt":"","text":"1、部署ES不能用root用户需要用useradd es添加一个叫es的用户,来启动es 2、max file错误1max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] 解决办法: 在文件:/etc/security/limits.conf 添加:12* soft nofile 165535* hard nofile 365535 *是指所有用户,文件数可以根据需要自己定义 然后sysctl -p 重新登录es用户就可以解决max file的问题了 3、max virtual memory错误max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 解决办法: 在文件:/etc/sysctl.conf 添加: vm.max_map_count=655360 数字根据需要进行调整 然后sysctl -p重新登录es用户就可以解决max virtual memory的问题了 4、局域网访问问题首先,打开防火墙对应端口9200,9300 然后,配置config文件夹下的elasticsearch.yml对应的network.bind_host为es的本机局域网地址,如:network.bind_host: [‘10.51.x.x’] 如果使用云服务,需要考虑到安全组、安全规则的配置","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"ES","slug":"ES","permalink":"http://www.icnws.com/tags/ES/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"ES-MatchQuery","slug":"es-matchquery","date":"2017-05-12T10:37:11.000Z","updated":"2018-03-15T06:27:28.461Z","comments":true,"path":"2017/es-matchquery/","link":"","permalink":"http://www.icnws.com/2017/es-matchquery/","excerpt":"","text":"1、加载依赖12345678910111213141516<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.4.0</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version></dependency> 2、初始化Client123456789101112131415161718192021222324public class MyTransportClient { private static Logger logger = LoggerFactory.getLogger(MyTransportClient.class); private static TransportClient client; public MyTransportClient() { init(); } protected void init() { // on startup try { client = new PreBuiltTransportClient(Settings.EMPTY) .addTransportAddress(new InetSocketTransportAddress( InetAddress.getByName("localhost"), 9300)); } catch (UnknownHostException e) { e.printStackTrace(); } } public static TransportClient getTransportClient(){ if(client==null){ new MyTransportClient(); } return client; }} 3、高亮查询12345678910111213141516171819202122232425262728293031HighlightBuilder hiBuilder=new HighlightBuilder();hiBuilder.preTags("<h2>");hiBuilder.postTags("</h2>");hiBuilder.field("tweet");QueryBuilder matchQuery = QueryBuilders.matchQuery("tweet", "IS");SearchResponse response2 = MyTransportClient.getTransportClient().prepareSearch("us").setTypes("tweet").setQuery(matchQuery).setFrom(2).setSize(2).highlighter(hiBuilder).get();log.info(response2);log.info(response2.getHits());//获取查询结果集SearchHits searchHits = response2.getHits();System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");//遍历结果for(SearchHit hit:searchHits){System.out.println("String方式打印文档搜索内容:");System.out.println(hit.getSourceAsString());System.out.println("Map方式打印高亮内容");System.out.println(hit.getHighlightFields());System.out.println("遍历高亮集合,打印高亮片段:");Text[] text = hit.getHighlightFields().get("tweet").getFragments();for (Text str : text) {System.out.println(str.string());}}}","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"ES","slug":"ES","permalink":"http://www.icnws.com/tags/ES/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"unblock with 'mysqladmin flush-hosts'","slug":"unblock-with-mysqladmin-flush-hosts","date":"2017-04-28T08:11:06.000Z","updated":"2018-03-15T06:27:28.497Z","comments":true,"path":"2017/unblock-with-mysqladmin-flush-hosts/","link":"","permalink":"http://www.icnws.com/2017/unblock-with-mysqladmin-flush-hosts/","excerpt":"","text":"上午突然断网,恢复的过程中多次链接mysql数据库,导致创建链接过多,出现host被锁的问题,查了一下 1、找到mysqladmin whereis mysqladmin,看到对应的路径,然后cd进入所在目录 比如/usr/local/mysql/bin 2、执行修复命令 ./mysqladmin flush-hosts -h127.0.0.1 -p3308 -uroot -p 然后输入密码 -h127.0.0.1是-h加上mysql服务的host地址 -p3308是-p加上mysql服务的port端口号 -uroot是-u加速mysql服务的user,root用户 这里的最后一个p是指password的,mysql的root用户的密码 执行之后,输入密码就可以修复了 参考:http://www.cnblogs.com/susuyu/archive/2013/05/28/3104249.html","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Name for argument type [java.lang.String]","slug":"name-for-argument-type-java-lang-string","date":"2017-04-28T06:40:15.000Z","updated":"2018-03-15T06:27:28.471Z","comments":true,"path":"2017/name-for-argument-type-java-lang-string/","link":"","permalink":"http://www.icnws.com/2017/name-for-argument-type-java-lang-string/","excerpt":"","text":"参考博客:http://panyongzheng.iteye.com/blog/2222666 最终将get(@RequestParam(required=false)替换为get(@RequestParam(value="id",required=false) 因为在我的项目中主要是id这个地方有用到@RequestParam,如果有更多就不能这么简单处理了。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Code,Bugs","slug":"Code-Bugs","permalink":"http://www.icnws.com/tags/Code-Bugs/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"IDEA项目编译总是用jdk1.5的问题","slug":"idea-setting-failed-compile-with-jdk-1.5","date":"2017-04-28T00:55:00.000Z","updated":"2018-03-15T06:27:28.465Z","comments":true,"path":"2017/idea-setting-failed-compile-with-jdk-1.5/","link":"","permalink":"http://www.icnws.com/2017/idea-setting-failed-compile-with-jdk-1.5/","excerpt":"","text":"很长时间,使用IDEA编译项目,总是会出现使用jdk1.5 compile,于是很多东西会报错,每次都手动配置,浪费了不少时间,也是懒,要是早点去想着解决就不会一直到昨天才解决。 因为现在的项目都是依赖maven进行构建的,所以,首先要安装好maven,在之前的博客中有提到过安装maven以及更改maven的默认镜像为阿里云,这里讲设置profile,即将编译的信息加进来,不使用默认的maven参数去构建项目。 1、配置maven打开conf下的setting.xml文件,找到profiles标签,加入如下:1234567891011 <id>jdk17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.7</jdk> </activation> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion> </properties></profile> 2、更改IDEAIDEA默认的maven配置改为之前安装的maven 打开IDEA的setting,找到Build——>Maven,将maven home directory更改为maven的对应目录 3、查看Compiler发现compiler下当前打开的项目,默认的jdk版本都是使用刚才配置的1.7,这样就可以不用每次都调编译环境了","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"IDEA","slug":"IDEA","permalink":"http://www.icnws.com/tags/IDEA/"},{"name":"项目编译JDK问题","slug":"项目编译JDK问题","permalink":"http://www.icnws.com/tags/项目编译JDK问题/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"lantern share","slug":"lantern-share","date":"2017-04-26T03:55:46.000Z","updated":"2018-03-15T06:27:28.468Z","comments":true,"path":"2017/lantern-share/","link":"","permalink":"http://www.icnws.com/2017/lantern-share/","excerpt":"","text":"lantern download lantern的github项目,可以免fq下载 https://github.com/getlantern/forum","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"推荐","slug":"推荐","permalink":"http://www.icnws.com/tags/推荐/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"Unable to create an instance of type [com.sun.faces.config.ConfigureListener]","slug":"ConfigureListener-instance-unable","date":"2017-04-21T09:35:27.000Z","updated":"2018-03-15T06:27:28.453Z","comments":true,"path":"2017/ConfigureListener-instance-unable/","link":"","permalink":"http://www.icnws.com/2017/ConfigureListener-instance-unable/","excerpt":"","text":"spring项目启动的时候,出现Unable to create an instance of type [com.sun.faces.config.ConfigureListener]错误,在网上查了不少资料,最终解决方案是调整maven依赖123456<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope></dependency> 部分错误信息如下:123456789101112131415Caused by: java.lang.IllegalArgumentException: Unable to create an instance of type [com.sun.faces.config.ConfigureListener]at org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1303)at org.apache.catalina.core.ApplicationContextFacade.addListener(ApplicationContextFacade.java:647)at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:110)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5240)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)... 42 moreCaused by: java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListenerat org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139)at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:518)at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:499)at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)at org.apache.catalina.core.ApplicationContext.addListener(ApplicationContext.java:1274)... 46 more","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Bugs","slug":"Bugs","permalink":"http://www.icnws.com/tags/Bugs/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"【一餐】酱爆豆腐青椒","slug":"one-meal-1","date":"2017-04-19T14:13:34.000Z","updated":"2018-03-15T06:27:28.473Z","comments":true,"path":"2017/one-meal-1/","link":"","permalink":"http://www.icnws.com/2017/one-meal-1/","excerpt":"","text":"好多天没有做过好吃的菜了,大约是太累了吧,今天状态还不错做了一个差不多的菜,媳妇胃口大开,很开心,我也很开心。 今天的菜是酱爆豆腐青椒,看名字就知道原材料是什么,大概怎么做了,这里简单记录一下。 1、豆腐切块,青椒切块,备用。 2、切好姜丝儿、葱丝儿,准备好辣的黄豆酱(海天)。 3、锅里放油,烧半熟放入姜丝、葱丝儿,至葱丝儿微焦,放入黄豆酱,酌量添加。 4、翻炒黄豆酱,炒出香味后,下入青椒块,爆炒。 5、翻炒至青椒发软、变色,倒入豆腐。 6、翻炒至豆腐入味,转小火,慢慢翻炒,快出锅时加盐加鸡精即可。 提示:黄豆酱本身是咸的,所以盐不要放多了,否则会毁了一盘好菜。 ","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"生活","slug":"生活","permalink":"http://www.icnws.com/tags/生活/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"博客推荐【一】","slug":"blogs-recommend","date":"2017-04-19T05:18:17.000Z","updated":"2018-03-15T06:27:28.456Z","comments":true,"path":"2017/blogs-recommend/","link":"","permalink":"http://www.icnws.com/2017/blogs-recommend/","excerpt":"","text":"博客推荐,都是技术博客,请笑纳~ 囧克斯:http://jiongks.name/,勾三股四的新网址 风清袖一的博客:http://www.fqxyi.com/ ,安卓、前端,甚至后端都有涉猎 熊建刚的博客:http://blog.codingplayboy.com/,学习git使用时遇到的博客 YouMeek的博客:http://www.youmeek.com/,各种技术分享 泥瓦匠BYSocket:http://www.bysocket.com/,最近在研究Spring boot","categories":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}],"tags":[{"name":"推荐","slug":"推荐","permalink":"http://www.icnws.com/tags/推荐/"}],"keywords":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}]},{"title":"缓存的解决方案","slug":"solution-for-cache-1st","date":"2017-04-17T22:46:59.000Z","updated":"2018-03-15T06:27:28.484Z","comments":true,"path":"2017/solution-for-cache-1st/","link":"","permalink":"http://www.icnws.com/2017/solution-for-cache-1st/","excerpt":"","text":"1 、缓存关系、数据等不应该靠缓存键值来维护,这是大忌,会导致性能损耗2、缓存需要穿透,穿透同时要加标识,防止多次穿透,获取到数据之后写入缓存3、缓存穿透之后,对空数据要写入数据不存在标识并设置失效期,防止多次穿透,同时将数据请求加入有序队列,由定时任务完成数据更新。这里采用有序集合是防止多次穿透被重复写入队列4、读取到空数据标识之后,直接返回对应数据为空的状态5、定时任务获取数据并按照更新规则更新缓存数据,数据为空的不做处理 提示:这里还有不少细节没有说,比如分页,有序队列的数据结构,定时任务调优等,需要根据实际情况进行调整优化。","categories":[],"tags":[],"keywords":[]},{"title":"Jenkins学习:第五,部署配置Sonar(一)","slug":"jenkins-sonar-setup-and-config","date":"2017-03-14T01:07:03.000Z","updated":"2018-03-15T06:27:28.468Z","comments":true,"path":"2017/jenkins-sonar-setup-and-config/","link":"","permalink":"http://www.icnws.com/2017/jenkins-sonar-setup-and-config/","excerpt":"","text":"通过上面四个章节的学习,jenkins的基本使用已经可以了,对于Jenkins来说,我们完成了代码的checkout、compile、package相关功能,对于基础的使用已经可以了,但是如果对代码质量有要求呢? 这一节我们开始学习Sonarqube与jenkins结合使用。 1、下载 官网地址: https://www.sonarqube.org/ 下载网址: https://www.sonarqube.org/downloads/ 最新下载: https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.2.zip 网站显示最新版本是6.2,稳定版本是5.6,但经过测试,5.6版本会有数据库版本兼容问题,会报启动web应用失败,因此建议采用6.2版本,不用为了这个升级改变数据库。 2、配置 下载好的zip包解压一下,然后改一下文件夹名称为sonarqube,进入文件夹,找到conf目录下的文件。 2.1、sonar.properties配置 创建数据库sonar,网上教程一般推荐单独创建数据库用户sonar,你也可以这样做。 配置数据库信息,我这里用的是mysql数据库: sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://121.40.133.100:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformancesonar的默认端口是9000,你也可以根据自己的喜欢进行调整,我们这里用默认的。有很多教程还关注到了其他的参数配置,这里可以略过,当你需要的时候再来细看、调整。 2.2、wrapper.conf配置 网上很多教程忘了这个配置文件,这样会导致wrapper执行的时候报错,直接启动不了,这个地方也只需要改一个配置: wrapper.java.command的默认值是java,需要修改成你的JAVA_HOME目录后面加上/bin/java,比如: wrapper.java.command=/usr/local/jdk1.8.0_101/bin/java 3、启动 配置完成之后就可以进入启动步骤了,在sonar的根目录的bin目录下,对应不同的系统有不同的启动方式,比如我们的系统用bin/linux-x86-64/sonar.sh start/stop/restart来进行操作。 如果你是远程访问,记得打开防火墙的对应端口,否则会访问不到。系统的默认帐号密码是admin/admin。 另外,启动的时间和过程会比较漫长,因为这个过程sonar会链接数据库,创建并初始化几十个表及数据,这时候你可以用ps -ef | grep sonar看一下centos下的sonar进程是否在,同时可以通过less logs/sonar.log查看对应的启动日志,出错了也知道,不用干等。 4、插件安装 进入sonar的DashBoard之后,sonar的默认界面是英文界面,因此我们可以通过插件的方式进行安装对应汉化插件,网上有说下载对应的plugin包放到对应目录,比较麻烦,不采用。 通过顶部菜单Administrator进入设置页面,然后在中部菜单找到System(系统),选择后会出现下拉菜单,选择Update Center(更新中心),即可进入到插件对应页面。 插件页面首先展示的是Installed页面,我们要操作Avilable,然后通过搜索Chinese获得我们要安装的Chinese Pack,Install即可,这个过程需要等待服务器响应。 在等待响应的过程中,我们可以将java的相关插件一并安装了,搜索java会出现几个插件:Java、Findbugs 、Checkstyle、sonarJS等。 等所有的插件都安装完成之后,可以通过界面进行重启sonar服务,也可以通过后台命令去重启服务,我选择后者,比较快速,当然重启还是需要等待的。 5、项目管理 重启之后,我们进入DashBoard界面之后选择顶部菜单配置(Administartor),然后选择项目,出现下拉菜单中选择management即进入项目管理中,这个菜单只有管理员有权限进行配置项目。 选择create project会弹出对应的创建项目页面,主要是项目的名称和项目的标识即Name和Key,Branch是可选的,没有深入去看。 这里配置的name和key会在与jenkins协同进行代码审查的时候会用到,每个项目和key要一一对应,配置完成点击create就可以了,该项目会出现在DashBoard的所有项目那一列中。 Tips:这一节只是简单安装和配置sonar这个服务,下一节说说jenkins的sonar配置、sonar-runner配置及对应项目的配置。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Jenkins学习:第四,环境配置","slug":"jenkins-env-config","date":"2017-03-13T09:28:25.000Z","updated":"2018-03-15T06:27:28.466Z","comments":true,"path":"2017/jenkins-env-config/","link":"","permalink":"http://www.icnws.com/2017/jenkins-env-config/","excerpt":"","text":"今天简单说是环境变量的配置,涉及到jenkins使用到的一系列软件、插件,包括maven、JDK等 1、maven 1.1、下载 下载网址:http://maven.apache.org/download.cgi linux下载:http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz windows下载:http://apache.fayea.com/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip 1.2、环境变量 解压对应下载包,然后配置环境变量M2_HOME是maven的根目录 将$M2_HOME\\bin加入到PATH变量中即可 1.3、测试 打开命令行工具,输入mvn -v获取maven的版本信息 2、JDK 2.1、下载 这里的JDK版本用的是oracle的版本。 下载网址:https://jdk8.java.net/download.html Linux下载:http://www.java.net/download/java/jdk8u152/archive/b01/binaries/jdk-8u152-ea-bin-b01-windows-x64-10_feb_2017.exe windows下载:http://www.java.net/download/java/jdk8u152/archive/b01/binaries/jdk-8u152-ea-bin-b01-linux-x64-10_feb_2017.tar.gz 2.2、环境变量 解压对应下载包,然后配置环境变量JAVA_HOME是JDK的根目录 将$JAVA_HOME\\bin加入到PATH变量中即可 2.3、测试 打开命令行工具,输入java -version获取JDK的版本信息 3、Jenkins配置 上面两点都是基础的软件安装,Jenkins要使用起来还是需要一些配置的。 进入Jenkins的Dashboard之后,在左侧可以看到系统管理,点击之后进入二级页面,找到Global Tool Configuration ,这是配置全局工具的地方,我们的主要工作是调整这些内容。 3.1、Maven Configuration 软件maven的配置文件,这个可以不改,但是对于国内maven用户来说,maven会出现下载超时失败等状况,因此需要通过修改maven的默认镜像来解决这个问题,比如阿里云的maven镜像。 a、找到maven的安装目录下的conf目录下的setting.xml文件 b、找到mirrors标签,在标签下方增加如下代码即可:123456<mirror> <id>alimaven&lt;/id> <name>aliyun maven&lt;/name> <url>http://maven.aliyun.com/nexus/content/groups/public/&lt;/url> <mirrorOf>central&lt;/mirrorOf></mirror> 3.2、JDK JDK的安装就是设置JDK的别名,比如JDK8标识当前版本,然后在JAVA_HOME对应的项填入上面的JDK安装路径的根目录即可 3.3、Git Git的安装需要去网上找对应教程或者根据官方文档安装,设置类似JDK添加别名和对应路径或者执行方法 我们的Jenkins的系统环境是CentOs,系统的git版本是1.7,所以我的参数是git1.7,Path to Git executable的值是git,这样就可以了。 Windows下需要安装并配置对应路径即可。 3.4、Maven Maven的配置就是设置maven的别名及对应MAVEN_HOME的值,我们这里别名设置的是maven3.9,MAVEN_HOME是maven安装的对应根目录即可。 Tips:这里只是简单交代了初始化安装完成之后的配置,我们接下来要进行的代码质量分析、代码审查用到的Sonar和sonar Runner还需要再次进行配置,敬请期待咯~","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Jenkins学习:第三,maven构建的项目配置-pom.xml文件","slug":"jenkins-maven-pom-config","date":"2017-03-11T03:29:08.000Z","updated":"2018-03-15T06:27:28.467Z","comments":true,"path":"2017/jenkins-maven-pom-config/","link":"","permalink":"http://www.icnws.com/2017/jenkins-maven-pom-config/","excerpt":"","text":"对于maven项目,原来构建的时候,连本机的maven环境变量都没有用起来,IDE中maven的状态一直是个摆设,着要用Jenkins肯定不行了,构建一下就各种错误,甚至直接执行不了,看了错误会抓狂,各种文件找不到是个很大的问题。于是觉得应该好好学一下关于maven的构建配置。 在学习的过程中,主要参考一片博客:http://blog.csdn.net/tomato__/article/details/13625497 ,备用链接:http://www.icnws.com/?p=279 根据博客的内容,自己摸索了一个基本的配置方法,刚开始总是编译出错,目录不对,war包文件内容也不对。 1、配置maven环境变量简单,解压对应tar/zip包,然后配置环境变量M2_HOME,并将环境变量即${M2_HOME}加入系统的PATH变量中。windows系统按照配置环境变量的方式,linux配置更新/etc/profile或者.bash_profile配置完成之后,需要用mvn -v 测试一下,如果能看到版本信息就可以了,否则就可能是配置失败 2、配置IDE使用maven我们开发一般用Android studio、eclipse、IDEA,找到maven配置的地方,选择你安装maven的根目录即可 3、配置pom.xml文件pom.xml配置文件很重要,之前主要是通过maven添加依赖,至于build相关的内容基本上没有怎么用,所以几尽周折才搞定。1234567891011121314151617181920212223242526272829<groupId>com.icnws</groupId><artifactId>icnws-tx</artifactId><packaging>war</packaging><version>1.1</version><build> <finalName>icnws-tx</finalName> <defaultGoal>package</defaultGoal> <directory>${basedir}/target</directory> <resources> <resource> <targetPath>${basedir}/target/icnws-tx/WEB-INF/classes</targetPath> <directory>${basedir}/src/main/resources</directory> <filtering>false</filtering> </resource> <resource> <targetPath>${basedir}/target/icnws-tx/</targetPath> <directory>${basedir}/web</directory> <filtering>false</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version> </plugin> </plugins></build> 一点点来,首先是项目的maven配置1234<groupId>com.icnws</groupId> <artifactId>icnws-tx</artifactId><packaging>war</packaging><version>1.1</version> 这里主要关注packaging,我们的目标是生成war包文件,也由生成jar包的,跟需求来,其他就不用说了 接下来是build相关的参数配置finalName是build之后发布的项目、生成的包名,这里就是icnws-tx.war和项目目录icnws-txdefaultGoal是build的目标,我这里写的是package,就是打包,也可以install等参数directory是build之后放到哪里,${basedir}是指项目的根目录,target是指放到项目根目录的target文件夹下,编译的Java class文件都会放到这个文件夹之内 接下来就是一些不需要编译的配置文件,resources,由于我们的项目结构是: ${basedir}/ –src/java/main –src/java/resource –lib –web这种结构,所以我需要配置两个resource标签,将相关目录下的文件放到打包目录,如下:123456789101112<resources> <resource> <targetPath>${basedir}/target/icnws-tx/WEB-INF/classes</targetPath> <directory>${basedir}/src/main/resources</directory> <filtering>false</filtering> </resource> <resource> <targetPath>${basedir}/target/icnws-tx/</targetPath> <directory>${basedir}/web</directory> <filtering>false</filtering> </resource> </resources> targetPath是build的目标文件夹,directory的源文件文件夹,filtering指是否加过滤条件,如果不加,那就false即可,如需要过滤,还需要配置对应过滤文件的位置 刚开始的时候采用的相对路径,结构build多次,发现搞不定,最后使用了绝对路径,搞定了,build完全通过。 最后是maven的war包插件配置:12345<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.0.0</version></plugin> 4、用maven构建项目IDE就提供maven构建的操作界面,找到并测试一下clean compile 以及package命令,clean是为了不让既有文件影响编译打包结果,很重要。compile是为了避免基础的语法错误,package才是这一阶段的目标——war文件生成。 5、在Jenkins构建对应项目配置完上述的内容之后,在Jenkins的对应job内更新对应的配置,然后点击立即构建,查看控制台输出就能看到对应的结果,如果项目在本地build都通不过,那在Jenkins服务器上也通不过,通过了说明你Jenkins的job配置可能有问题,或者目标物不对,大坑还没发现,等我跳! Tips:这一节是关于maven的一点小心得,不成大器,但是还能用,需要详细的资料的话,需要阅读更多的文档,祝你好运。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Jenkins学习:创建一个Job","slug":"jenkins-create-a-job","date":"2017-03-10T10:35:44.000Z","updated":"2018-03-15T06:27:28.466Z","comments":true,"path":"2017/jenkins-create-a-job/","link":"","permalink":"http://www.icnws.com/2017/jenkins-create-a-job/","excerpt":"","text":"这一节说如何创建一个job,我看了很多教程以及官方文档及视频,最终摸索出来一条比较简单的,由于各个版本的jenkins还是略有差异的,这里指明一下war的版本2.32.3,请你参考。我在学习的时候,安装过windows版的,那个msi安装包的jenkins版本不是最新的,但是有中文,直接有maven项目,而最新的稳定版2.32.3没有直接对maven项目的job,花费了一些时间。 1、新建JOB 选择左上角的Item(新建),然后进入新建一个job的页面,Enter an item name(填入你的job名称),以表意为好,可以与项目名称保持一致,然后选择构建一个自由风格的软件项目(free style),点击ok即可进入配置页面 2、配置JOB 2.1 、General 配置写项目是做什么的就可以了 2.2、源码管理 我们目前用的SVN,所以这里直接选择Subversion,然后会展开SVN对应的输入项,包括仓库地址,授权信息等,对不知道的,可以点击后面的问号即有简单说明,再不明白就去网上搜一下相关的关键词即可,如果授权不成功,会报相关的SVN错误,一般就是没有权限、授权失败、仓库地址不可用等等 2.3、 Credentials 授权的账户名和密码没有配置可以直接点add进行添加,将svn的帐号及密码输入,在授权页面选择即可 2.4、构建触发器 这个网上说一般用Poll SCM,语法类似crontab的语法,因为目前还在测试阶段,所以这块儿就没有配置,完全手动构建,如果你感兴趣可以查一下相关的资料 2.5、构建环境 这里也没有处理,暂时对构建环境没有过多关注 2.6、构建 构建是一个重要的点,因为选择的是自由风格的Job,又我们的项目是maven依赖的,所以这里就选择Invoke top-level Maven targets,它需要两个参数,一个是Maven Version,这里是构建项目用的maven版本,后面会讲怎么配置maven环境,这里暂时default即可,另外一个是Goals,就是构建的目标是什么,根据网友的经验和我自己的测试,maven的构建可以选择clean compile package clean是将之前编译的结果清除掉 compile是做基本的编译,看编译过程中是否会产生比较低级的错误 package是打包,我的目的是将项目打成war包,可以方便部署 然后点击保存(save)就算完成创建Job了,当然,现在直接构建这个Job还是会出各种各样的问题,我的第一个项目构建了三十多次才成功,还是对这玩意儿没有太多概念,网上的资料也都是这一点,那一点的,要么就是比较陈旧。 Tips:在这之前还需要配置工具集,会在后面一点点说来,还有java项目里的pom.xml文件配置也是很重要很坑的一个地方,后面会提到","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Jenkins学习:安装部署配置","slug":"jenkins-setup-config","date":"2017-03-10T10:06:41.000Z","updated":"2018-03-15T06:27:28.467Z","comments":true,"path":"2017/jenkins-setup-config/","link":"","permalink":"http://www.icnws.com/2017/jenkins-setup-config/","excerpt":"","text":"最近团队开始用jenkins做持续集成(CI),选型就是基于jenkins做相关的服务,因此就有了这个博客。部署的系统centos的操作系统。 1、下载war包 http://mirrors.jenkins.io/war-stable/latest/jenkins.war 这是最新的稳定版 2、配置JAVA环境 如果服务器已经有了,那就不用了,如果没有就下载一下,配置好JAVA的环境变量,用java -version去test一下 3、部署Jenkins 将war包放入tomcat容器的webapps下,启动tomcat即可,tomcat的端口及配置需要根据自己的情况去配置,另外在server.xml的配置里增加URIEncoding=”UTF8”,防止jenkins服务出现乱码 然后启动tomcat,我用的是tomcat默认端口8080 4、访问并配置Jenkins 用browser打开http://localhost:8080/jenkins即可看到初始化界面,根据提示路径,获得对应secret,然后填入,进入下一步。 对于初学者,不用自己去选择插件的配置,直接用默认的配置就可以。 当插件安装完成会进入帐号设置页面,按照提示进行操作即可,填好即可finish,然后启动Jenkins服务,这时候就进入了jenkins的管理界面。 这里有个需要注意的地方,browser有记住密码的功能,建议不要使用,我遇到过多次因为记住密码导致登录页面来回闪动就是进不去系统,设置一个自己能记住的密码就可以了。 Tips:这里只是简单的介绍安装配置,因为比较简单。","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"[Jenkins handbook]Getting Started with Jenkins","slug":"jenkins-handbook","date":"2017-03-04T14:10:28.000Z","updated":"2018-03-15T06:27:28.467Z","comments":true,"path":"2017/jenkins-handbook/","link":"","permalink":"http://www.icnws.com/2017/jenkins-handbook/","excerpt":"","text":"Getting Started with JenkinsThis chapter is intended for new users unfamiliar with Jenkins or those without experience withrecent versions of Jenkins.This chapter will lead you through installing an instance of Jenkins on a system for learningpurposes and understanding basic Jenkins concepts. It will provide simple step-by-step tutorials onhow to do a number common tasks. Each section is intended to be completed in order, with eachbuilding on knowledge from the previous section. When you are done you should have enoughexperience with the core of Jenkins to continue exploring on your own.If you are already familiar with Jenkins basics and would like to delve deeper into how to usespecific features, see Using Jenkins.If you are a Jenkins administrator and want to know more about managing Jenkins nodes andinstances, see Managing Jenkins.If you are a system administrator and want learn how to back-up, restore, maintain as Jenkinsservers and nodes, see Operating Jenkins.","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"Jenkins","slug":"Jenkins","permalink":"http://www.icnws.com/tags/Jenkins/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"你是不是想跳槽了?","slug":"want-to-job-hopping","date":"2017-02-15T13:52:01.000Z","updated":"2018-03-15T06:27:28.498Z","comments":true,"path":"2017/want-to-job-hopping/","link":"","permalink":"http://www.icnws.com/2017/want-to-job-hopping/","excerpt":"","text":" 元宵节过了,情人节也过了,接下来该植树节了。。。。春天来了,是不是又该挪动一下了?去年没跳槽的你是不是觉得有点小遗憾?某招聘网站说,互联网人在2016年这个资本寒冬里平均薪资涨了17%,都没统计我的薪资,这能靠谱吗?! 回到话题上来,你准备跳槽吗? 我先来回答一下,我没有准备跳槽。当然,你也没必要做一个参考,每个人和其他人寻求的价值点不同,每个人的适应能力也不同,所以,跳不跳槽取决于自己对自己当前境况的把握。 如今的这个时间点,大多数人都是追求金钱的,大家比的也都是金钱或者和金钱有关系的东西,所以,很多人的价值观也因此而扭曲。追逐着钱的生活,有很多时候看似鲜亮,其实中空,经不起推敲和思考。 如果你有想法,一定要多问自己为什么,多问几个结果的可能性。 我们不能只瞄着眼前的这些小利,还要看清以后的前途和路。事实证明,频繁跳槽的人往往得不偿失!一辈子很短,很多东西只是接触一两次并不能把握事物的本质,看东西如果永远只知道表面,那你将失去未来的很多机会。 另外,如果真的要跳槽,一定要整理好自己的简历,别把往年的简历加个工作经历就甩出来了,那样真没意思,每一年的简历起码要和之前的有所不同,最好能概括一下自己的职业历程,而不是罗列你那没营养的增删改查项目,讲一些跟项目深度有关的话题,而不是拐弯抹角至不知东西南北。","categories":[],"tags":[],"keywords":[]},{"title":"登录AWS的ES2服务器2——xshell","slug":"login-aws-ec2-server-2nd","date":"2017-02-08T15:05:21.000Z","updated":"2018-03-15T06:27:28.470Z","comments":true,"path":"2017/login-aws-ec2-server-2nd/","link":"","permalink":"http://www.icnws.com/2017/login-aws-ec2-server-2nd/","excerpt":"","text":"上一篇讲用PuTTY登录到EC2服务器,实际上还是比较麻烦的,或者说自己还不怎么会用PuTTY,更习惯于用xshell,更简单方便一些。 打开xshell之后,新建会话,在连接的主机地址填上EC2的公网IPV4地址,端口是22 然后选中用户验证,默认的方法是Password,这里需要切换成Public Key,用户名是ec2-user,用户密钥选择,导入创建EC2实例时生成的后缀名为pem的文件,导入成功后选择密钥即可 剩下的就是直接连接服务器了,该确认确认,进来就好了!","categories":[],"tags":[],"keywords":[]},{"title":"登录AWS的EC2服务器","slug":"login-aws-ec2-server-1st","date":"2017-02-08T14:40:12.000Z","updated":"2018-03-15T06:27:28.470Z","comments":true,"path":"2017/login-aws-ec2-server-1st/","link":"","permalink":"http://www.icnws.com/2017/login-aws-ec2-server-1st/","excerpt":"","text":"首先,创建实例的时候,会生成一个以pem为后缀的密钥x.pem 然后下载PuTTY客户端http://www.chiark.greenend.org.uk/~sgtatham/putty/,下载地址:https://the.earth.li/~sgtatham/putty/latest/x86/putty-0.67-installer.msi,下载完成之后进行安装即可 选中实例可以看到“实例: i-08a4dc80b2aaa2a8c 公有 DNS: ec2-52-36-224-176.us-west-2.compute.amazonaws.com”即实例的名称和公网的DNS地址,实例名称可以先不管,公网DNS是和登录有关的 在登录之前需要用刚刚安装号的PuTTY工具的一个组件转换您的私有密钥 启动 PuTTYgen (例如,在开始菜单中,选择 All Programs > PuTTY > PuTTYgen)。 在 Type of key to generate (要生成的密钥类型) 下,选择 SSH-2 RSA,然后加载你的x.pem文件,保存私钥到一个目录,私钥的后缀名为ppk,后面登录的时候需要用到 在 Host Name (主机名) 框中,输入 user_name@public_dns_name。确保为您的 AMI 指定相应的用户名。例如: 对于 Amazon Linux AMI,用户名为 ec2-user。 对于 RHEL AMI,用户名称是 ec2-user 或 root。 对于 Ubuntu AMI,用户名称是 ubuntu 或 root。 对于 Centos AMI,用户名称是 centos。 对于 Fedora AMI,用户名称是 ec2-user。 对于 SUSE,用户名称是 ec2-user 或 root。 另外,如果 ec2-user 和 root 无法使用,请与 AMI 供应商核实。根据这个说明,我们的EC2服务器的Host Name就是[email protected] 然后在连接目录下面找到SSH并点开Auth,选择上面转换出来的私钥,ppk文件,然后点击打开就可以登录到我们的EC2服务器了。 写的匆忙,可能有些不全面的地方,请参考官方说明文档即可。","categories":[],"tags":[],"keywords":[]},{"title":"mysql启动","slug":"mysql-start","date":"2017-02-03T08:33:11.000Z","updated":"2018-03-15T06:27:28.471Z","comments":true,"path":"2017/mysql-start/","link":"","permalink":"http://www.icnws.com/2017/mysql-start/","excerpt":"","text":"mysql启动不能用root用户 su mysql将用户切换成mysql bin/mysqld即可启动mysql服务","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务,数据库","slug":"服务-数据库","permalink":"http://www.icnws.com/tags/服务-数据库/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"mysql的一个坑","slug":"one-mysql-hole","date":"2017-02-03T06:49:23.000Z","updated":"2018-03-15T06:27:28.474Z","comments":true,"path":"2017/one-mysql-hole/","link":"","permalink":"http://www.icnws.com/2017/one-mysql-hole/","excerpt":"","text":"错误代码12345678910111213141516171819202122232425262728Unexpected error occurred <span class="hljs-keyword">inscheduled task.org.springframework.transaction.CannotCreateTransactionException:Could not open JDBC Connection <span class="hljs-keyword">fortransaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:No operations allowed after connection closed. 。。。。。。 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)Caused by:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:No operations allowed after connection closed. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 。。。。。。org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:223) ... 22 moreCaused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet successfully received from the server was 59 , 942 milliseconds ago. The last packet sent successfully to the server was 24milliseconds ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 。。。。。。 org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:212) ... 22moreCaused by:java.io.EOFException:Can not read response from server. Expected to read 4bytes, read 0bytes before connection was unexpectedly lost. at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2914) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3332) 原因MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。 解决办法修改mysql的配置文件 my.cnf 这个文件一般在mysql的安装目录或者/etc/my.cnf 修改内容如下 超时时间改为1年 [mysqld]wait_timeout=31536000interactive_timeout=31536000修改完保存之后,重启mysql 然后就观察吧","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Code","slug":"Code","permalink":"http://www.icnws.com/tags/Code/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"几个命令记录一下","slug":"notice-of-several-commands","date":"2017-02-03T06:38:57.000Z","updated":"2018-03-15T06:27:28.472Z","comments":true,"path":"2017/notice-of-several-commands/","link":"","permalink":"http://www.icnws.com/2017/notice-of-several-commands/","excerpt":"","text":"1、查看当前系统的磁盘状态123456xxxx# df -hT文件系统 类型 容量 已用 可用 已用<span class="hljs-comment">% 挂载点/dev/md2 ext3 30G 21G 6.7G 76<span class="hljs-comment">% //dev/md1 ext3 3.9G 93M 3.7G 3<span class="hljs-comment">% /boottmpfs tmpfs 1007M 0 1007M 0<span class="hljs-comment">% /dev/xxx/dev/md0 ext3 584G 40G 539G 7<span class="hljs-comment">% /srv/xxx</pre> 2、查看某文件夹下各个文件夹的大小123456789101112131415xxxx# du -sh /usr/*87M /usr/bin4.0K /usr/dlcfg4.0K /usr/etc4.0K /usr/fake.cfg4.0K /usr/games36M /usr/include214M /usr/java1.3M /usr/Java324.0K /usr/Java32\\xmit.ini1.5M /usr/Javar1.6M /usr/kerberos397M /usr/lib18M /usr/libexec ...... 3、查看文件大小12345678910111213141516171819xxxx# ll -lh总计 1.1G-rw-r--r-- 1 root root 72K 06-23 18:54 catalina.2015-06-23.log-rw-r--r-- 1 root root 9.6K 06-25 15:53 catalina.2015-06-25.log-rw-r--r-- 1 root root 12K 06-29 16:42 catalina.2015-06-29.log-rw-r--r-- 1 root root 9.6K 06-30 14:37 catalina.2015-06-30.log-rw-r--r-- 1 root root 25K 07-22 14:59 catalina.2015-07-22.log-rw-r--r-- 1 root root 86K 07-23 14:11 catalina.2015-07-23.log-rw-r--r-- 1 root root 118K 07-24 22:30 catalina.2015-07-24.log-rw-r--r-- 1 root root 1.3K 07-25 19:08 catalina.2015-07-25.log-rw-r--r-- 1 root root 3.8M 07-27 00:05 catalina.out-rw-r--r-- 1 root root 6.4K 06-23 18:54 error-debug.2015-06-23.log-rw-r--r-- 1 root root 436 06-25 15:53 error-debug.2015-06-25.log-rw-r--r-- 1 root root 1.2K 06-29 16:42 error-debug.2015-06-29.log-rw-r--r-- 1 root root 436 06-30 14:37 error-debug.2015-06-30.log-rw-r--r-- 1 root root 9.6K 07-22 14:59 error-debug.2015-07-22.log-rw-r--r-- 1 root root 14K 07-23 14:11 error-debug.2015-07-23.log-rw-r--r-- 1 root root 23K 07-24 22:46 error-debug.2015-07-24.log ......","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Code","slug":"Code","permalink":"http://www.icnws.com/tags/Code/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"别人告诉你的","slug":"others-told-you","date":"2017-02-03T06:38:09.000Z","updated":"2018-03-15T06:27:28.474Z","comments":true,"path":"2017/others-told-you/","link":"","permalink":"http://www.icnws.com/2017/others-told-you/","excerpt":"","text":"一转眼,离开济南快一年了,这一年感觉自己成长了不少,也学会了很多自己原来没有意识到的东西! 想当初要来北京的时候,也是被劝留下来,说北京固然工资高些,但是成本也更高,各方面压力也很大,所以好说歹说,就是最好别去! 现在来看,一切也不尽然这样,来北京之后感觉整个人都不一样了,见识也越来越开阔!今天看了一篇关于为啥要在大公司工作的文章,颇有感触! 虽然我现在的公司也不大,但是公司用到了不少以前公司永远也不会用到的很多东西!遇到了上家公司永远也不可能遇到的问题!问题是人进步的源泉和动力,那种总犯同一错误的人除外! 对于别人告诉你的话,如果你不懂,那你千万不要深信不疑。这对你是有好处的,因为怀疑才会使我们变得更能发现问题所在! 很多人说的话,那都是基于一些角色和立场的。这也意味着除了个人情感、机遇、经历之外的东西会影响你听到的结果! 怎么才能找到一个适合你的结果,这事是很复杂的! 如果你从来没有听过一个说法,你自然不会有那个念头,只有看的多了,听的多了,加上自己的经历和经验进行判断,给出惊艳的结果,必然了不起! 最近也一直在思考关于以后的事情!很多事情看的也越来越明白、透彻! 你有没有什么想法?","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"思考","slug":"think-1st","date":"2017-02-03T06:37:19.000Z","updated":"2018-03-15T06:27:28.497Z","comments":true,"path":"2017/think-1st/","link":"","permalink":"http://www.icnws.com/2017/think-1st/","excerpt":"","text":"连续加了两次班,感觉有点小累!程序员真的是个体力活啊! 感觉现在做的东西都很不精致,都是东拼西凑一些,完成功能,然后上线就好了!很少过多的去探究为什么要这么去做,因为大多数时间都在忙,忙的来不及思考,只知道做事,去做事! 于是,结果是,做了很多年的事情,但是让我们自己再做,还是会循环重头再做一遍! 这几天学到的东西: 1、HTML5是需要很深入的去学习的,皮毛的东西只能用来坑队友!哈哈,确实是坑队友啊! 2、思路还是要清晰,起码要把自己知道的理清楚。当然,不知道的可以和别人进行沟通以知悉所有! 3、我们犯了错误,需要去改,但不要等到最后才去确认!当我们接到需求的时候就应该着手分析相关需求,如果分析过了,那尽可能再次对需求进行确认。文字描述有很多时候是不到位的! 4、一定要写文案。写文案的好处多多,这里不一一说明!文档可以让人思考需求,啊1时也可以避免遗漏! 我们不是代码的创造者,我们只是代码的搬运工?!","categories":[],"tags":[],"keywords":[]},{"title":"学习Solr(二):创建core","slug":"solr-create-core","date":"2017-02-03T06:34:24.000Z","updated":"2018-03-15T06:27:28.483Z","comments":true,"path":"2017/solr-create-core/","link":"","permalink":"http://www.icnws.com/2017/solr-create-core/","excerpt":"","text":"时间 2015-07-01 17:33:20 城南往事 上一篇博文写到可以正常访问solr项目,但是真的要用起来solr还需要配置一个core。 core的配置是不能直接在界面上配置的,首先需要在服务器拷贝一些配置到新创建的目标core目录下 1、拷贝目录及文件cd /usr/local/solrmkdir core1cp –r configsets/sample_techproducts_configs/* core1 2、界面操作增加core data和其他文件都会自动创建,无需修改 3、添加一条索引数据 4、查询吧直接点击左侧的Query,然后执行右侧左下角的Excute Query,就会得到刚才添加的记录WAYNE 在创建core的过程中,遇到了一个问题,报了一个org.apache.solr.common.SolrException: Could not load config for solrconfig.xml的错误,查了一下,是因为配置的问题,按照上述操作一般不会出现这种情,solr的server最好是放到/usr/local/solr这个位置 期待更多更深入的学习.","categories":[],"tags":[],"keywords":[]},{"title":"学习Solr(一):部署","slug":"solr-setup","date":"2017-02-03T06:32:47.000Z","updated":"2018-03-15T06:27:28.484Z","comments":true,"path":"2017/solr-setup/","link":"","permalink":"http://www.icnws.com/2017/solr-setup/","excerpt":"","text":"从开始学习,到现在也试着学了不短的时间,今天终于真正的在Linux上跑起来了一个solr实例,so happy! solr的部署是参考Lucien_Leng的博客http://blog.csdn.net/jeffsmish/article/details/46533255 来实现部署的。 1、下载下载地址:http://apache.fayea.com/lucene/solr/5.2.1/ cd /usr/local/wget http://apache.fayea.com/lucene/solr/5.2.1/solr-5.2.1.tgz 2、解压tar -zxvf solr-5.2.1.tgz 3、部署tomcat7下载: wget http://apache.fayea.com/tomcat/tomcat-7/v7.0.62/bin/apache-tomcat-7.0.62.tar.gz解压: tar -zxvf apache-tomcat-7.0.62.tar.gz重命名: mv apache-tomcat-7.0.62 tomcat7设置: server.xml 的端口处增加URIEncoding=”UTF-8″ 4、拷贝solr.war到webapps下cp solr-5.2.1/server/solr.war tomcat7/webapps/ 5、解压war包这一步可以通过启动tomcat来实现,不过启动会报错,不过没问题,只要解压就ok了 或者使用命令解压 unzip tomcat7/webapps/solr.war 6、拷贝solr文件夹到local目录下cp -r solr-5.2.1/server/solr/ /usr/local/ 7、配置web.xmlvi tomcat7/webapps/solr/WEB-INF/web.xml12345<env-entry><env-entry-name>solr/home</env-entry-name><env-entry-value>/usr/local/solr</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry> 8、拷贝solr项目部署的依赖jar包cp solr-5.2.1/server/lib/ext/*.jar tomcat7/webapps/solr/WEB-INF/lib/ 9、启动tomcattomcat7/bin/startup.sh可能会提示没权限 chmod 755 -R tomcat7 10、访问solr启动tomcat之后就可以访问solr了 访问地址:http://localhost:8080/solr","categories":[],"tags":[],"keywords":[]},{"title":"系统通知的设计","slug":"design-for-system-notification","date":"2017-02-03T06:31:47.000Z","updated":"2018-03-15T06:27:28.461Z","comments":true,"path":"2017/design-for-system-notification/","link":"","permalink":"http://www.icnws.com/2017/design-for-system-notification/","excerpt":"","text":"应用要上系统消息通知,怎么通知?就是应用内的一个小消息推送! 具体就是运营平台给某渠道某用户级别发通知或直接给指定用户发送通知! 我的设计是这样的! 第一个表,系统消息通知表,就是在运行平台创建发送通知的一个表,记录给谁发送通知的基本信息! 第二个表是,消息表,记录消息类型,来源,标题,标签,内容,发送时间等信息。 这里考虑到有可能以后会有用户间的留言及评论等需求,所以单独设计了,从第一个表来的都是系统通知。 第三个表,记录指定用户的表,当发送通知是指定用户会读取这个表的信息!算是一个关联表! 第四个表,用户消息状态表,记录用户已读未读的消息ID,及是否有未读消息的状态! 当一表数据发布通知,对通知进行解析,生成二表消息数据及写入四表相关用户数据!这时候只写未读数据项。 同时,对二表和四表的数据做了缓存! 用户从客户端拉取数据时,接口端服务器先读未读消息,按时间倒序排列,然后读取已读消息,也按时间倒序排列! 用户点击未读消息,显示详情,标为已读,当用户离开消息功能界面上报,接口做对应处理,并返回结果! 大概就是这样了","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"},{"name":"通知","slug":"通知","permalink":"http://www.icnws.com/tags/通知/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos7 开启端口","slug":"centos7-setting-the-ports","date":"2017-02-03T06:30:41.000Z","updated":"2018-03-15T06:27:28.458Z","comments":true,"path":"2017/centos7-setting-the-ports/","link":"","permalink":"http://www.icnws.com/2017/centos7-setting-the-ports/","excerpt":"","text":"与centos之前的版本都不一样,这个是一个新的方式开启端口,不是用iptables而是用firewall,真是实至名归了,就是防火墙 开启端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent 命令含义: `–zone #作用域 –add-port=80/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效` 重启防火墙 firewall-cmd --reload","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"当你转发XX信息时你面临什么?","slug":"when-you-resent-the-msg","date":"2017-01-31T02:39:53.000Z","updated":"2018-03-15T06:27:28.500Z","comments":true,"path":"2017/when-you-resent-the-msg/","link":"","permalink":"http://www.icnws.com/2017/when-you-resent-the-msg/","excerpt":"","text":"最近朋友圈又有人转发如下类似的信息 我帮转发,大家帮忙转一下,我朋友捡到一个钱包。里边有一张身份证:梁伟瑜,卡10多张。现金9400元左右,动车票2张。(梁伟瑜,薛瑞华)车票是后天的,大家帮忙扩散。赠人玫瑰,手留余香。传递正能量。失主请联系:1371x490xx3。谁的群多,帮忙转一下。好人好事大家都转发一下哦,这个得转。现在好人太多了。谢谢!好人有好报!(帮转)当你转发的时候,你知道你面临什么吗? 第一,绝大多时候,我们并没有验证信息的真实性,就直接转发,电话没有打,所以不具可信性!但是,我们的朋友会基于对于我们的信任去判断信息的真伪,如果你发了信息,那你的公信力就面临考验!如果你发的真是假信息,那你本质上是在造谣传谣,行为很恶劣! 第二,骗子知道这是一条假信息,当你转发,就表示你甄别信息的能力比较低,换句话说,比较容易骗!另外同情心比较泛滥,可以利用这一点获取你的相关信息进行诈骗,危险性不言而喻!不要认为这是危言耸听,你没有遇到只是因为你的财富还没到被人觊觎的程度! 每个普通人的信息都是在信息黑产的笼罩下,你的信息对很多人来说,都是透明的!犯了错,最终都是要买单的! 所以,从现在开始,从自己做起,毕竟意志是我们自己的!","categories":[],"tags":[],"keywords":[]},{"title":"追随者","slug":"follers","date":"2017-01-22T18:22:40.000Z","updated":"2018-03-15T06:27:28.462Z","comments":true,"path":"2017/follers/","link":"","permalink":"http://www.icnws.com/2017/follers/","excerpt":"","text":"老郭是很少能看透本质的人,按照他的说法,创业是需要看透本质的,而不是要做追随者,追随者大多数都是盲目的,也是失败的! 很多年前,他就涉及了当今很流行的概念,O2O,团购,共享经济,GPS游戏等等,很多概念,在很多年前他就已经实现或者有所尝试了,这是洞见事物发展的能力! 如今而言,大多数人都是追随者,而不是发现和创造者,而且有了资本的参与,很多事情就很不一样了! 因为资本的介入,很多并没有看清产品本质的人和公司快速膨胀,屁民也跟着拍手叫好,但是现在呢?滴滴打车的服务已经跟不上了,易到用车叫车也是很多都加价,1.2倍 1.3倍甚至更多,其实没车,其实加价也给不了司机! 老郭说,还有一些东西没有看明白,差那么一点,如果他想明白了,就回去做! 我也想去做点东西!过去的一年,做了很多重复性的工作,也许很多人觉得没什么,有工资拿不就好了么,其实呢? 我对前路还没有看清,说的好听叫什么都能干,但是,最终能落到实处的总是有限的一点点!不希望自己是一个追随者,但是在迷雾拨开之前,只能慢慢摸索! 你是追随者还是创造者?!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"谈谈游戏","slug":"talk-about-games","date":"2017-01-18T00:41:26.000Z","updated":"2018-03-15T06:27:28.494Z","comments":true,"path":"2017/talk-about-games/","link":"","permalink":"http://www.icnws.com/2017/talk-about-games/","excerpt":"","text":"年轻的时候,没怎么玩过游戏,但是现在不那么年轻了,却去体验游戏去了,世事难料! 现在的游戏,无论怎么样,都是要花钱的,虽然不付费也可以玩!而且,一旦你开始付费了,付费的可能性就会接二连三的到来!这时候,你沉浸,你快乐,然而当你一刹那停下来,你就会被空虚和倦怠淹没和侵蚀!可能会为了花费的钱和时间后悔不已! 所以,大多数时候,玩游戏都是一个受伤害的旅程!从介入那一刻开始,就必然受到痛苦! 之前在赤兔上和一个兔友聊过游戏,理想中要建立的游戏是那种寓教于乐的,让人通过游戏学到很多知识,而不仅仅是打打杀杀,过过剧情,拼拼装备这样!只是,现实和理想差距有点大! 现在的游戏,体验就是炫,没有别的,只有过剧情,打造装备去竞技!而且,游戏的平衡大多做的不好,大多数平衡可以通过钱来解决!没有初心,只有赚钱,这样这种感觉真的很不好!","categories":[],"tags":[],"keywords":[]},{"title":"就差产品经理到位了","slug":"just-lack-a-producter","date":"2017-01-16T14:25:06.000Z","updated":"2018-03-15T06:27:28.468Z","comments":true,"path":"2017/just-lack-a-producter/","link":"","permalink":"http://www.icnws.com/2017/just-lack-a-producter/","excerpt":"","text":"开发了一个没有真正产品经理的产品,所以很长时间都是在为一个没有期望的目标努力,这种努力,很大程度上都是虚无,所以有时候就甚至一切从简,努力安慰自己! 年前的时光,产品经理比较难找,跳槽的大约也不是什么好的产品经理,程序员比较例外,因为临近年关,面临年终奖,效益不好的小公司们就不再hold了,毕竟怎么都面临game over,索性就耍起无赖! 然而,过了年就好招产品经理了吗?未必吧!产品经理也像程序员那种入门级的,竟然可以培训,快速育成了!有点不可思议,但是也是实情!毕竟,想想我们遇到的大多数产品经理都不过是在堆砌某些功能,抄袭多家集大成者,至于为什么,深层次有什么,大多无从知晓! 传统的瀑布流式开发已经逐渐的不适合了现在新生超越app的路线,如果这个产品经理只是一个执行者,那失败也仅仅是必然,梦想支柱轰然倒塌! 很多时候,不是产品经理能解决的问题,而大多数产品经理也不是解决问题的,只是将解决方案落实一下而已!有灵魂的产品经理很难找到,何况还要对口! 不要等产品经理了,每个参与产品开发的人,都需要有产品思维,而不仅仅是为了完成一两个功能,自己要去思考,去完善,去探索,产品的每一个细节!你是参与者,体验者,缔造者!","categories":[],"tags":[{"name":"产品经理","slug":"产品经理","permalink":"http://www.icnws.com/tags/产品经理/"}],"keywords":[]},{"title":"中庸怎么说?","slug":"what-is-moderation","date":"2017-01-16T00:09:58.000Z","updated":"2018-03-15T06:27:28.499Z","comments":true,"path":"2017/what-is-moderation/","link":"","permalink":"http://www.icnws.com/2017/what-is-moderation/","excerpt":"","text":"原来是比较喜欢说中庸的话,行中庸之道,自以为人生窃喜,其实现在来看,很多事情,不过是不想面对罢了,给自己安慰! 结果呢?当然是碌碌无为,如果有所成就,那就是因为在某种程度上顺应了时代的发展和需要,比如当一个程序员! 据我所知,所了解,国人大多持中庸态度,一以贯之,可能在一定程度上维护了社会安定,但是其终结是没有创造力和发展! 看看所有的娱乐项目,几乎所有的都是满足人们的发泄需求,其实发泄掉的何尝不是创造力?! 昨天看《西部世界》讲述的故事,很有感触,也很烧脑!每一个机器人都要有一个基石——人物背景,关于人物的角色、故事都在这个基础上产生并演变!机器人是没有真正的意识的,而痛苦、折磨、失望会让他们产生意识,是我所认同的! 不要做中庸的人,除非你想平庸甚至卑劣!!","categories":[],"tags":[],"keywords":[]},{"title":"西部世界","slug":"the-tv-play-of-West-World","date":"2017-01-15T14:00:32.000Z","updated":"2018-03-15T06:27:28.496Z","comments":true,"path":"2017/the-tv-play-of-West-World/","link":"","permalink":"http://www.icnws.com/2017/the-tv-play-of-West-World/","excerpt":"","text":"周末将《西部世界》这部电视剧看完了! 一句评语,在很大程度上和中国的西游记是一个意思。 一个概念,如果要精彩,需要有故事线,如果要更精彩,多条故事线交叉感染!","categories":[],"tags":[],"keywords":[]},{"title":"免费才是最贵的","slug":"free-is-expensive","date":"2017-01-15T13:38:01.000Z","updated":"2018-03-15T06:27:28.462Z","comments":true,"path":"2017/free-is-expensive/","link":"","permalink":"http://www.icnws.com/2017/free-is-expensive/","excerpt":"","text":"免费的概念屡试不爽,让很多人乐此不疲,寻求免费的解决方案,但是事实是:你花了很长的时间代价才获得你可以用同样的时间挣得钱买对应的好商品!如果你挣不到,那说明你的价值没有真正发挥出来,在很大程度上! 免费的东西是需要很多附加条件的,这个时代,虽然很多隐形产业已经很发达了,但是也需要一些突破口或者更多的信息去完善他们的信息!你以为你免费得到了一些好处,其实是以出卖自己为代价的,出卖的可能是自己的时间,自己的人脉,自己的生命等等!当你真的过度使用的时候,你将面临被狙击的危险! 或者你只是觉得自己是个小人物,没有什么价值,那是因为没有在价值线上,如果有人连接了这些信息那就是价值所在! 不要贪便宜,也不要图免费,代价可能是无形的,但是总会付出代价,不是吗?不要相信免费,没有免费!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"产品怎么做?","slug":"Producter-do-what-for-this","date":"2017-01-12T15:15:37.000Z","updated":"2018-03-15T06:27:28.453Z","comments":true,"path":"2017/Producter-do-what-for-this/","link":"","permalink":"http://www.icnws.com/2017/Producter-do-what-for-this/","excerpt":"","text":"目前做了几个产品,几个app,都没有算得上成功的产品,虽然我不是产品经理,但是已经开始思考这个事情! 想做好产品,最重要的就是做到的就是简单,易用!这大概所有人都知道,只是知道和做,是两回事! 看着现在的很多产品,很不开心,产品没有哲学,没有灵魂,只有功能的堆砌!这个时候就会想起来那句,你到底是产品经理还是功能经理? 产品的最初都是要解决一个核心问题,产生诸多价值,但是也并不绝对,也还有很多其他因素在里面! 现状是,很多人都在抄袭,各种抄袭,做事情开发功能的唯一理由就是其他的什么应用也有这个功能,他们是专门做什么什么的!有没有自己的用户使用场景?有没有自己的用户定义?只是模仿抄袭不能解决任何问题!","categories":[{"name":"产品","slug":"产品","permalink":"http://www.icnws.com/categories/产品/"}],"tags":[{"name":"产品,思考","slug":"产品-思考","permalink":"http://www.icnws.com/tags/产品-思考/"}],"keywords":[{"name":"产品","slug":"产品","permalink":"http://www.icnws.com/categories/产品/"}]},{"title":"最近看美剧","slug":"see-videos-of-Amarica-drama","date":"2017-01-11T00:25:36.000Z","updated":"2018-03-15T06:27:28.482Z","comments":true,"path":"2017/see-videos-of-Amarica-drama/","link":"","permalink":"http://www.icnws.com/2017/see-videos-of-Amarica-drama/","excerpt":"","text":"最近在看美剧,有福尔摩斯基本演绎原理第五季、第四季,定罪第一季,生死狙击第一季,还有刚开始看的哥谭第三季! 美剧很好看,一集一个事件的破案定罪,一条若有若无的线牵着剧情发展,丝丝入扣,让人忍不住一直看下去! 反观国产剧,简直无聊死!主题也就那几个,宫斗,古装,神剧,无厘头搞笑,玩小孩等等,找不出来更新鲜的东西了,这是为啥? 一个是大环境问题,不允许你胡思乱想;一个是思维受限,就算让你想,你的视野根本打不开,打不开就是坏事儿,折腾很多年也不过是旧时黄花;还有一个是技术受限,没有很高超的技术手段去实现,精于算计的人生,怎么会在技艺上有所建树;最后就是无奈了,投资多见效慢,投资人就不喜投资!没有太多投资,想作为也难!周而复始!","categories":[],"tags":[],"keywords":[]},{"title":"一月书单(2017)","slug":"read-January Book List(2017)","date":"2017-01-10T15:08:02.000Z","updated":"2018-03-15T06:27:28.476Z","comments":true,"path":"2017/read-January Book List(2017)/","link":"","permalink":"http://www.icnws.com/2017/read-January Book List(2017)/","excerpt":"","text":"进入一月份就会格外的忙起来,领导推荐我准备一下信息系统项目管理师这个资格证考试,这个对我比较有利,因为我没有本科毕业证,目前也就有一个专科毕业证而已! 上个月读的几本书,主要是徐志斌的《社交红利》《社交红利2.0》,以及《疯传》,其他的书零零散散的读了一些! 社交的概念不是泛泛的加个第三方登录就可以了,真正的要利用好社交元素,社交的红利,这里有很多工作要去做!我们平常看到的大多数应用都是知其然,就是抄抄抄,但是不知道所以然,只能说是人有我有,不能算人有我优,社交之路何其漫长,产品之路亦然! 本月的读书有一本侧重点,是关于restful的书,一直没有认真学习并使用过restful的设计,也没有做过对应的开发,考虑到未来的接口要规范化,实现前后端的分离,这一块就是一个必经之路了,在努力学习中,希望在年后能进入实践阶段! 另外一本是之前在亚马逊买的精益系列电子书里的一本关于精益设计的——Lean UX,也是一本有意思的书! 其他时间学习信息系统项目管理师的基础知识,一个目的是考证,一个目的是学习补充自己的项目管理理论,提高自己的管理能力!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"},{"name":"书单","slug":"书单","permalink":"http://www.icnws.com/tags/书单/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"关于RSA","slug":"about-RSA","date":"2017-01-10T11:30:03.000Z","updated":"2018-03-15T06:27:28.454Z","comments":true,"path":"2017/about-RSA/","link":"","permalink":"http://www.icnws.com/2017/about-RSA/","excerpt":"","text":"RSA是一种常用的非对称加密方式,有很多场景会用到,在我们谈论RSA的时候,一般会涉及到两个主要场景是:加密数据和签名验证 1、加密数据:这个的使用方式是公钥加密,私钥,就是说,你加密完成的数据,无论谁拿到了,只有有正确的私钥才能获得解密的真实数据!使用场景就是从a服务到b服务的数据,只有b能用私钥解密出数据 2、验证签名:这个是私钥加密,公钥解密!签名包含一些除签名之外的数据,通过对签名的公钥解密,获得参数并比对原有参数,确认请求是否有效!使用场景是第三方支付比较常见!","categories":[],"tags":[],"keywords":[]},{"title":"Centos7的防火墙操作","slug":"centos7-operation-of-firewall","date":"2017-01-09T08:47:52.000Z","updated":"2018-03-15T06:27:28.458Z","comments":true,"path":"2017/centos7-operation-of-firewall/","link":"","permalink":"http://www.icnws.com/2017/centos7-operation-of-firewall/","excerpt":"","text":"1、获取所有开启的端口 firewall-cmd --list-ports 2、添加端口 firewall-cmd --add-port 80/tcp 3、删除端口 firewall-cmd --remove-port 80/tcp","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Centos7","slug":"Centos7","permalink":"http://www.icnws.com/tags/Centos7/"},{"name":"服务","slug":"服务","permalink":"http://www.icnws.com/tags/服务/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Centos7被minerd及AnXqV挖矿程序入侵","slug":"centos7-diged-by-minerd-and-anxqv","date":"2017-01-09T08:42:26.000Z","updated":"2018-03-15T06:27:28.457Z","comments":true,"path":"2017/centos7-diged-by-minerd-and-anxqv/","link":"","permalink":"http://www.icnws.com/2017/centos7-diged-by-minerd-and-anxqv/","excerpt":"","text":"上午重启服务的时候,发现程序启动死慢,用top命令查看了一下,cpu被占用接近100%,所以无法运行新程序,通过top命令然后输入P,就能看到有两个程序几乎占用了所有的CPU,占用率为700%左右,程序名称为:minerd和AnXqV两个,通过搜索知道是挖矿程序,通过kill命令及pkill命令是无法直接解决的,找到了一个教程,http://www.cnblogs.com/zhouto/p/5680594.html,参考的这个进行的处理,基本上搞定了,不过里面有很多细节的地方这里记录下来。 1、关闭访问挖矿服务器的访问: iptables -A INPUT -s xmr.crypto-pool.fr -j DROP 和 iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP 2、找到minerd程序: find / -name minerd* 发现程序在/opt下面,同时发现另外的一个异常文件 KHK75NEOiq33和minerd 3、去掉执行权限 chmod -x KHK75NEOiq33 minerd 4、杀掉进程,kill或pkill随你喜欢 pkill minerd pkill AnXqV 5、清除定时任务: systemctl stop crond 我们的系统因为没有其他定时任务,所以可以直接这样,如果有需要自己手动备份自己的定时任务,然后清理掉其他的定时任务,情景分析后处理 6、清除文件 除了opt下面的两个异常文件需要清除,/tmp文件夹下也有文件需要清除,Aegis-<Guid(5A2C30A2-A87D-490A-9281-6765EDAD7CBA)> AnXqV ddg.217 ddg.218 ddg.219 duckduckgo.12.log duckduckgo.17.log duckduckgo.18.log duckduckgo.19.log 这里的文件有个duckduckgo的,大约是翻墙用的搜索对应的进程有ddg.217/218/219 7、清除未知的授权 进入 ~/.ssh/目录,发现多个异常文件,包括authorized_keys、known_hosts等,需要移除authorized_keys中的未知授权,这里可以看到有REDIS000…的授权key,我们自己没有设置过,所以直接删除之 8、元凶分析 有说是redis低版本存在的一个漏洞,有人利用这个漏洞提升权限,然后放置了挖矿工具,所以就将默认的端口改了,密码改了,重新启动了服务,基本上能过一段时间了","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"挖矿","slug":"挖矿","permalink":"http://www.icnws.com/tags/挖矿/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"微信小程序发布","slug":"publish-of-mini-program","date":"2017-01-09T00:22:11.000Z","updated":"2018-03-15T06:27:28.475Z","comments":true,"path":"2017/publish-of-mini-program/","link":"","permalink":"http://www.icnws.com/2017/publish-of-mini-program/","excerpt":"","text":"一大早,微信小程序铺天盖地而来,真的是一个盛世的样子! 体验了别人在群里分享的几个小程序,感觉还是太粗糙了,首先是适配,我安卓6.0.1的系统,展示不正常,再就是弹窗要确认两次,多个小程序都是两次,估计是小程序的问题,另外,放出来的界面并不美观,这个很致命吧! 对于不算高频的小密圈,已经卸载了,用上了“小密圈+”,不知道这对app来说,是不是好事儿? 作为一个程序男,在未来app的native版本仍然是必须的,但是我们要增加人力维护单独的小程序! 微信是时代的产物,也将随着时代结束而逐渐消亡!不可否认,微信追逐的方向应该是没有错的,但是产品和产品哲学并不统一!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"小程序","slug":"小程序","permalink":"http://www.icnws.com/tags/小程序/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"如何做个微信年会签到?","slug":"how-to-devlop-a-sigin-for-annual-meeting","date":"2017-01-08T14:19:37.000Z","updated":"2018-03-15T06:27:28.463Z","comments":true,"path":"2017/how-to-devlop-a-sigin-for-annual-meeting/","link":"","permalink":"http://www.icnws.com/2017/how-to-devlop-a-sigin-for-annual-meeting/","excerpt":"","text":"第一个方案 申请一个公众号,并将对应的二维码放出,参会者扫码关注,并发送签到信息,后台进行实时人工统计 方案特点:快,简单,但是有点简陋,需要人工配合 第二个方案 公众号申请认证,并做一个签到页面,参会者通过扫码打开并登录页面,填写相关签到信息 特点:高大上,但是需要多人配合及资金支持,时间短就要命了","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"开发","slug":"开发","permalink":"http://www.icnws.com/tags/开发/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"HttpAuthenticationFilter","slug":"httpauthenticationfilter","date":"2017-01-07T15:41:10.000Z","updated":"2018-03-15T06:27:28.464Z","comments":true,"path":"2017/httpauthenticationfilter/","link":"","permalink":"http://www.icnws.com/2017/httpauthenticationfilter/","excerpt":"","text":"12345678910111213141516171819202122232425262728293031323334353637383940@Overridepublic void filter(ClientRequestContext request) throws IOException { if ("true".equals(request.getProperty(REQUEST_PROPERTY_FILTER_REUSED))) { return; } if (request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { return; } Type operation = null; if (mode == HttpAuthenticationFeature.Mode.BASIC_PREEMPTIVE) { basicAuth.filterRequest(request); operation = Type.BASIC; } else if (mode == HttpAuthenticationFeature.Mode.BASIC_NON_PREEMPTIVE) { // do nothing } else if (mode == HttpAuthenticationFeature.Mode.DIGEST) { if (digestAuth.filterRequest(request)) { operation = Type.DIGEST; } } else if (mode == HttpAuthenticationFeature.Mode.UNIVERSAL) { Type lastSuccessfulMethod = uriCache.get(getCacheKey(request)); if (lastSuccessfulMethod != null) { request.setProperty(REQUEST_PROPERTY_OPERATION, lastSuccessfulMethod); if (lastSuccessfulMethod == Type.BASIC) { basicAuth.filterRequest(request); operation = Type.BASIC; } else if (lastSuccessfulMethod == Type.DIGEST) { if (digestAuth.filterRequest(request)) { operation = Type.DIGEST; } } } } if (operation != null) { request.setProperty(REQUEST_PROPERTY_OPERATION, operation); }}","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"读源码","slug":"读源码","permalink":"http://www.icnws.com/tags/读源码/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"maven设置国内镜像","slug":"maven-set-cn-mirror","date":"2017-01-07T00:35:08.000Z","updated":"2018-03-15T06:27:28.470Z","comments":true,"path":"2017/maven-set-cn-mirror/","link":"","permalink":"http://www.icnws.com/2017/maven-set-cn-mirror/","excerpt":"","text":"之前已经说过如何在windows系统安装配置maven,由于最近学习RESTful的东西,用到maven,国外镜像实在下载太慢,在网上找了解决办法,就是将maven的镜像由默认的改为国内的阿里云的maven镜像,方法如下: 1、找到maven的安装目录下的conf目录下的setting.xml文件 2、找到mirrors标签,在标签下方增加如下代码,然后重新加载即可!123456<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror>","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"服务,Maven","slug":"服务-Maven","permalink":"http://www.icnws.com/tags/服务-Maven/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"Window:maven安装","slug":"windows-install-maven-env","date":"2017-01-06T01:34:23.000Z","updated":"2018-03-15T06:27:28.500Z","comments":true,"path":"2017/windows-install-maven-env/","link":"","permalink":"http://www.icnws.com/2017/windows-install-maven-env/","excerpt":"","text":"1、从http://maven.apache.org/download.cgi下载安装包[apache-maven-3.3.9-bin.zip](http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip) 2、解压,并配置环境变量M2_HOME为C:\\apache-maven-3.3.9,环境变量的Path里增加%M2_HOME%\\bin; 3、打开cmd命令行,输入mvn -v 如果能看到如下即可:1234567Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)Maven home: C:\\apache-maven-3.3.9Java version: 1.7.0_67, vendor: Oracle CorporationJava home: C:\\Program Files\\Java\\jdk1.7.0_67\\jreDefault locale: zh_CN, platform encoding: GBKOS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" 4、另:安装maven需要先安装配置JAVA相关软件及环境变量","categories":[],"tags":[],"keywords":[]},{"title":"发节日祝福","slug":"send-message-for-festival","date":"2017-01-02T10:08:07.000Z","updated":"2018-03-15T06:27:28.482Z","comments":true,"path":"2017/send-message-for-festival/","link":"","permalink":"http://www.icnws.com/2017/send-message-for-festival/","excerpt":"","text":"节日祝福,圣诞,元旦,新年等等,都是节日愉快,满天飞,但是,并没有什么用啊! 早些年流行发短信祝福,后来是QQ祝福,后来是微信祝福,而且只有祝福,没有其他的了! 其实呢,祝福可以发,但是能不能多说几句话呢?如果你只是简单的发祝福,没有人会记得你的祝福的,就算知道也只是知道! 如果你要发祝福,就真心点,不要群发,多聊几句,和每一个你祝福的人聊几句!要不,就别发,会成为别人眼中的垃圾制造者!","categories":[],"tags":[],"keywords":[]},{"title":"为啥有闰秒?","slug":"why-there-have-leap-second","date":"2017-01-01T02:02:11.000Z","updated":"2018-03-15T06:27:28.500Z","comments":true,"path":"2017/why-there-have-leap-second/","link":"","permalink":"http://www.icnws.com/2017/why-there-have-leap-second/","excerpt":"","text":"昨天看到一个世界范围内调整标准时间的新闻,看了一些说明,这些说明比较牵强,日历是人定制的一个时间概念,为了调整这一秒浪费了太多的资源,而且没有解决什么实质性问题! 如果说解决了什么问题,那就是创造了很多就业岗位,有这一秒的调整,那个英国格林尼治的时间组织就得以存货和壮大,本质就是浪费资源! 所以,有很多人和国家是反对这个调整的,比如美国,不要瞎折腾,给活着的人制造困难!","categories":[],"tags":[],"keywords":[]},{"title":"想家了","slug":"homesick-again","date":"2016-12-29T23:56:28.000Z","updated":"2018-03-15T06:27:28.463Z","comments":true,"path":"2016/homesick-again/","link":"","permalink":"http://www.icnws.com/2016/homesick-again/","excerpt":"","text":"今天早晨梦见二老来看我,大约是想家了! 忘记家的时候,人的路会走偏,前路漫漫,迷失自己!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"想家","slug":"想家","permalink":"http://www.icnws.com/tags/想家/"},{"name":"记录","slug":"记录","permalink":"http://www.icnws.com/tags/记录/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"GO: string convert to float64","slug":"go-string-convert-to-float64","date":"2016-12-29T15:09:33.000Z","updated":"2018-03-15T06:27:28.463Z","comments":true,"path":"2016/go-string-convert-to-float64/","link":"","permalink":"http://www.icnws.com/2016/go-string-convert-to-float64/","excerpt":"","text":"1234567import "strconv"i, err := strconv.ParseFloat(f, 64)if err != nil { fmt.Println("the wrong:", err) os.Exit(2)}","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"GO","slug":"GO","permalink":"http://www.icnws.com/tags/GO/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]},{"title":"学习GO语言的工具","slug":"tools-for-go-language","date":"2016-12-29T14:53:23.000Z","updated":"2018-03-15T06:27:28.497Z","comments":true,"path":"2016/tools-for-go-language/","link":"","permalink":"http://www.icnws.com/2016/tools-for-go-language/","excerpt":"","text":"这几天在学习go语言,在windows环境下,跟着《GO语言圣经》这本书及书中的示例代码,学的相对来说还是很方便的。 环境是Windows 安装Windows版的git客户端 IDE是LiteIDE git-bash和liteIDE是一个很方便的工具组合,希望你也能用到。","categories":[],"tags":[],"keywords":[]},{"title":"springmvc的model日期格式化丢失时分秒","slug":"springmvc-model-lost-mills","date":"2016-12-28T09:10:48.000Z","updated":"2018-03-15T06:27:28.492Z","comments":true,"path":"2016/springmvc-model-lost-mills/","link":"","permalink":"http://www.icnws.com/2016/springmvc-model-lost-mills/","excerpt":"","text":"在BaseSpringController加入下面的代码并重启项目就可以了1234@InitBinderpublic void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));}","categories":[],"tags":[],"keywords":[]},{"title":"读论语(3)","slug":"read-lunyu-3rd","date":"2016-12-27T00:20:55.000Z","updated":"2018-03-15T06:27:28.479Z","comments":true,"path":"2016/read-lunyu-3rd/","link":"","permalink":"http://www.icnws.com/2016/read-lunyu-3rd/","excerpt":"","text":"** 曾子曰:“吾日三省吾身:为人谋而不忠乎?与朋友交而不信乎?传不习乎?”** 【译文】曾子说:“我每天多次反省自己:替别人做事是否尽心竭力了,和朋友交往是否忠实守信了?教给学生的知识我实践了吗?(老师传授给我的知识我践习了吗?)” 曾子说的三省吾身在现在,很多人都是反其道而行之的!怎么说? 上班的时候不用心竭力,只是应付工作,消磨时间的人,可以说是大有人在!很多人对目前的现状不满,但是只是停留在抱怨阶段,甚至更多人只是消极怠工,并不试图改变什么!其实,你如果现在给别人打工的时候都不能全心投入,等你自己创业的时候,会指望自己全心全意?虽然你很可能会,但是心有余而力不足是很常见结局! 坑队友,坑朋友,杀熟,在一定程度上成了现在很多人发家致富的途径,最明显的是朋友圈里的微商群体。很多时候他们都没有验证过产品是不是真的好用,是不是真的有用,就开卖了,钱也挣不多,却伤害了朋友之间的友情! 我们应该好好想想,朋友应该是能互相帮扶的,这样才能建立长久的信任,任何有损信任的事情都不要做,得不偿失,出来混,总要还的,哈哈! 最后一点体验的点应该是说自己确定的事情,说自己亲身实践的经验,对于不确定的事情,要慎言! 现在有一个很明显的事情,很多人在朋友圈转发各种危言耸听的文章,转发一些明显带有谣言性质的信息,自己不去分辨就去分享给大家!他是要获取社交货币,提高自己的影响力,表示自己是某种达人,关心朋友等等,只是事与愿违,很多那种信息都可以在网上找到辟谣,只是他不去验证,和这样的人做朋友是很危险的! 你不要发这种东西,你发了,我只能觉得你是有问题,智商不高,可能本心不坏,但是不会深交!这就是我的理解,我是会努力践行三省吾身的!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"辞职成为自由职业者~七芊老师分享","slug":"become-professionals","date":"2016-12-26T13:21:17.000Z","updated":"2018-03-15T06:27:28.455Z","comments":true,"path":"2016/become-professionals/","link":"","permalink":"http://www.icnws.com/2016/become-professionals/","excerpt":"","text":"一、什么样的人具备辞职称为自由业者的条件? 有一技之长,并且稳定地靠它赚过钱,或者有人为你的一技之长提供机会。 有一定的业务基础和人脉关系 有一定的积蓄(前两者ok后不那么必须)二、辞职成为自由业者需要增加哪方面的素质巩固收入? 明确自身要做的事,搜集行业内部信息进行学习,培养获取信息与人交流的能力 有明确的每日任务计划 有明确的财务计划三、如何在自由业期间坚持学习? 坚持锻炼 坚持读书 坚持参与活动,与人交流 上述三项安排每天都做的任务量四、如何对付自由业后的焦躁期? 没钱:制定财富目标落实每日财富计划,重在提升专业性 没目标:坚持做一件小事 自我怀疑:坚持与人交流。这就是七芊老师在赤兔的分享,如果你想获得更多信息,可以关注她的公众号——七芊物语!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"职业","slug":"职业","permalink":"http://www.icnws.com/tags/职业/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"不要很热点","slug":"don't-be-so-hot","date":"2016-12-26T11:19:59.000Z","updated":"2018-03-15T06:27:28.461Z","comments":true,"path":"2016/don't-be-so-hot/","link":"","permalink":"http://www.icnws.com/2016/don't-be-so-hot/","excerpt":"","text":"不要很热点,更不要很八卦,那样你即使能说点东西,但是也很可能拉低你的品位,因为事情可能就是那样,爆料不爆料都是存在的! 我看见别人在群里,微信朋友圈里,微博里发的那些自以为是其实没什么用的言论,都觉得低趣味,不可深交! 为什么会这么想? 一开始,我们得到的消息,大多数都是不全面的,甚至极端片面的,这时候大多是爆料者愿意你看到的,希望能激发你的相应的情绪,比如愤怒,比如恐惧,比如欢乐,最终扩大它的影响力,而你只是消费品! 还有一个原因是现在的媒体,大多数极其不负责任,为了吸引读者的眼球不惜曲解歪解甚至恶意解读事情的始末,使原本清晰可见的事实,因为报道者的功利心,变得扑朔迷离! 所以,不要很热点,很八卦,有这个时间不如去增加一下自己识别垃圾信息的能力,学习新东西的能力,对社会和人要有深一层的了解!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"},{"name":"蹭热点","slug":"蹭热点","permalink":"http://www.icnws.com/tags/蹭热点/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"读论语(2)","slug":"read-lunyu-2nd","date":"2016-12-26T01:14:24.000Z","updated":"2018-03-15T06:27:28.479Z","comments":true,"path":"2016/read-lunyu-2nd/","link":"","permalink":"http://www.icnws.com/2016/read-lunyu-2nd/","excerpt":"","text":"子曰:“弟子入则孝,出则弟(tì),谨而信,汎(fàn)爱众,而亲仁。行有余力,则以学文。”【译文】孔子说:“ 年轻人在家要孝敬父母,在外要尊敬师长,谨慎忠信,要热爱世上的每一个人,亲近有仁德的人。做这些有余力的时候,再去学习书本知识。” 现在的教育大多本末倒置,不教做人的道理,只教学习知识,考试考试,教出来的人是有知识,但是没文化和教养呢,所以就觉得很失败! 家庭也是,很多家人一味地宠爱后辈,使后辈没有规矩,自己又做的不好,不能成为后辈楷模,结果一家人为了后辈们的各种行为买单,吃苦果! 前几天谈话,讲到《弟子规》,讲到传统文化的缺失感,很悲伤?! 推荐大家去读一下,《论语》对大多数人来说,都比较艰深,难以理解和明晰,但是弟子规相对来说就很好理解,也有一些专门讲传统文化的老师在讲,比较实用! 我接触弟子规是在济南的时候,一个赵姓老师教的,他信佛,据说如今已经修行去了!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"博客推荐:熊窝窝","slug":"blogs-recommend-2nd","date":"2016-12-25T13:16:55.000Z","updated":"2018-03-15T06:27:28.456Z","comments":true,"path":"2016/blogs-recommend-2nd/","link":"","permalink":"http://www.icnws.com/2016/blogs-recommend-2nd/","excerpt":"","text":"熊窝窝这个博客的地址是http://www.baiyuxiong.com/ 博客内容为PHP、Codeigniter、JAVA、C#、JAVASCRIPT、LINUX、LATEX、GOLANG等技术分享,貌似是全栈开发者! 我是在极客学院听他讲关于GO语言的课程的时候,对老师的名字搜了一下,结果就有了意外发现。作者在GO语言的分享上,做了很多,也经常更新,后面会将作者纳入到友链里,希望大家更方便获取信息和交流。","categories":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}],"tags":[{"name":"推荐","slug":"推荐","permalink":"http://www.icnws.com/tags/推荐/"}],"keywords":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}]},{"title":"读论语(1)","slug":"read-lunyu-0ro","date":"2016-12-25T09:03:46.000Z","updated":"2018-03-15T06:27:28.478Z","comments":true,"path":"2016/read-lunyu-0ro/","link":"","permalink":"http://www.icnws.com/2016/read-lunyu-0ro/","excerpt":"","text":"子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?”学习却不知道去实践的人,不知道自己学到了什么,所以说学习并经常进行实践是让人快乐的。现在工作中,很多人就是人浮于事,不知道自己大学里学到了什么,却一味的想一步登天,一夜抱负,不知其悲! 与其想怎么一步登天,不如好好考虑自己现在做的是什么事情,需要做什么事情,有什么可以去学习去补不足的地方,然后学习了去实践,在实践中,财富就是附加值,人的痛苦也会减少很多。 有志同道合的人一起做事情,自然是很开心。道相近,那就能相互的印证彼此的想法和观点。如果,道不同,那话说半句都会嫌多,所以有志同道合的人一起是很开心的。 再看看我们的身边,我们大多数人都是将工作只是当成工作,而不是自己的乐趣兴趣所在。他们做工作,只是为了获取那相对于浪费的时间来说微乎其微的东西,可谓是本末倒置。 所以,现在的工作当中,要想有所突破,那就有可选的几条路: 第一条就是自己深挖。一个人深耕自己的那片地,然后有所成绩,有所得,有所乐。不过这样会很累,因为一个人走路,只能是一条道走到黑,有成就的时候也比较难以分享。你的快乐,别人甚至以为你是装疯卖傻。 第二条就是自己培养发现志同道合之人。这个可以从工作中甚至工作之外的地方着手。同事之间有很多工作都是大致相同的,所以可以对某些人进行深入的沟通,对,必须是有些人,因为你精力有限。另外一种方式就是通过行业大会或者相关的论坛和社区去寻找,这样的人大多会带有和你一样的属性,希望找到志同道合的人。当然,这里也会存在很多浑水摸鱼的人,毕竟有很多人告诉过大家,要融入技术圈子,这样可以有人脉,提高自己的知识面等等,不过总体来说还是可以的。前者可以经常见面,好处自然而然,后者只能说神交,当然现在通讯工具交通工具这么发达,也不是太大的问题。后面讲别人不能理解你的想法的时候,需要给予理解,毕竟每个人的层次不一样,当然见地也有多不同。这时候不能去一味的抱怨,而应该以一种积极的心态和行为去做对应的处理,不要无动于衷,也不要大动干戈。虽然你可能很明确是你的有道理,是真知灼见,但是呢,保不齐你的并经不起推敲。 如果你能放下偏见,这是一个很好的提高自己的机会,让你去讲讲自己的理解和见地,和别人沟通,知道别人的想法,知道自己的想法才会知道有所差别,才知道自己的不足,这点在《论语》的很多地方都会提到,要有学习的心。","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"圣诞礼物2016","slug":"Christmas-gift(2016)","date":"2016-12-25T06:15:17.000Z","updated":"2018-03-15T06:27:28.453Z","comments":true,"path":"2016/Christmas-gift(2016)/","link":"","permalink":"http://www.icnws.com/2016/Christmas-gift(2016)/","excerpt":"","text":"培养大局观! 面向产品和需求,体现技术的价值! 合适的架构和技术才是最好的! 做好测试沟通需求和代码! 尝试全栈体验! ** 学以致用,用以促学,学用相长!**","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"圣诞节","slug":"圣诞节","permalink":"http://www.icnws.com/tags/圣诞节/"},{"name":"节日","slug":"节日","permalink":"http://www.icnws.com/tags/节日/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"低级趣味","slug":"vulgar-taste","date":"2016-12-21T14:32:41.000Z","updated":"2018-03-15T06:27:28.498Z","comments":true,"path":"2016/vulgar-taste/","link":"","permalink":"http://www.icnws.com/2016/vulgar-taste/","excerpt":"","text":"人的低级趣味,只能自己去克服,其他的外力都是徒劳无功! “低俗体温计”项目流产!","categories":[],"tags":[],"keywords":[]},{"title":"“不用站起来,坐那就行”","slug":"sit down is ok","date":"2016-12-20T11:32:19.000Z","updated":"2018-03-15T06:27:28.483Z","comments":true,"path":"2016/sit down is ok/","link":"","permalink":"http://www.icnws.com/2016/sit down is ok/","excerpt":"","text":"今天早上,在门口遇到一个领导和门岗说“不用站起来,坐那就行”! 那个人呢?其实是在玩手机! 感觉上,这个人什么也做不好,虽然领导很宽容,但是也早就注定了这个“门岗”没有前途! 你是不是那个门岗?上班的时候做着自己的小动作,总是有千万的不甘心,却只能拿那一点点工资呢? 希望你不是,我也不希望自己是!","categories":[],"tags":[],"keywords":[]},{"title":"低俗温度计","slug":"Vulgar-thermometer","date":"2016-12-18T16:19:54.000Z","updated":"2018-03-15T06:27:28.454Z","comments":true,"path":"2016/Vulgar-thermometer/","link":"","permalink":"http://www.icnws.com/2016/Vulgar-thermometer/","excerpt":"","text":"关于这个有一些想法,源于赤兔的一个讨论,你有什么牛逼的创业点子,我的回答是这样的: 创办一个网站,专门搜集追溯那种以吸引人眼球为目的的新闻排行榜,设立媒体黑榜,将经常,强烈围殴那些不负责任的新闻人!好像目前没人做这件事!很多媒体不负责任的一再误导人,只要你觉得信息有问题就上报,网站负责追凶!网站名字就叫解恨!哈哈,好YY!有人一起玩吗?真的想惩奸除恶啊!!!这个实现起来有点麻烦,首先追踪就是一个很复杂的过程,当时虽然有好多人支持,但是这个点子还行吧!有很多人跑来和我说,你真的要做吗?有什么盈利模式等等,要认真的说,还没有,那时候!但是,这个念头没有完全放下! 现在,我们看到内容创业很火,而且信息容量爆炸,而普通人没有辨别数据信息好坏,是否有用的能力,被垃圾信息教唆的不行不行的,人生观价值观等等都极度扭曲!这对每个人,甚至社会都是有极大危害的! 我们也看到,很多媒体,为了博取眼熟无下限,无德行,甚至倒行逆施,而且没有人来惩戒,顶多在些平台会被举报,但是治标不治本! 那有没有什么方式能对这种文化现象,信息雾霾进行清理,制止呢? 那就是今天要说的——“低俗体温计”!这是干啥的?解决什么问题?怎么实现?有什么前途?盈利点是什么? 它的定位是系统级应用,需要检测、获取用户的app使用信息,对用户的网络使用进行分析! 它要解决的问题是很多人看到低俗的内容,由于受到贪嗔痴等本欲影响,导致不能很快切换到正常的思维,这时候app所在的系统需要提示用户正在获得低俗积分,会导致不良影响!同时可以为用户推荐优质的内容! 前期通过专业运营,认为的跟踪一些数据,接着借助大数据对不好的甚至有害的内容进行建模学习,当用户访问一些低俗内容的时候,给予提醒,同时用户可以主动提交一些低俗的内容,共建在线社区,配合专业运营,实现对低俗内容的抵制! 盈利点,前期通过广告植入,后期通过大数据,对每个终端的习惯,推荐进阶的书,活动,圈子,阅读内容等等 好啦,就这样吧,希望有想法的和我一起探讨! QQ1503904712","categories":[],"tags":[],"keywords":[]},{"title":"博客推荐:破冰博客","slug":"blogs-recommend-3rd","date":"2016-12-16T07:44:12.000Z","updated":"2018-03-15T06:27:28.456Z","comments":true,"path":"2016/blogs-recommend-3rd/","link":"","permalink":"http://www.icnws.com/2016/blogs-recommend-3rd/","excerpt":"","text":"https://xshell.net/ 关于linux的使用及其他,博主写的很用心","categories":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}],"tags":[{"name":"推荐","slug":"推荐","permalink":"http://www.icnws.com/tags/推荐/"}],"keywords":[{"name":"分享","slug":"分享","permalink":"http://www.icnws.com/categories/分享/"}]},{"title":"我想有一个开始","slug":"i-want-to-start-a-company","date":"2016-12-16T00:13:47.000Z","updated":"2018-03-15T06:27:28.465Z","comments":true,"path":"2016/i-want-to-start-a-company/","link":"","permalink":"http://www.icnws.com/2016/i-want-to-start-a-company/","excerpt":"","text":"都说内容创业,是创业,但是没有开始就不知道路在哪里,空想是不行的!虽然自己在做公众号,在读书,在写作,效率很低,要改变了!之前一直在找突破口,或许突破口就是注册一个公司的过程,给自己定一个目标吧! 昨天就想,注册一个公司吧,在北京这个地方,想做点什么还是得迈开步子! 这就是我想的一个开始!还得继续锤炼!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"直播降低了发泄成本","slug":"live-reduce-the-price-of-wreak","date":"2016-12-13T11:59:33.000Z","updated":"2018-03-15T06:27:28.469Z","comments":true,"path":"2016/live-reduce-the-price-of-wreak/","link":"","permalink":"http://www.icnws.com/2016/live-reduce-the-price-of-wreak/","excerpt":"","text":"到今天,直播平台还只能算是一个发泄的工具,一个可以轻易就不负责任发泄的工具,这让人很担忧! 我们的生活充满了无奈和不如意,尤其在这个所谓物欲横流的时代,无论是精神的贫瘠,还是金钱的匮乏,都会让人不满,甚至愤怒! 我们的学校没有真正教会我们如何和家人相处,如何和集体相处,如何与社会和平相处!只是给我们灌输老师也觉得永远不可能用到的知识!想起来某个作家说,或者是社会学家,之所以有学校,就是为了将这些人圈到一个范围内,形成一个小社会,让一群不知所以的人去管理!这些人呢,没有学到该有的本领,却知道了愤怒,知道了悲剧,所以当他们出来校园之后就开始横行以报复这个社会! 前几天在地铁里,有个黄毛小子在直播,也不知道聊天室里的谁惹到了他,一口一个NMB,一口一个卖屁股,地铁里很多人都对这事儿侧目!我也在场,感觉到不可思议,为什么有人这样去做?在反思这个事情! 可能最重要的是,这个平台让人发泄的成本很低!打开手机就可以面对你一辈子都不可能在现实里遇到的人,言语中毫不顾忌,就是认为对方要报复的成本会很高,在某种程度上永远不会发生! 这是很多人参与直播的一个点!还有另外一个点,那就是钱——打赏!现在大多数的直播平台,无论用户和平台都是靠打赏获利分成的,已经有很多网红通过这个途径获得了一桶金,第几桶不知道!这种模式很不好,很不健康,很不利于年轻人的成长!可以很不客气的说,那些求着打赏,变着法的暴露的人,价值观已经扭曲了,和在H站上那些女子基本上没有啥区别了!更多的人通过这个知道只要会骚浪贱就能有人给钱,就能衣食住行都满足,进而有人把这个当做主业! 有能力做一辈子主播的人能有几个?主播这个职业能存在多久?这是很多未知数!然而,因为很多人在学校学不到东西,不会学东西,出来之后找不到工作,只能避重就轻的去做主播,把大好青春都浪费掉了!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"不是设置好了就好了","slug":"setting done is the beginning","date":"2016-12-10T14:08:02.000Z","updated":"2018-03-15T06:27:28.483Z","comments":true,"path":"2016/setting done is the beginning/","link":"","permalink":"http://www.icnws.com/2016/setting done is the beginning/","excerpt":"","text":"最近因为手机坏了,然后换了新手机,手机邮件可以正常收取就没有过多关注。然而,昨天和一位老师发邮件的时候,怎么都收不到,最后无奈换成了QQ邮箱去发邮件! 后来经过确认,是因为邮箱无法发出邮件,只是可以收邮件,测试邮件发了老半天也没有什么动静! 无奈之下,查了查教程,我的邮箱里有说怎么去设置,试了一下,还真是管用!设置好之后,测试邮件一发,也基本上是即时达了! 设置邮件的方式,也很简单!安卓自带的邮件工具,选择exchange,然后填入邮箱全称作为用户名,输入密码后就能自动匹配服务器配置!可能不同的企业邮箱也不完全一样,但是可以作为参考! 我们做事情呢,不要去想当然了,如果你一旦掉入想当然的陷阱里,那你就回真的沦陷!希望你去看到显性结果的同时也去看看有没有什么隐性的待确认的工作! 不是配置好了就好了,还需要进一步确认周全,要不然就会让墨菲定理起作用!悔之晚矣,切记切记!","categories":[],"tags":[],"keywords":[]},{"title":"十二月书单(2016)","slug":"read-Dec-Book-List(2016)","date":"2016-12-01T05:23:10.000Z","updated":"2018-03-15T06:27:28.475Z","comments":true,"path":"2016/read-Dec-Book-List(2016)/","link":"","permalink":"http://www.icnws.com/2016/read-Dec-Book-List(2016)/","excerpt":"","text":"上个月计划之中读了好几本书,还有一本《重构》没有读完,这个月会继续读下去!这里列一下这个月的书单。本月的开发工作比较重,另外和文中老师准备做一些事情,所以将书单定位为社交和营销。 《社交红利》 徐志斌 著 《社交红利2.0》 徐志斌 著 《BIG DATA 大数据时代》 《疯传》 [美]乔纳·伯杰 《人类简史》","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"},{"name":"书单","slug":"书单","permalink":"http://www.icnws.com/tags/书单/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"感恩节活动","slug":"linkedin's-activity-for-giving-day","date":"2016-11-26T14:27:16.000Z","updated":"2018-03-15T06:27:28.469Z","comments":true,"path":"2016/linkedin's-activity-for-giving-day/","link":"","permalink":"http://www.icnws.com/2016/linkedin's-activity-for-giving-day/","excerpt":"","text":"今天下午,刚刚参加了领英中国北京总部的感恩节活动,很感恩,也很感动!希望自己在以后的工作和生活中一如既往的坚持感恩和回馈! 加入赤兔职场已经463天了,这个过程中,收获了很多东西!首先是1718位好友,687条动态,4210个赞,然后是很多大咖的经验教诲,使我的工作和生活少走了很多弯路。 原来我觉得弯路总是要走的,谁也改变不了,但是现在我意识到,如果有好的人生导师或者多读书,是可以避免一些不必要的弯路的。我们的人生,可以说难得是顺风顺水的,所以一定不要在安乐窝里,那样会老的很快,死的不知其所! 今天很多人都谈到,和赤兔的缘分,大多数到场的都是使用赤兔一年以上的兔友,和我一样,一起见证了赤兔的一步步成长。对我们来说,赤兔就像一个很好的伙伴,也是一个导师,你需要知道什么,想知道什么,都可以在这里找到突破口,答案呢,更多时候还是得自己去得出。 也有很多人都谈到,赤兔带给自己的疗效,很理想,很推荐! 每个人都有自己鲜为人知的一面,但是只要我们懂得感恩,懂得如何open的去看这个世界,open的去看待自己的圈子,你会发现,其实世界真的不仅仅是你熟知的那个世界。 感谢领英中国的小伙伴们给大家提供一个从职场小白晋升的快速通道,这里你可以解答你的职场困惑,也可以跟导师大咖亲切互动等等! 你的眼界决定你的未来,没错!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"赤兔","slug":"赤兔","permalink":"http://www.icnws.com/tags/赤兔/"},{"name":"记录","slug":"记录","permalink":"http://www.icnws.com/tags/记录/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"微信的“小程序”","slug":"wechat-mini-program-comment","date":"2016-11-24T12:07:10.000Z","updated":"2018-03-15T06:27:28.499Z","comments":true,"path":"2016/wechat-mini-program-comment/","link":"","permalink":"http://www.icnws.com/2016/wechat-mini-program-comment/","excerpt":"","text":"微信的小程序热闹了很久,很多人都往上贴,但是我没有,因为看不出来优势在哪里,所以不动! 最近看了篇文章,写的很到位,深得我心!文章说真正做开发的人是不喜欢“小程序”的,因为微信基于H5做了一些封闭的定义,使这个规则只适应于微信小程序,移植到其他平台就很困难,属于对H5做了封闭! 但是,小程序除了能享受部分微信红利意外,比H5不知道low了多少倍哦! 另外,有人讨论小程序开发者,这个就搞笑了,真的只是微信的附庸,那微信就是你的上帝了,这样短时间内尚可,长时间不可取!","categories":[],"tags":[],"keywords":[]},{"title":"感恩节","slug":"about-giving","date":"2016-11-24T11:55:14.000Z","updated":"2018-03-15T06:27:28.455Z","comments":true,"path":"2016/about-giving/","link":"","permalink":"http://www.icnws.com/2016/about-giving/","excerpt":"","text":"感恩节吃了个黄焖鸡米饭,口味一般! 感恩节不说别的,说感恩就行!不过说感谢父母老师啥的,很多时候比较虚,你只是在朋友圈里晒一下而已! 比较喜欢用自己的行动去影响这个世界,去做点让自己感动的事情就好了! 可能能力有限,但是要有态度,要有行动,不要只做朋友圈的附庸!","categories":[],"tags":[],"keywords":[]},{"title":"读《这样读书就够了》","slug":"read-read-book-in-this-way-is-enough","date":"2016-11-20T10:21:16.000Z","updated":"2018-03-15T06:27:28.480Z","comments":true,"path":"2016/read-read-book-in-this-way-is-enough/","link":"","permalink":"http://www.icnws.com/2016/read-read-book-in-this-way-is-enough/","excerpt":"","text":"《这样读书就够了:拆书帮》作者是赵周,一本关于如何用“拆书帮”的方法去读一本书,就是讲怎么拆书的! 首先列出了读书的三大难题: 没时间、没精力 看不懂、记不住 看不下去第一个问题很好理解,因为这曾经也是我的借口,哈哈!时间和精力这东西,在普通人的世界里,永远都有的,只是用不用,挤不挤的问题!如果你用心去考量这个问题,读书是有时间的,只是你不愿意读,不去规划时间,也就是没时间!至于精力,大多消耗在聊天打屁电视剧上了吧,当然,你可能是玩游戏的主! 解决这个问题的方法就是要调整好你的态度,要从本质上只是觉得读书是有用的,但是就是不花时间去读!为什么?很多人都是被应试教育害了,打心底里认为读书总会和考试挂钩,虽然走入社会之后没有了,但还是心理上就不愿意!对于这个问题,只能是自我修复和调节咯,先调整状态,然后读几本书再说! 第二个问题也很好理解,看书就要记住,看书就要全部看懂,多么“正常”的思维哈!其实认真的说,读书贵在实践!我们之所以有要看懂要记住这样的思维,也是源于我们的教育告诉我们读书应该这样做,在上学时代,在构建知识体系的开始这是无可厚非的,而且跟你说多了也没有卵用啊!只是,在你从校门走出之后,没有人告诉你新的读书方式是什么,所以你有畏难心理! 解决这个问题的方法就是改变学习的方式,不要认为书要全盘记住或者怎么样,现在读书不是为了应付考试,而是自己要有一个目的性。一本书有一点所得也是抵了买书的钱和花的时间,只要这个点能深入下去就会颇有收获! 第三个问题跟外环境有关。很多时候不是我们不想看不想学,而是身边的这些人都不学,都不看。手机的app提醒滴滴滴的想,很容易分心走神,诱惑这么多,很多时候因为处理一个通知就不知不觉的浪费掉了一个小时的时间。面对这种情况,确实难以看下去。 我怎么解决这个问题?我可以将app的通知,非重要的那种app都关掉通知权限,让他销声匿迹。另外,不要随大众去做事情,当你有了一定的基础之后,一定要有自己的想法和计划,不要为世人的浑浑噩噩所迷惑,别人不自强正是我辈赶超之时。 那拆书帮做了什么? 拆书帮给我们提供了一种方法论和群体学习的方法。通过拆书的形式,将书里零散的,叙述性的东西拿出来进行发散、提点,同时以读者为主体,拆书家做引导完成书的内容的学习和知识应用场景的演练。 方法很好,只是难度比较大!特别是初期,需要有人带入,中后期需要持续不断的加强!这也是持续学习的一种好的方式。所谓书非拆不能读也! 看了这本书最大的感受就是,一定要将所读之书和实际的场景进行结合,有经历的直接带入,没有经历的也要努力在大脑中操练,这种操练不是完全无用的,在某个时间点就会突然迸发,带入到我们的真实生活工作场景之中!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"为啥没买电动自行车?","slug":"buy-an-electric-bike","date":"2016-11-17T22:33:50.000Z","updated":"2018-03-15T06:27:28.457Z","comments":true,"path":"2016/buy-an-electric-bike/","link":"","permalink":"http://www.icnws.com/2016/buy-an-electric-bike/","excerpt":"","text":"来北京也两年多了,盆友的电动自行车是我从济南寄来的,我也想有辆电动自行车,然而到现在也没买,为啥? 这其实是一个成本问题,无论多远的距离,基本上还是要花很多时间在路上!而这段时间,如果你骑车,那只能是在路上穿梭,不能用于任何建设性的提高,同时,你还要承担很高的事故风险,车多人多,总有很多不守交通规则的,可能包括你哦! 如果你坐车呢?除了到车站站牌的时间,其他都可用于获取资讯、读书、聊天等等!我的时间,很多时候是读书,在公交车上看了很多本书了。可能有很多人因为拥挤就看不下去了,不过我还好,只要是状态可以,随时都可以安全的看书!如果状态不太好,一般是随便看看资讯,刷微博和推特! 我也有不少和我一样在通勤的过程中读书的,每个人都收获满满!前几天的“丢书大作战”只是一次深入套路的营销,带来的只是很多人抱怨地铁人太挤,没法读书!说真的,条件真的是自己创造的!你不想读书,地铁无论如何空旷,你都只会在刷微博,玩游戏,根本没有读书那一壶,跟你讲也是瞎了! 如果你没有电动自行车,就不要买了!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"读《骗子为什么要穿阿玛尼》","slug":"read-why-lier-dress-armani","date":"2016-11-12T13:24:18.000Z","updated":"2018-03-15T06:27:28.481Z","comments":true,"path":"2016/read-why-lier-dress-armani/","link":"","permalink":"http://www.icnws.com/2016/read-why-lier-dress-armani/","excerpt":"","text":"刚刚读完的这本书叫《骗子为什么要穿阿玛尼》,书很短,但很有意思,推荐阅读,大约一点五小时能读完! 书中从骗子穿阿玛尼开始,一点点展开骗子们说如何骗人的,一个破解骗术的书,好像是这样!作者是日本作家桦旦纯,写的是一部心理学著作。书中从各个方面描述了心理作用、心理认识等的偏差,会成为骗子利用这些弱点进行诈骗的切入点。 总之,不要只关注外表、声音、容貌,行为态度等等,要时刻保持冷静、清醒,不贪便宜,有所事事!天下没有免费的午餐,不贪小便宜就不会吃大亏,不过分自信就不会被骗了还帮骗子数钱。如果你知道对方是博取同情心的时候,一定要警惕了。表面上好人,实际上可能只是伪装而已!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"读《软件小设计》","slug":"read-little-disign-for-software","date":"2016-11-12T10:25:29.000Z","updated":"2018-03-15T06:27:28.478Z","comments":true,"path":"2016/read-little-disign-for-software/","link":"","permalink":"http://www.icnws.com/2016/read-little-disign-for-software/","excerpt":"","text":"《软件小设计》作者董向阳!这本书前几天刚刚读完,一直没有想好怎么给这本书写点什么东西,今天想了想还是写点吧。 这本书呢,是从“开发者头条”这个APP上淘到的,就是在APP的“礼物兑换”清单里发现的,然后积分恰好够,就兑换下来了。这里很感谢开发者头条,不仅仅是因为赠书,而是提供了一个很好的平台,同时礼物清单里有很多很好的有益的书,可以作为程序员可选书单里的一个。毕竟现在的书太庞杂了,越来越不知道该去读什么的时候,这是一个很好的缩小选择范围的办法! 书的内容就如书名,讲的就是关于软件设计的东西。一个很有意思的就是,书中把软件设计作为一个人修炼神功一路讲来,也不觉得生疏。书的作者是用c#、.net做开发的,我作为一个Java程序员看着也无甚门槛,也颇有收获!最近在做一个新的CMS系统的设计,做了一些参考,属于现学现用!不过不用担心,我并没有滥用设计这种东西,适可而止才是最好的,毕竟也过了几年职业生涯,还是知道一点东西的,过犹不及! 书中讲了几部分: 设计的概念、原则 设计的过程 设计的模式 重构的设计算是关于设计的整个面都涵盖进来了,书中重点讲了设计的过程,各种拆案例,讲的很全面,但是这一章实在是太折磨了,有一百多页,感觉遥遥无期,好在最后调整心态,慢慢看了下来。 关于模式和重构,作者也根据谈了一些很有见地的想法,这些是这本书的精华。这本书适合有一定工作经验的人来看,这样会有很多触动,如果没有工作过,很难体会里面的东西,只是死的知识而已。推荐给你看哦!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"混圈子(2016-11-12)","slug":"stay-at-a-level","date":"2016-11-12T09:33:30.000Z","updated":"2018-03-15T06:27:28.492Z","comments":true,"path":"2016/stay-at-a-level/","link":"","permalink":"http://www.icnws.com/2016/stay-at-a-level/","excerpt":"","text":"每个人都有自己的小圈子,有可能是同事、舍友、同学,以及共同爱好的社团等等,今天就来扒一下我自己的圈子,我都在哪些圈子混呢! 首先是赤兔职场https://chitu.com/ 赤兔是一个关于职场社交的典范,是领英中国出品,运营团队和开发团队都很强大。在当代中国里,没有其他任何一个职场社交APP能做到赤兔的成绩,赤兔真的十分令人喜欢。如果你想走入职场社交,不妨选择赤兔这个平台,一定会帮到你的。我也将她推荐给了我身边的朋友,希望对更多的人有益!我在这个平台积累了很多好友,每次发一些讨论都能收到各种各样的观点恢复,这种感觉,各种思想碰撞,总有火花产生!赤兔能带给你什么样的体验呢? 认识更多有识之士的机会 自由发表职场意见和想法的机会 赤兔的线上分享课很直接与大咖交流 可以建立自己的圈子,遇到自己的贵人其次是开发者头条https://toutiao.io/ 这个头条是关于开发者的,是程序员的文章和资源分享的好地方。每天你都可以通过订阅当天最好的或者最有特点的文章推送,编辑也很用心的去筛选,而且热衷分享的人也很多,从中受益颇多,这就是一个共享知识的小社会,温柔和畅! 我在开发者头条里创建了一个“APP后端开发”的团队号,已经积累了2400+的粉丝,经常分享我看到的一些好看好玩的有用的东西到这里,也会将自己的公众号和博客文章贴一下,可以认识一些志同道合的朋友。如果你是程序员,希望你能加入进来,赶早不赶晚哦! 再次是开源中国社区http://www.oschina.net/ 没错,这是一个开发者的社区,我从2012年就加入进来了,也经历了开源中国的很多事情,算是他一直伴着我的开发生涯成长起来的吧。刚开始很简单,只有软件、博客和新闻,后来增加了好多好玩好用的功能。比如动弹、比如git,后来升级成码云,比如众包,后来上市,公司可以在这里发布任务,程序员可以接一些任务,然后程序员增收,公司减少投入,加快项目进度、解决项目困难等等,还有招聘板块,只不过这个板块不是特别的活跃。 刚开始很多文章都是在这里写的,虽然没有什么深度,但是为现在的写作打下了一定的基础。后来这个网站的部署迭代,中间有一次就将所有博客内容导入到开源中国的博客里了。和开源中国有很多故事,最早和缪斯的情人、郑传义等一起组织济南圈的线下活动,认识了很多圈子里的人。那时候大多数人都没有出来活动的意识。现在回头看看那些一起参与活动的人,每个人都混的很不错!很感谢这个社区,让我在刚开始走上开发的时候没有走太多的弯路! 最后是小密圈https://www.xiaomiquan.com/ 一个依附于微信的私密分享交流的社区,我加进来时因为池建强老师,看了他的两本mactalk,关注了公众号,一个圈里很好的榜样,锤子公司欢喜云的CTO,一个很乐于分享的人。小秘圈做的体验也不错,私密分享,分享内容可以导出,避免微信群那种无秩序的感觉。当然,很多小秘圈都是很私密的,加入有门槛,不太高的还可以接受的啦。 你有哪些圈子在,分享出来,大家一起来玩啊~","categories":[],"tags":[],"keywords":[]},{"title":"十一月书单(赤兔职场)","slug":"read-Nov-Book-List(2016)","date":"2016-11-11T01:49:09.000Z","updated":"2018-03-15T06:27:28.477Z","comments":true,"path":"2016/read-Nov-Book-List(2016)/","link":"","permalink":"http://www.icnws.com/2016/read-Nov-Book-List(2016)/","excerpt":"","text":"分享一下赤兔职场的兔友们的书单,以供参考: 《黑雨》,作者:唐皓明 《人生定位》,作者:艾·里斯 《微信思维》,作者:谢晓萍 《刘强东自述》,作者:刘强东 《爆品手记》,作者:金错刀 《印度十日》,作者:曹景行 《活法》,作者:稻盛和夫 《你从未真正拼过》,作者:领英 《敬天爱人》,作者:稻盛和夫 《如何阅读一本书》 《文明是副产品》 《人类简史》 《创京东》 《断舍离》,作者:【日】山下英子 《魔鬼经济学》 《BIG DATA》 《在线》,作者:王坚博士 《精神科的故事》 《学会提问》 《论证是一门学问》 《批判性思维》 《从0到1》 《经济学人》 《职得》 《领导力十律》 《菜根谭》 《滚滚红尘》,作者:三毛 《梦幻花》,作者:东野圭吾 《管人的真理》,作者:斯提芬P.罗斯宾 《尼采传》 《卓有成效的管理者》 《创业维艰》 《中国审计史》 《高效能人士的七个习惯》 《幸福的方法》,来自哈佛大学幸福课 《耶路撒冷三千年》 《重新定义公司》 《重新定义团队》 《重新定义创新》 《重新定义管理》 《重新定义战略》 《金字塔原理》 《穷查理宝典》 《查令十字街》 《心理学与生活》 《引爆点》 《罗马人的故事》 《软件小设计》 《七堂极简物理课》 《互联网时代项目管理术》","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"很多时候就是不甘心","slug":"not-prefer","date":"2016-11-10T14:40:53.000Z","updated":"2018-03-15T06:27:28.472Z","comments":true,"path":"2016/not-prefer/","link":"","permalink":"http://www.icnws.com/2016/not-prefer/","excerpt":"","text":"没错啊,很多时候就是不甘心!不甘心自己的失误带来的结果,不甘心自己付出的努力,于是努力做很多去挽回,但是呢? 结果是事情变得更坏了,损失更大了! 如果事情变坏了,一定要看好了再去做决定,看清楚了再去投入!不要以投入作为唯一衡量的标准,那只会让你的判断失去理智,结果失去希望! 如果,各方面的分析已经出来,有挽回的余地,而且后继的投入在可以承受的范围之内,那么就调整好方向并快速投入进去吧!这时候,晚一点就可能没有机会了! 无论你甘心或者不甘心,代价已经产生了,无论抱怨还是肆意挥霍,都改变不了既有投入! 人的事情,无论什么时候,都是代价的问题,衡量很多事情也跟代价有关!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"一次早起","slug":"one-time-for-weakup-early","date":"2016-11-10T14:17:46.000Z","updated":"2018-03-15T06:27:28.474Z","comments":true,"path":"2016/one-time-for-weakup-early/","link":"","permalink":"http://www.icnws.com/2016/one-time-for-weakup-early/","excerpt":"","text":"说起来,这一年多,基本上没有为上班订过闹铃,也是奇葩了吧!时间就是嘀嗒嘀嗒的脑表,走了多久,心里会自己算! 曾经试过很多次,猜时间,几点了,几分了,都猜的很相近,为什么?因为自己心里有个时钟在走,而不是外界的那个时钟在提醒! 最近看书看的多了,主要是节奏比较快,大脑有点hold不住了,似乎到了一个接受知识的瓶颈,这是好事儿不?可能是吧,从前就没有感觉到过啊! 十天的时间,除了正常的工作,大大小小的,看了四本书,这也是没谁了,况且比较杂食,脑容量不够用一样! 最近总是在研究新项目,这是一个痛苦的过程,就像生长拔高一样!脑力消耗比较严重,两事会师,有点压力过高的样子!以前很少午休的,最近也被迫着午休了起来,要不然一下午都没精神了! 前两天又是六点之前醒来了,然后看了会儿书,发现有点儿困,就困觉了!媳妇走的时候没叫醒我,于是无视时间沉浸在梦里,直到八点二十的样子,突然从床上弹起,收拾东西好快,紧赶慢赶,到公司差一分钟就迟到了,有点刺激! 也许应该反思一下,时间那么紧,塞的东西越多就越有用吗?一次早起能解决知识的匮乏吗?也许应该适可而止,但是是不是逼一下自己更对得起自己! 我还是习惯早起,早起能获取很多东西!大多数时候很清醒,少数时候会继续补觉!在累的时候还是要适当的休息的,不是铁人! 为了表示对工作的尊重,我定了一个闹铃,早上七点多的,一起早起读书啊!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"早起","slug":"早起","permalink":"http://www.icnws.com/tags/早起/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"读书,你喜欢一个人还是一群人?","slug":"read-alone-or-read-couples","date":"2016-11-08T11:07:57.000Z","updated":"2018-03-15T06:27:28.478Z","comments":true,"path":"2016/read-alone-or-read-couples/","link":"","permalink":"http://www.icnws.com/2016/read-alone-or-read-couples/","excerpt":"","text":"这是一个很有意思的话题!按传统来讲,读书是一件很私密的事情,需要读者自己去阅读、思考、发现、研究、反复等等!这样下来是有点读书做学问的样子了,但是在互联网时代还是合适的吗?有一点你不得不承认,现在的人心有多浮躁?!简直分分钟都看不了书,能持续阅读的大多是小说,各种小说!每个人都有一个很大很大的发财梦,异想天开,那看小说就好了,全都满足,大脑更满足!顶用么?有屁用,唯一就是精神在某个时间点可以放松一下! 再就是现代人有明显的时间碎片化倾向!各种社交APP,新闻APP等等,将人们的整片时间打碎,碎片时间更碎,导致除了工作之外,各种online,没有谁能想到人的时间碎片化会这么严重!这直接导致我们每个人,想要看一些书,干一些事情各种没时间!给阅读带来了很大的阻力,很多次因为一个消息推送就打乱了所有安排! 这是信息时代,海量的信息将我们每个人都浸泡在信息里,这时候如果没有选择,可能三生三世都不能看完世界一天产生的信息,所以我们如果要有所得,那必然要有筛选,有选择,而这些行为的成本也很高,所以这时候我们需要借助群体的力量,将信息通过群体和圈子进行过滤掉! 微信读书APP的出现,开启了一个新的读书时代!它将读书和社交(微信)连接起来,将读书向游戏化方向发展!这使读书从私密阅读向半公开阅读进化,从一个人到一个圈子,读书APP的一小步,人类阅读的一大步! 当你阅读的时候,如果没有方向,可以去看看书友们的书架,很可能会有意外收获,从而开启新的读书旅程! 读书的过程中可以看到书友们公开的评论思考,可以快速的帮我们答疑解惑!我们也可以进行评论,给后来的读者有参照,而且这样也可以交到新的好朋友,相同趣味的书友! 再就是排行榜这种游戏化的东西,特别应景!我们每个人都喜欢游戏,各种各样的游戏,也都喜欢有个比较,这样才有感觉!当我们懈怠的时候,看一看好友书友们都在充实自己,是不是会有奋起直追的想法?! 独自获取知识的时代已经快成为历史了,我们每个人都要试图接受这种娱乐化、游戏化的获取知识的方式,有益无害!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"带书上班","slug":"read-a-book-on-the-road","date":"2016-11-08T00:13:17.000Z","updated":"2018-03-15T06:27:28.477Z","comments":true,"path":"2016/read-a-book-on-the-road/","link":"","permalink":"http://www.icnws.com/2016/read-a-book-on-the-road/","excerpt":"","text":"为啥带书上班? 因为急不可待! 昨晚看书到一点多,有点小累,也有点兴奋,在看一本叫《软件小设计》的书!这本书不是很出名,作者也不是很出名,不过书还是不错的! 最近在做CMS的重构设计,很多地方没有想太明白,总觉得卡在哪里了,觉得不够好,还有更好的方案,在触手可及的地方!所以就寻求灵光一闪的那一刹那! 之前看了一点这本书,没有完全看下来,现在又重来,颇有受益!单纯学习一些知识的时候,只是想象那个应用场景,但是真的怎么应用,怎么好用真的不是那么简单!现在,场景已经存在了,怎么去应用设计思想,编程思维去设计去实现变得触手可及!接近或者找到解决方案的兴奋和激动难以抑制! 今天带了书上班,在公交车人挤人的状况下写东西,感觉没那么浮躁和拥挤,大约是注意力被转移了吧!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"轻读《在线》——王坚博士","slug":"read-the-book-《online》","date":"2016-11-06T05:41:31.000Z","updated":"2018-03-15T06:27:28.481Z","comments":true,"path":"2016/read-the-book-《online》/","link":"","permalink":"http://www.icnws.com/2016/read-the-book-《online》/","excerpt":"","text":"在周四晚上的时间点,媳妇让给她买一本会计的书,然后为了凑单,在当当网上买了一本《在线》。书是周六下午到的,我周五晚上开始看这本书,在周日的上午将这本书读完了。 总体来说,这是一本很有启发的书! 书中介绍了“在线”这一概念的由来,以及由在线引发的新的变革,对经济形态的影响,以及阿里云为在线所做的工作和各种尝试,也介绍了YunOS这个在线的操作系统,叙事比较宏大,而且作者也的确见多识广,颇有受益! 书中谈及大数据,很认同他的说法,国人对“大数据”的理解总是着眼于其“大”,从体量上来说的,但是大数据更应该是侧重数据的在线。只有在线的数据才是财富,才是自然资源,这是作者的重要观点之一。 在大数据的运用中,作者强调不要用大数据去改良现有的业务,而是要将大数据用到以前做不到的事情上,这点有点看不太明白。因为就我们所知的,大数据的应用就是对现有的数据进行分析、挖掘,从中获取有价值的信息,但是这些有价值的信息怎么去运用的目前还没有涉及到。按照我所接触的东西,互联网金融行业的风控系统是用大数据做的支持,使其坏账率极大的降低。 另外,王坚博士讲到,数据不是收集出来的,而是沉淀出来的,互联网时代 讲到云服务,他说现在的很多厂商混淆视听,将云分为公有云、私有云、混合云等等,其实就是换汤不换药的营销手段。这点在很大程度上跟我看到的现状是差不多的,因为大家对云的认识还不成熟,很多人以为很多台机器放到一起就能组建成云服务,组建成云计算平台,但是王坚博士告诉我们这种观念是错误的。真正的云计算应该是公共云,作为一种类似公路、铁路的基础设施。当然,以目前的情况来看,我们的社会形态还没有将公共云作为一种基础设施的程度。 互联网已经从传统互联网转变为移动互联网,下一个阶段是万物互联网,我们都能真切的感受到。越来越多的设备,越来越多的可能性都会纳入到互联网中,而互联网在未来也将变成一种基础设施的存在。 在线三定律可以学习一下: 定律一:每一个比特都在互联网上 定律二:每个比特都可以在互联网上流动 定律三:比特所代表的每个对象都是在互联网上可计算的 我们很幸运,生活在这样一个变革的时代,有这么多的大师级的人物来引领我们去革新,去创造,所以一定要有想法,有坚持,有创造,把握好在线定律!感谢王坚博士!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"我为什么对“双十一”不感冒?","slug":"bad-double-11","date":"2016-11-06T04:21:30.000Z","updated":"2018-03-15T06:27:28.455Z","comments":true,"path":"2016/bad-double-11/","link":"","permalink":"http://www.icnws.com/2016/bad-double-11/","excerpt":"","text":"又到了每年的双十一的节点,双十一是从淘宝发起的一个购物节,逐渐演变成全民的所有电商平台共同参与的购物节!但是,在我来说,我真的不喜欢这样的购物方式,整个社会都经历这样没有必要的洗礼! 为啥我对双十一不感冒? 天下没有免费的午餐!!! 1、羊毛出在羊身上 这是毫无争议的吧!你以为你想买的东西的确便宜了,事实上,是如非你时长的观察你是发现不了的,现在购物的有几个人会追溯到商品的原价呢!起码据我所知,当当网的东西是会先提价后折扣,最终可能便宜一点点吧! 2、没有控制只有欲望 欲望是无止境的,有不少人通过双十一购买了一年的日用品、洗化用品,甚至很多居家用品,这会直接将家里有限的空间挤占了,相对于你得到的实惠和你付出的空间代价!特别是我这样北漂的人,大多是租房子,空间能有多大,日常生活得付出多大的代价! 再说说大件奢侈品,可能在某种程度上会有优惠,不过这时候质量是否能很好保障?如果不能保障又要付出多大代价? 在这种购物面前,一定要克制,克制一下自己的欲望,不要放纵自己,放纵完了就连续好久吃土,这样真的不值得! 3、承担心里压力和焦灼 我们都知道,每个双十一,都有很多物流事件发生,而且这种事很难维权!因为会赶上一个多发期,维权周期会加长!另外,购买的物品在路上会担心出问题,这样每天关注运送的货物也是很焦虑的 4、给社会带来了很多压力 集中抢购,电商平台有压力,一些电商平台的工作人员因为连续工作身体生病甚至精神崩溃,影响每一个支撑的人所在的家庭,代价巨大! 快递物流也倍感压力,每年的包裹数量都急剧增加,工作量也急剧增加,疲劳过度也是整整一个月的事情!不知道这一个月快递相关的交通事故是不是较平时有所增加,因为没有数据! 5、浪费个人的时间和精力 购物抢购需要在上十亿的商品中去选择自己所需,同时如果参加抢购大多要在指定的时间段内参与并完成,你需要付出时间和精力的代价!另外,最最纠结的是,这真的能提高你的生活水平甚至促进社会经济吗?然并卵吧!消费观念要改变的,可能大多数人都意识不到,省钱不是一个好办法,开源才是! 年轻人应该做的就是将有限的精力投入到无限的个人成长中去,而不应该像老妈妈们在超市排一个小时的队买便宜了五毛钱的鸡蛋! ","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"产品","slug":"产品","permalink":"http://www.icnws.com/tags/产品/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"团队的驱动力","slug":"the-driven-of-team","date":"2016-11-05T03:56:36.000Z","updated":"2018-03-15T06:27:28.495Z","comments":true,"path":"2016/the-driven-of-team/","link":"","permalink":"http://www.icnws.com/2016/the-driven-of-team/","excerpt":"","text":"**你所在的团队靠什么驱动? 我们目前的驱动方式主要有两个方面: 第一,项目驱动每当有一个项目立项,产品需求跟进,这时候每个人都很活跃,开动脑筋,群策群力,头脑风暴!一步步规划,设计,讨论,实现,并反复雕琢,这就是一个工艺品! 第二,个人成长严格来说,个人成长属于内部驱动力,项目驱动属于外部驱动力,两种驱动,结果导向完全不同!项目上要求的是结果,是交付,并不能关注到每一个细节,不会告诉你要去做什么,要做什么样的储备! 个人成长是自我意识的苏醒,无论是通过外部引导苏醒还是自我苏醒,都需要这么一个过程!苏醒之后就开始意识到工作边缘以及工作之外,工作深入背后的原力!这些都是工作的延伸! 比如一个出纳只是知道做支出单,网银转账等等,那是永远不会成为一个高级会计的!需要去学习会计知识,需要根据会计知识分析公司的现金流,业务流程,盈利支撑等等,这样,才是个人成长!出纳的工作有没有会计证,学个几天就能搞定了!要着眼于现有的资源去做深挖,这才是成长的契机! 比如一个初级程序员,如果只会根据功能设计文档去实现功能开发,不去问为什么,不去思考产品为什么要这样设计,技术实现是不是最优解等等,那他十年工作也只有一年经验!我们要关注的除了基本工作以外的很多东西,这才是成长的开始! 做管理有一段时间了,虽然只是基础的技术经理,但是还是有很多可以说的地方!刚开始是一点经验没有,毕竟是技术出身,习惯大包大揽,但是当成为管理的一员之后,这明显是很不合适的! 读了很多关于管理的书,更加深入的去观察了解身边的每个人,对他们的性格、行为方式等有所掌握,然后在工作中才可能有所针对的去做一些安排,工作分派等等! 我常常跟兄弟们讲: 1. 在忙的时候,一定要将手头的工作做好了,去参与到项目中的每一个环节,这样不仅仅对项目有所深入,更多的会在开发上有所增益。比如明天你去接手一个新项目,你的这种经验可能马上就可以用到2. 在不是很忙的时候,一定要给自己排好计划,对于平常因为项目和工期导致不能产生最优解的那些解决问题的方式要试着去做优化,去想这里面的来龙去脉!3. 我可以一对一沟通,这种方法是通过赤兔职场学到的!一对一沟通可以解决在群体会议及交谈里不能触及的东西,有很多东西需要私密沟通!另外关于个人成长方面可以有针对性的讨论和深入沟通!还有就是可以通过交谈沟通,拉进彼此关系,促进个人发展,提高工作效率!4. 想成为领导的人,都要观察你的领导是怎么做事情的,观察高层们是怎么处理问题的,并且换位思考,自己在那个位置会怎么做!如果你已经开始这样想,并且开始去做努力,你离升职不远了!5. 一定要多读书,不要把自己局限在一个小圈子里,要不然,出了小圈子,自己什么也不知道,什么也不是,那做人就很失败了!","categories":[],"tags":[],"keywords":[]},{"title":"赤兔职场(1)","slug":"chitu-workplace","date":"2016-11-05T03:19:21.000Z","updated":"2018-03-15T06:27:28.460Z","comments":true,"path":"2016/chitu-workplace/","link":"","permalink":"http://www.icnws.com/2016/chitu-workplace/","excerpt":"","text":"一个老人挑着一担瓷碗在路上走着,突然一只瓷碗掉到地上摔碎了,老人头也不回地继续向前走。路人很奇怪,便问:“你的碗摔碎了,为什么你看都不看呢?”老人答道:“我再怎么回头看,碗还是碎的。” 这个例子可以受到什么启发? 不要对已经发生的事情做无用功,已经碎了 机会成本不可挽回,努力挽回就是扩大机会成本 保护幸存者,不要因为考虑既有损失而扩大损失 说那么多干嘛,赶紧卖碗吧","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"职场","slug":"职场","permalink":"http://www.icnws.com/tags/职场/"},{"name":"赤兔","slug":"赤兔","permalink":"http://www.icnws.com/tags/赤兔/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"一个道理","slug":"on-theory","date":"2016-11-02T09:00:49.000Z","updated":"2018-03-15T06:27:28.473Z","comments":true,"path":"2016/on-theory/","link":"","permalink":"http://www.icnws.com/2016/on-theory/","excerpt":"","text":"最近在赤兔职场上,跟一个老前辈学了点儿东西,明白一个道理: 不是不做或者做不到,大多数都是代价的问题!更多的人,忽视隐藏的代价!!!","categories":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}],"tags":[{"name":"思考","slug":"思考","permalink":"http://www.icnws.com/tags/思考/"}],"keywords":[{"name":"杂谈","slug":"杂谈","permalink":"http://www.icnws.com/categories/杂谈/"}]},{"title":"读《自品牌》","slug":"read-the-own-brand","date":"2016-11-02T08:54:08.000Z","updated":"2018-03-15T06:27:28.481Z","comments":true,"path":"2016/read-the-own-brand/","link":"","permalink":"http://www.icnws.com/2016/read-the-own-brand/","excerpt":"","text":" 最近用kindle读完了这本丹·斯柯伯尔写的书《自品牌》,写的很不错,翻译的也不错,也是一本值得一看的书! 这本书讲的是什么?从名字就能看出来一些端倪,就是讲如何打造属于我们自己的个人品牌,里面有很多东西值得学习和借鉴! 当今世界,物质的极大丰富,社交网络的极其复杂,使人有更多的机会展示和表现自己,同时也为打造自品牌提供了千载难逢的机会。 打造自品牌不仅仅是在社交软件上提高影响力,发表观点和意见建议,而且最重要也是最基础的,要在工作中打造个人品牌。这个过程包括基础的,提高工作技能,包括硬技能和软技能,再就是提高沟通能力,增强团队协作能力,将自己的视野放到当前工作及直接领导的工作这个层面,这样才会逐渐培养出自己的全局观念。 把基础的事情做好之后,就要发现自己在工作中的真实兴趣所在,同时与公司现有业务进行结合,并为之努力,包括技能习得,岗位获得和自我提升等等。 在这之后才是扩大个人在社交上的影响力。注意,这里的社交上真正的人脉圈,粉丝群,关系网,是通过社交软件/网络发声,通过发声获得认同,同时可以吸引有相同观点志向的人进行交流。 也可以通过社交网络结交高层次的人,通过观察他们的言行举止,通过和他们沟通获得工作、学习、生活中的启发和灵感,甚至醍醐灌顶! 当然,社交网络也有很多陷阱,有很多需要注意的地方,这在书里有讲到,比较零零碎碎,所以需要你自己去阅读获得。 除了社交网络,还有博客和公众号也是建立自品牌的重要阵地。当一个人将自己的所见所闻所思所想所感所悟付诸于文字里,这可能会让更多人受益,同时这个过程也是自我提升和拔高的过程,所以很多有名有能力的人都会写博客,写书,事情本身可能愉悦感有限,但是从长远角度来看,获益匪浅! 我现在也在打造属于我自己的自品牌,包括写博客,运营公众号,微博发声,开发者头条的团队号分享等等。另外在工作中,也会将从书里学到的东西去实践起来,在允许的情况下进行试错,我逐渐成长! 《自品牌》这本书让我意识到了很多东西,这些东西虽然之前也略有接触和涉猎,但是这里更系统,更明白,前人经验,某种意义上的捷径,加油咯~","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"自品牌,阅读","slug":"自品牌-阅读","permalink":"http://www.icnws.com/tags/自品牌-阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"读《异类》","slug":"read-the-Heathens","date":"2016-11-02T08:47:06.000Z","updated":"2018-03-15T06:27:28.480Z","comments":true,"path":"2016/read-the-Heathens/","link":"","permalink":"http://www.icnws.com/2016/read-the-Heathens/","excerpt":"","text":" 前一段时间读完了这本书——《异类》,作者马尔科姆·格拉德威尔,源自老罗(罗永浩)的推荐,每次就是那个锤子手机的老罗! 记得另外一个罗姓老师——罗振宇(罗胖)说过,想看好书,不需要自己去可以寻找甄别,只需要关注相关领域的杰出人物,看看他们看什么书,推荐什么书,那基本上会对看什么书能有一个概念! 罗胖这句话说的深得我心,看老罗的演讲记录,看到了不少好书,认真读的就是这本《异类》了,因为用微信读书(阅读APP),可以直接获得,所以坐公交的缝隙里就看了下来! 异类讲的是什么呢?并不是真正的异类,而是那些取得成功的人! 成功的人,依靠的是自身的努力、时代的以及自身的机遇,最终成就了个人,或者说成就了一代人。这个理论在书中反复印证。也印证了另外一个说法,机会总是留给有准备的人,没有准备的人只能错过! 书中另外一个理论上10000个小时理论,说的是如果一个人能在做一件事或者一个职业上有10000个小时的积累和成长,基本上都能成为专家级的人物。关于这个理论,我在读这本书之前也有所涉猎,但是我通过和别人交流沟通,发现身边的人竟然很少有人知道这个理论,不知道说什么好,人丑就是读书多么?哈哈~ 关于10000个小时的理论,在我不知道的时候,我更多的是遵循稻盛和夫的那种说法做法活法!大约五六年前看了稻盛和夫的《活法》系列,详细的内容不记得了,只是知道做事情不能浮躁,要懂得坚持和努力,金钱的东西和追求永远应该是其次和末位的,或者说是附带的!你的坚持,在长远看来都是会获得丰厚的回报的。 反观,现在又有多少人去做坚持的事情呢?我们见面沟通大多攀比谁挣钱多,跳了个好公司,今年分红多少,往往很少去谈论今年有什么成长,达成了什么成长目标,很大程度上是社会风气导致的。 想成为“异类”——成功的人,首先得知道什么是异类,这些人都在做什么,有什么方向方法可以借鉴学习,一一把脉,条分缕析,最终选择一条路,坚持下去。推荐你看这本书——《异类》!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"读《商业的本质》","slug":"read-The-Real-Life-MBA","date":"2016-11-02T08:40:51.000Z","updated":"2018-03-15T06:27:28.477Z","comments":true,"path":"2016/read-The-Real-Life-MBA/","link":"","permalink":"http://www.icnws.com/2016/read-The-Real-Life-MBA/","excerpt":"","text":"《商业的本质》这本书是韦尔奇的新书,就是那本《赢》的续篇,领英总裁D哥推荐的书! 这本书买了有些天了,不过最近才拿起来看,就是上个周末在家,花了四个多小时读完了第一遍,很有感触!从名字来看是关于商业相关讨论的书,但是真的深入进去会发现,不仅仅是在讨论商业,或者说更多的不是讨论商业的内容! 讲的是关于如何工作,如何生活,如何沟通的一些事情,颇有启发性!很多本来不可能讲清楚的东西,在作者的描述中也有了一些明显的意识,不是那么艰深!有时间我会再看第二遍的,会有更多收获吧! 最近看了不少书。每天早上会起来读一会儿英语,上下班的路上会看一些书,晚上也会抽出时间读一会儿英语,大约感觉很快要用到英语了! 很长时间没有写公号文章,大多数时间一直在修行,各种忙吧!最近要出去溜达一圈了,这一走就是一周多,怕你想念太多,提前问候一下! 祝你老师节快乐,中秋节快乐,有生的日子天天快乐,一定要知道想要什么!","categories":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}],"tags":[{"name":"阅读","slug":"阅读","permalink":"http://www.icnws.com/tags/阅读/"}],"keywords":[{"name":"读书","slug":"读书","permalink":"http://www.icnws.com/categories/读书/"}]},{"title":"谈谈新闻资讯APP","slug":"talk-about-news-apps","date":"2016-11-02T08:32:48.000Z","updated":"2018-03-15T06:27:28.494Z","comments":true,"path":"2016/talk-about-news-apps/","link":"","permalink":"http://www.icnws.com/2016/talk-about-news-apps/","excerpt":"","text":"最近新闻资讯APP越来越火了,火的不行了,本来就是红海,现在都成黑海了!在赤兔职场里也被反复讨论,现在就这个问题简单梳理一下,发表一些看法和想法。 凤凰新闻、今日头条闹的沸沸扬扬的,一点资讯也走马换将,地铁里前段时间的头条广告,现在也有相当一部分换成了一点资讯的,地铁里似乎也成了广告里的一个必争之地。 现在,我们处在一个信息爆炸的时代,越来越多的信息会涌进我们的视线,而这些信息的质量则是参差不齐的。所以,每当我们想简单获取一些信息的时候,很容易被更多的无用的信息去干扰,严重影响我们获取信息的效率。 大数据时代的新闻资讯APP已经开始让机器来替代了相当一部分的人工编辑,这样处理的结果是,很多内容可以第一时间到达更多的用户面前,但是更多的问题是,这会极大的干扰用户的基本生活,将用户的时间进行碎片化!当然,这样只是将用户的时间更碎片化一点而已,不过我还是不希望有这样的事情发生。 大数据的发展,使机器学习成为可能,但是看看今日头条就知道,新闻资讯APP竟然可以这么没有态度,见识了。假如你不小心点到了一个八卦新闻,然后不留神多看了几条信息之后,你再次打开头条的时候,无论是推送还是推荐内容,那就完全刷新了新闻的底线和无耻程度。 现在是不是内容创业的好时机?面对这个问题,我觉得应该给予肯定的回答,是的,历史上没有任何一个时期比今天更适合内容创业。 为什么?因为你有前所未有的互联网,也有越来越多的内容生产者,只要你有好的运营团队,优秀的编辑人才,更好的互联网产品及产品经理,再加上一点小资本来启动就可以了,只要你的模式可以盈利,可以变现,那么你就会被蜂拥而至的资本淹没,也会被疯狂的学习,这就是现在的状况。 现在的新闻资讯发展状况堪忧,变现的途径就只有投放广告,而且现在的广告投放效率是极低的(猜测),而只是为了数字好看,去做了很多工作来吸引投资人。 未来的信息时代,我们会越来越需要付费订阅这种服务。这种服务不是某一个人将自己的成果和资源共享出来,而是要有团队去做这个事情,要能很好的做这个事情,也只有这样,我们通过付费才能将自己筛选信息浪费掉的给补回来。 首先,要订阅就是要从用户诉求开始。用户有什么样的需求,需要根据用户的意愿去做一个有深度的分析,根据用户的诉求,去拆解这种需求,如何通过大数据、人工智能、人工等去实现对用户订阅的内容负责。 其次,要对用户的行为和习惯进行深度的分析。分析师对内容的一种把控,同时可以少投放及精准投放,这样做到有的放矢,用户会越来越喜欢他的付费服务。 再次,对用户的意愿和诉求要持续跟进。不仅仅是深度分析,同时还要对用户诉求进行更新和更好的适应。用户成长是一个持续的过程,这个过程中,意识和需求都会一步步改变,成为不可思议的结果。 就简单说这么多,今天加班有点太累,洗刷一下就睡了,晚安各位!","categories":[],"tags":[],"keywords":[]},{"title":"信息时代,你觉得什么是最重要的东西?","slug":"the-importance-of-information-ear","date":"2016-11-02T08:29:34.000Z","updated":"2018-03-15T06:27:28.495Z","comments":true,"path":"2016/the-importance-of-information-ear/","link":"","permalink":"http://www.icnws.com/2016/the-importance-of-information-ear/","excerpt":"","text":"信息时代,你觉得什么是最重要的东西?从IT时代到DT时代,虽然都属于信息时代,但是认知已经从互联网向大数据进行过度,处在这个档口,每个人、每个行业、每个机构对这个问题都会有着自己的看法和理解! 我从04年接触电脑,到如今成为一个正儿八经的互联网程序员,已经有十几年了,对于这个问题,我的回答是:信息安全,信息时代最重要的是信息安全! 那什么是信息安全? 信息安全主要包括以下五方面的内容,即需保证信息的保密性、真实性、完整性、未授权拷贝和所寄生系统的安全性。 信息是一种资源,它的普遍性、共享性、增值性、可处理性和多效用性,使其对于人类具有特别重要的意义。信息安全的实质就是要保护信息系统或信息网络中的信息资源免受各种类型的威胁、干扰和破坏,即保证信息的安全性。再加上近几年来大数据火的不要不要的了,更加对信息安全的重要性进行了一些“挑衅”,数据开始大范围的进行脱敏处理,当然也有不法分子对这些信息不做脱敏,直接去使用和出卖,这是尤其令人愤慨的! 下面我分别几个从不同的方面来聊聊信息安全: 一、网站信息网站,大家都很熟悉。通过在浏览器里输入网址就可以打开对应的网站,展示的是丰富多彩的内容(图片、文字、音频、视频等)。 我们很多人关注的都是网页的内容,但网站对我们做了什么却不了解。当我们打开网站的时候,浏览器会执行发送请求给网关解析网站地址,转换成IP地址,向目标地址发起请求信息,站点根据请求的资源响应内容。浏览器会加载页面上需要展示的内容/资源,比如:图片,视频,文字,css(网页样式),js(脚本语言编写的代码)。js 的内容非 开发者是看不懂的,如果你仔细检查网站都加载了哪些资源(chrome浏览器右击打开“检查”),会发现总是会默认加载一个 1×1 的 jpg 文件,这个文件事实上根本就没有展示到页面上,行业内将这样的一般都会做 tracker 处理。也就是说,你访问页面的时候,还多发送了一次请求,从这次请求中,服务器端可以拿到你客户端的信息,如:操作系统版本、浏览器版本、cookie,IP(地域)、refer 等。这些信息会被存储下来,最后沉淀为大数据服务。 相比较,手机上获取的信息就会更多。通过你安装APP可以拿到手机的很多数据 ,比如IMSI、Mac地址、经纬度、手机型号、系统版本、系统安装APP信息,甚至通讯录、通话记录、短信等等,还有更流氓的就是给你的手机装各种各样的东西,留一些你意识不到的后门什么的。比如你只是装一个APP,却发现突然手机上连着装了好几个,一下子内存就不够用了,越来越卡! 还有,不知道大家有没有经历过这样的事情:买个房,留下电话之后,会不断的有装修公司、家居公司直呼姓名的问你装不装修房子。你买了房,为什么装修公司的人会知道你买了房,并且知道你姓名和电话?行业内将这个称作”用户信息黑产“,给你打电话的人通过某些渠道获得了你的联系方式,然后和你联系开展商业活动! 当然,这只是简单的骚扰,但是背后的利益链条上很可怕的,你什么都不知道的时候就将自己暴露给别人,赤裸裸的。 二、智能家居科技的发展,使我们的生活方式也有了很大的改变。机器人的思想通过深度学习已经能与人一较高下了。前段时间很火的机器人AlphaGo ,他会下围棋,他通过学习大量的围棋招式,再经过自己的各种深度挖掘,以4:1的结果赢了世界级的棋手。这在一定程度上说明了人工智能进入了一个新的发展阶段。 回到正题,智能家居是安全的吗?或许你会问,这有有什么信息安全的东西存在呢?设想一下,每天通过网络去操作你家里的智能家居,很方便,可以随时通过网络操作,在床上一动不动的就可以实现智能家居能做的事儿,手机就相当于一个遥控器。然后,家里的每个人都会连WIFI去上网,去操作智能家居,但是这中操作上安全的吗?你的信息是安全的吗? 手机的操作可能会被网络劫持,黑客攻击,然后获得对应的控制权之后,那你家里的智能家居会发生什么就不知道了。另外,现在很多智能家居是很不安全的,系统防护也很弱,前几天每个半个国家的网络都断掉了,就是因为黑客通过侵入智能家居及路边摄像头进行的控制,然后对网络发起攻击。这是很难想象的,不过已经很真实的发生了。 当我们用网络的时候,用WIFI的时候,给我们提供服务的网络会收集我们的信息,然后对我们每个人的行为进行”画像“,从而分析一些我们的行为,为我们设置一些消费陷阱和向导等等。 这时候,数据安全就显得尤为重要!如果你说,我在家不用智能家居不就好了吗?!虽然可以不用,但是WIFI你能拒绝吗?电视盒子呢?智能电视已经很普及,小米盒子、乐视电视等等。你什么时候开机,什么时候关机,浏览了什么节目(当然这里的数据可能跟广告DSP有关),在我看来这些也属于信息安全的范畴。 有一些数据虽然最终会落地到精准营销或广告推送上面,只要没有被触及到敏感信息,或许不会对我们本身不会造成什么损失,但需要自我有防范意识。 三、电商大多数人都在淘宝、天猫,京东等电子商务网站上购买过东西,从搜索商品、下单、付款、收快递、评价,这一系列的动作表面上看似风平浪静,但是里面隐藏了很多鲜为人知的行为。一是信息可能会泄漏,二是商家对数据可能被做手脚。 你搜索商品,你所买的东西和价格代表你最近的处境(比如:尿布,生孩子了,价格:你的收入水平),付款的时候,大家一般都会选择银联或网银支付,这些接口上面的信息我就不做描述了。填写快递地址的时候你会写地址和电话,地址你有可能是公司,也有可能是租的房子或家里,电话你会写错的吗?至少我不会傻到买个东西写成别人的电话号码。站在信息安全的角度,你觉得能做啥?试想,你媳妇也买了一个东西,地址也写成和你一样是家里,电话是她自己的,说到这里,你应该会意识有什么了吧!你的住所决定了你的收入等级,你的地址总结一下就是家里有多少人,哈……其他的东西,你自己慢慢提炼吧! 四、电信运营商电信运营商在国内就是三大运营商(移动、联通、电信)! 唉,一句话描述吧:你在手机上的所有操作,均被知晓,我见到的只是行为(比如:打电话、发短信、上网、蓝牙)信息,其他更详细的我没有碰到过!具体他们做了什么,不方便透露了。还有很多方面的数据安全,在这里就不详述了,总之大概就分为这么几种,最后的落地都是包装成精准营销、实时分析、舆情分析、人群画像等。对那些我不太懂,作为一个底层的程序员,开发者,我们不得不对自己的信息安全做些许的提防,虽然我们不能改变什么,但当我们有意识去规避这些危险,就会有一定的好处。科技的发展是为了造福人类,我们一起努力让这个世界更美好!说明:本文来稿是人称“欢哥”的大数据相关大牛,目前是一线开发者,常年活跃在大数据圈子里,见了很多普通人看不到的或者不知道的东西,上一次邀请他来写个相关的文章,他也很高兴的答应了邀约,这里也特别感谢! 欢哥的开源中国博客地址:https://my.oschina.net/Rayn,欢迎大家交流!","categories":[],"tags":[],"keywords":[]},{"title":"代码坑(1)","slug":"1-code-bugs-1","date":"2016-11-02T08:19:05.000Z","updated":"2018-03-15T06:27:28.446Z","comments":true,"path":"2016/1-code-bugs-1/","link":"","permalink":"http://www.icnws.com/2016/1-code-bugs-1/","excerpt":"","text":"关于代码书写的一些坑 1、无用的代码记得及时擦除,说不定某个地方的引用没被发现,导致发布上线出现问题,谨记! 今天发生的问题是一些冗余的代码导致上线发布项目无法正常运行,排查错误才发现问题所在 同时,删除的内容也要及时同步到SVN上,免得发生一些问题和事情,忘记同步 2、对于一些连接,要记得及时释放,当然一些可以自动释放的连接也需要明确 我们今天遇到的坑就是调用亿美短信的client没有释放连接,导致OOM问题 3、如果上传图片,用到一些东西图片缩放工具,需要在tomcat的catalina.sh文件添加: CATALINA_OPTS=”-Djava.awt.headless=true” 或者 JAVA_OPTS=”-Djava.awt.headless=true” 欢迎评论转载,转载请注明文章出处!QQ:1503904712,本人公众号:南无小事,欢迎关注!","categories":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}],"tags":[{"name":"Code","slug":"Code","permalink":"http://www.icnws.com/tags/Code/"}],"keywords":[{"name":"技术","slug":"技术","permalink":"http://www.icnws.com/categories/技术/"}]}]}