618换台好用的电脑吧

俗话说工预善其事必先利其器,我观察很多优秀的程序员,都会将自己的工具整的很顺手,无论是软件还是硬件。而电脑就是最重要的一个硬件,是每一名程序员的必备工具,一台好用的电脑可以让你效率更高,心情也更愉悦。 我家里有 3 台电脑,其中一台笔记本和一台台式机是我的,有 6 年左右历史了,开多了应用或者虚拟机的话,就会比较卡。前段时间换了 manjaro,体验好了不少,大家有老旧的机器希望延长它们服役时间的话,可以试试换个轻量级操作系统。这里埋个坑,下次讲讲我一个使用 ubuntu 7年多的老用户为什么这次会选择使用 manjaro 来给老机器续命。 还有一台是媳妇的 macbook air, 6千多买的最丐版,媳妇看看视频什么是够的,开发的话配置就太低了。6 千多只能买 i5 2核 8g 内存 128g 硬盘,不是果粉或者做 ios 开发的话,苹果的性价比我是觉得很低的。 这不马上 618 了吗,我也想着乘这段时间换一台好用的电脑。不巧前段时间,业界大神 Linus Torvalds 公开其最新 Linux 开发 PC 的所有配置, 我们先来看看大神的配置: CPU — AMD RyzenThreadripper 3970X 主板 —技嘉 Aorus TRX40 Master Fan — Noctua NF-A14 PWM,高级静音风扇 CPU 散热片 — Noctua NH-U14S 和 Noctua NF-A15 Case — Be Quiet Dark Ba​​se 700 Extra Fan — Silent Wings 3 电源设备 — Seasonic Focus GX-850 Storage — 1TB SamsungEVO 970 Memory — 4x16GB DDR4-2666 Linux distro — Fedora 32 笔记本电脑 — Dell XPS 13 这是两台机器...

June 5, 2020 · 1 分钟 · ming

不需要打包的构建工具snowpack和vite

关注 vue3 的人一定关注到尤雨溪的另一个开源项目 vitejs, 它是一个不需打包的构建工具,开发时使用 es module 导入代码,生产环境用 rollup 构建。 它 有一些显著的优势: 使用es module导入代码, 极快的启动速度(ESM) 即时的热模块替换(HMR) 真正的按需编译 目前尤雨溪似乎花费了蛮多精力在这个项目的,目前 vitejs 600左右 commit,vue3 2000左右 commit, 粗略估算工作量前者约后者的 30%,我甚至忍不住想 vue3 的延期会不会跟这个项目有关呢?可见尤大对这个项目的重视。 vitejs 依赖现代浏览器的一个关键特性,即es module imports, 那么市面上有没有类似的工具呢? 答案是有的,vitejs 的 how and why 章节也列了出来,其中最接近的一个就是 snowpack,文档里说道: 两个工具都原生支持基于 ESM 的 HMR。 Vite 先一步支持, snowpack 在 v2 时也支持了。双方在基于 ESM 的 HMR 上合作过,尝试建立统一的 api, 但因为底层不同还是会略微不同。 vite 更加专注,自带更多功能,如 typescript 编译,css 导入, css 模块和 post css 的默然支持。 生产环境打包, vite 使用 rollup, snowpack 使用 parcel/webpack 今天恰巧也关注到 snowpack v2 的发布博客, 在 v1 的目标 在浏览器中直接使用 npm 包外,v2 又增加了对基于 ESM 的 HMR 的原生支持。它有如下特性:...

May 28, 2020 · 1 分钟 · ming

spring官网推荐的学习项目sagan

