python decorator

简单记录一下python修饰符@的理解和使用方法,一直没好好理解,现在卡住了。。。参考wiki的定义, A decorator is any callable Python object that is used to modify a function, method or class defination. The decorator syntax is pure syntactic sugar, using @ as the keyword.即python修饰符作为一种python对象,用来修饰函数、方法或者类。

参考Wiki,我们简单实现一个修饰符的样例,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def calculator(f):
print("Begin...")
a = 3.0
b = 2.0
f(a,b)
print("End")
@calculator
def calc_add(a,b):
print("%.2f + %.2f = %.2f" % (a,b,a+b))
@calculator
def calc_minus(a,b):
print("%.2f - %.2f = %.2f" % (a,b,a-b))

在ipython环境下执行,有如下结果,

1
2
3
4
5
6
Begin...
3.00 + 2.00 = 5.00
End
Begin...
3.00 - 2.00 = 1.00
End

所以,修饰符的用途,等价于如下情形,

1
2
3
4
5
6
7
>>> a = 3.0, b = 2.0
>>> print("Begin...")
>>> calc_add(a,b)
>>> print("End")
>>> print("Begin...")
>>> calc_minus(a,b)
>>> print("End")

最直观的理解就是decorator简化了calculator()中的部分代码。正如wiki中的解释:Decorators are a form of metaprogramming; they enhance the action of the function or method they decorate.

这篇博客还分析了修饰符嵌套的执行顺序问题,感兴趣可以参考一下。

References

[1] Python syntax and semantics#Decorators
[2] Python修饰符 (一)—— 函数修饰符 “@”

Comment and share

cpp notebook 1

生成CPP应用程序的步骤,

  1. 编写cpp代码;
  2. 使用编译器对代码进行编译,将代码转换为包含在目标文件中的机器语言版本;
  3. 使用链接器链接编译器的输出,生成可执行文件,如.exe

编译器每次转换一个代码文件,都会生成一个扩展名为.o.obj的目标文件,忽略这个cpp文件与其他文件中代码的依赖。解析这些依存关系的工作由链接程序负责。

集成开发环境 (integrated development environment, IDE)
Tip:online IDE

强烈安利visual studio code,一个轻量级的IDE,支持多种语言(java, python, c/c++)以及文本编辑器(vim)。

下面以’Hello World’来入门,并说明VS code的使用步骤,还是有点麻烦的。。。

  1. MinGW
  2. GNU C++

CPP中,一条语句可以跨越多行;还可在一行中包含多条语句,只要每条语句都以;结尾

预处理器编译指令#include

1
2
#include <> // 标准头文件
#include "..." // 用户自建的头文件

除非明确声明了不返回值,否则函数必须有return语句

名称空间的概念:给代码指定的名称,有助具降低命名冲突的风险。
例如std,用来调用获得ISO标准委员会批准的函数、流和工具给代码指定的名称,有助具降低命名冲突的风险。
例如std,用来调用获得ISO标准委员会批准的函数、流和工具。其声明方法是”using namespace”

C++中的main函数必须返回int,没有void main这种定义方式,

1
2
int main(void)
int main(int argc, char *argv[])

定义变量
VariableType VariableName;
VariableType VariableName = InitialValue;
变量类型向编译器指出了变量可存储的数据的性质,编译器将为变量预留必要的空间。

最高有效位 most significant bit
最低有效位 least significant bit

新特性

C++14的chunking separator,即用但引号作为组块分隔符,例如

1
int x = 100'000;

测试了一下,gcc-7.2支持这一新的标准,但是gcc-5.5还不支持,Check 一下

sizeof 用于确定变量的长度,是个运算符。。。

1
sizeof(int)

C++11中引入的列表初始化避免缩窄转换错误,造成执行中隐藏的bug
例如,如下的代码,就会有这样的警告,并且无法编译通过,但直接写就不会警告

1
2
3
4
...
int16__t largeNumber = 257;
int8_t smallNumber = largeNumber; // No warning
int8_t smallNumberList = {largeNumber}; // warning| narrowing conversion of

