ArchLinux 上搭建 Jupyter Notebook 服务器

安装 Jupyter 和 nginx 一行代码搞定: # pacman -S jupyter nginx 启用 nginx 服务: # systemctl start nginx # systemctl enable nginx 配置 这个才是我想说的重点.看了一些资料,因为对 nginx 不是很了解,所以才看不明白.首先,为了避免升级的时候配置文件被覆盖,先创建两个存放配置文件的目录,/etc/nginx/sites-available 和 /etc/nginx/sites-enabled,有的发行版已经有了这两个目录的就可以不用创建了.一般我们将配置文件写到 /etc/nginx/sites-available 目录下,然后需要启用的时候在 /etc/nginx/sites-enabled 新建一个相应的软链接即可.编辑 /etc/nginx/nginx.conf,在 http 这一节加入一行: include /etc/nginx/sites-enabled/* 很多文章就只说 nginx 的配置很简单,但是不懂 nginx 的人看了还是摸不着头脑.实际上还要添加 /etc/nginx/sites-available/jupyter.conf: server { listen PORT; # PORT 为反代端口,根据需要选择 location / { proxy_pass http://127.0.0.1:JUPYTER_PORT; # JUPYTER_PORT 为 Jupyter 运行端口 proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.

more...

LVM 实战:ArchLinux 上将 home 分区放在两块硬盘组成的 LVM 上

情况简介 已经安装好的 Arch Linux,分区情况如下: /dev/sda1 /boot /dev/sda2 / /dev/sdb1 /home 现在新增一块硬盘 /dev/sdc,希望可以将 /dev/sdc 分给 /home 分区.理所当然地想到使用 LVM. 实战 首先是对 /dev/sdc 分区,直接使用 gdisk 工具,分一个 Linux LVM 分区,gdisk 中的分区类型为 8e00.这一个硬盘只分一个分区 /dev/sdc1 即可. 然后创建物理卷(physical volume, pv), pvcreate /dev/sdc1 创建卷组(volume group, vg),这里设定卷组名称为 homevg, vgcreate homevg /dev/sdc1 创建逻辑卷(logical volume, lv),这里设定逻辑卷的名称为 homelv,并将卷组的所有空闲空间分给它, lvcreate -l 100%FREE homevg -n homelv 创建好的逻辑卷在 /dev/<volume_group>/<logical_volume> 下,可以将它看作我们平时使用的类似 /dev/sda1 分区,将其格式化,并挂载即可使用. 创建文件系统,也就是格式化分区,我们这里使用 XFS 文件系统: mkfs.xfs /dev/homevg/homelv 将逻辑卷挂载, mount /dev/homevg/homelv /mnt 将 /home 分区的内容复制到逻辑卷,

more...

操蛋的 Ubuntu

今天尝试着升级 Ubuntu,从 Ubuntu 14.04 LTS 升级到 Ubuntu 16.04.首先编辑 /etc/update-manager/release-upgrades,修改为: Prompt=lts 然后执行升级命令: sudo do-release-upgrade 一切都很顺利的样子.登录上去执行一个 sudo apt update,提示 GLIBC 有误.明显就是 libstdc++6 这个包出问题了,直接从镜像源下载一个,然后使用 dpkg -i package.deb 安装.Done.然后再次执行 sudo do-release-upgrade,提示没有可以更新的版本.应该使用 sudo do-release-upgrade -d.结果更糟糕,提示遇到无法解决的问题,建议我报告 bug.不死心,修改 /etc/update-manager/release-upgrades: Prompt=normal 然后更新到了 17.10.再次尝试更新,sudo do-release-upgrade,依然提示同样的错误.Emm,肿么办?不怕,我们直接修改 /etc/apt/sources.list,把源换成 18.04,然后刷新软件源并升级: sudo apt update sudo apt dist-upgrade 终于给个有用的提示了,virtualbox 的一个包 virtualbox-dkms 有依赖问题无法解决.所以 do-release-upgrade 是二傻子么?遇到升级的时候遇到无法解决的依赖也不提示一下用户是什么依赖无法解决?先卸载 virtualbox,然后 sudo do-release-upgrade,这就可以升级了. Ubuntu 这是自作主张,觉得用户没法解决问题,do-release-upgrade 根本就不给出有用的错误信息.Fuck you, Canonical Ubuntu! 要不是大家搞深度学习都用的 Ubuntu,我才不会考虑用它啊.真要用 Deb 系的也是考虑 Debian 啊.

