Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

Python——数字范围边界等问题

Posted on 2019-03-26

C++中不同类型的数字有自己不同的边界和范围,Python中呢?如何判断边界问题?


最大最小整数

C++

1
2
int minInt = 0x80000000;
int maxInt = 0xffffffff

Python

1
2
minInt = -0xffffffff
maxInt = 0xffffffff
  • Python中int大小为24个字节,数字太大时不会越界,会变为long类型,long类型的字节占位可以非常大(24以下为int,之后为long,分别可以为36,44,52,60等,每次8位递加?),不会越界

    • 测试:当一个数字太大时,使用int(a)强制字符转换也不能将数字转换为int类型,将一直为long类型
    • 测试: Python中24个字节存储一个int类型对象,但是并不是所有空间都存值,只有一部分用来存储数值
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      MinInt = int(0x80000000000000000)
      print MinInt
      import sys
      print sys.getsizeof(MinInt)
      print type(int(MinInt))

      # output:
      147573952589676412928
      36
      <type 'long'>
  • Python中定义最小负数时可以使用float最小值或者是很大的整数的负数,而不是像C++一样


最大最小浮点数

Python

1
2
minFloat = float("-inf")
maxFloat = float("inf")

ML——主成分分析-PCA

Posted on 2019-03-15

与TSVD的对比

  • 关于SVD的进一步了解可参考Math——奇异值分解-SVD
  • PCA与TSVD目标不同
  • TSVD奇异值与PCA分解得到的对角矩阵元素意义不同
    • PCA得到矩阵对角元素的是该维度的方差
    • TSVD得到的是某种重要的隐形意义(注意,不是方差)
  • PCA等价于下面两个步骤:
    • 对数据X中心化
    • 对数据做TSVD分解

与ICA的对比

  • ICA得到的变量满足独立性
  • PCA得到的变量满足不相关性
  • 独立与不相关的关系
    • 变量独立\(=>\)变量不相关
    • 变量不相关\(\neq>\)变量独立
    • 当变量是正态分布时:变量独立\(<=>\)变量不相关

Tips——一些有用的tips总结

Posted on 2019-03-13

本文对一些程序员日常可能用到的小tips进行总结和记录


海量字符串的合并

问题描述

  • 将大量的(现实遇到的是18W+级别的句子,句子长度平均在100个字符以上)字符串需要合并为一个字符串

  • 如果直接迭代并使用下面的语句合并,花费很多时间,随着字符串的增大,合并速度越来越慢

    1
    2
    all_texts += " %s" % text
    all_texts = "%s %s" % (all_text, text)
  • 现实生活中发现到了5000个字符串以上时速度变得极慢

解决方案

  • 分批次合并,将词语分批次分别合并为一个比较小的,最后再合并到一起
    • 实际中我按照2000个句子一份合并完成,再最终合并,速度提升了非常多

Python——队列和栈使用

Posted on 2019-03-03

本文从总结Python中栈和队列的基本使用
Python 中queue模块是线程安全的,为多线程任务设计的,没有peek()操作

  • 双端队列(deque)是一个具有栈和队列性质的数据结构,可以从两端弹出

普通的栈和队列

栈

list实现栈
1
2
3
4
5
6
7
8
9
10
11
# init
stack = list()
# push
stack.append(1)
# pop
stack.pop()
# peek
top = stack[-1]
# determine whether it is empty
if len(stack) == 0:
print("stack is empty")
deque实现栈
1
2
3
4
5
6
7
8
9
10
11
12
from collections import deque
# init
stack = deque([1, 2, 3])
# push
stack.append(4)
# pop
stack.pop()
# peek
top = stack[-1]
# determine whether it is empty
if len(stack) == 0:
print("stack is empty")

队列

list实现栈
1
2
3
4
5
6
7
8
9
10
11
12
# init
queue = [1, 2, 3]
# push
queue.append(4)
# pop
queue.pop(0)
# peek
first = queue[0]
last = queue[-1]
# determine whether it is empty
if len(queue) == 0:
print("queue is empty")
deque实现队列
1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import deque
# init
queue = deque([1, 2, 3])
# push
queue.append(4)
# pop
queue.popleft()
# peek
first = queue[0]
last = queue[-1]
# determine whether it is empty
if len(queue) == 0:
print("queue is empty")

线程安全的栈和队列

queue模块实现队列和栈

1
2
3
4
5
6
7
8
9
10
11
import queue
# init, stack and queue
sstack = queue.LifoQueue()
squeue = queue.Queue()
# push
sstack.put(item)
# pop
sstack.get()
# determine whether it is empty
if sstack.empty():
print("sstack is empty")