auto自动推断类型
如果使用的编译器支持C++11或更高的版本,可以不显式地指定变量的类型,即

1
auto flag = True; // flag将被设定为bool

注意:使用auto时,必须对变量进行初始化。

使用typeof替换变量类型
C_++允许将变量类型替换为认为方便的名称,例如

1
2
typedef unsigned int STRICTLY__POSITIVE_INTEGER;
STRICTLY_POSITIVE_INTEGER num = 1234;

Comment and share

趁着最近空闲一点,继续纠结TensorFlow学习率调整的问题。学习率对网路训练的影响还是挺大的,初始化时可以采用大的学习率,帮助网络快速收敛。但网络的梯度是非线性的,随着迭代次数的增加,梯度的导数趋于变小,如果继续保持大学习率,会出现优化目标在最优解附近波动的情况,如下图所示。此时,为了接近收敛点,需要调整学习率。

参考TensorFlow: 实战Google深度学习框架这本书,利用指数衰减的方法设置梯度下降算法的学习率,TensofFLow中集成了这一算法,即tf.train.exponential_decay。其实现了

其中$L_R$表示学习率,$R_d$表示衰减率,$S_g$和$S_d$分别表示总Epochs和每个Epochs中的Batches。从而没迭代一轮,学习率便更新一次。

在TensorFlow中可以用如下代码实现指数衰减的学习率更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
import tensorflow as tf
init_lr = tf.Variable(0., name="LR")
global_step = tf.Variable(0., name="global_step")
decay_step = tf.Variable(0., name="decay_step")
decay_rate = tf.Variable(0., name="decay_rate")
learning_rate = tf.train.exponential_decay(
learning_rate = init_lr ,
global_step = global_step,
decay_steps = decay_step,
decay_rate = decay_rate,
staircase=False,
name=None
)
# Test
lr_init = 0.1
epochs = 200
batches = 100.
d_rate = 0.9
epoch = np.arange(0,epochs,1)
lr = np.zeros(epoch.shape)
# Init a session
init_op = tf.global_variables_initializer()
sess = tf.InteractiveSession()
sess.run(init_op)
for i in epoch.astype(int):
lr[i] = sess.run(learning_rate,
feed_dict={init_lr: lr_init,
global_step: i,
decay_step: batches,
decay_rate: d_rate
})

这里提供了一个样例,其输出结果如下图,通过设置tf.exponential_decay的参数staircase可以控制learning rate是否为阶梯型或者平滑的。

而在训练网络,优化目标函数的过程中,可以参考官方手册,用如下语句进行梯度更新。

1
2
3
4
5
6
7
8
9
10
...
global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
100000, 0.96, staircase=True)
# Passing global_step to minimize() will increment it at each step.
learning_step = (
tf.train.GradientDescentOptimizer(learning_rate)
.minimize(...my loss..., global_step=global_step)
)

Reference

[1] exponential decay

Comment and share

继续debian test的坑,如何用apt-get,安装和配置Nvidia CUDA,并解决无法进入桌面的问题。

软件源的配置

CUDA 属于第三方软件,debian的源中默认是没有的,需要手动添加。添加方法如下:

1
2
3
4
5
6
7
$ cd /etc/apt/sources.list.d
$ sudo touch debian-testing.list
$ sudo vim debian-testing.list
# 加入如下两个源
deb http://mirrors.ustc.edu.cn/debian/ testing main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian/ testing main contrib non-free
$ sudo apt update

此时,利用apt search cuda,便能找到cuda的安装包了,类似如下的结果

1
2
nvidia-cuda-toolkit/testing,now 8.0.61-3 amd64 [installed]
NVIDIA CUDA development toolkit

这里显示installed,是因为我已经安装好了。

安装 CUDA

添加好软件源后,利用apt install便可以安装,但这之前需要中止图形界面的程序,并禁止系统自带的显卡驱动,具体步骤如下。

