❗️你有0条未读消息

已读



“每个时代都有一个转折点,都有一种新的认识和评判世界秩序的方法。我们这一代人也在惊讶我们自己的新宇宙观——我们认识世界秩序的新方法,实际上也在实现我们自己的价值,把我们搭成人类的阶梯,通向遥远的星辰。”
基本每年一本科普读物,最远到量子力学,弦理论的大名早听说过,这次终于涉及到了,给我的震撼不亚于高三那年看到”熵”时的冲击。正如相对论是为了调和经典牛顿力学在宏观高速情形下的冲突,量子力学是为了调和牛顿力学在微观尺度下的冲突一样,弦理论是为了调和相对论和量子力学间的冲突,试图找到一个包罗万象能解释世间一切的理论,而这个理论再次颠覆了我们对世界基本构成的认识:宇宙万物的基本构成是一根根震动的”琴弦”。在弦理论的世界里,世界不是无限分割的,弦理论的对偶性告诉我们,最小只能到普朗克长度的尺度,往下和往上是某种形式的镜像对称:h尺度和1/h尺度的世界是对称的,因而不存在量子涨落,宇宙爆炸前也不是一个点而是一个普朗克尺度的火球。而弦理论进一步加强了相对论时空不可分的认识,一切的性质都是时空组成的影响结果。弦理论的世界里,宇宙是11维的,1个时间维,10个空间维里只有3个是展开的,7个其余维度是蜷缩的。弦可以束缚住空间,弦理论的深刻和反直觉远超过了量子力学和相对论,但如果你跟随它的思想路径逐步去深入你不得不叹服这是一群如何天才的人才能发现如此深刻的宇宙奥秘。虽然现在还不得而知弦理论是真正正确的大一统宇宙真理还是只能自圆其说的纸面学说,期待有实验数据验证弦论的那么一天。



系统了解一下Maven的工具书,写的还挺详细的。跟作者一起踢过球,挺逗的一人。

2/53,每周一篇博,坚持!

Maven仓库类型

Maven有几种不同的仓库类型:

  1. 中央仓库,中央仓库是由Maven官方提供维护的资源仓库
  2. 私有仓库,一般私有仓库由企业自己维护,不对外开放,和中央仓库一起可以称之为远程仓库。
  3. 本地仓库,本地仓库顾名思义就是开发者自己本机所处的仓库环境,通常是自己打包的jar包目录。
    配置的方式是修改maven配置文件的”repositories”部分。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!--中央仓库默认为http://repo1.maven.org/maven2-->
    <!--nexus私服设置-->
    <repositories>
    <repository>
    <id>central</id>
    <url>http://mvnrepo.alibaba-inc.com/mvn/repository</url>
    </repository>
    </repositories>
    <!--本地仓库-->
    <!--默认仓库默认是在${user.home}/.m2/repository下-->
    <localRepository>/path/to/local/repo</localRepository>
阅读全文 »

一个短暂的春节过去了,短短的七天假期有一多半的时间是在开车,属于自己的时间满打满算也就一个双休日吧。明天又要开工了,新的一年新的一轮奋斗又要开始了,像这种传承了几千年的节日怎么着也得放个半个月吧,谁说不是呢?

本来是一篇2017年终总结,硬是从元旦拖到春节再从春节拖到春节结束,现在真真的是离笔太久,提笔恐惧啊。简单说几句算是对去年的一个交代也给新年做点期许吧。

现在时间流逝太快,转眼我儿子都已经满地跑,而我也已经年过三十。那个在宿舍憋着写《水样年华》的日子仿佛还历历在目。时间催促着我成长,而我成长的速度远远赶不上时间。有一个理论说,年少时记忆的东西少,每一年的经历都是崭新的,而年岁越大经历的重复的东西也越多,于是乎可供大脑记忆的东西越少越觉得时间过得快。想想有些道理,于是偶尔抽身世外,读读书神游太虚便是件快乐的事,否则无时无刻都在感受时光洪流冲刷着身体,眼睁睁看着他衰朽是件多么可怕的事。

诶,提笔就爱瞎矫情的毛病又犯了,这老气横秋的气质与我本人不符啊,哈哈~说了些废话的感慨,先总结下年度阅读吧。

阅读全文 »

背景

我在项目中使用阿里云OSS存储文件,导出时导出为csv格式的文件。然而打开时总是存在中文乱码。
通过网上的一番搜索,大抵是使用记事本先打开csv文件,然后再保存为ANSI格式,然后再用excel打开时就不存在乱码了。但这不是程序里的解决方式,我们不可能提供一个半成品的导出文件供用户使用。经过一番网上搜寻,发现问题的根源在于UTF8的BOM信息头。
本来UTF8是不需要BOM头的,这就不得不说到微软的可恶了。

BOM简介

BOM中文译作”字节顺序标记”,UTF8本不需要BOM来表明字节顺序,但WINDOWS用BOM来标记文件文件的编码方式。BOM的UTF8编码是”EF BB BF”,所以如果接收者收到以”EF BB BF”开头的字节流,就知道这是UTF8编码了。WINDOWS系软件保存的UTF8编码的文件需要文件的开头保有这个BOM字符。

问题解决

项目中使用OSS存储文件,存储成功后返回一个签名过的文件url地址,前端再根据这个url去请求获取文件。由于前端是直接使用”window.open(url)”的方式,直接新开窗口访问链接,下载下来的文件默认是UTF8编码的,因此使用excel打开时需要BOM字符来表明是UTF8编码,否则其中的中文则会产生乱码。