Centos——硬盘操作-分区和挂载

Posted on 2019-02-24
  • 参考博客:https://www.cnblogs.com/lizhangshu/p/9719018.html

磁盘分区类型

  • 三种分区
    • 主分区
    • 扩展分区
    • 逻辑分区
  • 分区规则
    • 主分区 + 扩展分区的数量不能超过4个
    • 扩展分区只能有1个
    • 逻辑分区要在扩展分区之上进行划分,逻辑分区没有数量限制,可以任意个
    • 扩展分区是不能直接用的,他是以逻辑分区的方式来使用的,所以说扩展分区可分成若干逻辑分区。他们的关系是包含的关系,所有的逻辑分区都是扩展分区的一部分。
  • 硬盘的容量
    • 硬盘容量 = 主分区的容量 + 扩展分区的容量
    • 扩展分区的容量 = 各个逻辑分区的容量之和
  • 为什么 主分区 + 扩展分区数量不能超过4个
    • 主分区就是普通磁盘分盘,但是由于磁盘设备由大量的扇区组成,一个扇区的容量为512字节。磁盘的第一个扇区最为重要,记录了主引导记录与分区表信息。就第一个扇区而言,主引导信息记录需要占用466个字节,分区表64个字节,结束符占用2个字节;其中分区表中每记录一个分区信息就需要16个字节,所以最多只有4个分区信息可以记录在第一个扇区中,所以主分区+扩展分区的数量不能超过4个。但是为了创建更多的分区,就使用扩展分区做份下若干个分区的指针,划分若干个逻辑分区,来满足分区数大于4个的需求。扩展分区不需要挂载,但是可以格式化。

分区操作

  • 查看当前设备上的磁盘信息及分区信息

    1
    fdisk -l
  • 选取需要分区的磁盘

    1
    fdisk /dev/[disk_name]
    • 注意这里disk_name是硬盘名不是分区名称
    • 一般来说硬盘名都是sda, sdb, vda, vdb等
    • 一般来说硬盘sda上的分区名成为sda1,sda2等
  • 在进入分区磁盘后打印操作帮助

    1
    m
  • 新建分区

    1
    n
  • 选择是主分区还是扩展分区

    • 主分区

      1
      p
    • 拓展分区

      1
      e
  • 选择分区号[1-4]

    1
    1
  • 起始扇区

    1
    2048
    • 一般默认值即可
  • 结束扇区

    1
    +200G
    • 结束扇区在起始扇区基础上+200G, 表示该分区大小为200G
    • 默认是全部分配给当前分区

格式化分区

  • 先输入

    1
    mkfs.
  • Tab键,查看所有可能的命令

mkfs.bfs mkfs.exfat mkfs.ext3 mkfs.fat mkfs.msdos mkfs.vfat
mkfs.cramfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.ntfs

  • 用法

    1
    mkfs.ntfs
  • 说明:

    • mkfs.ntfs命令可以将文件分区为

挂载分区

  • 新建挂载文件夹

    1
    mkdir /mnt/data
    • 建议新建在/mnt/文件夹下
    • 比如我本地的机器为/mnt/SSD和/mnt/HDD

临时挂载

  • 分区临时挂载

    1
    mount /dev/[part_name] /mnt/[dir_name]
    • 没有文件系统的分区不能挂载
  • 分区临时卸载

    1
    umount /dev/[part_name]

开机重启自动挂载

修改文件
  • 查看想要挂载分区的UUID

    • 查看所有UUID

      1
      blkid
    • 查看某个分区的UUID

      1
      blkid /dev/[part_name]
  • 编辑文件

    1
    vim /etc/fstab
  • 添加

    1
    2
    UUID=[UUID_NUMBER]   /data/[dir_name]  ext4  defaults   0 0
    分区临时卸 挂载路径 分区格式 参数 是否备份 引导分区相关(引导分区为1,其他分区为0或者2)
修改生效的两种方式
  • 使用命令重新加载/etc/fstab的内容

    1
    mount -a
  • 重新启动机器

    • 如果配置有错机器可能无法正常进入系统,但是会进入Emergency模式,我们可以在Emergency模式下修改/etc/fstab然后重新启动来修复问题

Linux——NFS服务器和客户端的配置

Posted on 2019-02-24

以Centos7为例, Ubuntu相似