禁止系统显卡驱动
1
2
3
4
5
6
7
$ cd /etc/modprobe.d
$ sudo touch nvidia-blacklists-nouveau.conf
$ sudo vim nvidia-blacklists-nouveau.conf
# Add
blacklist nouveau
# 保存并退出,重启显卡服务
$ sudo update-initramfs -u

此时,再执行lsmod | grep nouveau,若没有显示,则说明配置成功。

中止图形界面并安装CUDA

同时按Ctrl+Alt+F2进入Console界面,以用户或者root身份登录,执行如下如下指令,

1
2
$ systemctl stop lightdm.service # 若使用的是gdm3,则为gdm3.service
$ sudo apt install nvidia-cuda-toolkit

此时,便开始安装CUDA,其中包含了CUDA的一些library和与显卡对应的NVIDIA驱动,例如我安装的驱动为nvidia-384.111

安装Xserver-xorg-video-nvidia

这一点单独提出来,是因为我在这里卡了好久。。。因为每安装Xorg对应的驱动,导致开机以后无法进入桌面,这一点Ubuntu真的做得很好。。。
在师兄的指导下,找到了问题,下面先列出安装了Xserver-xorg-video-nvidia前后Xorg.0.log的区别,

  1. 未安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [ 2891.835] (EE) Failed to load module "nv" (module does not exist, 0)
    [ 2891.835] (II) LoadModule: "modesetting"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/modesetting_drv.so
    [ 2891.835] (II) Module modesetting: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.5, module version = 1.19.5
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) LoadModule: "fbdev"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so
    [ 2891.835] (II) Module fbdev: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.0, module version = 0.4.4
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) LoadModule: "vesa"
    [ 2891.835] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so
    [ 2891.835] (II) Module vesa: vendor="X.Org Foundation"
    [ 2891.835] compiled for 1.19.0, module version = 2.3.4
    [ 2891.835] Module class: X.Org Video Driver
    [ 2891.835] ABI class: X.Org Video Driver, version 23.0
    [ 2891.835] (II) NOUVEAU driver Date: Fri Apr 21 14:41:17 2017 -0400
    [ 2891.835] (II) NOUVEAU driver for NVIDIA chipset families :
    [ 2891.835] RIVA TNT (NV04)
    [ 2891.835] RIVA TNT2 (NV05)
    [ 2891.835] GeForce 256 (NV10)
    [ 2891.835] GeForce 2 (NV11, NV15)
    [ 2891.835] GeForce 4MX (NV17, NV18)
    [ 2891.835] GeForce 3 (NV20)
    [ 2891.835] GeForce 4Ti (NV25, NV28)
    [ 2891.835] GeForce FX (NV3x)
    [ 2891.835] GeForce 6 (NV4x)
    [ 2891.835] GeForce 7 (G7x)
    [ 2891.835] GeForce 8 (G8x)
    [ 2891.836] GeForce GTX 200 (NVA0)
    [ 2891.836] GeForce GTX 400 (NVC0)

系统此刻找不到nv有关的驱动,而我又禁止了nouveau,所以无法进入图形界面。而在安装了相应的驱动以后,日志如下

  1. 已安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    [ 38.430] (II) Applying OutputClass "nvidia" to /dev/dri/card0
    [ 38.430] loading driver: nvidia
    [ 38.430] (==) Matched nvidia as autoconfigured driver 0
    [ 38.430] (==) Matched nv as autoconfigured driver 2
    [ 38.430] (==) Matched nv as autoconfigured driver 4
    [ 38.430] (II) LoadModule: "nvidia"
    [ 38.431] (II) Loading /usr/lib/xorg/modules/drivers/nvidia_drv.so
    [ 38.437] (II) Module nvidia: vendor="NVIDIA Corporation"
    [ 38.440] (II) LoadModule: "nv"
    [ 38.440] (WW) Warning, couldn't open module nv
    [ 38.440] (II) UnloadModule: "nv"
    [ 38.440] (II) Unloading nv
    [ 38.440] (EE) Failed to load module "nv" (module does not exist, 0)
    [ 38.997] (==) NVIDIA(0): No modes were requested; the default mode "nvidia-auto-select"
    [ 38.998] (II) NVIDIA(0): "DFP-0:nvidia-auto-select"
    [ 39.015] (II) NVIDIA(0): Setting mode "DFP-0:nvidia-auto-select"
    [ 39.072] (II) NVIDIA(0): [DRI2] VDPAU driver: nvidia