spring 系框架如 spring, springboot, springcloud 等已成为 java 开发的标配,笔者也是 spring 系框架的多年用户,它们遵循统一的原则,原理清晰,实现优雅, 更新及时,很多最佳实践慢慢都沉淀为规则,为广大 javaer 提供了很多开箱即用的便利,大大降低开发成本。 官方网站一般是学习和查阅某种技术资料的首选, spring 也不例外. 前段时间,我惊喜的发现它们的官方网站 改版了, 风格更加清爽轻量,访问速度更快,布局更加条理找文档更加方便了。在这个前端框架层出不穷的年代,我有点好奇 spring 的官网前端和后端分别是用 啥做的, 又有啥亮点呢? 我们来一探究竟。 首页截图 分析网站技术架构有一个不错的工具 wappalyzer, 不过我们这里用不到,因为他家官网源码是开源的。 把源码 clone 下来,README 上面一开始就写着: In addition to the practical purpose of powering Spring’s home on the web, this project is designed to serve as a reference application– resource that developers can use to see how the Spring team have used Spring to implement a real-world app with a few interesting requirements....

May 26, 2020 · 2 分钟 · ming

halo发布文章自动输入slug

halo 发布文章时,需输入 slug,即固定链接地址,有利于搜索引擎收录和提升权重。而中文出现在 url 中并不友好, 所以需要自己想一个 slug,一般是英文或者中文拼音。每次发文章都需要这么想一下不方便,我们来优化一下, 即默认填写文章标题的中文拼音作为 slug。 这里有两个思路,首先想到的是后台去转换,毕竟服务器端资源更多更强大,但需要写一个额外的 api,稍显麻烦。 那先研究一下纯前端 js 有没有合适的解决方案呢?马上调研一下: 百度一下 js 中文 拼音,有不少相关文章,毕竟是比较常见的需求。但排名靠前的文章都是贴在文章中的代码,或者百度网盘, 啥年代了还不知道贴一个仓库地址,不专业不考虑。 github 搜 ‘pinyin’, 找到一些几个不错的仓库。 结合他们的文档和然后分别百度, 搞清楚了他们的优劣: https://github.com/hotoo/pinyin 5.1k star, 常见汉字字典文件 165kB,后端版本有 npm 包,web 版本没有。 https://github.com/sxei/pinyinjs 1.8k star, 常见汉字字典文件 27kB, 无npm包。该作者知晓并借鉴了上面的库,自己整理了字库,且做了JS版拼音输入法,看了效果不错。 https://github.com/creeperyang/pinyin 420 star, 常见汉字字典文件 7kB, 有npm包, 缺点是不支持ie和edeg浏览器。该库转换方原理参见博客利用Android源码,轻松实现汉字转拼音功能,可以算作Java到JavaScript的一次转译。 说明一下,上面的情况都是选择他们的 web 常用字库版,带约 6000+ 汉字也有排序。它们都还有带声调多音子的完整字库版本,需要的自己去深入研究。有人可能会和我一样,觉得 6000+ 常用字够不够,那就来感觉一下,这些常用字你能认识多少先吧: /** * 常规拼音数据字典,收录常见汉字6763个,不支持多音字 */ var pinyin_dict_notone = { "a":"啊阿锕", "ai":"埃挨哎唉哀皑癌蔼矮艾碍爱隘诶捱嗳嗌嫒瑷暧砹锿霭", "an":"鞍氨安俺按暗岸胺案谙埯揞犴庵桉铵鹌顸黯", "ang":"肮昂盎", "ao":"凹敖熬翱袄傲奥懊澳坳拗嗷噢岙廒遨媪骜聱螯鏊鳌鏖", "ba":"芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸茇菝萆捭岜灞杷钯粑鲅魃", "bai":"白柏百摆佰败拜稗薜掰鞴", "ban":"斑班搬扳般颁板版扮拌伴瓣半办绊阪坂豳钣瘢癍舨", "bang":"邦帮梆榜膀绑棒磅蚌镑傍谤蒡螃", "bao":"苞胞包褒雹保堡饱宝抱报暴豹鲍爆勹葆宀孢煲鸨褓趵龅", "bo":"剥薄玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳亳蕃啵饽檗擘礴钹鹁簸跛", "bei":"杯碑悲卑北辈背贝钡倍狈备惫焙被孛陂邶埤蓓呗怫悖碚鹎褙鐾", "ben":"奔苯本笨畚坌锛" // 省略其它 }; 我要优化的这个场景是 halo 博客的后台,发布文章时默认填充一个文章标题的中文拼音作为 slug。...