NFS Server

  • 安装nfs所需的所有组件

    1
    sudo yum -y install nfs*
  • 设置开机启动nfs和rpcbind服务

    1
    2
    systemctl enable rpcbind.service
    systemctl enable nfs-server.service
  • 启动nfs和rpcbind服务

    1
    2
    systemctl start rpcbind.service
    systemctl start nfs-server.service
  • 配置exports文件

    1
    2
    3
    4
    5
    vim /etc/exports
    >>> input
    /home/jiahong/SharedTest *(rw,no_root_squash,no_all_squash,sync)
    /home/jiahong/SharedTest 123.45.6.7(rw,no_root_squash,no_all_squash,sync)
    >>> input done
    • 这里的*号可以使用ip,表示只有这个ip可以访问共享文件
    • 使用*则表示所有ip均可访问,设置多个ip可以访问则可使用多行
  • 使exports的配置生效

    1
    exportfs -rv
    • -r生效
    • -v显示结果
  • 查看是否生效

    1
    exportfs

NFS Client

  • 安装nfs所需的所有组件

    1
    sudo yum -y install nfs*
  • 设置开机启动rpcbind服务

    1
    systemctl enable rpcbind.service
  • 启动rpcbind服务

    1
    systemctl start rpcbind.service
  • 查看服务器哪些目录可以共享

    1
    showmount -e serverip
  • 新建文件夹以作为mount目标

    1
    mkdir -p /mnt/nfs/shared_dir
  • 挂载操作

    1
    mount -t nfs serverip:server_dir client_dir
  • 查看挂载情况

    1
    df -h
  • 解除挂载

    1
    umount client_dir

相关问题

  • 客户端出现以下情况时, 一般是服务器防火墙有问题, 解决方案是下面的解开防火墙的命令

    • mount.nfs: No route to host
    • mount.nfs: Connection timed out
      1
      2
      3
      4
      5
      firewall-cmd --permanent --add-service=rpc-bind
      firewall-cmd --permanent --add-service=mountd
      firewall-cmd --permanent --add-port=2049/tcp
      firewall-cmd --permanent --add-port=2049/udp
      firewall-cmd --reload
  • 客户端出现以下情况时,说明客户端未umount但服务器解除文件夹了

    • mount.nfs: Stale file handle
    • umount: xx/xx: Stale file handle
      1
      2
      3
      umount -lf /xx/xx

      # then mount /xx/xx again

Linux——文件操作

Posted on 2019-02-24

本文记录一些Linux相关文件操作的常见问题


mv操作中断

  • 由于mv操作等价于先执行cp然后执行rm操作
    • 还在cp阶段,原始数据是完整的,删除目标文档就行
    • 如果已经进入rm阶段,那么说明目标文件时完整的,删除原始文件就行

硬链接与软链接

Linux中链接分为两类:硬链接(hard link)和软链接(soft link),软链接又称为符号链接(symbolic link)

  • 如果一个文件有多个硬链接,那么需要所有硬连接都被删除,当前文件才会被删除
    • 原始文件与硬链接是同一个物理地址的两个不同名字
    • 硬链接是相互的(个人理解: 一个普通的文件就可以理解为一个硬链接)
  • 如果一个文件有一个硬链接和多个软链接(符号链接),那么删除符号链接不影响原始文件
    • 只有文件的所有硬链接都没删除后文件才会被删除
    • 文件被删除后软链接也会自动失效,链接路径链接不上

Linux——服务器防火墙配置

Posted on 2019-02-24

本文介绍Linux下服务器防火墙的设置
更详细的描述可以参考博客:https://blog.51cto.com/andyxu/2137046


防火墙总结

  • iptables:内核层面的netfilter网络过滤器来处理
  • firewalld: 交由内核层面的nftables包过滤框架处理

Centos6

Centos6默认使用iptable作为防火墙

查看防火墙状态

1
service iptable status

关闭防火墙

  • 临时

    1
    servcie iptables stop
  • 永久

    1
    chkconfig iptables off

打开防火墙

  • 临时

    1
    servcie iptables start
  • 永久

    1
    chkconfig iptables on

Centos7

Centos7默认使用的时firewall作为防火墙, 默认使用systemctl管理服务,接下来介绍systemctl管理firewall服务的操作,其他服务也可用systemctl以类似方法管理,只需将filewall名称换成其他服务名称即可

  • 关于服务名称的命名
    • 一般来说都是正常名称后加上一位’d.service’,比如’firewalld.service’,’mysqld.service’等

安装

  • Centos7自带firewalld
  • Ubuntu:
    1
    sudo apt-get install firewalld

配置文件

  • /usr/lib/firewalld/
    • 系统配置,尽量不修改
  • /etc/firewalld/
    • 用户配置地址

