bash on windows 发行版升级

在windows10周年纪念版里面微软推出了黑科技bash on windows。微软通过对windows内核加了一层linux的wrapper使得大多数linux程序可以运行在windows上。为了方便用户使用,微软又把ubuntu 14.04的镜像预置在系统内。

稍等……14.04?这个版本已经停止维护了啊,微软这做的不厚道啊

sudo upgrade-manager 诶,等等,报错了

不能升级绝对不可能的,就算是官方的做法不能升级也有其他方法能做到。在某外国程序员同性交友(雾)网站找到了解决方案:

一:先执行某黑科技的发行版升级命令

sudo do-release-upgrade -f DistUpgradeViewNonInteractive -d

执行命令的时候程序会在一般卡死,卡死的位置在一个配置文件是否覆盖的问题之后,如果卡死在别的地方那就怀疑是你人品不好。卡死之后强制结束掉这个

二:执行修复命令

sudo dpkg –configure -a

执行命令的时候如果遇到sudo不能访问tty的时候加上-S参数

三:执行日常的软件升级

apt-get update

apt-get dist-upgrade

apt-get autoremove

这之后就享用啦。终于可以方便的编译c++14啦

manageryzy@MANA:/mnt/c/Users/manag$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial

不同编译器下系统开方运算性能测试(已更新Linux版测试)

前两天看到一篇文章提到了用MagicNumber来做神奇的导数开方运算,于是我打算试一试测试系统的函数的性能

 

#include "stdafx.h"
#include <math.h>
#include <time.h>

#define MAX_SIZE 100000000
double data[MAX_SIZE];

void test() {
	for (int i = 0; i < MAX_SIZE; i++) {
		data[i] = sqrt(i);
	}
}

int main()
{
	int t1 = clock();
	test();
	printf("%ld ms", clock() - t1);
	getchar();

	for (int i = 0; i < MAX_SIZE - 1; i++) {
		data[i] = data[i + 1];
	}

    return 0;
}

以上这段简短的程序就是我写的来测试性能的代码。注意:后面的的重写这个数组是为了防止编译器优化把计算的循环给优化掉

 

测试机器是我的笔记本

  • CPU:Intel i73517U  @2.7GHz
  • 内存:16G DDR3L 1600Mhz

性能测试的时候为了准确使用了Intel的性能调试工具,没有使用程序输出的数值。编译全部是windows平台,gcc使用mingw环境。都是debug模式开O2优化,x64代码。

 

VS 2015:557.943ms

CLang 3.7:605.040ms

icc 16.0:762.681ms

gcc 5.2.0:1269ms

 


附加测试:Linux上的性能测试。有朋友说我的测试都是Windows平台,Linux平台下面g++可能性能会更好,于是我有做了另一个测试

测试机器是我的一台服务器

  • CPU Xeon E5-2603 x2 @ 1.80 GHz
  • 内存:16G

由于服务器上没有Intel的性能调试工具的授权,所以使用系统函数来测试时间。系统是Ubuntu

 

CLang 3.4 :1020.149ms

gcc 4.8.4:1355.673ms

所以可以看出来在Linux系统下面gcc的性能有所提升,但是仍然比不了clang

剁手日记:华为mate8使用体验

好久没有更新博客了。本来想要更新一点机器学习相关的文章结果发现自己的基础知识匮乏,写不出来有价值的文章。手机也是好久之前就买了的,最近实在是用的比较蛋疼于是就写这么一篇测评吧。

