osinovsky

osinovsky 查看完整档案

合肥编辑中国科学技术大学苏州研究院  |  计算机应用技术 编辑  |  填写所在公司/组织填写个人主网站
编辑

我们将会做到

个人动态

osinovsky 赞了回答 · 9月21日

解决为什么Python的类型标注没有对类型进行检查?

给你一个参考的方案吧 自己可以来实现这个功能 我是在python cookbook看到的一个实现 用这个装饰器可以强制类型检查 不然就报错

from functools import wraps
from inspect import signature
def typeassert(*ty_args, **ty_kwargs):
    def decorate(func):
        # If in optimized mode, disable type checking
 if not __debug__:
            return func
 # Map function argument names to supplied types
 sig = signature(func)
        bound_types = sig.bind_partial(*ty_args, **ty_kwargs).arguments
        @wraps(func)
        def wrapper(*args, **kwargs):
            bound_values = sig.bind(*args, **kwargs)
            # Enforce type assertions across supplied arguments
            for name, value in bound_values.arguments.items():
                if name in bound_types:
                    if not isinstance(value, bound_types[name]):
                        raise TypeError('Argument {} must be {}'.format(name, bound_types[name])
                                        )
            return func(*args, **kwargs)
        return wrapper
    return decorate

`

关注 3 回答 2

osinovsky 提出了问题 · 9月18日

解决为什么Python的类型标注没有对类型进行检查?

尝试了一下Python的类型标注(Type Hinting),但是发现Python并没有帮我检查类型。

from typing import *

L : List[Tuple[int, str]] = {x:x+10 for x in range(10)}
print(type(L), L)

L应该被标记为整型与字符串元组的列表,但它接受了字典

<class 'dict'> {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}
def foo1(a : str, b : float) -> None:

 print(type(a), type(b))

foo1([1,2,3,4], 20)

foo1应该接受字符串和浮点数作为参数,但它接受了列表和整型,也没有进行隐式类型转换

<class 'list'> <class 'int'>
def foo2(s : str, l : List[int]) -> Set[str]:

 return str([str(x) + s for x in l])

print(type(foo2('#', list(range(10)))))

foo2 应该返回一个字符串集合,但它接受了字符串

<class 'str'>
def foo3(a : int) -> int:

 return a/3.678

print(type(foo3(10)), foo3(10))

同理,foo3返回了浮点数

<class 'float'> 2.718868950516585

更复杂的类型标注我还没有尝试,但标注之后既没有报错也没有提示我觉得有点奇怪,难道typing只是给开发者当提示的吗?

关注 3 回答 2

osinovsky 赞了文章 · 8月24日

ArchLinux搭建高效便捷的平铺式桌面

一不注意竟然已经三个多月没写文章了,十一月份总算找到感觉比较满意的实习工作了,同时把近视给弄好了,已经有十多年没有这么清晰地看过这个世界了:-D

前言

关于ArchLinux请自己谷歌度娘,由于整个工作环境都是自己从头开始搭建的,最是熟悉和顺手,再加上神器yaourt滚动更新(一年多来未滚挂过),十分给力的Wiki,简直爱不释手。
笔者已经在主力机上运行这套工作环境一年多,暂未感到任何不适。

如果对Linux不是很熟悉且不太乐于折腾的请绕过。

搭建完成后大概是下面这个样子:
预览

桌面使用i3-gaps(i3wm的分支)+py3status+i3lock+LilyTerm

  1. 选择平铺桌面管理器是因为可以自动排列所有打开的窗口,所有窗口操作使用快捷键实现最大化利用工作区最大化利用屏幕空间占用资源小
  2. 选择i3-gaps是因为i3wm的本身配置非常简单,i3-gaps在它的基础之上增加窗口间隙调整的支持,方便把桌面弄得更漂亮一些。
  3. 选择py3staus是因为它支持更多的插件和属性配置。截图中右下角显示的信息分别是:

内存 内存使用率|cpu使用率|cpu温度|下行速度上行速度|未读邮件数|当前时间|音量|单机截图|DPMS|其他软件

  1. 选择LilyTerm是因为易于配置和对中文支持比较好。

整个桌面最多可以开启10个工作区,我的布置是这样的:

  1. 窗口1(1:Info)用来运行glances+系统命令
  2. 窗口2(2:Web)运行浏览器。
  3. 窗口3~8(3~8:Work)运行开发相关的程序。
  4. 窗口9(9:Other)虚拟机运行windows10。
  5. 窗口10(10:Other)运行音乐播放器。
  6. 同时在一个可切换显示和隐藏的小窗口中运行ydcv,需要翻译的时候就切换出来相当方便。

我说这么多1 2 3 4…………只为了说明一点:只要习惯了自己配置的快捷键和空间布局,工作效率飕飕地往上升。习惯了在平铺式的桌面中开发后,再回到windows这类层叠式的有种生不如死的感觉= =

基本系统的安装

ArchLinux的Wiki是十分完善的,且大多数常用的文档都有中文版,系统的安装主要也是参照Installation guide (简体中文)),如果按照以下流程安装系统时和官方Wiki有冲突,以官方Wiki为准。

  1. 执行ping www.baidu.com测试网络是否可用,安装过程中需要用到网络。
  2. 执行timedatectl set-ntp true设置时间自动同步。
  3. 执行fdisk -l查看要安装的目标硬盘,并用fdisk对硬盘进行操作,我要把系统安装到/dev/sda这个硬盘中。
  4. 执行fdisk /dev/sda,其中/dev/sda是步骤3中找到的,fdisk的详细使用方法请查阅Wiki,如果你的硬盘是GPT磁盘分区,要记得创建一个EFI分区。
    我是MBR磁盘分区,在进入fdisk工具后:

    1. 重复执行d命令直到删除所有已有分区。
    2. 执行n命令创建分区,Partition typePartition numberFirst sector直接回车用默认值,Last sector输入+512M表示给该分区分配512M大小的空间。
    3. 执行n命令创建根分区,分配45G的空间
    4. 执行n命令并一路回车,把硬盘所有剩余空间都给home分区, 如果有需要的话也可以选择再分配一个swap分区。
    5. 执行p命令查看是否和预想中的分区情况一致。
    6. 如果上一个步骤没问题的话,执行w命令保存并退出。
  5. 执行mkfs.ext4 /dev/sda1格式化/dev/sda1分区为EXT4格式。
  6. 执行mkfs.ext4 /dev/sda2格式化/dev/sda2分区为EXT4格式。
  7. 执行mkfs.ext4 /dev/sda3格式化/dev/sda3分区为EXT4格式。
  8. 执行mount /dev/sda2 /mnt挂载根分区。
  9. 执行mkdir /mnt/bootmkdir /mnt/home分别创建boot分区和home分区的挂载点。
  10. 执行mount /dev/sda1 /mnt/bootmount /dev/sda3 /mnt/home分别将对应的分区挂载好。
  11. 执行vim /etc/pacman.d/mirrorlist,删除不需要的mirror,我只保留了163和中科大的mirror。
  12. 执行pacman -Syy更新mirror数据库。
  13. 执行pacstrap /mnt base base-devel安装基本系统。
  14. 执行genfstab -U /mnt >> /mnt/etc/fstab生成fstab文件。
  15. 执行arch-chroot /mnt /bin/bash切换到新安装的系统上。
  16. 执行pacman -S vim安装vim。
  17. 执行ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime设置时区。
  18. 执行hwclock --systohc --utc设置时间标准 为 UTC。
  19. 执行vim /etc/locale.gen修改本地化信息,移除en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8zh_TW.UTF-8 UTF-8前面的#后保存。
  20. 执行locale-gen生成本地化信息。
  21. 执行echo LANG=en_US.UTF-8 > /etc/locale.conf将系统 locale 设置为en_US.UTF-8.
  22. 执行echo myhostname > /etc/hostname修改主机名。
  23. 执行systemctl enable dhcpcd设置dhcpcd自启动。
  24. 执行passwd设置root密码。
  25. 执行pacman -S grub os-prober efibootmgr安装grub、os-prober和efibootmgr。
  26. 安装引导程序:

    1. grub-install --target=i386-pc /dev/sda
    2. grub-mkconfig -o /boot/grub/grub.cfg
  27. 执行exit
  28. 执行umount -R /mnt
  29. 执行reboot

到此为止,基本系统已经安装完成,重启后登陆root帐号开始搭建桌面环境。

搭建桌面环境

创建用户和安装常用的程序

  1. 执行useradd -m yourusername创建新用户,并执行passwd yourusername设置登陆密码。
  2. 执行vim /etc/sudoers编辑sudo权限,复制一行root ALL=(ALL) ALL, 并替换其中的root为新用户名,保存并退出。
  3. 执行exit退出root用户,并登陆新创建的用户。
  4. 执行sudo pacman -S alsa-utils xf86-video-vesa xorg xorg-xinit安装声卡、显卡及xorg。
  5. 执行sudo pacman -S zsh git unrar zip unzip openssh glances htop iftop screenfetch tree vlc wget net-tools安装常用程序。

安装oh-my-zsh

执行sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"安装oh-my-zsh,我们将使用它作为默认shell。

执行vim .zshrc编辑配置文件,修改ZSH_THEME的值可以更改shell的主题,主题可以到这里来查看,我个人比较喜欢使用rkj-repos这个主题。

在配置文件最底端加入一下代码段为一些命令创建别名:

alias ll='ls -l'
alias la='ls -a'
alias vi='vim'
alias svi='sudo vim'
alias grep='grep --color=auto'
alias install='sudo pacman -S'
alias remove='sudo pacman -Rcn'
alias upgrade='sudo pacman -Syu'
alias findProc='ps -ef | grep '
alias docker='sudo docker '
alias cls='printf "\033c"'

编辑完成后保存并退出,执行source .zshrc更新。
插件和其他的配置根据自己所需到这里查询配置。

安装yaourt

执行sudo vim /etc/pacman.conf,在文件最底部加入以下文本后保存并退出:

[archlinuxcn]
SigLevel = Optional TrustAll
Server   = https://mirrors.ustc.edu.cn/archlinuxcn/$arch

然后执行sudo pacman -Syu yaourt更新仓库数据库并安装yaourt
接着再执行install archlinuxcn-keyring安装archlinuxcn的keyring,不然有些pacman的软件包无法安装。

配置桌面环境

配置i3wm

  1. 执行install i3lock i3status compton dmenu feh, compton如果没有装的话会一些窗口效果会消失。因为i3wm是没有桌面图标这些东西的,所以我们通过dmenu来打开应用程序。feh是用来设置壁纸的。
  2. 执行yaourt i3-gaps安装i3wm

安装好i3-gaps后,编辑~/.i3/config文件配置i3wm的快捷键和外观等,其中mod键我设置为win键

以下是我的快捷方式:

窗口管理

win+0 ~ win+9:切换工作区。

win+左:聚焦到左边的窗口。
win+右:聚焦到右边的窗口。
win+上:聚焦到上边的窗口。
win+下:聚焦到下边的窗口。

win+shift+左:移动当前聚焦的窗口到左边。
win+shift+右:移动当前聚焦的窗口到右边。
win+shift+上:移动当前聚焦的窗口到上边。
win+shift+下:移动当前聚焦的窗口到下边。

win+shift+0 ~ win+shift+9:将当前聚焦的窗口移动到指定的工作区中。

win+H:窗口水平分离,即新创建的窗口将会出现在当前窗口的右侧。
win+V:窗口垂直分离,即新创建的窗口将会出现在当前窗口的下侧。

win+R:调整当前聚焦的窗口的大小,在按完快捷键后再按方向键即可调整。
win+F:切换当前聚焦的窗口为全屏/非全屏。

ctrl+alt+W:关闭当前聚焦的窗口。
win+shift+space:使当前聚焦的窗口浮动。
win+space:在浮动的窗口和非浮动的窗口之间切换焦点。
win+T:切换窗口显示为边框+标题栏。
win+Y:切换窗口显示为只有1像素的边框。
win+U:切换窗口显示为没有边框也没有标题栏,默认为这种显示方式,因为边框和标题栏太丑而且太占空间了= =。

win+shift+ -:移动当前窗口到scratchpad中,即可以在需要的时候将其调出来,不需要时将其隐藏。
win+ -:切换scratchpad中的窗口的显示与否,该功能我最常将用来创建一个运行ydcv进程的窗口来翻译,相当方便。

系统命令

win+回车:打开一个新的终端。
win+E:打开dmenu,会在屏幕顶部出现一个黑色输入框,输入程序名字按回车就会打开程序。
win+L:锁屏。
win+E:打开资源管理器。

fn+音量+:音量上调5%。
fn+音量-:音量下调5%。

win+shift+Q:调出系统命令。
在调出系统命令后,按O注销会话S关机R重启Esc取消
win+shift+C:重新加载i3wm的配置文件。
win+shift+R:重新启动i3wm,不会丢失已经打开的窗口等信息。
win+shift+E:关闭i3wm,将会导致所有窗口被关闭。

以下是我的配置:

#===============设置字体===============
font pango:Source Code Pro, EmojiOne Color 10

#===============定义$mod键为win键===============
# customized
set $mod Mod4

#===============设置窗口边框===============
new_window none
bindsym $mod+t border normal
bindsym $mod+y border pixel 1
bindsym $mod+u border none


#===============状态栏===============
bindsym $mod+m bar mode toggle
bar {
    i3bar_command i3bar -t
#    status_command i3status
    status_command py3status 
    position bottom
    modifier Shift
    separator_symbol " | "

    colors {
        background #000000CC
        #statusline #000000FF
        separator #B8F788
        focused_workspace  #B8F788 #000000AA
        active_workspace   #FFFFFF #FFFFFFAA
        inactive_workspace #AAAAAA #000000AA #AAAAAA
        urgent_workspace   #E57B85 #000000AA
    }
}

#===============窗口间距===============
gaps inner 6
gaps outer 0
smart_gaps on

#===============系统命令===============
set $mode_system  注销(O) 关机(S) 重启(R) 取消(Esc)
bindsym $mod+shift+q mode "$mode_system"
mode "$mode_system" {
    bindsym o exec i3-msg exit
    bindsym s exec systemctl poweroff
    bindsym r exec systemctl reboot
    bindsym Escape mode "default"
}

#===============鼠标聚焦===============
focus_follows_mouse no

#===============锁屏快捷键===============
# bindsym Mod4+l exec --no-startup-id i3lock -i '/home/huang/Pictures/Wallpapers/universe.png'
bindsym Mod4+l exec --no-startup-id i3lock -i 'path/to/lock/screen/wallpaper'

#===============自动启动fcitx===============
exec --no-startup-id fcitx
bindsym $mod+e exec nautilus

#===============音量控制===============
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -q sset Master 5%+
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -q sset Master 5%-

#===============浮动窗口===============
# use Mouse+Mod1 to drag floating windows to their wanted position
#floating_modifier $mod

#===============打开终端===============
# bindsym $mod+Return exec i3-sensible-terminal
bindsym $mod+Return exec lilyterm

#===============关闭窗口===============
bindsym Control+Mod1+w kill

#===============打开dmenu===============
# start dmenu (a program launcher)
bindsym $mod+d exec dmenu_run
# There also is the (new) i3-dmenu-desktop which only displays applications

# bindsym Mod1+d exec --no-startup-id i3-dmenu-desktop

# change focus
#bindsym $mod+$left focus left
#bindsym $mod+$down focus down
#bindsym $mod+$up focus up
#bindsym $mod+$right focus right

# alternatively, you can use the cursor keys:
#===============窗口聚焦===============
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
#bindsym $mod+Shift+$left move left
#bindsym $mod+Shift+$down move down
#bindsym $mod+Shift+$up move up
#bindsym $mod+Shift+$right move right

# alternatively, you can use the cursor keys:
#===============窗口移动===============
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

#===============窗口拆分模式===============
bindsym $mod+h split h
bindsym $mod+v split v

#===============切换全屏===============
bindsym $mod+f fullscreen toggle

#===============切换布局模式===============
#bindsym $mod+s layout stacking
#bindsym $mod+w layout tabbed
#bindsym Mod1+e layout toggle split

#===============切换窗口浮动===============
bindsym $mod+Shift+space floating toggle

#===============浮动/平铺聚焦切换===============
bindsym $mod+space focus mode_toggle

#===============聚焦到父窗口===============
#bindsym $mod+a focus parent

#===============聚焦到子窗口===============
#bindsym Mod1+d focus child

#===============添加窗口到存储===============
bindsym $mod+Shift+minus move scratchpad

#===============切换存储器中的窗口===============
# Show the next scratchpad window or hide the focused scratchpad window.
# If there are multiple scratchpad windows, this command cycles through them.
bindsym Mod1+minus scratchpad show

#===============绑定workspace快捷键===============
# switch to workspace
bindsym $mod+1 workspace 1:Info
bindsym $mod+2 workspace 2:Web
bindsym $mod+3 workspace 3:Work
bindsym $mod+4 workspace 4:Work
bindsym $mod+5 workspace 5:Work
bindsym $mod+6 workspace 6:Work
bindsym $mod+7 workspace 7:Work
bindsym $mod+8 workspace 8:Other
bindsym $mod+9 workspace 9:Other
bindsym $mod+0 workspace 10:Other

#==============设置workspace默认显示到LVDS1===============
workspace "1:Info" output LVDS1
workspace "2:Web" output LVDS1
workspace "3:Dev" output LVDS1
workspace "4:Dev" output LVDS1
workspace "5:Dev" output LVDS1
workspace "6:Dev" output LVDS1
workspace "7:Dev" output LVDS1
workspace "8:Music" output LVDS1
workspace "9:Other" output LVDS1
workspace "10:Other" output LVDS1

#===============绑定移动窗口到指定workspace快捷键===============
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1:Info
bindsym $mod+Shift+2 move container to workspace 2:Web
bindsym $mod+Shift+3 move container to workspace 3:Work
bindsym $mod+Shift+4 move container to workspace 4:Work
bindsym $mod+Shift+5 move container to workspace 5:Work
bindsym $mod+Shift+6 move container to workspace 6:Work
bindsym $mod+Shift+7 move container to workspace 7:Work
bindsym $mod+Shift+8 move container to workspace 8:Other
bindsym $mod+Shift+9 move container to workspace 9:Other
bindsym $mod+Shift+0 move container to workspace 10:Other

#===============指定程序打开后出现在指定工作区===============
assign [class="chrome"] 2:Web
# assign [class="idea"] 3:Dev
# assign [class="VirtualBox"] 9:Other

#===============重新加载配置===============
# reload the configuration file
bindsym $mod+Shift+c reload

#===============重启i3===============
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart

#===============退出i3===============
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m '是否确定退出i3? 这将导致所有工作窗口被关闭.' -b '确定' 'i3-msg exit'"

#===============调整窗口大小===============
# resize window (you can also use the mouse for that)
mode "resize" {
        # same bindings, but for the arrow keys
        bindsym Left        resize shrink width 10 px or 10 ppt
        bindsym Down        resize grow height 10 px or 10 ppt
        bindsym Up          resize shrink height 10 px or 10 ppt
        bindsym Right       resize grow width 10 px or 10 ppt

        # back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
}

#===============绑定调整窗口大小快捷键===============
bindsym $mod+r mode "resize"

#===============开启i3时自启动项===============
exec_always --no-startup-id feh --bg-fill path/to/background/image
exec i3-config-wizard
exec --no-startup-id i3-msg "workspace 1:Info"
exec compton &

如果复制了我的配置文件,请修改path/to/background/imagepath/to/lock/screen/wallpaper
至此i3wm的配置已经弄好了,就是这么简单= = 关于i3wm的详细配置参考官方文档

配置py3status

  1. 执行yaourt py3status安装。

py3status的配置文件在~/.i3status. conf中,在配置i3wm的时候我们已经在配置文件中启用了py3status,在这一部分只需要配置要启用的模块即可,所有支持的模块可以在这里找到

  1. 执行install noto-fonts-emoji安装Emoji字体。

以下是我py3status的配置文件:

general {
    output_format = "i3bar"
    colors = true
    color_good = "#BBBBBB"
    color_bad = "#CC1616"
    color_degraded = "#55858E"
    interval = 1
}

order += "sysdata"
order += "cpu_usage"
order += "cpu_temperature 0"
order += "net_rate"
order += "imap"
order += "time"
order += "volume_status"
order += "static_string screenshot"
order += "dpms"

sysdata {
    format = "? {mem_used}G ? {mem_used_percent}%"
    color = "#48CCCD"
}

cpu_usage {
    format = "? %usage"
    color = "#52D017"
}

cpu_temperature 0 {
    format = "♨️ %degrees °C"
    max_threshold = 65
    path = "/sys/class/thermal/thermal_zone0/temp"
    color = "#CCFB5D"
}

net_rate {
    interfaces = "enp0s25"
    format = "?{down} ?{up}"
    color = "#FFDB58"
}

imap {
    cache_timeout = 60
    format = "? {unseen}"
    imap_server = 'imap.gmail.com'
    mailbox = 'INBOX'
    name = 'you/name'
    password = 'you/mail/password'
    port = '993'
    user = 'your/mail'
    new_mail_color = "#F87431#F62217"
    on_click 1 = 'exec google-chrome-stable https://mail.google.com/mail'
    color = "#FCDFFF"
}

time {
    format = "? %Y-%m-%d %H:%M:%S"
    color = "#9E7BFF"
}

volume_status {
    format = "? {percentage}%"
    cache_timeout = 1
    device = "default"
    thresholds = [
        (0, "#A0CFEC"),
        (10, "#82CAFF"),
        (20, "#79BAEC"),
        (30, "#3BB9FF"),
        (40, "#56A5EC"),
        (50, "#5CB3FF"),
        (60, "#1589FF"),
        (70, "#157DEC"),
        (80, "#306EFF"),
        (90, "#2B65EC")
    ]
}

static_string 'screenshot' {
    format = "?"
        on_click 1 = "exec gnome-screenshot"
        color = "#C44975"
}

dpms {
    format_on = "? DPMS"
    format_off = "? DPMS"
    color_on = "#F9B7FF"
    color_off = "#6B9299"
}
  1. 我的配置文件中使用了imap模块,需要配置邮箱相关的信息。
  2. volume_status模块需要安装pamixeralsa-utils
  3. 不同的Emoji字体会造成状态栏的图标不一样,我截图中使用的是nodejs-emojione,这里的配置使用的是 noto-fonts-emoji,因为觉得后者 比较好看= =。

配置LilyTerm

执行install lilyterm安装终端模拟器。
LilyTerm的配置文件在/etc/lilyterm.conf, 不过不建议直接修改配置文件,可以在启动i3wm后打开终端,在终端上右键即可进行可视化配置。字体我使用的Source Code Pro+Noto Sans CJK SC

配置xinit

执行vim ~/.xinitrc编辑xinit配置文件, 这一步的配置关系到i3wm的启动和搜狗输入法的使用,将内容修改如下:

export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:en_US
export LC_CTYPE=en_US.UTF-8

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

exec i3
exec sogou-qimpanel

修改完成后执行startx就会发现桌面环境启动成功了。

执行vim ~/.zshrc,在文件底部加入这一行[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec startx,这样以后登陆系统后会自动运行startx登陆到桌面中。

搜狗输入法

在桌面环境下打开一个终端(win+回车),执行install fcitx-im fcitx-configtool fcitx-sogoupinyin安装fcitx套件和搜狗输入法。
安装完成后右击状态栏最右侧的小键盘,在设置中添加搜狗输入法,然后重启系统,就会发现输入法可以使用了,输入法的切换默认按键为ctrl+space

Chrome

执行install google-chrome安装Chrome浏览器,安装完成后按win+d调出dmenu,输入chrome回车,即可运行Chrome。

资源管理器

执行install nautilus安装gnome的资源管理器,安装完成后可以通过win+e打开。
为了能够让nautilus识别安卓手机,需要执行install gvfs-mtp来支持MTP。

更新1: 使用thunar代替nautilus

GTK主题

笔者使用使用arc-gtk-theme界面主题+numix-icon-theme图标主题, 执行install arc-gtk-theme numix-icon-theme-git安装, 安装完成后按win+d调出dmenu,输入lxappearance回车打开配置工具,选择刚刚安装的界面主题和图标主题即可。

安装PDF阅读器

执行install foxitreader安装福昕PDF阅读软件, 安装完成后按win+d调出dmenu,输入foxitreader回车,即可运行foxitreader。

截屏

执行install gnome-screenshot安装gnome的截屏软件,安装完成后点击状态栏中的截屏按钮就会自动截屏。
执行yaourt shutter可以安装功能强大的截图软件shutter,安装完成后按win+d调出dmenu,输入shutter回车,即可运行shutter。

WPS

执行install wps-office安装wps套件,虽然绝大多数时候我都会在虚拟机下开windows编辑文档,但是只是查看的话还是很方便的。

翻译:ydcv

执行install ydcv安装ydcv,通过它再配scratchpad功能,在简单翻译的情境下比任何翻译工具都要好用。

代理:proxychains4

proxychains4可以在终端使用sock5代理命令,最常用的就是git和yaourt有时候下载速度很慢,git本身可以就支持sock5,但是yaourt不支持,那么就可以通过这个软件来执行命令,如:proxychains4 yaourt gotty

  1. 执行install proxychains
  2. 执行sudo vim /etc/proxychains.conf
  3. 将配置文件中的socks4 127.0.0.1 9095改成socks5 127.0.0.1 your_sock5_proxy_port

没有声音

  1. 如果出现没有声音的情况, 就运行alsamixer查看音量条下是否显示MM而不是00, 如果是的话就按m切换为00, 然后重启程序看看是否已有声音。
  2. 如果还是没有声音,那么考虑是否默认声卡配置错了,执行amixer scontrols,如果结果中没有Master, 那么执行aplay -l查看有那些可用声卡设备,并记住其中真正可用的card ID, 如card 1, 最后编辑/etc/asound.conf,添加以下内容即可(替换其中的ID为实际查询到的id):
defaults.pcm.card ID
defaults.pcm.device 0
defaults.ctl.card ID

结尾

做到这里差不多桌面环境都搭建好了,笔者是实体机上边安装边写的文章,大体上不会有什么问题,如果安装过程中有疑问或者不对的地方欢迎提出讨论。

转载请注明出处:ArchLinux搭建高效便捷的平铺式桌面
查看原文

赞 8 收藏 24 评论 31

osinovsky 赞了文章 · 8月14日

如何使用screen命令

大家好,我是良许。

很多时候,我们都需要执行一些需要很长时间的任务。如果这时候,你的网络连接突然断开了,那么你之前所做的所有工作可能都会丢失,所做的工作可能都要重做一遍,这会浪费我们许多的时间,非常影响我们的工作。那么有没有办法可以解决这个问题呢?

答案是肯定的,那就是使用 screen 命令。screen 命令允许用户在一个窗口内使用多个终端会话,可以断开连接,也可以重新连接已断开连接的会话。每个会话都可以恢复连接,这样就算会话断开了,用户也不必担心数据丢失,这正好解决了我们的问题。

因此,良许想与大家分享 Screen 这个实用工具的一些功能以及用法:

安装 Screen

现在许多的 Linux 发行版通常都预装了 Screen 。通过运行以下命令,可以查看系统是否安装了 Screen :

$ screen --version
Screen version 4.06.02 (GNU) 23-Oct-17 

如果你的系统并未安装 Screen ,则可以执行以下命令来安装:

$ sudo apt install screen

启动 Screen 会话

想要启动一个 Screen 会话,只需输入以下命令:

$ screen

输入 screen 命令后,你会看到一个布满版权信息的界面,你只需按回车或者空格键就可以跳过这个界面。跳过之后,你就可以看到终端界面了。这个终端和原来的终端并没有什么不同,你一样可以浏览文件夹,打开文件,在原来的终端中能做到的事情,它也可以做到。

你也可以在启动 Screen 会话时,使用 -S 参数给会话起名字。例如,我想启动一个叫 alvin 的 Screen 会话:

$ screen -S alvin

当你启动了不止一个 Screen 会话时,这可以用来区分其他 Screen 会话。

进入 Screen 终端后,按 Ctrl a+? 快捷键,可以查看 Screen 所附带的所有命令:

markdown

分离与重新连接 Screen 会话

假如你要更新系统,你输入更新命令后,是需要等待很长时间才更新完毕的。这时,如果你没用 screen 命令,一旦你的网络连接断开了,那么更新就会被打断,你就必须要重新开始更新。

Screen 会话的分离功能可以解决这个问题。你可以进入 Screen 终端里执行更新命令,然后输入会话分离快捷键 Ctrl a+d ,你会看到以下提示信息:

markdown

这就表示你已经成功从 Screen 会话中分离出来并回到原来的 Shell 会话中了。这时,Screen 会话会继续留在后台执行更新任务。而且无论是网络断开连接,还是关闭原来的 Shell 会话,它都不会受到影响。

当然,如果你来不及按会话分离快捷键网络就断开了,Screen 会话也不会关闭,它一样会继续留在后台执行更新任务。

如果你想重新连接到已分离的 Screen 会话,以查看更新进程,只需执行以下命令:

$ screen -r

需要注意的是,该命令只适用于当前终端只启动了一个 Screen 会话的情况。

嵌套 Screen 会话

嵌套 Screen 会话,顾名思义,就是 Screen 会话中的 Screen 会话,是实现用户在一个窗口中使用多个终端的方法之一。

想要启动一个嵌套 Screen 会话很简单,你只需要在 Screen 终端再次输入 screen 命令,或者按 Ctrl a+c 快捷键,这会在你原来的 Screen 会话中再启动一个 Screen 会话,而原来的 Screen 会话则会在后台保持活动。

例如,你运行了 top 命令来监控系统的 CPU 的使用情况:

$ top

markdown

而你既不想关掉这个 top 进程,又想同时做其他的任务,那么你就可以使用 Ctrl a+c 快捷键来启动一个新的 Screen 会话,这样,你既可以保持 top 命令在后台运行,又可以去执行其他的任务。

而如果你想切换回执行 top 命令的 Screen 会话,可以使用快捷键 Ctrl a+n (切换至下一个 Screen 会话)或者 Ctrl a+p (切换至上一个 Screen 会话)进行切换。

分离并启动新的 Screen 会话

从 Screen 会话中分离出来再启动新的 Screen 会话,也可以实现用户在一个窗口中使用多个终端。

例如,你启动一个 Screen 会话,然后输入 df -h 来查看硬盘的使用情况:

$ df -h

markdown

然后你可以按 Ctrl a+d 快捷键从 Screen 会话中分离出来,回到原来的终端。这时你就可以再次输入 screen 命令启动一个新的 Screen 会话来执行其他的任务。

如果你想重新连接回运行 df -h 命令的 Screen 会话,则需要先从新的 Screen 会话中分离出来,然后尝试输入 screen -r 命令。这时,由于你并行启动了多个 Screen 会话,然而 screen 命令并不知道你想要重新连接到哪个会话中,因此,你会看到以下提示信息:

markdown

从图中可以看到,每个 Screen 会话都有自己的 ID( 4352 与 4294 )以及自己的名字( pts-0.lxlinux )。这里可以看到两个会话的名字都是 pts-0.lxlinux ,那是因为我启动 Screen 会话的时候,没有指定名字,因此它们都以默认的名字作为自己的名字。

想要重新连接到运行 df -h 命令的 Screen 会话,你只需在 screen -r 命令后面再加上会话的 ID 就可以了,像这样:

$ screen -r 4352

当然,如果在启动 Screen 会话时,你给会话指定了独一无二的名字,那么你也可以通过会话的名字来指定重新连接到哪个会话,例如,重新连接到名字为 alvin 的会话:

$ screen -r alvin

如果你并不知道 Screen 会话的 ID 以及名字,你也可以通过以下命令来查看:

$ screen -ls

关闭 Screen 会话

要关闭 Screen 会话很简单,就和关闭平常的会话一样,你可以使用 Ctrl d 快捷键,也可以输入 exit 命令关闭:

$ exit

markdown

善用 Screen

在工作中,我们总会遇到需要执行较长时间才能完成的任务,如果在执行这些任务的过程中,遇到网络中断,那将会导致数据丢失以及时间的浪费,这将严重影响我们的工作。Screen 允许会话断开后进程在后台继续运行,且支持从断点恢复进程,这很好地解决了这问题。

而且 screen 命令还使我们可以利用一个窗口来同时执行多个任务,这对我们工作是非常有用的。因此,为了避免数据丢失以及节省时间,我们应该多用 screen 命令。最后,如果你还对 screen 命令有疑问,请留言告诉我呗!


最后,最近很多小伙伴找我要Linux学习路线图,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!

免费送给大家,只求大家金指给我点个赞!

电子书 | Linux开发学习路线图

也希望有小伙伴能加入我,把这份电子书做得更完美!

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

推荐阅读:

查看原文

赞 3 收藏 1 评论 1

osinovsky 关注了标签 · 8月10日

rust

一门赋予每个人构建可靠且高效软件能力的语言。

关注 436

osinovsky 关注了标签 · 8月10日

c#

C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#由C语言和C++派生而来,继承了其强大的性能,同时又以.NET 框架类库作为基础,拥有类似Visual Basic的快速开发能力。

关注 5626

osinovsky 提出了问题 · 2019-09-24

Archlinux 的有些包在 MSYS2 找不到?

我想在 MSYS2 上安装 ppl 库,在archlinux搜到了这个库,于是我就用 pacman -Syu ppl 安装,但是找不到包名。

我的MSYS2源是默认的+清华源,之前也pacman -Sy 更新过。

关注 1 回答 0

osinovsky 提出了问题 · 2019-09-24

Archlinux 的有些包在 MSYS2 找不到?

我想在 MSYS2 上安装 ppl 库,在archlinux搜到了这个库,于是我就用 pacman -Syu ppl 安装,但是找不到包名。

我的MSYS2源是默认的+清华源,之前也pacman -Sy 更新过。

关注 1 回答 0

osinovsky 回答了问题 · 2017-10-01

Fortran 向 C 传递成员带有指针的结构体,该成员指针到C中无效

今天才知道原问题在哪,那个指针指向的成员没有实例化……

不过这个我还是不太明白这个示例问题错在哪

关注 3 回答 1

osinovsky 提出了问题 · 2017-09-25

Fortran的REAl类型用二进制写入文件,结果与C的二进制写不一样?

我需要让fortran与c两种代码异步共享一些数据,于是让fortran用二进制流(stream)写入一些real类型并输出到屏幕上。在用C代码fread的时候(rb),得到的float和fortran中的输出在屏幕上的不一样。

后来我又实验了,用fortran写入某real并打印在屏幕,然后直接调用C,将该real传入。在C中将其也写入另一个二进制文件。最后用HEX格式发现两个文件的数据竟然不一样。

查了一下资料,两个不是都是IEEE存储浮点数据吗?为什么会这样?

关注 2 回答 1

认证与成就

  • 获得 6 次点赞
  • 获得 27 枚徽章 获得 0 枚金徽章, 获得 6 枚银徽章, 获得 21 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-03-26
个人主页被 416 人浏览