此刻,虽然有warning,但error已经没有了,系统也可以正常进行到登录部分。此刻查看系统显卡驱动信息,会发现出现了nvidia,如下

1
2
3
4
5
6
$ lsmod | grep nvidia
nvidia_drm 53248 1
drm_kms_helper 192512 1 nvidia_drm
drm 438272 4 nvidia_drm,drm_kms_helper
nvidia_modeset 860160 3 nvidia_drm
nvidia 13168640 84 nvidia_modeset

安装方法,直接用apt install即可,不再赘述。

最后,讲一下调整Desktop Manager的方法,留做一个tip。可供选择的DM有很多,如lightdm,gdm3,kde等,其中lightdm用得比较多,毕竟ubuntu的用户量很大。那么,如果想要在它们之间进行切换的话,用如下方法

1
$ sudo dpkg-reconfigure lightdm

在弹出的窗口中选择想要采用的桌面管理器即可。

Comment and share

美好的周日贡献给重装系统了,因为又手残了。既上周日删除了自己的home目录以后,这周直接把系统的权限折腾乱了,起因是我用了sudo chown -R,系统真的有提示我的。。。所以是我的锅。

近期使用的系统是Ubuntu-16.10,考虑到Meltdown-Spectre漏洞的补丁还不支持,想着换个系统算了,就入了debian的坑。。。嗯,这个坑更大!!!

于是,一边填坑,一边记录一下步骤,有种预感最近还是会折腾系统。

debian系统安装

debian-testing的iso下载路径,可以在USTC的镜像站找,我尝试安装debian-9,可能刻录的时候有问题,无法安装,所以改用了network install的版本。使用了UltraISO烧写到U盘里,他们的试用版功能已经足够了。烧写好以后开始安装,按流程走就行。这里要注意的地方是: 挂载/目录的分区需要格式化,否则无法安装。主要原因是与原有的ubuntu系统文件存在冲突。

多系统引导

Debian采用grub引导多系统,我是在win10基础上安装Linux系统的,并通过debian引导windows。在重装的过程中,碰到了windows分区没有被读出并列在引导列表中的情形,有一个简答的解决方法,更新一下grub配置, 即update-grub

1
$ sudo update-grub

一般更新后的列表后会出现对应windows的分区和条目。当然这个是运气,如果碰到其他问题,建议问谷歌。。。

系统配置

我选择了gnome桌面环境,系统本身还是很好看的,但也有一些bug,比如gnome-terminal就很丑。。。除此之外,debian比ubuntu预装的软件少很多,例如常用sudolocate等都需要自己安装,对新手来说比较坑。下面说一下我的配置过程,

terminal shortcuts

Ubuntu默认的terminal快捷键是Ctrl+Alt+T,debian是没有这个快捷键的,需要自己添加。具体的思路是

1
system setting -> devices -> keyboard -> "+" -> add a new shortcut

Terminal默认的shell通常为bash,如果要更换为其他的,例如zsh, 则执行如下指令即可

1
$ chsh -s /usr/bin/zsh

此处会提示用户输入密码。

sudoer 及 sudo安装

打开terminal以后,便可以安装和配置软件,此时需要sudo来临时使用root权限,debian默认不将用户添加到sudoer列表里,因此需要手动添加,步骤如下,

1
2
3
4
5
6
7
8
9
10
11
首先按Ctrl+Alt+F3,进入console,以root身份登录,在安装系统时会要求设置root的密码
进入以后,执行如下步骤
1. 添加user到root的group里
# usermod -G root user
2. 修改sudoers文件为可写
# chmod +w /etc/sudoers
3. 编辑sudoers文件,添加用户
# vim /etc/sudoers
# user ALL=(ALL:ALL) ALL
4. 修改sudoers文件为只读
# chmod -w /etc/sudoers