关于systemctl的使用

  • 列出所有服务

    1
    systemctl list-unit-files
  • 列出所有打开的服务

    1
    systemctl list-unit-files|grep enabled
  • 列出某个服务

    1
    systemctl list-unit-files|grep [service name]

查看防火墙状态

1
firewall-cmd --state
  • 输出not running或者running

查看防火墙服务

  • 方法一

    1
    systemctl list-unit-files|grep firewalld.service
    • 输出firewalld.service disabled或者firewalld.service enabled
  • 方法二

    1
    systemctl status firewalld.service
    • 输出更详细的信息

开机启动

  • 禁止

    1
    systemctl disable firewalld.service
  • 允许

    1
    systemctl enable firewalld.service
  • 查看

    1
    systemctl is-enabled firewalld.service;echo $?

启动防火墙服务

  • 启动防火墙后默认只开放22端口,其他端口都关闭

    1
    systemctl start firewalld.service
  • 不能启动的解决方案

    1
    2
    systemctl unmask firewalld.service 
    systemctl start firewalld.service

关闭防火墙服务

  • 1
    systemctl stop firewalld.service

端口相关操作命令

  • 查看所有以开放端口

    1
    firewall-cmd --list-ports
  • 查看某个端口是否开启

    1
    firewall-cmd --query-port=8080/tcp
  • 开放端口

    1
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    • 命令含义:
      • –zone #作用域
      • –add-port=80/tcp #添加端口,格式为:端口/通讯协议
      • –permanent #永久生效,没有此参数重启后失效
  • 重启服务

  • 开放端口后需要重启服务才能生效*

    1
    firewall-cmd --reload
  • 移除指定端口

    1
    firewall-cmd --permanent --remove-port=8080/tcp

防火墙的域

域的作用
  • 一共9种,常用的就一种public,开放时把所有访问该端口的用户当做公共人员,不完全信任,trusted为完全信任:
    • block dmz drop external home internal public trusted work
    • 下面图片来自博客:https://blog.51cto.com/13503302/2095633
  • 在开放端口时,可以为其添加域(默认为public),不同的域代表不同的信任
域的操作
  • 查看默认zone

    1
    firewall-cmd --get-default-zone
  • 修改默认zone

    1
    firewall-cmd --set-default-zone=public

防火墙与SSH登录

默认启动firewall后,防火墙不会打开22端口[已测试],但为何还能正常ssh登录呢?

1
firewall-cmd --list-all

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

  • 从上面的输出中可以看出来ssh服务默认被开启防火墙了,所以无需开启22端口即可使用ssh指令登录到服务器
  • 同时开启的还有dhcpv6-client服务,这个服务用于ipv6的DHCP服务(为什么ipv4不需要这个服务呢?详情参考问答:https://unix.stackexchange.com/questions/176717/what-is-dhcpv6-client-service-in-firewalld-and-can-i-safely-remove-it )

Linux——查看服务器内核和系统版本

Posted on 2019-02-24

本文主要介绍Linux系统的内核版本和系统版本等信息用命令行如何查看


系统类型和版本

Centos

  • 文件存在表示为Centos

    1
    cat /etc/redhat-release
  • 上述指令同时会输出Centos版本

Ubuntu

  • 命令可以执行表示为Ubuntu

    1
    lsb_release -a
  • 执行下面命令可以看出Ubuntu的版本

    1
    cat /etc/issue

更进一步的内核信息

  • 内核名称

    1
    uname -s
  • 结点名称

    1
    uname -n
  • 内核发行号

    1
    uname -r
  • 处理器类型

    1
    uname -p
  • 操作系统

    1
    uname -o

Ubuntu——自动加载bashrc

Posted on 2019-02-24

本文描述了如何为Ubuntu用户创建默认的/.bashrc并设置自动加载/.bashrc


创建.bashrc

  • 如果.bashrc存在,则无需创建,很多程序安装时可能会自动创建,否则,需要我们复制一个

  • 复制命令

    1
    cp /etc/skel/.bashrc ~/
  • 亲测,无需复制,创建一个新的即可


使.bashrc生效

暂时生效

用户重新登录不会生效

1
source ~/.bashrc

永久生效

用户登录后默认生效

  • 新建或打开文件

    1
    vim ~/.profile
  • 添加下面的语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # ~/.profile: executed by Bourne-compatible login shells.

    if [ "$BASH" ]; then
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    fi

    mesg n
  • 保存后退出,以后默认的,我们登录后~/.bashrc即可生效

  • 马上生效~/.profile

    1
    source ~/.profile
1234…20
Joe Zhou

Joe Zhou

世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活。 ——罗曼·罗兰

195 posts
38 tags
GitHub E-Mail
© 2024 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4