首先声明。我绝对不是土豪啦。这面买手机的主要原因还是手机在杭州参加ELM2015会议的时候在公交车是被偷了(喂喂,话说那两天不是正好乌镇开互联网大会么,为什么治安还是这么差

先来说说华为Mate8使用的第一印象吧:!这个手机不是一般的大,我的手已经算是比较大的了,不过单手操作还是比较困难的。当然了,也有人评价丑的,不过我是没有感觉啦。

说说我感觉好的地方吧:

  • CPU、GPU均为旗舰配置,大多数应用都可以流畅运行(当然了崩坏学园那种优化烂的一逼的U3D游戏另说)
  • 运存通常也都够用
  • 续航持久
  • Android 6.0系统
  • 自带Google服务框架
  • WiFi信号很好
  • 一体式的机身

剩下的日常说说缺点吧

  • 系统界面操作超级蛋疼
    • 华为的虚拟按键很多应用不显示MENU键,也没有实体MENU键。比如Google Chrome就无法切换标签页
    • 系统更新之后通知栏占用时间过长,运行全屏应用比如看视频的时候通知栏弹出很烦人(这种显示QQ群消息简直噩梦)
  • 系统默认应用的BUG:我这里修改了多次默认浏览器到Chrome,然而好几次都回到了系统默认
  • 相机不算清晰
  • 距离传感器设置的似乎阈值过高导致通话的时候有的时候会误操作手机
  • 密码键盘不能记住密码之后指纹一键输入密码
  • SD卡和双SIM不能同时安装

怎么说呢,对于我来说,下回有机会还是买Google Nenux吧,虽然也是华为代工的,但是原生Android比起这面好许多

H萌云观测测试版上线

神隐了一个多月之后又来发东西啦。这回的是花了半个星期 做的一个东西啦。现在已经上线测试啦。

博主在神隐的一个多月里面参加了中国机器学习及其应用研讨会、做了大半个多月项目(然后被坑,一分钱没拿到)。这回一个一时兴起丢下天堂的大坑先过来做了这么一个在线观测。这个观测系统每半个小时检测一下所有H萌UP主的投稿信息(以后检测频率可能会调整吧)

测试版地址(请使用现代浏览器访问):http://115.28.73.8/

项目源码已经在Github开源,求Star:https://github.com/hmoe/hmoe-ce

神舟PC PAD试玩

由于觉得总背着笔记本来回跑太沉了,就打算搞一个Windows平板用用。苦于预算问题,没有买Surface Pro,买了神舟来玩玩。就把这两天使用的体验说一下吧。

先说一下硬件配置:

  • Intel Atom 1.3GHz CPU
  • 2G DDR3 内存
  • 64G emmc 主储存,可扩展microSD
  • 10寸 1280*800 分辨率屏幕 10点触控
  • 键盘皮套
  • 内置蓝牙4.0

下面就说一说使用的时候遇到的问题:

  • 硬盘不是SSD,读写速率过低,实际测试4K随机读写差不多2MB/s左右吧这个速度和机械的速度相当,这主要是因为只有一个FLASH芯片的过,要是像SSD一样是FLASH的矩阵构成的话速度应该能快不少。
  • 内存的读写速率没有什么问题,不过2G内存有点不够用,这里开chrome的话比较吃力了
  • 键盘皮套的触摸板太难用了,这个精度基本不能用,而且不支持扩展触摸手势,也不提供禁用功能
  • 键盘皮套占地过大,要是用键盘的话后面要用支架的话需要好长
  • 使用高保真蓝牙耳机进行测试的时候发现经常有卡顿的出现,不知道是CPU负载过高还是单纯的蓝牙模块有问题
  • Wifi信号也不是很强,离路由器30厘米而信号不是满格
  • 实际使用的时候感觉还是比较热的,差不多外壳有四十度吧,这个还算正常
  • 使用一天中在看高清视频是死过一次机,不是无响应,是直接硬件卡死了,没有蓝屏
  • 预装系统是32位系统,而且自动使用window更新的时候无法连接到服务器,我是挂了代理才更新成功的,不知道为什么,很迷
  • 拍照清晰度很差,这个就不要求了,毕竟要拍照片的都去用单反了

说一说优点吧:

  • 续航比较持久,我测试6小时是没问题
  • 内置了office 365的授权,这个office 365的授权价格都快要赶上这个平板的价钱了吧

基本上目前来看就这些情况,性价比上肯定超过surface pro,但是体验上肯定差很多,由于这面windows 10的升级因为学校的渣网速还没有完成,所以暂且不知道运行windows 10如何

九月一号无题

一直想写一点什么却一直以各种各样的借口没能动笔,什么在外地啦,什么写程序啦,什么赶火车啦,什么出去吃饭啦,什么回来补番啦,就这样又快两个月没有写博客。终于在新的这个月的凌晨三点我听着初音的音乐 又一次的动笔了。

前一段时间去北京听了黄广斌的ELM培训,还去黄岛又一次的蹭了一个智能数据处理方面的学术会议,然而并没有什么卵用。黄广斌的ELM虽然吹嘘的很厉害,然而我并不用;而数据处理会议上听了那么多报告结果只有两个相关领域的报告。

紧接着去了南京去中国软件杯成功打酱油。好吧,只拿了优秀奖这种事是谁也不想的(12梗)。在那里结交了一个新的基友,一问他发现他和布鲁克很熟,这既视感怎么回事呢,世界又一次的真的好小啊。之前认识szszss的时候结果发现他是Naylon的同学的时候就很吃惊了。

手头上个各种事情也是一堆。h萌新站开发拖了有半年了,boss这面神经网络的控制程序那面虽然外包出去也是要做的,齐鲁软件比赛我还带了三个队,我自己的代码一点还没有码,看来STG游戏大概又是够呛了。还有一个奇葩的国内的数学建模比赛,大概九月的人生也就交代这里

原本还打算做的一个爆菊b站的计划也搁浅了,还有动画数据库的计划也就都搁浅了。算了,突然发觉BGM已经成了LoveLive的歌曲,想到白天家里全都停水停电也是各种绝望,于是决定睡觉

visual studio code快捷键

怎么说呢,好久没有写博客,最近发现visual studio code真的实在是太好用了,就来按照官方的总结一下快捷键啦

这里的快捷键都是IBM PC的啦,至于Mac用户自己寻找好了。我会在下面把我认为比较常用的用粗体标示出来。比较鸡肋的用删除线标示出来。

本文章汇编自visual studio code的官方文档

基础使用

打开/关闭窗口左侧的边栏:Ctrl + B

增加一栏打开的文件窗口:Ctrl + \

在新的一栏里面打开文件:Ctrl + Enter (这个需要在左面的文件栏选择好文件,比较鸡肋)

通过名称搜索打开文件:Ctrl + P

保存文件:Ctrl + S (BTW,保存文件不是Ctrl + S的异端都要灭亡!)

自动保存文件:Ctrl + Shift + P (不是很喜欢idea的那种模式)

在目录下文件中全文搜索: Ctrl + Shift + F 

高级版的上一个功能: Ctrl + Shift + J

对编辑器输入命令:Ctrl + Shift + P (就当这个是vi的冒号的模式好了)

在最近打开的文件中切换:Ctrl + Tab

查找并且导航到符号:Ctrl + Shift + O

文件编辑窗口导航:Alt + ← 或者 Alt + → (这个倒是和idea很像)也可以通过 Ctrl + 数字键 导航

文件编辑

跳转到匹配的括号:Ctrl + Shift + ]