May 23, 2020 · 1 分钟 · ming

不蒜子计数器研究和jsonp的妙用

最近研究使用 halo 部署个人博客,很常见的一个需求就是网站访问量统计,毕竟每个新站长都想知道自己的网站有多少人访问了。 halo 内置了不蒜子极简网站计数器,简单的添加一个 js 和页面标签,就能获得你网站的访问人数等数据,简单,够用。 那么它是怎么实现的呢,下面我们就来研究一下。 获得源码 不蒜子只需要一个 js 文件,把它拷贝下来,比较简单不到 100 行,直接贴在下面: // http://s.xinac.net/static/busuanzi/v2.3.0/bsz.pure.mini.js var bszCaller, bszTag; !function() { var c, d, e, a = !1, b = []; ready = function(c) { return a || "interactive" === document.readyState || "complete" === document.readyState ? c.call(document) : b.push(function() { return c.call(this) }), this }, d = function() { for (var a = 0, c = b.length; c > a; a++) b[a]....

May 22, 2020 · 5 分钟 · ming

java web开放中碰到的三个问题

java web开放中碰到的三个问题 现在维护一个常规java web项目,jquery前端,java 后台, mysql 数据库,这几天开发过程中分别碰到一个问题,不算很冷门,但没碰到过或疏忽了也花费不少时间解决,特记录下来备用及分享。 jquery 的 attr()和 prop() 男女两个 radio, 使用 jquery 分别赋值男女多次,最后使用 attr 方法异常,使用 prop 方法正常 <input type="radio" name="sex" value="1"/> 男 <input type="radio" name="sex" value="0"/> 女 $("input[name='sex'][value=1]").attr("checked", true) // ok $("input[name='sex'][value=1]").attr("checked", false) // ok $("input[name='sex'][value=1]").attr("checked", true) // fail,最后男未选中,异常 $("input[name='sex'][value=1]").prop("checked", true) // ok $("input[name='sex'][value=1]").prop("checked", false) // ok $("input[name='sex'][value=1]").prop("checked", true) // ok,最后男选中,正确 原因是jquery较高版本对property和attribute做了区分,(有的说1.6+,有的说1.9+,暂未核实),较高版本应该使用 prop 方法操作 property: property 它是与生俱来的,并不是后天赋予的。比如说,某些对象在定义时就具有某一些属性。 attribute 本身没有的,后天赋予的。比如说,某些对象在创建后,自定义赋予的一些属性。 下面是官方 https://api.jquery.com/prop/ 的介绍: The difference between attributes and properties can be important in specific situations....

July 5, 2019 · 2 分钟 · ming

java 整型比较的坑

今天碰到一个奇怪的空指针错误,场景大概是这样,从数据库中找出选修了某门课程的学生列表,然后筛选出不及格的考生,要求他们重新考试,部分代码如下 List<Student> list = StudentMapper.findByClass(classId); //找出选修课程的所有学生 list.stream() .filter(x -> x.getScore() < 60) ... 然而上面的代码,运行时会报空指针异常,由于错误信息包在 stream 里面并不是很清晰,我第一个想法就是 x 为空,故 x.getScore(0) 报空指针异常, 然而经过debug, 发现 list 均不是 null。然后我的方向往 stream api 的方向去找了,莫非全过滤调了,或者哪个 api 用错了,一番折腾,依旧没有解决。 最后,我注意到了 x.getScore() 返回的是整型Integer, int 的自动拆封装箱类型,原来不是 x 的值为空,而是x.getScore()的值为空,然后和 60 比较大小时,抛出空指针异常。 由于在其他场景自动拆封装箱使用的挺顺畅,以及编译期不报语法错误,Integer 和int互相比较时,很容易写成较简单的 == 形式,然后就出现了奇怪的空指针异常。 整型比较还有更不容易发现的坑,如下面的代码: Integer i1 = 120; Integer i2 = 120; Integer i3 = 130; Integer i4 = 130; System.out.println(i1==i2); //true System.out.println(i3==i4); //false } 是不是很惊奇?原因是 java 为优化性能,默认创建了值在(-128,128]这个范围内的整型装箱实例。...