因此,在OSS存储时,我们就需要额外添加BOM头一并存储。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OSSClient client = new OSSClient(ossHelper.getEndPoint(), ossHelper.getAccessKeyId(),
ossHelper.getAccessKeySecret());
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("application/vnd.ms-excel");
objectMetadata.setContentEncoding("UTF-8");
objectMetadata.setContentDisposition("attachment; filename=" + fileName + ".csv");
// 增加BOM头信息
String bom = new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF });
try {
// 以同样的编码获取字节流
client.putObject(ossHelper.getBucketName(), fileName,
new ByteArrayInputStream((bom + exportFileString).getBytes("UTF-8")), objectMetadata);
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}

最近在看《Java编程思想》,记录一些觉得有必要整理的内容。本篇就简要分析一下Java并发编程中遇到的volatile关键字。

并发编程中,我们通常会遇到以下三个概念:原子性可视性以及有序性
volatile关键词正式对应可视性这个概念。

可视性是指,当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。即便使用了本地缓存,volatile修饰的域也会立即被写入到主存中,而读取操作就是发生在主存中。
而相应地,非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到这个新值。

然而,要区分原子性和可视性是不同的概念。volatile关键字能保证可视性但并不能保证操作的原子性。如果一个域的值依赖于它之前的值,例如递增一个计数器,或者某个域的值收到其他域的值的限制,例如Range类的lower和upper边界就必须遵循lower<=upper的限制,那么只用volatie修饰是不起作用的。保持原子性或说同步,第一选择应该是使用synchronized关键字,同步也会导致向主存中刷新,因此synchronized防护的方法或语句块内的域就不必使用volatile修饰了。

阅读全文 »

背景

本篇博文分享下使用树莓派结合百度语音合成API进行当前时间和天气自动播报功能的实现。转载请注明出处。

阅读本文需要你有一定的Linux编码水平(主要是Bash)及一些python基础。
这个项目的想法初衷是希望树莓派能够定时地将一些信息通过蓝牙播放设备自动播放出来,初期先播放时间和天气,能够代替一个闹钟了呢,哈哈~~

方案设计

方案很简单,设置定时任务,将运行时时间获取到,并同时获取当前天气状况,然后使用百度语音合成API将获取到的信息转换成语音通过蓝牙连接的播放设备播放出来。

获取天气也使用了百度开放平台提供的接口,因此一共需要有百度开放平台和语音合成API两个接口的调用权限。

开放平台注册
语音合成API注册

获取天气

我们先来获取天气信息,API的返回结果结构如下:

我舍弃了穿衣指数什么的,只获取天气数据。

阅读全文 »

背景

阅读本文需要你有一定的Linux编码水平,至少能够读懂Bash,对于一个树莓派玩家来说这都不是事儿了吧。

树莓派使用Micro SD卡来作为系统存储,而SD卡又很容易坏,当我们辛苦配置好的树莓派工作环境因为SD卡挂掉,重装时各种配置又要来一趟真的很奔溃,关键还不记得当初一个个都配置了啥了。。

我最近在配置树莓派时就遇到了类似的问题,因为挂载移动硬盘出了点差错(下文会说),导致系统启动失败,以为是系统被我折腾坏了,格了好几遍SD卡重装,每次都要把软件、配置都重来一遍,于是索性将第一次开机后必做的几件事写成了初始化脚本传到github了,重装后直接下下来执行下就解决了。方便多了,再也不怕重装系统。

顺便记录下导致我写这个自动化初始化树莓派脚本的最初问题。

问题

一开始我的树莓派是没有显示器的,都是使用VNC远程连接。最近在配置了不知道哪个东西后,树莓派就连不上了,反复重装过几次,经过一番配置之后重启后必然又连不上。后来搞了跟显示器的连接线,启动后发现树莓派进入了”emergency mode“,网上查了下,解决方案对我都不适用,最后我才发现,原来是我在设置自动挂载移动硬盘的时候出错,导致系统启动失败。我的硬盘是NTFS格式的,而树莓派不能直接挂载ntfs格式,需要先安装一个ntfs-3g工具。由于重装过系统,忘记了安装这个,直接将挂载命令写入了fstab文件而又没有验证是否能够挂载成功(毕竟挂载过太多次了,想当然以为没问题了)。

阅读全文 »

alert(28443422041709109)会输出什么?

背景

上一篇博文里我记录了一个诡异的前后端数据不一致的问题,最终定位为前端js精度丢失。但只说了原因及结论并没有深入研究这个问题。
这一篇博文准备在此基础上,深入探寻一番,彻底弄清楚这个问题发生的本质。

引子

让我们先来看几个小问题热热身:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## js环境下运行,输出结果是什么?
1. console.log(1 === 1.0);
2. console.log(0.1 + 0.2 === 0.3);
3. console.log(9007199254740992);
4. console.log(9007199254740992 + 1);
5. console.log(9007199254740992 + 2);
6. console.log(9007199254740992 + 3);
7. console.log(9007199254740992 + 4);
... ...

浏览器环境下运行下看看是不是有点颠覆了三观?

阅读全文 »

这是我转战JAVA以来的第一篇博文,纪念一下。

背景

组织变动,转战JAVA差不多有一个月了,做了一个小需求,遇到一个诡异的问题。本文记录一下排查经过,顺便提醒自己后续开发中避免这样的坑。

问题描述

JAVA后端需要给前端返回一串数据,其中有个交易订单号,该交易订单在返回给前端后跟后端吐出的值不一致。直观地来看,最后的几个数字被0取代了。
一开始以为取错了交易订单号,然而从DEBUG的过程来看,后端的处理结果没有问题,返回了正确的结果给前端。
如下图所示:

当时也并没有纠结问题的根本原因,下意识地将交易订单号类型从List<Long>换成了List<String>返回就正常了。

发布以后觉得这里可能是个坑,于是研究了一下果然是有缘由的。

阅读全文 »