再按Ctrl+Alt+F1回到图形界面,此时便可以用root权限安装sudo,并进一步安装其他软件了。

系统语言及locale配置

由于要使用中文,我通常会用中文安装系统,再修改系统为英文。在Ubuntu中,直接在设置中设置语言即可;在debian中会更纯粹一些,即设置系统语言并调整locale的配置。

1
2
$ sudo vim /etc/locale.gen
# 将需要的语言反注释掉,如 en-US.UTF-8

再在system setting中调整语言支持即可,或者执行如下指令进行设置。

1
$ sudo dkpg-reconfigure locale

时区调整

改变语言为英文后,系统会采用UTC时间,此时会出现即使时区选择为Asia/Shanghai,依然与北京时间相差八个小时的情况,这也说明系统与Network Time没有同步,解决方法如下,

1
2
$ sudo apt install ntpdate
$ sudo ntpdate time.windows.com

即将系统时间与windows提供的网络时间同步,这样便会根据系统时区找到对应的时间了。

Genome 窗口调整问题

gnome默认的窗口控件没有最大化和最小化,刚转过来会不习惯,解决方法是在genome-tweak-toolwindows选项中进行设置。

gnome-terminal 无法正常运行

这个通常与调整了系统语言相关,即locale的语言设置与系统语言冲突,或未设置,导致genome-terminal无法初始化窗口,解决方法是,

1
# echo "LANG=zh-CN.UTF-8" >> /etc/locale.conf

系统切换以后block size的问题

这个情况比较特殊,实验室可能只有我碰到过。在一块SSD上安装了windows和linux双系统,并且上一次运行的系统是windows, 则开机后因为ext4分区的block错误,导致无法引导进入Linux,目前有两个指令可以解决这一问题,并且要求有livecd USB,即能独立引导的最小化系统。可用的指令分别为fscke2fsck,二者的区别,我争取专门写一篇,目前还不太理解。

首先用sudo fdisk -l查看文件格式为ext3/ext4的分区,着重关注包含有Linux系统的主分区,然后修复block的问题。

  1. fsck

    1
    # fsck -t ext4 /dev/sda1
  2. e2fsck

    1
    2
    # e2fsck -b 32768 /dev/sda1
    -b 表示 superblock,具体的解释<TODO>...

Comment and share

今天讨论网页视频流抓取问题,针对Firefox浏览器,有两种方法。

  1. 直接从Firefox的缓存中获取;
  2. 利用flash流的进程号,在系统/proc下抓取缓存的数据流。

Firefox 缓存提取

Firefox的缓存保存在如下的路径中,其中f176xa6s.default不同的用户会不同,其他路径成分基本相同。

1
~/.cache/mozilla/firefox/fl76xa6s.default/cache2/entries

进入缓存文件夹后,便可以根据时间和文件大小搜索缓存文件。因为文件名是16进制编码的,无法体现文件内容,所以不考虑。

1
$ ls -lSt

其中-S表示按文件大小排序,-t表示按时间先后排序。

通常视频文件大小为MB量级,所以一般排序在前的几个文件会是缓存的视频。

Firefox flash flow 抓取

从Firefox网页抓取flash插件播放的视频流的步骤分为三步,(1) 打开视频、(2) 获取flash播放进程ID、(3) 视频流转存。

Step1 打开视频

在浏览器播放视频,此处需要firefox支持flash,或者安装adobe flash插件。

Step2 获取flash播放进程ID

利用lsof抓取正在运行的Flash进程,如下

1
$ lsof | grep Flash

会输出如下类似的结果,其中31346即为目标ID.

1
plugin-co 31346 user 26u REG 8,5 4561004 787806 /tmp/FlashXXJa3CWn (deleted)

Step3 视频流转存