多行选择:Alt + Click (鼠标左键) 或者 Ctrl + Alt + ↑ 或 Ctrl + Alt + ↓

选择全部和当前光标所在的标识符同名的标识符:Ctrl + Shift + L 或者 Ctrl + F2 (代码重构反混淆神器)

代码提示:Ctrl + Space(比起idea那么多代码提示的快捷键好多了,嗯,可是为什么我要黑idea呢)

查看定义:F12 或者 Ctrl+ Click

转到定义:Ctrl + Alt + Click

查找符号:Ctrl + T

查找引用:Shift + F12 或 Alt + F12

重命名符号:F2

查看所有错误:Ctrl + Shift + M

五月病都到七月啦

默默的看了一下上一篇博客的更新时间,还是停留在五月。啊,两个月没有写博客了。一直以没时间为借口一直没有更新博客,然而实际上这两个月来我就和被紫妈神隐了一样的在偷懒。参加了软件杯那种奇怪的编程比赛,然而并没有写文章。补了好多番,什么鲁鲁修、豹头王传说、晨曦公主啊之类的,也并没有什么发生。钉宫病也发作过,又复习了一遍零之使魔和灼眼的夏娜。两个月的时间就这么过去了。

眼看着七月份服务器的使用时间就要到了,又要改付费了,这个时候终于有一次打起精神准备开始码字。还是在纠结服务器是不是要移到海外。现在手头上有两个闲置的vps,一个conoha,一个搬瓦工。然而一直是由于备案的问题一拖再拖。估计心情好的话下个月还是换成conoha的vps吧(不会日语和客服交流简直是煎熬)。

最近又在搞分布式的神经网络的计算(只是单独的分布式,不是集群)以及下载了整个b站的cid数据。

 

总之前方将有大批的填坑以及文章,非战斗人员请回避

Windows的进程线程优先级与修改

如果你曾经用过windows的任务管理器,就算是没有学习过windows的内核你也应该有听说过“进程优先级“这么一个概念。虽然你可能没有操作过,但是你很有可能在任务管理器里面见过它。今天稍微讲一下Windows的进程优先级以及线程优先级。

Windows是一个抢断式多线程操作系统,在并发的处理的时候最基本的执行单结构是线程,而一个进程内并不是一个执行上不可分割的结构,而是由多个线程组成的。每一个线程在内核中有一个优先级顺序,这个顺序的取值范围是0-31,数字越大优先级越高。如果有任意一个高顺序的线程需要执行,Windows绝对不会执行低优先级的线程。如果低优先级的线程一直不能被执行,那么线程就被饥饿了,这个时候抢占式操作系统的特点就体现出来了。

但是为什么平时都没有注意到呢,这里很大的原因是平时绝大多数工作线程的的优先级都是基本差不多一致的,每一个线程基本都能分配到时间片。但是有的时候我们需要创建一些较高优先级或者较低优先级的线程用来完成一些特殊的任务,我们就要了解一下这个线程的优先顺序到底是如何计算出来的。