刀片服务器 CPU 节点使用指北

查看可用资源与计算节点状态 在提交任务或者作业之前,务必检查一下各个节点的状态,例如资源是否充足,当前有多少在执行的任务等等.使用命令 pbsnodes -a 可以查看所有节点的状态,free 表示空闲. 提交任务 用户需要编写一个 PBS 脚本来完成作业提交的设置.PBS 脚本可以在本地编写完成后上传,也可以在服务器上编辑.注意脚本内容中不要包含中文字符,在 Windows 系统下编辑的时候,可以用 Notepad++,并另存为,将换行符设置为 Unix (LF) 模式. 编写 PBS 脚本 一个简单的 PBS 脚本的模板如下,注意这里的中文注释是方便大家理解,最后都要删掉的. #!/bin/bash #PBS -N <jobname> ### 在 X 个节点上申请 Y 个 CPU 核心 #PBS -l nodes=X:ppn=Y ### 可选值为 q1, q2, q3,根据用户所在的组别选择对应的队列 #PBS -q <队列名> ### 合并标准错误输出和标准输出 #PBS -j oe ### 切换路径 cd $PBS_O_WORKDIR ### 运行需要执行的脚本或者命令 #### matlab 脚本这样子运行 matlab -nodesktop -nodisplay -nosplash < <m 文件> > <matlab 输出日志文件> ### python 脚本可以这样子写 python <python 脚本文件名> 其中第一行是固定的,表示用 /bin/bash 来执行脚本.#PBS 开头的行用来设置 PBS 选项,比如使用的资源等等.每组只有 3 个节点,每个节点的最大 CPU 核心数量为 16,申请时不能超过最大值.在确定申请 CPU 核心数量之前,请先确定是否需要这些计算资源.如果程序本身的并行程度不高(由你的代码决定),申请过多的节点和 CPU 核心数量会造成资源的浪费,并且影响他人的使用.

more...

vlmcsd service in Linux

vlmcsd 是一个 KMS 服务端软件,用于 M$ 产品的激活与授权. 安装 自己去官网下载源码编译打包.Arch Linux 用户可以去 AUR 找现成的 PKGBUILD 脚本打包. 启动服务 Arch Linux 的 AUR 中的 vlmcsd 包有提供一个 systemd unit,内容如下: [Unit] Description=KMS Emulator [Service] Type=forking User=nobody ExecStart=/usr/bin/vlmcsd [Install] WantedBy=multi-user.target 可以根据上述内容自己创建一个,然后复制到合适的路径.启动并设置开机启动服务: systemctl start vlmcsd systemctl enable vlmcsd vlmcsd 的默认端口为 1688,如果有防火墙的请修改防火墙设置. 使用方法 Windows 打开 cmd,使用命令安装批量授权 key: slmgr /ipk xxxxx-xxxxx-xxxxx-xxxxx 其中批量授权 key 可以从这里根据 Windows 版本选择对应的 key. 设置 KMS 服务器地址: slmgr /skms IP 其中 IP 为你的 vlmcsd 服务的 IP.然后激活:

more...

一个简单而又相对完整的 Qt Charts 例子

不想说太多,请直接看代码.这个例子相对比较简单,但是绘图所需的各种元素都尽量涉及到了,以期给出一个完整的参考例子. 参考 补充一些很有用的参考文章. 这篇 Qt Charts入门指南 提供了使用 Qt Charts 的两种方法的例子,QChartView + QChart 以及 QGraphicsScene + QChart. 这篇 Qt Charts 基本组成 介绍了 Qt Charts 的主要类,有利于从全局把握. 最后,还是建议多看 Qt 的官方文档,它们的文档应该可以说是开源项目里写得最好的那一批了.

利用 cURL 分块下载大文件