参考博客: Linux下的浏览器播放flv视频都是采用的Flash播放器,而Flash播放器在播放每个视频的时候都会在/tmp目录下创建以“Flash”字样开头做标识的缓存文件,但是如果我们进入到/tmp目录下察看所有文件,却找不到正在播放的缓存文件,因为这些视频缓存文件只有系统可见,对用户是隐藏的。因此,我们可以根据Flash进程的ID,进入系统进程文件/proc下,获取缓存的视频流。

1
2
3
$ ls /proc/31346/fd
# 找到类似如下的行,其中 26 便是视频流缓存
lrwx------ 1 user user 64 Jan 12 12:07 26 -> /tmp/FlashXXJa3CWn (deleted)

利用cat管道,将数据流输入到.flv文件中。

1
$ cat /proc/31346/fd/26 > ~/Desktop/test1.flv

视频格式转换

利用mencoder可以对视频文件进行格式转换,

1
$ mencoder -ovc lavc -lavcopts vcodec=mpeg4 -oac mp3lame source.flv -o dest.mp4

其中参数含义如下,参考了此文

  • -ovc lavc:(output video codec)指定输出视频文件的视频编码类型,此处选择的是 Libavcodec 的视频编码;

  • -lavcopts vcodec=mpeg4:(Libavcodec options)指定视频编码的设置,由于 Libavcodec 包含了多种视频编码,所以用 vcodec=mpeg4 来指定具体的使用 MPEG-4 编码;

  • -oac mp3lame:(output audio codec)指定输出媒体文件的音频编码类型,此处选择的是 mp3lame;

References

[1] Linux下提取保存浏览器中的视频
[2] linux下视频格式转换工具

Comment and share

To be continue…

蒙特卡罗方法帮助产生服从样本分布的新样本,并且实现参数的估计,是一种基于贝叶斯统计的算法。机器学习中的许多重要工具都基于从某种分布中采样,以及用这些样本对目标量做一个蒙特卡罗估计。

Why sampling and Monte Carlo?

当无法精确计算和或积分时,通常可以使用蒙特卡罗采样来近似。这种想法把和或积分视作某分布下的期望,然后通过估计对应的平均值来近似这个期望。而这里的估计用到了中心极限定理,即$\hat{s}_n$收敛到以s为均值,以$Var[f(x)]/n$为方差的正态分布。而马尔可夫链蒙特卡罗方法(MCMC),就是用一种方式构建一个收敛到目标分布的估计序列。

Comment and share

Libsvm for python

Happy new year!! Feel blue but still have to work.

I am gonna introduce the application of a famous package namely libsvm, which realizes the support vector machin (SVM) based algorithms and supports multiple programming languages. I have designed SVM based approaches for machine-learning tasks on MATLAB by the libsvm, which is very awsome. Now, it’s time to try it on python, though it has been encapsulated in the SciPy.

To use libsvm on python, you may follow the coming steps.

  1. Download the package

    1
    $ wget -O libsvm.tar.gz http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz
  2. unzip the package

    1
    $ tar -xvf libsvm.tar.gz
  3. Installization

    1
    2
    $ cd libsvm-3.22
    $ make

If it generates four svm- prefixed files as well as the library libsvm.so.2, then the installization is completed.

Now you can take a trial with provided python based utilities in the folder ./python. For instance,

1
2
3
4
5
6
7
8
9
10
11
12
>>> from svmutil import *
>>> y, x = svm_read_problem('../heart_scale') # load data
>>> m = svm_train(y[:200], x[:200], '-c 4') # train a SVM model
# This will output like,
*.*
optimization finished, #iter = 257
nu = 0.351161
obj = -225.628984, rho = 0.636110
nSV = 91, nBSV = 49
Total nSV = 91
>>> p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m) # make a test
Accuracy = 84.2857% (59/70) (classification)

Note

As introduced by the README in the ./python folder, two .py scripts are provided, of which svm.py and svmutil.py are corresponding to low-level and high-level use of the interface. In my opinion, I suggest the users to directly use svmutil.py.

In addition, the python scripts rely on the libsvm.so.2, which should be added into the LD_LIBRARY_PATH or a package not find exception will be raised when import svm.

Now, time to do your machine learning work.

Comment and share

