笨熊之家

欢迎来到笨熊之家~

0%

在某群看到有人提了一个时间戳与时区时间转换的问题,当时就看出他的计算方式有问题,但是对相关概念有些模糊,今天想起来就整理了一下这个问题。

加减时间戳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Instant instantPlusEightHours = Instant.now().plus(8, ChronoUnit.HOURS);
Instant now = Instant.now();

System.out.println("UTC: " + now);
System.out.println("UTC+8: " + instantPlusEightHours);

System.out.println("对应上面UTC的时间戳: " + now.toEpochMilli());
System.out.println("系统时间戳: " + System.currentTimeMillis());
System.out.println("对应上面UTC+8的时间戳: " + instantPlusEightHours.toEpochMilli());

//Output:
//UTC: 2019-03-15T02:42:40.958Z
//UTC+8: 2019-03-15T10:42:40.953Z
//对应上面UTC的时间戳: 1552617760958
//系统时间戳: 1552617761041
//对应上面UTC+8的时间戳: 1552646560953

可以看出他想将时间戳转换为对应UTC+8时区的时间,但这里他犯了一个概念性的错误。

Unix时间戳是从UTC时间 1970年1月1日 00:00开始所经过的秒数,不考虑闰秒。
协调世界时(英语:Coordinated Universal Time,法语:Temps Universel Coordonné,简称UTC)是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治标准时间。
协调世界时是世界上调节时钟和时间的主要时间标准。

Read more »

问题

  • 运输层的功能是什么?
  • TCP与UDP的优劣比较?它们的应用场景分别是什么样的?
  • 为什么要为分组编号?
  • 为什么要为分组加上检验和?
  • TCP的拥塞控制是如何实现的?
  • 为什么TCP要使用滑动窗口协议?

正文

运输层的两个关键功能:

  • 将网络层的在两个端系统之间的交付服务拓展到运行在两个不同端系统上的应用层进程之间的交付服务
  • 控制运输层实体的传输速率以避免网络中的拥塞
Read more »

图源 github.com/cyc2018

问题

  • Java中的线程有哪些状态?
  • 什么是happens-before?
  • synchronized和RenentrantLock有什么区别?
  • synchronized底层如何实现的?
  • 什么是公平锁?
  • 什么是锁消除、锁粗化?(什么是锁的升级、降级)
  • AtomicInteger底层实现原理是什么?

Java内存模型与线程

Java 内存模型

Read more »

挺久前看过但一直没有整理,今天复习了自动内存管理机制相关内容。
图源: github.com/cyc2018

一些问题

  • 强引用、软引用、弱引用、幻象引用有什么区别?
  • 谈谈JVM内存区域的划分,哪些区域可能发送OutOfMemoryError?
  • Java常见的垃圾收集器有哪些?
  • 谈谈你的GC调优思路?
  • 新生代和老年代是什么意思?

带着以上问题接着阅读这篇笔记吧!

Java内存区域

Read more »

程序一般是逐个运行内存中相邻的指令,诸如跳转、调用和返回这样一些程序指令则会改变这一状况,让程序以不同的顺序执行,这样一些程序指令都是必要的机制,使得程序能够对由程序变量表示的内部程序状态中的变化做出反应。

但是系统也必须能够对系统状态的变化做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定要和程序的执行的相关。比如,一个硬件定时器定期产生信号,这个事件必须得到处理。包到达网络适配器后,必须存放在内存中。程序向磁盘请求数据,然后休眠,直到被通知说数据已就绪。当子进程终止时,创造这些子进程的父进程必须得到通知。

除了程序指令,系统各部分都有不同的机制来触发异常控制流。比如,在硬件层,硬件检测到的时间会触发控制突然转移到另一个用户进程。在操作系统层,内核通过上下文切换将控制从一个用户进程转移到另一个用户进程。在应用层,一个进程可以发送信号到另一个进程,而接收者会将控制突然转移到它的一个信号处理程序。一个程序可以通过回避通常的栈规则,并执行到其他函数中任意位置的非本地跳转来对错误做出反应。

异常控制流是操作系统用来实现I/O、进程和虚拟内存的基本机制。

问题

  • 什么是系统调用?
  • 并发和并行有什么区别?
  • 用户态、内核态和上下文切换是什么?
  • 如何创建并使用多进程编程?
  • 什么是非本地跳转?有什么用处?

异常

异常就是控制流中的突变,用来响应处理器状态中的某些变化。
在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序)。当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下3种情况中的一种:
1) 处理程序将控制返回给当前指令,即当事件发生时正在执行的指令。
2) 处理程序将控制返回给下一指令,即如果没有发生异常时将会执行的下一条指令。
3) 处理程序终止被中断的程序。

Read more »

本章介绍Screeps中的建筑设施以及相关的应用

基本建筑

  1. 建筑会在hits为0时消失。
  2. 有些建筑的数量上限是受RCL(房间控制器等级)影响的。
  3. 除了道路、容器和堡垒,其他建筑都会阻挡Creep的移动。

ConstructionSite(建筑工地)

所有的建筑从无到有的过程都是放置建筑工地->Creep前往并开始修建->修建进度完成,建筑工地转为对应类型的建筑,不过玩家的第一个孵化器是直接创建的。

Read more »

官方教程

官方教程 已经覆盖了一些基本的概念,包括

  1. 游戏界面以及基本的脚本编写
  2. 升级控制器
  3. 建造设施
  4. 自动生产Creep
  5. 基本的防御