缘起 自己的 VPS 是个小家伙,硬盘只有 10G,装完系统,能用的空闲空间也不过 7G 左右.但是我需要从国外的服务器下载一些数据,文件都比我的硬盘大.直接下载到本地速度不够快,而且下载链接有时效,只能考虑先下载到 VPS 上,然后再转移到本地.自然而然的想到一个办法就是分段下载文件到 VPS 上,最后转移到本地之后再拼接起来. 前提 使用本文的方法需要服务器支持 HTTP Range Request,否则只能老老实实地买个硬盘大的 VPS 进行下载.至于怎么确认服务器是否支持,我首先想到的是从服务器分段下载一个较小的文件,然后拼接,对比直接下载完整的文件是不是一致. 其实也可以用 cURL 查看返回的请求头.例如: curl -I http://mirrors.ustc.edu.cn/debian-cd/current/amd64/iso-cd/debian-mac-9.3.0-amd64-netinst.iso 返回结果 HTTP/1.1 200 OK Server: openresty Date: Sun, 21 Jan 2018 13:45:58 GMT Content-Type: application/octet-stream Content-Length: 307232768 Last-Modified: Sat, 09 Dec 2017 13:04:52 GMT Connection: keep-alive ETag: "5a2bdf74-12500000" Accept-Ranges: bytes 看到了 Accept-Ranges: bytes,说明这个服务器是支持 HTTP Range Request 的.如果返回结果中不含 Accept-Ranges,则很有可能是不支持 HTTP Range Request 的.有的服务器会显式返回 Accept-Ranges: none 表示不支持 HTTP Range Request.

more...

XRPD 相关的一个小问题——关于 `thinclient_drives` 目录的错误

关于 XRPD 是什么,我就不废话了.它会在远程 Linux 主机的用户家目录下创建一个 thinclient_drives 目录,用于驱动器的映射.这个目录实际上应该是用 fuse 挂载的.但是有的时候会遇到该目录的权限错误,如下: d????????? ? ? ? ? ? thinclient_drives/ 它的权限位全部变成了问号.这个是因为挂载出现了问题.如果你尝试使用 fuser thinclient_drives 去分析它,会得到提示: 无法分析 /home/user/thinclient_drives: 传输端点尚未连接 或者 Cannot stat /home/user/thinclient_drives: Transport endpoint is not connected 实际上就是挂载出现了错误.如果你使用 XFCE 的文件管理器 Thunar,你甚至会无法打开文件管理器.解决方法很简单,只需要将其正确卸载即可: fusermount -u thinclient_drives Over. 参考:FUSE error: Transport endpoint is not connected

区域生长算法的一种实现

算法流程 选取种子点 QPoint seed(x, y),用栈来保存种子点区域,将种子点 push 到栈中. 将栈中的种子点 pop 出来,以该点为中心,遍历其八邻域. 判断邻域像素是否已经在种子区域中,若否则判断该像素是否满足生长条件,满足则将其作为新的种子点 push 到栈中. 重复步骤 2-3,直到栈为空. 代码实现 // seed 为种子点坐标 // threshold 为一个阈值,若邻域像素与种子点的灰度值之差小于这个阈值 // 则判定其满足生长条件 // // 这里默认使用了 Qt 的栈 QStack,图像的读写使用 CImg.h 库 void regionGrowth(const QPoint &seed, const int &threshold) { // 输入图像 CImg<int> img("test.png"); // 输出结果图像 // 这是一个全白的图片 CImg<int> result(img.width(), img.height(), img.depth(), img.spectrum(), 255); int T = threshold; // 用于存储坐标值的临时变量 int x, y; // 种子栈 QStack<QPoint> seeds; // 用于存储 pop 出来的种子的临时变量 QPoint currentSeed; // 将原始的种子压栈 seeds.

more...

什么是颜色相关直方图

正文 记 \( I \) 为一幅 \( n \times n \) 的图像,\( I \) 中的颜色可以量化为 \( m \) 种:\( c_{1}, c_{2}, \ldots, c_{m} \).对于一个像素 \( p = (x, y) \),记 \( I(p) \) 为他的颜色.记 \( I_{c} \triangleq \{ p \mid I(p) = c \} \),这样子的话,记号 \( p \in I_{c} \) 就等价于 \( p \in I, I(p) = c \).为了简单起见,作者使用无穷范数来度量两个像素之间的距离,即像素 \( p_{1} = (x_{1}, y_{1}), p_{2} = (x_{2}, y_{2}) \) 的距离为 \( \lvert p_{1} - p_{2} \rvert \triangleq \max \{ \lvert x_{1}, x_{2} \rvert, \lvert y_{1} - y_{2} \rvert \} \).记集合 \( \{ 1, 2, \ldots, n \} \) 为 \( [n] \).

more...