Ubuntu server的防火墙配置问题,包括新用户添加、防火墙规则设定以及ssh的简单设置,写得比较简单,慢慢理解以后来填坑。主要的references见文末,另外说一句 Merry Xmas!

Change or update root pwd

修改或者初始化root的密码,如下

1
2
3
sudo passwd root
New password: xxxx
Retype new password: xxxx

Add a new user

Ubuntu server在安装好以后只有Root用户,为了方便管理,通常需要添加一个用户以方便管理,并且为了服务器的安全性,需要配置ssh的key only和防火墙。

1
2
3
4
5
6
7
8
9
10
11
sudo apt update # optional
sudo apt upgrade # optional
sudo apt install vim # install vim, optional
sudo adduser jason # Add a new user
sudo usermod -G root jason # Add user jason into Group root
# Add sudoer authority
sudo chmod u+w /etc/sudoers # Change sudoers from readonly to writtable
sudo vim /etc/sudoers
# Add the line below root ALL=(ALL:ALL) ALL
jason ALL=(ALL:ALL) ALL
sudo chmod u-w /etc/sudoers # Rechange mode of sudoers to readonly

SSH confiurations

ssh配置方便远程访问server,主要的配置包括端口修改、aurhorized_keys以及一些有助于安全性的配置。

1. 生成本机的Authentication key-pair
1
ssh-keygen -b 4096

选择默认的id_rsaid_rsa.pub存储密钥对,并且选择不设定密码。

2. 添加该用户的public key到server中
1
2
3
4
5
6
mkdir ~/.ssh
cd ~/.ssh
touch authorized_keys
vim authorized_keys
# Add your public key into this file like
ssh-rsa xxxxx user@xxx
3. 配置ssh端口及相应的安全选项

sshd的配置文件存放在/etc/ssh/sshd_config中,

1
2
3
4
5
6
7
vim /etc/ssh/sshd_config
# change port
Port 2333 # 默认的端口号为22,此处建议修改为其他值
# 禁止root登录
PermitRootLogin no
# 禁止密码验证
PasswordAuthentication no

4. 重启ssh服务

配置完成后,重启sshd服务,如下

1
sudo systemctl restart sshd

UFW configuration

详细的UFW配置参考这篇文章,下面列出我的配置并对解释。

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt install ufw
# allow all outgoing and deny all incoming
sudo ufw default allow outgoing
sudo ufw default deny incoming
# allow ssh
sudo ufw allow ssh
# allow tcp udp http
sudo ufw allow 80/tcp
sudo ufw allow http/tcp
sudo ufw allow 1725/udp
# enable ufw
sudo ufw enable

sudo ufw status查看ufw的运行状态和配置结果,若显示如下列表,则说明配置好了,

1
2
3
4
5
6
7
8
9
10
Status: active
To Action From
-- ------ ----
80/tcp ALLOW Anywhere
1725/udp ALLOW Anywhere
2333 ALLOW Anywhere
80/tcp (v6) ALLOW Anywhere (v6)
1725/udp (v6) ALLOW Anywhere (v6)
2333 (v6) ALLOW Anywhere (v6)

References

Comment and share

Ubuntu自启动用户脚本的问题,流行的两种方法可以参考文末的References,此处讨论的是在user的start up里添加自定义脚本。

Step1 prepare your script

准备待执行的脚本并修改权限为可执行,如下

1
2
3
4
$ cd ~/local/
$ touch myscript.sh
$ vim myscript.sh # Add the lines you want to execute...
$ chmod +x myscript.sh # Change mode to executable

Step2 configure the .conf file

编写配置文件,放入~/.config/upstart/中,例如

1
2
3
4
5
6
7
$ cd ~/.config/upstart
$ touch myscript.conf
$ vim myscript.conf
#### configurations to be added.
start on startup
task
exec /home/usrname/local/myscript.sh

Step3 log out and relogin

重新登录,检验是否实现myscript.sh的自启动

References

Comment and share

Author's picture

Jason Ma

We are in the same story.


Astronomer? Software engineer


Shanghai