April 1, 2018 · 1 分钟 · ming

分布式集群Session共享

解决方法 Session Sticky 让负载均衡器能够根据每次的请求的会话标识来进行请求的转发,这样就能保证每次都能落到同一台服务器上面。 Session Replication 即 session 复制,一般应用容器都支持 Session Replication 的方式。这种方式开销大,只适合几台机器的场景。 Session数据集中存储 是对方案 2 的优化,Session数据不保存到本机而且存放到一个集中存储的地方,如 redis。 Cookie Based 所有 session 数据放在 cookie 中。 每种方式的具体原理及优缺点,可以查看附录1. 可以发现, 大多数情况下,方法 3 最优。 session基于redis共享有两种基本的方案 基于容器自身的扩展,比如tomcat的session-manage,以及 https://github.com/jcoleman/tomcat-redis-session-manager.  基于spring-session的方案. spring-session的好处不仅仅是session共享,它还可以与容器解耦,应用于多终端session共享,websocket,restful api等场景。 环境 jdk 8 意味着老的 jar 包不能用 tomcat 8.5 spring 5 spring boot 2 maven 依赖管理。建立公司内部的私服。 技术选型要有一定的前瞻性,带来的好处大于学习成本。 参考资料 分布式集群Session共享 http://blog.csdn.net/jerome_s/article/details/52658946 单点登录实现(spring session+redis完成session共享) https://www.cnblogs.com/hujunzheng/p/6395966.html 使用nexus3搭建私有仓库 https://www.jianshu.com/p/dbeae430f29d

March 3, 2018 · 1 分钟 · ming

部署个别变动文件到服务器2

在上一篇文章中, 我写了基于 svn 的将变动按 war 包目录提取的文章 https://www.jianshu.com/p/a2ec55f0da0a , 这篇文章我做了一些优化, 使得脚本能处理 C R U D 等大部分情况, 不能处理的部分也会有合理的输出. 下面假设你的项目是标准的 eclipse java web 项目. 下面两个脚本配合, 可以将变动很方便的同步到测试环境部署,值得一提的是 rsync 非常非常快. get_changes.sh #!/bin/bash # 这个脚本分析 svn diff -r commit1:commit2 --summarize 的输出, 找到两个 commit 间变动的文件, # 按文件原有的目录结构 和 war 包的目录结构, 放到放在一个目录中. # 然后, 可以直接将该目录中的内容拖到 war 包中以实现快速准备 war 包; 或上传到测试服务器以实现部署 # 支持 新增, 修改; 删除不支持, 需手动删除. if [[ $# != 2 ]]; then echo "get changes from between < oldCommit > and < newCommit> , for example:" echo "....

January 28, 2018 · 3 分钟 · ming

部署个别变动文件到服务器

持续集成是个好东西, 但有些老项目因为各种原因用不了. 维护这样的老项目, 往往是改动某个文件, 然后上传到测试/生产服务器, over. 这样的工作不胜其烦而且容易出错, 今天终于抽时间写了一个小工具, 来做这个事情. 思路如下: 使用 svn diff -r 3265:HEAD –summarize 生成 svn 两个 commit 之间的文件变动信息, 像下面这个样子. ± |user-edit ✓| → svn diff -r 3265:HEAD --summarize M WebRoot/jsp/right/userInfoUpdate.jsp M src/com/action/right/UserInfoAction.java M src/com/action/right/UserAction.java M src/com/hibernate/UserInfo.java M src/com/services/right/IUserInfoService.java M src/com/services/right/UserInfoServiceImpl.java M src/com/jpa/notify/NotifyDaoImpl.java M src/com/jpa/right/IUserInfoDao.java M src/com/jpa/right/UserInfoDaoImpl.java A docs/sql/userInfo.sql A sync_to_sever.sh 上面这个输出有两部分, M 或 A 表示修改或新增, 我叫它 action; 后面的是文件路径, 我叫它 local file. 根据 action 和 local file 文件类型, 找到 copy 的源和目的路径....

December 15, 2017 · 2 分钟 · ming