虽然说这个优先顺序的取值范围是0-31,但是你并不能直接通过API来设定优先顺序。你能够设定一个进程优先级以及一个线程优先级。下面是一个Windows的优先级对应表:

线程相对

优先级

进程优先级类

Idle

Below Normal

Normal

Above Normal

High

Real-Time

Time-critical

15

15

15

15

15

31

Highest

6

8

10

12

15

26

Above normal

5

7

9

11

14

25

Normal

4

6

8

10

13

24

Below normal

3

5

7

9

12

23

Lowest

2

4

6

8

11

22

Idle

1

1

1

1

1

16

从这个表你可以看出来,实时优先级的进程拥有者极高的数值,通常情况下你不应该把你的进程优先级设置为实时。包括磁盘IO、鼠标显示、音频输出之类的系统功能都在实时优先级中的某些优先级中工作。如果你的线程优先级高于它们,并且需要大量CPU运算很有可能导致整个操作系统无法响应。不过微软在windows vista开始引入UAC之后开始限制了管理员账户的一些权限,现在你必须需要完全的UAC管理员权限才能把进程的优先级设置为实时,否则系统不会报错,但是最高会给你设置到高。

设置优先级的方法也非常简单,一种方法是创建进程或者创建线程的时候进行设置,另一种方法是通过专门的设置优先级的API进行设置。这里只介绍第二种通过专门的API设置的方法。

下面我给一种设置进程优先级的代码

	//提升自身优先级到实时
	HANDLE hProcess = OpenProcess(PROCESS_SET_INFORMATION, FALSE, GetCurrentProcessId());
	if (SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS) == 0)
	{
		MessageBeep(0);
		MessageBox(0, L"设置进程优先级错误,推荐手动通过进程管理器设置优先级为实时", L"警告", 0);
	}
	CloseHandle(hProcess);

类似的你也可以通过

  • SetProcessPriorityBoost
  • SetThreadPriorityBoost
  • SetThreadPriority
  • SetPrioriytClass

等这一簇函数来完成。更详细资料请参考MSDN

 

GDI高效内存手动绘图

最近一直想要写几篇文章,但是由于懒癌的发作一直都没有写。今天趁着写代码写的闹心并且无力追番的闲心写一下。

最近在参加一个比赛,里面要求百万的图形能够在10s以内能够进行裁剪显示,这对于GDI绘图来说是基本不现实的,不过经过各种优化我在1秒以内完成这个任务(i7 四核 1.8GHz)。实现这个效果的最关键的就是手动绘图替代掉效率底下的GDI。

如果有DOS下图形编程经验的朋友可能都习惯用最基本的绘点函数来完成一些复杂的绘制,到了windows之后遇到GDI之后却发现绘点函数慢的恐怖。比如要SetPixel来绘制一个调色盘,这个效率基本是要让人疯掉的。

这里先分析一下GDI的效率为什么低下。众所周知,现在的Windows是运行在保护模式的,只有系统内核以及驱动程序才能接触到那些关键的显存,而普通的ring3应用程序必须通过操作系统的API才能调用硬件资源。于是每次绘图的时候程序都会调用gdi的dll,这个动态链接库会接受到调用之后在缓冲队列里面记录下操作,在特定的时候会触发CPU陷阱把缓冲队列的数据交给内核来执行。也就是说大量的GDI绘图指令会导致大量的内核切换的开销。

为了加速绘图微软公司也是有不少解决方案,在windows早期就提出过DirectX用来直接操作这些硬件资源。不过今天并不打算采用那种复杂到恐怖的东西。还是用类似于双缓冲的方式实现

GDI里面的重要的一个概念就是DC,而DC需要一个实际的数据区,这个数据区就是一个位图。如果我们能够直接对这个位图内部的内存进行读写那么就能够非常快的完成绘图操作。

关键的代码有下面这几个,如果有问题可以查询MSDN。我一开始也对这几个函数比较有疑惑,现在稍微记录一下吧。

  • CreateCompatibleDC能够创建一个空的兼容的DC,但是这个DC由于没有缓存区所以大小是1*1的。
  • CreateCompatibleBitmap能够创建一个大小一致的兼容的BMP,由于新创建的DC并没有大小,请注意这里要传入旧的DC
  • SelectObject用来把一个BMP绑定到DC上
  • BitBlt用来复制并且光栅操作
  • SetBitmapBits用来设置一个BMP的内容

还有一些其他的API可能也是有用的,不过由于调用并没有这里方便于是我就不介绍了

代码Demo可以看我当时写的代码:https://github.com/manageryzy/lineCircle/blob/master/lineCycle/draw/drawMemory.cpp