首先说下教程代码之中一些可以改善的地方:

  1. 不够动态,如只选用了Spawn1,在后期有多个房间或是控制器等级高了之后一个房间有多个Spawn;
  2. 所有角色都会去采集能量,效率不高。
Read more »

介绍

Observer method

如图,观察者模式涉及到两种对象,Observer和Subject(Observable)。

Subject(Observable) 是可观察的对象,而Observer则是观察者,使用流程一般是:

  1. Observer将自己注册到对应的Subject中
  2. Subject的状态变化时,遍历已注册的观察者列表,逐一调用观察者的update方法
Read more »

看极客时间某专栏里有几篇编程入门篇的文章里罗列了很多书,文章和文档的链接,种类繁多,个人觉得对初学者并不是十分友好,给学过的人查漏补缺是可以的。

把过多的内容推给初学者,而一般的初学者暂时没有能力和意识去分辨这些内容,怎么去学,怎么去用,如何分配时间和精力也是一个问题。

学习的话,还是要按照个人的节奏来,不是说看到这些人列的书单就一定都要去看,书读多了可能你就陷进去了,成了书呆子,空有理论。最重要的是,一定要结合实践。
 
如果是自学并且在实践,其实很多东西你自发地就会去了解,最好不要想着死学别人列出来的就一定能达成什么目标,别人的书单终究是别人的学习路线别人的学习思路导出的,不能说是通用的,也不能说是无用的,各人得自己去消化,调整为适合自己的方式方法。

如何入门编程

这里我说下我认为应该如何入门编程,个人看法仅供参考。

Read more »

实习公司的项目语言环境为Delphi, C和C++,原开发者用的开发环境是Delphi 6和Visual C++ 6.0。
个人比较习惯命令行下操作,也更喜欢使用GCC,所以这里写一下这个月在Windows下搭建环境的心得和遇到的一些问题。

Delphi

这个语言现在似乎比较少用,至少我在接手项目之前没怎么接触过这个语言。搭建环境时我下载了Delphi 2010,这个IDE功能挺完善的(相比Delphi 6),但是编译现有项目时总是提示缺少依赖,折腾了一两天依然没有解决,后使用Delphi 6编译成功。

但是Delphi 6是比较旧的软件,它的窗口都不能很好的合并在一起,对于代码中符号,函数和变量的跳转都不是很智能,很不适合用来研究源码。

所以现在现有的使用方式是,用Delphi 2010查看和编辑代码,用Delphi 6编译和构建。

Read more »

个人其实平日里并不太喜欢吐槽,只是这次正好要用的时候碰上各种问题。这次吐槽不是吐槽腾讯云开发者平台的服务,性能怎么样,而是针对其用户体验。
实习期间,整理项目代码,之前公司里这些项目是一个老程序员写的,没用上Git。所以这次维护时,先把项目代码整理好加入版本控制。

服务器上选择的是Coding.net,不限制私有仓库。

一开始用的也挺好,有天看见Coding.net推送的通知,说是与腾讯云达成合作,升级到腾讯云开发者平台有什么什么好处之类的。相关公告

我心想着既然达成合作,以后怎么说也会慢慢迁移过去的,也就选择了升级,绑定了微信号。

电脑上操作没什么变化,原coding的地址会自动重定向到腾讯云,登录开发者平台要扫微信。

Read more »

安装parsoid时,提示依赖版本4.0.0以上的NodeJS,而事实上已经通过nvm安装过nodejs,且其版本是满足要求的。

无视依赖安装一个包

1
2
apt-get download <package-name> #下载对应包
dpkg -i -ignore-depends=<dependency-name> -i <filename> #无视依赖安装指定包

警告“存在未满足依赖的模块,请尝试使用apt-get -f install恢复”

这会影响后续apt安装其他软件包,怎么解决呢?

Read more »

记录一下升级MediaWiki版本中遇到的一些问题及其解决方案。

更新操作按照官方文档这里进行。

PHP

PHP 5 -> PHP 7.2

这里经历了一番周折,最初找到的仓库是给Ubuntu用得,辗转最后找到适用Debian 8的仓库。

Read more »

工作需要从USB设备启动虚拟机进而装系统或是还原镜像,在VirtualBox的设置中没有找到相关选项,辗转搜索到这篇文章

这里的解决方案是,通过命令在主机将usb设备模拟成虚拟硬盘,然后在VirtualBox设置虚拟机的Storage选项,增加模拟盘并将usb模拟盘放在第一顺位,虚拟机启动时就会从这第一个盘引导了。

这里引导顺序还需要在System > Motherboard下的Boot order中将硬盘的顺序放在第一位(如果只有硬盘,那不设置这个选项也是可以的)。

1
2
3
4
sudo fdisk -l #查看设备信息,找到usb设备对应的设备文件,常见的可能是/dev/sdb,像/dev/sdb1这种是指向对应设备分区的文件。
ls -l /dev/sdb #查看设备文件的属性,主要是看权限方面的,一般是brw-rw---- root
sudo chmod o+rw /dev/sdb #增加others在该设备文件的读写权限,如果不这样设置,那么后面运行相应的命令都得使用sudo(以root身份执行)才有权限操作该设备文件
vboxmanage internalcommands createrawvmdk -filename ~/VMs/usb.vmdk -rawdisk /dev/sdb #将指定设备文件模拟成指定文件名的虚拟硬盘

经过这几步,我们已经成功将usb设备模拟成虚拟硬盘了,接下来对VirtualBox中对应的虚拟机进行设置即可(见文章首部)。

Read more »