Kindd：一个图形化 dd 命令前端

Summary: 向 “Kindd” 问好，一个属于 dd 命令的图形化前端。它是自由开源的、用 Qt Quick 所写的工具。总的来说，这个工具对那些对命令行不适应的初学者是非常有用的。

![Kindd - A Graphical Frontend To dd Command](/data/attachment/album/201905/12/231740uhxa662k3mycxp9k.png)

前不久，我们已经学习如何在类 Unix 系统中 [使用 dd 命令创建可启动的 ISO](https://www.ostechnix.com/how-to-create-bootable-usb-drive-using-dd-command/)。请记住，`dd` 命令是最具危险性和破坏性的命令之一。如果你不确定你实际在做什么，你可能会在几分钟内意外地擦除你的硬盘数据。`dd` 命令仅仅从 `if` 参数获取数据，并写入数据到 `of` 参数。它将不关心它正在覆盖什么，它也不关心是否在磁道上有一个分区表，或一个启动扇区，或者一个家文件夹，或者任何重要的东西。它将简单地做它被告诉去做的事。如果你是初学者，一般地尝试避免使用 `dd` 命令来做实验。幸好，这有一个支持 `dd` 命令的简单的 GUI 实用程序。向 “Kindd” 问好，一个属于 `dd` 命令的图形化前端。它是自由开源的、用 Qt Quick 所写的工具。总的来说，这个工具对那些对命令行不适应的初学者是非常有用的。

它的开发者创建这个工具主要是为了提供：

1. 一个用于 `dd` 命令的现代化的、简单而安全的图形化用户界面，
2. 一种简单地创建可启动设备的图形化方法，而不必使用终端。

### 安装 Kindd

Kindd 在 [AUR](https://aur.archlinux.org/packages/kindd-git/) 中是可用的。所以，如果你是 Arch 用户，使用任一的 AUR 助手工具来安装它，例如 [Yay](https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/) 。

要安装其 Git 发布版，运行：

```
$ yay -S kindd-git
```

要安装正式发布版，运行：

```
$ yay -S kindd
```

在安装后，从菜单或应用程序启动器启动 Kindd。

对于其它的发行版，你需要从源文件手动编译和安装它，像下面所示。

确保你已经安装下面的必要条件。

* git
* coreutils
* polkit
* qt5-base
* qt5-quickcontrols
* qt5-quickcontrols2
* qt5-graphicaleffects

一旦所有必要条件安装，使用 `git` 克隆 Kindd 储存库：

```
git clone https://github.com/LinArcX/Kindd/
```

转到你刚刚克隆 Kindd 的目录，并编译和安装它：

```
cd Kindd
qmake
make
```

最后运行下面的命令来启动 Kindd 应用程序：

```
./kindd
```

Kindd 内部使用 pkexec。pkexec 代理被默认安装在大多数桌面环境中。但是，如果你使用 i3 (或者可能还有一些其它的桌面环境)，你应该首先安装 polkit-gnome ，然后粘贴下面的行到 i3 配置文件：

```
exec /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 &
```

### 使用 Kindd 创建可启动的 ISO

为从一个 ISO 创建一个可启动的 USB，插入 USB 驱动器。然后，从菜单或终端启动 Kindd 。

这是 Kindd 默认界面的外观：

![](/data/attachment/album/201905/12/231741cbkl711obi610ikl.png)

*Kindd 界面*

正如你所能看到的，Kindd 界面是非常简单的和明白易懂的。这里仅有两部分，即设备列表，它显示你的系统上的可用的设备（hdd 和 Usb），并创建可启动的 .iso 。默认情况下，你将在“创建可启动 .iso”部分。

在第一列中输入块大小，在第二列中选择 ISO 文件的路径，并在第三列中选择正确的设备（USB 驱动器路径）。单击“转换/复制”按钮来开始创建可启动的 ISO 。

![](/data/attachment/album/201905/12/231742itfbbfttqhtuh8j3.png)

一旦进程被完成，你将看到成功的信息。

![](/data/attachment/album/201905/12/231743rhmqd4ihrm4mmr45.png)

现在，拔出 USB 驱动器，并用该 USB 启动器启动你的系统，来检查它是否真地工作。

如果你不知道真实的设备名称（目标路径），只需要在列出的设备上单击，并检查 USB 驱动器名称。

![](/data/attachment/album/201905/12/231744sylr368yztzd0c19.png)

Kindd 还处在早期开发阶段。因此，可能有错误。如果你找到一些错误，请在这篇的指南的结尾所给的 GitHub 页面报告它们。

这就是全部。希望这是有用的。更多的好东西将会来。敬请期待！

谢谢！

资源：

* [Kindd GitHub 储存库](https://github.com/LinArcX/Kindd)

相关阅读：

* [Etcher：一个来创建可启动 SD 卡或 USB 驱动器的漂亮的应用程序](https://www.ostechnix.com/etcher-beauitiful-app-create-bootable-sd-cards-usb-drives/)
* [Bootiso 让你安全地创建可启动的 USB 驱动器](https://www.ostechnix.com/bootiso-lets-you-safely-create-bootable-usb-drive/)

---

via: <https://www.ostechnix.com/kindd-a-graphical-frontend-to-dd-command/>

作者：[sk](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


TLP：一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

![](/data/attachment/album/201905/13/094413iu77i8w75t80tq7h.jpg)

笔记本电池是针对 Windows 操作系统进行了高度优化的，当我在笔记本电脑中使用 Windows 操作系统时，我已经意识到这一点，但对于 Linux 来说却不一样。

多年来，Linux 在电池优化方面取得了很大进步，但我们仍然需要做一些必要的事情来改善 Linux 中笔记本电脑的电池寿命。

当我考虑延长电池寿命时，我没有多少选择，但我觉得 TLP 对我来说是一个更好的解决方案，所以我会继续使用它。

在本教程中，我们将详细讨论 TLP 以延长电池寿命。

我们之前在我们的网站上写过三篇关于 Linux [笔记本电池节电工具](https://www.2daygeek.com/check-laptop-battery-status-and-charging-state-in-linux-terminal/) 的文章：[PowerTOP](https://www.2daygeek.com/powertop-monitors-laptop-battery-usage-linux/) 和 [电池充电状态](https://www.2daygeek.com/monitor-laptop-battery-charging-state-linux/)。

### TLP

[TLP](https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html) 是一款自由开源的高级电源管理工具，可在不进行任何配置更改的情况下延长电池寿命。

由于它的默认配置已针对电池寿命进行了优化，因此你可能只需要安装，然后就忘记它吧。

此外，它可以高度定制化，以满足你的特定要求。TLP 是一个具有自动后台任务的纯命令行工具。它不包含GUI。

TLP 适用于各种品牌的笔记本电脑。设置电池充电阈值仅适用于 IBM/Lenovo ThinkPad。

所有 TLP 设置都存储在 `/etc/default/tlp` 中。其默认配置提供了开箱即用的优化的节能设置。

以下 TLP 设置可用于自定义，如果需要，你可以相应地进行必要的更改。

### TLP 功能

* 内核笔记本电脑模式和脏缓冲区超时
* 处理器频率调整，包括 “turbo boost”/“turbo core”
* 限制最大/最小的 P 状态以控制 CPU 的功耗
* HWP 能源性能提示
* 用于多核/超线程的功率感知进程调度程序
* 处理器性能与节能策略（`x86_energy_perf_policy`）
* 硬盘高级电源管理级别（APM）和降速超时（按磁盘）
* AHCI 链路电源管理（ALPM）与设备黑名单
* PCIe 活动状态电源管理（PCIe ASPM）
* PCI(e) 总线设备的运行时电源管理
* Radeon 图形电源管理（KMS 和 DPM）
* Wifi 省电模式
* 关闭驱动器托架中的光盘驱动器
* 音频省电模式
* I/O 调度程序（按磁盘）
* USB 自动暂停，支持设备黑名单/白名单（输入设备自动排除）
* 在系统启动和关闭时启用或禁用集成的 wifi、蓝牙或 wwan 设备
* 在系统启动时恢复无线电设备状态（从之前的关机时的状态）
* 无线电设备向导：在网络连接/断开和停靠/取消停靠时切换无线电
* 禁用 LAN 唤醒
* 挂起/休眠后恢复集成的 WWAN 和蓝牙状态
* 英特尔处理器的动态电源降低 —— 需要内核和 PHC-Patch 支持
* 电池充电阈值 —— 仅限 ThinkPad
* 重新校准电池 —— 仅限 ThinkPad

### 如何在 Linux 上安装 TLP

TLP 包在大多数发行版官方存储库中都可用，因此，使用发行版的 [包管理器](https://www.2daygeek.com/category/package-management/) 来安装它。

对于 Fedora 系统，使用 [DNF 命令](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/) 安装 TLP。

```
$ sudo dnf install tlp tlp-rdw
```

ThinkPad 需要一些附加软件包。

```
$ sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
$ sudo dnf install http://repo.linrunner.de/fedora/tlp/repos/releases/tlp-release.fc$(rpm -E %fedora).noarch.rpm
$ sudo dnf install akmod-tp_smapi akmod-acpi_call kernel-devel
```

安装 smartmontool 以显示 tlp-stat 中 S.M.A.R.T. 数据。

```
$ sudo dnf install smartmontools
```

对于 Debian/Ubuntu 系统，使用 [APT-GET 命令](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/) 或 [APT 命令](https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/) 安装 TLP。

```
$ sudo apt install tlp tlp-rdw
```

ThinkPad 需要一些附加软件包。

```
$ sudo apt-get install tp-smapi-dkms acpi-call-dkms
```

安装 smartmontool 以显示 tlp-stat 中 S.M.A.R.T. 数据。

```
$ sudo apt-get install smartmontools
```

当基于 Ubuntu 的系统的官方软件包过时时，请使用以下 PPA 存储库，该存储库提供最新版本。运行以下命令以使用 PPA 安装 TLP。

```
$ sudo add-apt-repository ppa:linrunner/tlp
$ sudo apt-get update
$ sudo apt-get install tlp
```

对于基于 Arch Linux 的系统，使用 [Pacman 命令](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/) 安装 TLP。

```
$ sudo pacman -S tlp tlp-rdw
```

ThinkPad 需要一些附加软件包。

```
$ pacman -S tp_smapi acpi_call
```

安装 smartmontool 以显示 tlp-stat 中 S.M.A.R.T. 数据。

```
$ sudo pacman -S smartmontools
```

对于基于 Arch Linux 的系统，在启动时启用 TLP 和 TLP-Sleep 服务。

```
$ sudo systemctl enable tlp.service
$ sudo systemctl enable tlp-sleep.service
```

对于基于 Arch Linux 的系统，你还应该屏蔽以下服务以避免冲突，并确保 TLP 的无线电设备切换选项的正确操作。

```
$ sudo systemctl mask systemd-rfkill.service
$ sudo systemctl mask systemd-rfkill.socket
```

对于 RHEL/CentOS 系统，使用 [YUM 命令](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/) 安装 TLP。

```
$ sudo yum install tlp tlp-rdw
```

安装 smartmontool 以显示 tlp-stat 中 S.M.A.R.T. 数据。

```
$ sudo yum install smartmontools
```

对于 openSUSE Leap 系统，使用 [Zypper 命令](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/) 安装 TLP。

```
$ sudo zypper install TLP
```

安装 smartmontool 以显示 tlp-stat 中 S.M.A.R.T. 数据。

```
$ sudo zypper install smartmontools
```

成功安装 TLP 后，使用以下命令启动服务。

```
$ systemctl start tlp.service
```

### 使用方法

#### 显示电池信息

```
$ sudo tlp-stat -b
或
$ sudo tlp-stat --battery
```

```
--- TLP 1.1 --------------------------------------------

+++ Battery Status
/sys/class/power_supply/BAT0/manufacturer                   = SMP
/sys/class/power_supply/BAT0/model_name                     = L14M4P23
/sys/class/power_supply/BAT0/cycle_count                    = (not supported)
/sys/class/power_supply/BAT0/energy_full_design             =  60000 [mWh]
/sys/class/power_supply/BAT0/energy_full                    =  48850 [mWh]
/sys/class/power_supply/BAT0/energy_now                     =  48850 [mWh]
/sys/class/power_supply/BAT0/power_now                      =      0 [mW]
/sys/class/power_supply/BAT0/status                         = Full

Charge                                                      =  100.0 [%]
Capacity                                                    =   81.4 [%]
```

#### 显示磁盘信息

```
$ sudo tlp-stat -d
或
$ sudo tlp-stat --disk
```

```
--- TLP 1.1 --------------------------------------------

+++ Storage Devices
/dev/sda:
  Model     = WDC WD10SPCX-24HWST1
  Firmware  = 02.01A02
  APM Level = 128
  Status    = active/idle
  Scheduler = mq-deadline

  Runtime PM: control = on, autosuspend_delay = (not available)

  SMART info:
      4 Start_Stop_Count          =    18787
      5 Reallocated_Sector_Ct     =        0
      9 Power_On_Hours            =      606 [h]
     12 Power_Cycle_Count         =     1792
    193 Load_Cycle_Count          =    25775
    194 Temperature_Celsius       =       31    [°C]

+++ AHCI Link Power Management (ALPM)
/sys/class/scsi_host/host0/link_power_management_policy  = med_power_with_dipm
/sys/class/scsi_host/host1/link_power_management_policy  = med_power_with_dipm
/sys/class/scsi_host/host2/link_power_management_policy  = med_power_with_dipm
/sys/class/scsi_host/host3/link_power_management_policy  = med_power_with_dipm

+++ AHCI Host Controller Runtime Power Management
/sys/bus/pci/devices/0000:00:17.0/ata1/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata2/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata3/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata4/power/control = on
```

#### 显示 PCI 设备信息

```
$ sudo tlp-stat -e
或
$ sudo tlp-stat --pcie
```

```
$ sudo tlp-stat -e
or
$ sudo tlp-stat --pcie

--- TLP 1.1 --------------------------------------------

+++ Runtime Power Management
Device blacklist = (not configured)
Driver blacklist = amdgpu nouveau nvidia radeon pcieport

/sys/bus/pci/devices/0000:00:00.0/power/control = auto (0x060000, Host bridge, skl_uncore)
/sys/bus/pci/devices/0000:00:01.0/power/control = auto (0x060400, PCI bridge, pcieport)
/sys/bus/pci/devices/0000:00:02.0/power/control = auto (0x030000, VGA compatible controller, i915)
/sys/bus/pci/devices/0000:00:14.0/power/control = auto (0x0c0330, USB controller, xhci_hcd)

......
```

#### 显示图形卡信息

```
$ sudo tlp-stat -g
或
$ sudo tlp-stat --graphics
```

```
--- TLP 1.1 --------------------------------------------

+++ Intel Graphics
/sys/module/i915/parameters/enable_dc        = -1 (use per-chip default)
/sys/module/i915/parameters/enable_fbc       =  1 (enabled)
/sys/module/i915/parameters/enable_psr       =  0 (disabled)
/sys/module/i915/parameters/modeset          = -1 (use per-chip default)
```

#### 显示处理器信息

```
$ sudo tlp-stat -p
或
$ sudo tlp-stat --processor
```

```
--- TLP 1.1 --------------------------------------------

+++ Processor
CPU model      = Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz

/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver    = intel_pstate
/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor  = powersave
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors = performance powersave
/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq  =   800000 [kHz]
/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq  =  3500000 [kHz]
/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference = balance_power
/sys/devices/system/cpu/cpu0/cpufreq/energy_performance_available_preferences = default performance balance_performance balance_power power

......

/sys/devices/system/cpu/intel_pstate/min_perf_pct      =  22 [%]
/sys/devices/system/cpu/intel_pstate/max_perf_pct      = 100 [%]
/sys/devices/system/cpu/intel_pstate/no_turbo          =   0
/sys/devices/system/cpu/intel_pstate/turbo_pct         =  33 [%]
/sys/devices/system/cpu/intel_pstate/num_pstates       =  28

x86_energy_perf_policy: program not installed.

/sys/module/workqueue/parameters/power_efficient       = Y
/proc/sys/kernel/nmi_watchdog                          = 0

+++ Undervolting
PHC kernel not available.
```

#### 显示系统数据信息

```
$ sudo tlp-stat -s
或
$ sudo tlp-stat --system
```

```
--- TLP 1.1 --------------------------------------------

+++ System Info
System         = LENOVO Lenovo ideapad Y700-15ISK 80NV
BIOS           = CDCN35WW
Release        = "Manjaro Linux"
Kernel         = 4.19.6-1-MANJARO #1 SMP PREEMPT Sat Dec 1 12:21:26 UTC 2018 x86_64
/proc/cmdline  = BOOT_IMAGE=/boot/vmlinuz-4.19-x86_64 root=UUID=69d9dd18-36be-4631-9ebb-78f05fe3217f rw quiet resume=UUID=a2092b92-af29-4760-8e68-7a201922573b
Init system    = systemd
Boot mode      = BIOS (CSM, Legacy)

+++ TLP Status
State          = enabled
Last run       = 11:04:00  IST,    596 sec(s) ago
Mode           = battery
Power source   = battery
```

#### 显示温度和风扇速度信息

```
$ sudo tlp-stat -t
或
$ sudo tlp-stat --temp
```

```
--- TLP 1.1 --------------------------------------------

+++ Temperatures
CPU temp               =    36 [°C]
Fan speed              = (not available)
```

#### 显示 USB 设备数据信息

```
$ sudo tlp-stat -u
或
$ sudo tlp-stat --usb
```

```
--- TLP 1.1 --------------------------------------------

+++ USB
Autosuspend         = disabled
Device whitelist    = (not configured)
Device blacklist    = (not configured)
Bluetooth blacklist = disabled
Phone blacklist     = disabled
WWAN blacklist      = enabled

Bus 002 Device 001 ID 1d6b:0003 control = auto, autosuspend_delay_ms =     0 -- Linux Foundation 3.0 root hub (hub)
Bus 001 Device 003 ID 174f:14e8 control = auto, autosuspend_delay_ms =  2000 -- Syntek  (uvcvideo)

......
```

#### 显示警告信息

```
$ sudo tlp-stat -w
或
$ sudo tlp-stat --warn
```

```
--- TLP 1.1 --------------------------------------------

No warnings detected.
```

#### 状态报告及配置和所有活动的设置

```
$ sudo tlp-stat
```

```
--- TLP 1.1 --------------------------------------------

+++ Configured Settings: /etc/default/tlp
TLP_ENABLE=1
TLP_DEFAULT_MODE=AC
TLP_PERSISTENT_DEFAULT=0
DISK_IDLE_SECS_ON_AC=0
DISK_IDLE_SECS_ON_BAT=2
MAX_LOST_WORK_SECS_ON_AC=15
MAX_LOST_WORK_SECS_ON_BAT=60

......

+++ System Info
System = LENOVO Lenovo ideapad Y700-15ISK 80NV
BIOS = CDCN35WW
Release = "Manjaro Linux"
Kernel = 4.19.6-1-MANJARO #1 SMP PREEMPT Sat Dec 1 12:21:26 UTC 2018 x86_64
/proc/cmdline = BOOT_IMAGE=/boot/vmlinuz-4.19-x86_64 root=UUID=69d9dd18-36be-4631-9ebb-78f05fe3217f rw quiet resume=UUID=a2092b92-af29-4760-8e68-7a201922573b
Init system = systemd
Boot mode = BIOS (CSM, Legacy)

+++ TLP Status
State = enabled
Last run = 11:04:00 IST, 684 sec(s) ago
Mode = battery
Power source = battery

+++ Processor
CPU model = Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz

/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver = intel_pstate
/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor = powersave
/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors = performance powersave

......

/sys/devices/system/cpu/intel_pstate/min_perf_pct = 22 [%]
/sys/devices/system/cpu/intel_pstate/max_perf_pct = 100 [%]
/sys/devices/system/cpu/intel_pstate/no_turbo = 0
/sys/devices/system/cpu/intel_pstate/turbo_pct = 33 [%]
/sys/devices/system/cpu/intel_pstate/num_pstates = 28

x86_energy_perf_policy: program not installed.

/sys/module/workqueue/parameters/power_efficient = Y
/proc/sys/kernel/nmi_watchdog = 0

+++ Undervolting
PHC kernel not available.

+++ Temperatures
CPU temp = 42 [°C]
Fan speed = (not available)

+++ File System
/proc/sys/vm/laptop_mode = 2
/proc/sys/vm/dirty_writeback_centisecs = 6000
/proc/sys/vm/dirty_expire_centisecs = 6000
/proc/sys/vm/dirty_ratio = 20
/proc/sys/vm/dirty_background_ratio = 10

+++ Storage Devices
/dev/sda:
 Model = WDC WD10SPCX-24HWST1
 Firmware = 02.01A02
 APM Level = 128
 Status = active/idle
 Scheduler = mq-deadline

 Runtime PM: control = on, autosuspend_delay = (not available)

 SMART info:
 4 Start_Stop_Count = 18787
 5 Reallocated_Sector_Ct = 0
 9 Power_On_Hours = 606 [h]
 12 Power_Cycle_Count = 1792
 193 Load_Cycle_Count = 25777
 194 Temperature_Celsius = 31 [°C]

+++ AHCI Link Power Management (ALPM)
/sys/class/scsi_host/host0/link_power_management_policy = med_power_with_dipm
/sys/class/scsi_host/host1/link_power_management_policy = med_power_with_dipm
/sys/class/scsi_host/host2/link_power_management_policy = med_power_with_dipm
/sys/class/scsi_host/host3/link_power_management_policy = med_power_with_dipm

+++ AHCI Host Controller Runtime Power Management
/sys/bus/pci/devices/0000:00:17.0/ata1/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata2/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata3/power/control = on
/sys/bus/pci/devices/0000:00:17.0/ata4/power/control = on

+++ PCIe Active State Power Management
/sys/module/pcie_aspm/parameters/policy = powersave

+++ Intel Graphics
/sys/module/i915/parameters/enable_dc = -1 (use per-chip default)
/sys/module/i915/parameters/enable_fbc = 1 (enabled)
/sys/module/i915/parameters/enable_psr = 0 (disabled)
/sys/module/i915/parameters/modeset = -1 (use per-chip default)

+++ Wireless
bluetooth = on
wifi = on
wwan = none (no device)

hci0(btusb) : bluetooth, not connected
wlp8s0(iwlwifi) : wifi, connected, power management = on

+++ Audio
/sys/module/snd_hda_intel/parameters/power_save = 1
/sys/module/snd_hda_intel/parameters/power_save_controller = Y

+++ Runtime Power Management
Device blacklist = (not configured)
Driver blacklist = amdgpu nouveau nvidia radeon pcieport

/sys/bus/pci/devices/0000:00:00.0/power/control = auto (0x060000, Host bridge, skl_uncore)
/sys/bus/pci/devices/0000:00:01.0/power/control = auto (0x060400, PCI bridge, pcieport)
/sys/bus/pci/devices/0000:00:02.0/power/control = auto (0x030000, VGA compatible controller, i915)

......

+++ USB
Autosuspend = disabled
Device whitelist = (not configured)
Device blacklist = (not configured)
Bluetooth blacklist = disabled
Phone blacklist = disabled
WWAN blacklist = enabled

Bus 002 Device 001 ID 1d6b:0003 control = auto, autosuspend_delay_ms = 0 -- Linux Foundation 3.0 root hub (hub)
Bus 001 Device 003 ID 174f:14e8 control = auto, autosuspend_delay_ms = 2000 -- Syntek (uvcvideo)
Bus 001 Device 002 ID 17ef:6053 control = on, autosuspend_delay_ms = 2000 -- Lenovo (usbhid)
Bus 001 Device 004 ID 8087:0a2b control = auto, autosuspend_delay_ms = 2000 -- Intel Corp. (btusb)
Bus 001 Device 001 ID 1d6b:0002 control = auto, autosuspend_delay_ms = 0 -- Linux Foundation 2.0 root hub (hub)

+++ Battery Status
/sys/class/power_supply/BAT0/manufacturer = SMP
/sys/class/power_supply/BAT0/model_name = L14M4P23
/sys/class/power_supply/BAT0/cycle_count = (not supported)
/sys/class/power_supply/BAT0/energy_full_design = 60000 [mWh]
/sys/class/power_supply/BAT0/energy_full = 51690 [mWh]
/sys/class/power_supply/BAT0/energy_now = 50140 [mWh]
/sys/class/power_supply/BAT0/power_now = 12185 [mW]
/sys/class/power_supply/BAT0/status = Discharging

Charge = 97.0 [%]
Capacity = 86.2 [%]
```

---

via: <https://www.2daygeek.com/tlp-increase-optimize-linux-laptop-battery-life/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


每日安全资讯：Mozilla 资助开发更有效的在 Firefox 中整合 Tor

根据上个月公布的 Research Grants 2019H1，Mozilla 正寻求资助开发在 Firefox 中更有效的整合 Tor 的方法。目前 Tor 能工作在 Firefox 浏览器上，Tor 浏览器就是证据，但这种整合方法拖慢了浏览器的速度。Mozilla 认为，要让更多的用户使用 Tor 匿名网络需要解决目前 Tor 存在的效率低下的问题。学术界正在研究替代的协议架构和路线选择协议，如 Tor-over-QUIC、DTLS 和 Walking Onions。但替代的协议架构和路线选择协议是否能带来可接受的 Tor 性能增强，是否能保留 Tor 的特性，是否能大规模部署 Tor，如何全面整合 Tor 和 Firefox？Mozilla 愿意在这些方面提供研究资金。

![](/data/attachment/album/201905/13/101826yrkdvveetmrt2vh8.jpg)

来源：solidot.org

### 更多资讯

##### 杠上美国反病毒公司：俄罗斯黑客要卖它们的源代码

5月12日，Ars technica称，Fxmsp是一个破坏私人企业和政府信息的俄罗斯组织，自3月份以来，Fxmsp在网络犯罪论坛上声称持有了从美国三家主要防病毒公司软件开发相关的独家源代码。

来源： 雷锋网

详情： <http://t.cn/EK215J0>

##### 错误更新导致荷兰数百名嫌犯佩戴的监控踝带短暂失联

一个有缺陷的 Windows 更新或许会令人烦恼，但还不足以引起人们的恐慌，但是如果是数百名被警方监控的嫌犯或者有前科的罪犯突然失控呢？本周四佩戴在嫌犯腿部的踝关节监视器在更新中出现问题，导致设备和警察之间的通信被中断。

来源： cnBeta.COM

详情： <http://t.cn/EK21Vcx>

##### 为了挖掘加密货币 两个黑客组织争夺 Linux 服务器

Rocke 和 Pascha 两个从事门罗币挖掘业务的黑客组织正在努力控制尽可能多的 Linux 云环境，以便挖掘加密货币。去年年底，自新黑客组织 Pacha 崛起以来，这场争夺战就一直秘密进行。这两个组织都进行了大规模扫描来寻找开放或未打补丁的云服务和服务器，然后用基于 Linux 的多功能恶意软件感染它们。

来源： 雷锋网
详情： <http://t.cn/EK21Mwm>

##### 5 月全球 Web 服务器报告 微软减少 1.12 亿站点

Netcraft 发布了 2019 年 5 月份全球 Web 服务器调查报告。Netcraft 公司官网每月公布的 Web Server Survey 是当前人们了解全球网站数量以及服务器市场分额情况的主要参考依据。5 月份报告共收录了 1 326 664 693 个站点数据，比上个月减少了 1.19 亿个，其中活跃站点有 187 976 419 个

来源： 开源中国
详情： <http://t.cn/EK21Jpv>

（信息来源于网络，安华金和搜集整理）


使用 Python 和 Pygame 模块构建一个游戏框架

原文：backdrop = pygame.image.load(os.path.join('images','stage.png').convert())

应修改为：

backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()

>
> 这系列的第一篇通过创建一个简单的骰子游戏来探究 Python。现在是来从零制作你自己的游戏的时间。
>
>
>

![](/data/attachment/album/201905/13/215141pkn334yyuqeq4qzu.png)

在我的[这系列的第一篇文章](/article-9071-1.html) 中， 我已经讲解如何使用 Python 创建一个简单的、基于文本的骰子游戏。这次，我将展示如何使用 Python 模块 Pygame 来创建一个图形化游戏。它将需要几篇文章才能来得到一个确实做成一些东西的游戏，但是到这系列的结尾，你将更好地理解如何查找和学习新的 Python 模块和如何从其基础上构建一个应用程序。

在开始前，你必须安装 [Pygame](http://www.pygame.org/wiki/about)。

### 安装新的 Python 模块

有几种方法来安装 Python 模块，但是最通用的两个是：

* 从你的发行版的软件存储库
* 使用 Python 的软件包管理器 `pip`

两个方法都工作的很好，并且每一个都有它自己的一套优势。如果你是在 Linux 或 BSD 上开发，可以利用你的发行版的软件存储库来自动和及时地更新。

然而，使用 Python 的内置软件包管理器可以给予你控制更新模块时间的能力。而且，它不是特定于操作系统的，这意味着，即使当你不是在你常用的开发机器上时，你也可以使用它。`pip` 的其它的优势是允许本地安装模块，如果你没有正在使用的计算机的管理权限，这是有用的。

### 使用 pip

如果 Python 和 Python3 都安装在你的系统上，你想使用的命令很可能是 `pip3`，它用来区分 Python 2.x 的 `pip` 的命令。如果你不确定，先尝试 `pip3`。

`pip` 命令有些像大多数 Linux 软件包管理器一样工作。你可以使用 `search` 搜索 Python 模块，然后使用 `install` 安装它们。如果你没有你正在使用的计算机的管理权限来安装软件，你可以使用 `--user` 选项来仅仅安装模块到你的家目录。

```
$ pip3 search pygame
[...]
Pygame (1.9.3)                 - Python Game Development
sge-pygame (1.5)               - A 2-D game engine for Python
pygame_camera (0.1.1)          - A Camera lib for PyGame
pygame_cffi (0.2.1)            - A cffi-based SDL wrapper that copies the pygame API.
[...]
$ pip3 install Pygame --user
```

Pygame 是一个 Python 模块，这意味着它仅仅是一套可以使用在你的 Python 程序中的库。换句话说，它不是一个像 [IDLE](https://en.wikipedia.org/wiki/IDLE) 或 [Ninja-IDE](http://ninja-ide.org/) 一样可以让你启动的程序。

### Pygame 新手入门

一个电子游戏需要一个背景设定：故事发生的地点。在 Python 中，有两种不同的方法来创建你的故事背景：

* 设置一种背景颜色
* 设置一张背景图片

你的背景仅是一张图片或一种颜色。你的电子游戏人物不能与在背景中的东西相互作用，因此，不要在后面放置一些太重要的东西。它仅仅是设置装饰。

### 设置你的 Pygame 脚本

要开始一个新的 Pygame 工程，先在计算机上创建一个文件夹。游戏的全部文件被放在这个目录中。在你的工程文件夹内部保持所需要的所有的文件来运行游戏是极其重要的。

![](/data/attachment/album/201905/13/215148oae9wya97w03haho.jpg)

一个 Python 脚本以文件类型、你的姓名，和你想使用的许可证开始。使用一个开放源码许可证，以便你的朋友可以改善你的游戏并与你一起分享他们的更改：

```
#!/usr/bin/env python3
# by Seth Kenlon

## GPLv3
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
```

然后，你告诉 Python 你想使用的模块。一些模块是常见的 Python 库，当然，你想包括一个你刚刚安装的 Pygame 模块。

```
import pygame  # 加载 pygame 关键字
import sys     # 让 python 使用你的文件系统
import os      # 帮助 python 识别你的操作系统
```

由于你将用这个脚本文件做很多工作，在文件中分成段落是有帮助的，以便你知道在哪里放代码。你可以使用块注释来做这些，这些注释仅在看你的源文件代码时是可见的。在你的代码中创建三个块。

```
'''
Objects
'''

# 在这里放置 Python 类和函数

'''
Setup
'''

# 在这里放置一次性的运行代码

'''
Main Loop
'''

# 在这里放置游戏的循环代码指令
```

接下来，为你的游戏设置窗口大小。注意，不是每一个人都有大计算机屏幕，所以，最好使用一个适合大多数人的计算机的屏幕大小。

这里有一个方法来切换全屏模式，很多现代电子游戏都会这样做，但是，由于你刚刚开始，简单起见仅设置一个大小即可。

```
'''
Setup
'''
worldx = 960
worldy = 720
```

在脚本中使用 Pygame 引擎前，你需要一些基本的设置。你必须设置帧频，启动它的内部时钟，然后开始 （`init`）Pygame 。

```
fps   = 40  # 帧频
ani   = 4   # 动画循环
clock = pygame.time.Clock()
pygame.init()
```

现在你可以设置你的背景。

### 设置背景

在你继续前，打开一个图形应用程序，为你的游戏世界创建一个背景。在你的工程目录中的 `images` 文件夹内部保存它为 `stage.png` 。

这里有一些你可以使用的自由图形应用程序。

* [Krita](http://krita.org) 是一个专业级绘图素材模拟器，它可以被用于创建漂亮的图片。如果你对创建电子游戏艺术作品非常感兴趣，你甚至可以购买一系列的[游戏艺术作品教程](https://gumroad.com/l/krita-game-art-tutorial-1)。
* [Pinta](https://pinta-project.com/pintaproject/pinta/releases) 是一个基本的，易于学习的绘图应用程序。
* [Inkscape](http://inkscape.org) 是一个矢量图形应用程序。使用它来绘制形状、线、样条曲线和贝塞尔曲线。

你的图像不必很复杂，你可以以后回去更改它。一旦有了它，在你文件的 Setup 部分添加这些代码：

```
world    = pygame.display.set_mode([worldx,worldy])
backdrop = pygame.image.load(os.path.join('images','stage.png').convert())
backdropbox = world.get_rect()
```

如果你仅仅用一种颜色来填充你的游戏的背景，你需要做的就是：

```
world = pygame.display.set_mode([worldx,worldy])
```

你也必须定义颜色以使用。在你的 Setup 部分，使用红、绿、蓝 (RGB) 的值来创建一些颜色的定义。

```
'''
Setup
'''

BLUE  = (25,25,200)
BLACK = (23,23,23 )
WHITE = (254,254,254)
```

至此，你理论上可以启动你的游戏了。问题是，它可能仅持续了一毫秒。

为证明这一点，保存你的文件为 `your-name_game.py`（用你真实的名称替换 `your-name`）。然后启动你的游戏。

如果你正在使用 IDLE，通过选择来自 “Run” 菜单的 “Run Module” 来运行你的游戏。

如果你正在使用 Ninja，在左侧按钮条中单击 “Run file” 按钮。

![](/data/attachment/album/201905/13/215152bp4rcerge07jll4g.png)

你也可以直接从一个 Unix 终端或一个 Windows 命令提示符中运行一个 Python 脚本。

```
$ python3 ./your-name_game.py
```

如果你正在使用 Windows，使用这命令：

```
py.exe your-name_game.py
```

启动它，不过不要期望很多，因为你的游戏现在仅仅持续几毫秒。你可以在下一部分中修复它。

### 循环

除非另有说明，一个 Python 脚本运行一次并仅一次。近来计算机的运行速度是非常快的，所以你的 Python 脚本运行时间会少于 1 秒钟。

为强制你的游戏来处于足够长的打开和活跃状态来让人看到它（更不要说玩它），使用一个 `while` 循环。为使你的游戏保存打开，你可以设置一个变量为一些值，然后告诉一个 `while` 循环只要变量保持未更改则一直保存循环。

这经常被称为一个“主循环”，你可以使用术语 `main` 作为你的变量。在你的 Setup 部分的任意位置添加代码：

```
main = True
```

在主循环期间，使用 Pygame 关键字来检查键盘上的按键是否已经被按下或释放。添加这些代码到你的主循环部分：

```
'''
Main loop
'''
while main == True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit(); sys.exit()
            main = False

        if event.type == pygame.KEYDOWN:
            if event.key == ord('q'):
                pygame.quit()
                sys.exit()
                main = False
```

也是在你的循环中，刷新你世界的背景。

如果你使用一个图片作为背景：

```
world.blit(backdrop, backdropbox)
```

如果你使用一种颜色作为背景：

```
world.fill(BLUE)
```

最后，告诉 Pygame 来重新刷新屏幕上的所有内容，并推进游戏的内部时钟。

```
    pygame.display.flip()
    clock.tick(fps)
```

保存你的文件，再次运行它来查看你曾经创建的最无趣的游戏。

退出游戏，在你的键盘上按 `q` 键。

在这系列的 [下一篇文章](https://opensource.com/article/17/12/program-game-python-part-3-spawning-player) 中，我将向你演示，如何加强你当前空空如也的游戏世界，所以，继续学习并创建一些将要使用的图形！

---

via: <https://opensource.com/article/17/12/game-framework-python>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中创建 SSH 别名

![](/data/attachment/album/201905/13/222910h2uwy06um3byr68r.jpg)

如果你经常通过 SSH 访问许多不同的远程系统，这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名，这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地址等。此外，它避免了在 SSH 到 Linux 服务器时重复输入相同的用户名、主机名、IP 地址、端口号。

### 在 Linux 中创建 SSH 别名

在我知道这个技巧之前，我通常使用以下任意一种方式通过 SSH 连接到远程系统。

使用 IP 地址：

```
$ ssh 192.168.225.22
```

或使用端口号、用户名和 IP 地址：

```
$ ssh -p 22 sk@192.168.225.22
```

或使用端口号、用户名和主机名：

```
$ ssh -p 22 sk@server.example.com
```

这里

* `22` 是端口号，
* `sk` 是远程系统的用户名，
* `192.168.225.22` 是我远程系统的 IP，
* `server.example.com` 是远程系统的主机名。

我相信大多数 Linux 新手和（或一些）管理员都会以这种方式通过 SSH 连接到远程系统。但是，如果你通过 SSH 连接到多个不同的系统，记住所有主机名或 IP 地址，还有用户名是困难的，除非你将它们写在纸上或者将其保存在文本文件中。别担心！这可以通过为 SSH 连接创建别名（或快捷方式）轻松解决。

我们可以用两种方法为 SSH 命令创建别名。

#### 方法 1 – 使用 SSH 配置文件

这是我创建别名的首选方法。

我们可以使用 SSH 默认配置文件来创建 SSH 别名。为此，编辑 `~/.ssh/config` 文件（如果此文件不存在，只需创建一个）：

```
$ vi ~/.ssh/config
```

添加所有远程主机的详细信息，如下所示：

```
Host webserver
    HostName 192.168.225.22
    User sk

Host dns
    HostName server.example.com
    User root

Host dhcp
    HostName 192.168.225.25
    User ostechnix
    Port 2233
```

![](/data/attachment/album/201905/13/222936jr7okl7907i7eo8o.png)

*使用 SSH 配置文件在 Linux 中创建 SSH 别名*

将 `Host`、`Hostname`、`User` 和 `Port` 配置的值替换为你自己的值。添加所有远程主机的详细信息后，保存并退出该文件。

现在你可以使用以下命令通过 SSH 进入系统：

```
$ ssh webserver
$ ssh dns
$ ssh dhcp
```

就是这么简单!

看看下面的截图。

![](/data/attachment/album/201905/13/222937vzymmddmkzdfz2da.png)

*使用 SSH 别名访问远程系统*

看到了吗？我只使用别名（例如 `webserver`）来访问 IP 地址为 `192.168.225.22` 的远程系统。

请注意，这只使用于当前用户。如果要为所有用户（系统范围内）提供别名，请在 `/etc/ssh/ssh_config` 文件中添加以上行。

你还可以在 SSH 配置文件中添加许多其他内容。例如，如果你[已配置基于 SSH 密钥的身份验证](https://www.ostechnix.com/configure-ssh-key-based-authentication-linux/)，说明 SSH 密钥文件的位置，如下所示：

```
Host ubuntu
    HostName 192.168.225.50
    User senthil
    IdentityFIle ~/.ssh/id_rsa_remotesystem
```

确保已使用你自己的值替换主机名、用户名和 SSH 密钥文件路径。

现在使用以下命令连接到远程服务器：

```
$ ssh ubuntu
```

这样，你可以添加希望通过 SSH 访问的任意多台远程主机，并使用别名快速访问它们。

#### 方法 2 – 使用 Bash 别名

这是创建 SSH 别名的一种应急变通的方法，可以加快通信的速度。你可以使用 [alias 命令](https://www.ostechnix.com/the-alias-and-unalias-commands-explained-with-examples/)使这项任务更容易。

打开 `~/.bashrc` 或者 `~/.bash_profile` 文件：

```
alias webserver='ssh sk@server.example.com'
alias dns='ssh sk@server.example.com'
alias dhcp='ssh sk@server.example.com -p 2233'
alias ubuntu='ssh sk@server.example.com -i ~/.ssh/id_rsa_remotesystem'
```

再次确保你已使用自己的值替换主机、主机名、端口号和 IP 地址。保存文件并退出。

然后，使用命令应用更改：

```
$ source ~/.bashrc
```

或者

```
$ source ~/.bash_profile
```

在此方法中，你甚至不需要使用 `ssh 别名` 命令。相反，只需使用别名，如下所示。

```
$ webserver
$ dns
$ dhcp
$ ubuntu
```

![](/data/attachment/album/201905/13/222939ru43vahbbbrbbhgd.png)

这两种方法非常简单，但对于经常通过 SSH 连接到多个不同系统的人来说非常有用，而且非常方便。使用适合你的上述任何一种方法，通过 SSH 快速访问远程 Linux 系统。

建议阅读：

* [允许或拒绝 SSH 访问 Linux 中的特定用户或组](https://www.ostechnix.com/allow-deny-ssh-access-particular-user-group-linux/)
* [如何在 Linux 上 SSH 到特定目录](https://www.ostechnix.com/how-to-ssh-into-a-particular-directory-on-linux/)
* [如何在 Linux 中断开 SSH 会话](https://www.ostechnix.com/how-to-stop-ssh-session-from-disconnecting-in-linux/)
* [4 种方式在退出 SSH 会话后保持命令运行](https://www.ostechnix.com/4-ways-keep-command-running-log-ssh-session/)
* [SSLH – 共享相同端口的 HTTPS 和 SSH](https://www.ostechnix.com/sslh-share-port-https-ssh/)

目前这就是全部了，希望它对你有帮助。更多好东西要来了，敬请关注！

干杯！

---

via: <https://www.ostechnix.com/how-to-create-ssh-alias-in-linux/>

作者：[sk](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 Python 进行社交媒体情感分析入门

Summary: 学习自然语言处理的基础知识并探索两个有用的 Python 包。

学习自然语言处理的基础知识并探索两个有用的 Python 包。

>
> 学习自然语言处理的基础知识并探索两个有用的 Python 包。
>
>
>

![](/data/attachment/album/201905/14/002943t6udxhhcq1zoxu15.jpg)

自然语言处理（NLP）是机器学习的一种，它解决了口语或书面语言和计算机辅助分析这些语言之间的相关性。日常生活中我们经历了无数的 NLP 创新，从写作帮助和建议到实时语音翻译，还有口译。

本文研究了 NLP 的一个特定领域：情感分析。重点是确定输入语言的积极、消极或中性性质。本部分将解释 NLP 和情感分析的背景，并探讨两个开源的 Python 包。[第 2 部分](https://opensource.com/article/19/4/social-media-sentiment-analysis-python-part-2)将演示如何开始构建自己的可扩展情感分析服务。

在学习情感分析时，对 NLP 有一个大体了解是有帮助的。本文不会深入研究数学本质。相反，我们的目标是阐明 NLP 中的关键概念，这些概念对于将这些方法实际结合到你的解决方案中至关重要。

### 自然语言和文本数据

合理的起点是从定义开始：“什么是自然语言？”它是我们人类相互交流的方式，沟通的主要方式是口语和文字。我们可以更进一步，只关注文本交流。毕竟，生活在 Siri、Alexa 等无处不在的时代，我们知道语音是一组与文本无关的计算。

### 数据前景和挑战

我们只考虑使用文本数据，我们可以对语言和文本做什么呢？首先是语言，特别是英语，除了规则还有很多例外，含义的多样性和语境差异，这些都可能使人类口译员感到困惑，更不用说计算机翻译了。在小学，我们学习文章和标点符号，通过讲母语，我们获得了寻找直觉上表示唯一意义的词的能力。比如，出现诸如 “a”、“the” 和 “or” 之类的文章，它们在 NLP 中被称为*停止词*，因为传统上 NLP 算法是在一个序列中找到这些词时意味着搜索停止。

由于我们的目标是自动将文本分类为情感类，因此我们需要一种以计算方式处理文本数据的方法。因此，我们必须考虑如何向机器表示文本数据。众所周知，利用和解释语言的规则很复杂，输入文本的大小和结构可能会有很大差异。我们需要将文本数据转换为数字数据，这是机器和数学的首选方式。这种转变属于*特征提取*的范畴。

在提取输入文本数据的数字表示形式后，一个改进可能是：给定一个文本输入体，为上面列出的文章确定一组向量统计数据，并根据这些数据对文档进行分类。例如，过多的副词可能会使撰稿人感到愤怒，或者过度使用停止词可能有助于识别带有内容填充的学期论文。诚然，这可能与我们情感分析的目标没有太大关系。

### 词袋

当你评估一个文本陈述是积极还是消极的时候，你使用哪些上下文来评估它的极性？（例如，文本中是否具有积极的、消极的或中性的情感）一种方式是隐含形容词：被称为 “disgusting”（恶心） 的东西被认为是消极的，但如果同样的东西被称为 “beautiful”（漂亮），你会认为它是积极的。从定义上讲，俗语给人一种熟悉感，通常是积极的，而脏话可能是敌意的表现。文本数据也可以包括表情符号，它带有固定的情感。

理解单个单词的极性影响为文本的<ruby>   词袋  <rt>  bag-of-words </rt></ruby>（BoW）模型提供了基础。它分析一组单词或词汇表，并提取关于这些单词在输入文本中是否存在的度量。词汇表是通过处理已知极性的文本形成称为*标记的训练数据*。从这组标记数据中提取特征，然后分析特征之间的关系，并将标记与数据关联起来。

“词袋”这个名称说明了它的用途：即不考虑空间位置或上下文的的单个词。词汇表通常是由训练集中出现的所有单词构建的，训练后往往会被修剪。如果在训练之前没有清理停止词，那么停止词会因为其高频率和低语境而被移除。很少使用的单词也可以删除，因为缺乏为一般输入实例提供的信息。

但是，重要的是要注意，你可以（并且应该）进一步考虑单词在单个训练数据实例之外的情形，这称为<ruby>   词频  <rt>  term frequency </rt></ruby>（TF）。你还应该考虑输入数据在所有训练实例中的单词计数，通常，出现在所有文档中的低频词更重要，这被称为<ruby>   逆文本频率指数  <rt>  inverse document frequency </rt></ruby>（IDF）。这些指标一定会在本主题系列的其他文章和软件包中提及，因此了解它们会有所帮助。

词袋在许多文档分类应用程序中很有用。然而，在情感分析中，当缺乏情境意识的问题被利用时，事情就可以解决。考虑以下句子：

* 我们不喜欢这场战争。
* 我讨厌下雨天，好事是今天是晴天。
* 这不是生死攸关的问题。

这些短语的情感对于人类口译员来说是有难度的，而且通过严格关注单个词汇的实例，对于机器翻译来说也是困难的。

在 NLP 中也可以使用称为 “n-grams” 的单词分组。一个二元组考虑两个相邻单词组成的组而不是（或除了）单个词袋。这应该可以缓解诸如上述“不喜欢”之类的情况，但由于缺乏语境意思，它仍然是个问题。此外，在上面的第二句中，下半句的情感语境可以被理解为否定前半部分。因此，这种方法中也会丢失上下文线索的空间局部性。从实用角度来看，使问题复杂化的是从给定输入文本中提取的特征的稀疏性。对于一个完整的大型词汇表，每个单词都有一个计数，可以将其视为一个整数向量。大多数文档的向量中都有大量的零计数向量，这给操作增加了不必要的空间和时间复杂度。虽然已经提出了许多用于降低这种复杂性的简便方法，但它仍然是一个问题。

### 词嵌入

<ruby> 词嵌入 <rt>  Word embedding </rt></ruby>是一种分布式表示，它允许具有相似含义的单词具有相似的表示。这是基于使用实值向量来与它们周围相关联。重点在于使用单词的方式，而不仅仅是它们的存在与否。此外，词嵌入的一个巨大实用优势是它们关注于密集向量。通过摆脱具有相应数量的零值向量元素的单词计数模型，词嵌入在时间和存储方面提供了一个更有效的计算范例。

以下是两个优秀的词嵌入方法。

#### Word2vec

第一个是 [Word2vec](https://en.wikipedia.org/wiki/Word2vec)，它是由 Google 开发的。随着你对 NLP 和情绪分析研究的深入，你可能会看到这种嵌入方法。它要么使用一个<ruby> 连续的词袋 <rt>  continuous bag of words </rt></ruby>（CBOW），要么使用一个连续 skip-gram 模型。在 CBOW 中，一个单词的上下文是在训练中根据围绕它的单词来学习的。连续 skip-gram 学习倾向于围绕给定的单词学习单词。虽然这可能超出了你需要解决的问题，但是如果你曾经面对必须生成自己的词嵌入情况，那么 Word2vec 的作者就提倡使用 CBOW 方法来提高速度并评估频繁的单词，而 skip-gram 方法更适合嵌入稀有单词更重要的嵌入。

#### GloVe

第二个是<ruby>   用于词表示的全局向量  <rt>  Global Vectors for Word Representation </rt></ruby>（GloVe），它是斯坦福大学开发的。它是 Word2vec 方法的扩展，试图通过将经典的全局文本统计特征提取获得的信息与 Word2vec 确定的本地上下文信息相结合。实际上，在一些应用程序中，GloVe 性能优于 Word2vec，而在另一些应用程序中则不如 Word2vec。最终，用于词嵌入的目标数据集将决定哪种方法最优。因此，最好了解它们的存在性和高级机制，因为你很可能会遇到它们。

#### 创建和使用词嵌入

最后，知道如何获得词嵌入是有用的。在第 2 部分中，你将看到我们通过利用社区中其他人的实质性工作，站到了巨人的肩膀上。这是获取词嵌入的一种方法：即使用现有的经过训练和验证的模型。实际上，有无数的模型适用于英语和其他语言，一定会有一种模型可以满足你的应用程序，让你开箱即用！

如果没有的话，就开发工作而言，另一个极端是培训你自己的独立模型，而不考虑你的应用程序。实质上，你将获得大量标记的训练数据，并可能使用上述方法之一来训练模型。即使这样，你仍然只是在理解你输入文本数据。然后，你需要为你应用程序开发一个特定的模型（例如，分析软件版本控制消息中的情感价值），这反过来又需要自己的时间和精力。

你还可以对针对你的应用程序的数据训练一个词嵌入，虽然这可以减少时间和精力，但这个词嵌入将是特定于应用程序的，这将会降低它的可重用性。

### 可用的工具选项

考虑到所需的大量时间和计算能力，你可能想知道如何才能找到解决问题的方法。的确，开发可靠模型的复杂性可能令人望而生畏。但是，有一个好消息：已经有许多经过验证的模型、工具和软件库可以为我们提供所需的大部分内容。我们将重点关注 [Python](https://www.python.org/)，因为它为这些应用程序提供了大量方便的工具。

#### SpaCy

[SpaCy](https://pypi.org/project/spacy/) 提供了许多用于解析输入文本数据和提取特征的语言模型。它经过了高度优化，并被誉为同类中最快的库。最棒的是，它是开源的！SpaCy 会执行标识化、词性分类和依赖项注释。它包含了用于执行此功能的词嵌入模型，还有用于为超过 46 种语言的其他特征提取操作。在本系列的第二篇文章中，你将看到它如何用于文本分析和特征提取。

#### vaderSentiment

[vaderSentiment](https://pypi.org/project/vaderSentiment/) 包提供了积极、消极和中性情绪的衡量标准。正如 [原论文](http://comp.social.gatech.edu/papers/icwsm14.vader.hutto.pdf) 的标题（《VADER：一个基于规则的社交媒体文本情感分析模型》）所示，这些模型是专门为社交媒体文本数据开发和调整的。VADER 接受了一组完整的人类标记过的数据的训练，包括常见的表情符号、UTF-8 编码的表情符号以及口语术语和缩写（例如 meh、lol、sux）。

对于给定的输入文本数据，vaderSentiment 返回一个极性分数百分比的三元组。它还提供了一个单个的评分标准，称为 *vaderSentiment 复合指标*。这是一个在 `[-1, 1]` 范围内的实值，其中对于分值大于 `0.05` 的情绪被认为是积极的，对于分值小于 `-0.05` 的被认为是消极的，否则为中性。

在[第 2 部分](https://opensource.com/article/19/4/social-media-sentiment-analysis-python-part-2)中，你将学习如何使用这些工具为你的设计添加情感分析功能。

---

via: <https://opensource.com/article/19/4/social-media-sentiment-analysis-python>

作者：[Michael McCune](https://opensource.com/users/elmiko/users/jschlessman)  选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


每日安全资讯：哪些属于App违法违规收集使用个人信息？

![](/data/attachment/album/201905/14/075122urrh0noghm0g48gp.jpg)

手机 APP（应用程序）过度索权、注销难等导致个人信息“裸奔”的现象，近年来屡屡被曝光并引发关注。针对手机APP违法违规收集和使用个人信息问题，有关部门连出重拳。今年，中央网信办、工信部、公安部、市场监管总局等四部门开展专项治理行动，向违法违规手机APP“开刀”。

手机APP的哪些伎俩属于违法违规收集个人信息？根据国家网信办官网消息，《APP违法违规收集使用个人信息行为认定方法（征求意见稿）》（以下简称《征求意见稿》）近日公开征求社会意见，对相关行为给出了较为明确的界定。

**7 种 APP 情形被认定为违法违规**

根据《征求意见稿》，APP违法违规收集使用个人信息共有7种情形，包括没有公开收集使用规则；没有明示收集使用个人信息的目的、方式和范围；未经同意收集使用个人信息；违反必要性原则收集与其提供的服务无关的个人信息；未经同意向他人提供个人信息；未按法律规定提供删除或更正个人信息功能；侵犯未成年人在网络空间合法权益。

针对上述7种情形，《征求意见稿》有进一步的详细规定。例如，APP没有隐私政策、用户协议，在安装、使用等过程中均未通过弹窗、链接等方式提示用户阅读隐私政策，进入APP主功能界面后，多于4次点击、滑动才能访问到隐私政策等，都算作违法违规行为。

业内人士指出，《征求意见稿》的制定和公开征求意见，标志着APP违法违规专项治理行动又向前迈进了一步。这一规定既为手机APP运营者自查自纠提供了指引，也为有关监管部门评估和处置违法违规APP提供了参考，内容更加细化，同时切中了专项治理过程中的突出问题，有利于行业的有序发展，也利于公民的个人隐私得到更完善的保护。

**“强制授权”等将受到严厉处罚**

针对用户“吐槽”已久的一些违法违规情形，《征求意见稿》作出了明确的认定。例如，一些APP仅以改善程序功能、提高用户体验为由，收集用户个人信息；不少APP在申请调阅通讯录等权限时，未告知用户收集使用的目的；很多APP收集使用规则的内容晦涩难懂、长如“天书”；一些APP利用个人信息定向推送新闻、广告，却不提供终止推送的选项……以上这些行为，都被认定为违法违规。

与此同时，强制授权、过度索权、超范围收集、注销难等诸多行为都有明确的认定规则，如收集与现有业务无关的个人信息、收集频率等超出业务功能需要，未提供更正、删除个人信息和注销用户账号功能等。

中央网信办网络安全协调局巡视员兼副局长杨春艳表示，对于存在的问题和消费者反映强烈的问题，APP监管部门将重拳出击。对强制、过度收集个人信息，未经消费者同意、违反法律法规规定和双方约定收集、使用个人信息，发生或可能发生信息泄露、丢失而未采取补救措施，非法出售、非法向他人提供个人信息等行为，按照《网络安全法》《消费者权益保护法》等依法予以处罚。公安机关开展打击整治网络侵犯公民个人信息违法犯罪专项工作，依法严厉打击针对和利用个人信息的违法犯罪行为。

**彻底打破滥取用户信息的潜规则**

据悉，自APP违法违规收集使用个人信息专项治理工作组成立以来，至今年4月上旬，举报信息已近3500条，涉及1300余款APP。其中，对于30款用户量大、问题严重的APP，工作组已向其运营者发出了整改通知。

移动安全专家田铭表示，在大数据时代，一些互联网企业将手机APP用户视为重要资源，过度、过量索取用户隐私已成潜规则。企业获取的消费者信息越多，能绘制的消费者画像就越精准，从而达到流量变现的目的。

而获取消费者信息后，企业的数据保存和利用也存在安全隐患。一些企业的数据库缺乏有力的安全防护，在遭遇网络攻击时容易造成用户数据泄露。因此，专家指出，在认定方法最终出台后，要让相关规范在行业中得到严格执行，还需要一个循序渐进的过程。应通过技术性、长效性的个人信息保护解决方案，从源头上规范APP运营商的研发和推广，有效解决APP违规违法使用个人信息问题。

有APP运营者表示，运营团队十分关注认定方法的提出，也正在按照法律法规要求进行自查自纠。未来，将根据《征求意见稿》的进展做好合规准备，及时按照规定的要求查漏补缺，保护好用户的个人信息安全。

来源：人民日报海外版

### 更多资讯

##### Facebook 起诉韩国数据分析公司 欲重塑公司隐私形象

据外媒 Gizmodo 报道，在韩国数据分析公司 Rankwave 未能提供证据证明其遵守 Facebook 的数据政策之后，Facebook 已对该公司提起诉讼，指控 Rankwave 违反合同约定。

来源： 新浪科技

详情： http://t.cn/EK5nKxs

##### 报道称与俄罗斯有关的社交媒体账户正在传播针对欧盟选举的虚假信息

据《纽约时报》周日报道，一组与俄罗斯或极右翼团体有联系的网站和社交媒体账户正在传播虚假信息，并在欧盟关键选举前几周鼓励政治分歧。欧盟调查人员告诉《纽约时报》，该活动与俄罗斯此前的攻击活动具有许多相同的特征，包括俄罗斯干涉2016年美国大选的事件。

来源： cnBeta.COM

详情： <http://t.cn/EK5np5C>

##### 关于国家信息安全漏洞库（CNNVD）正式启动 2019 年兼容性服务申请工作的通知

CNNVD 兼容性服务是 CNNVD 面向国内外信息安全从业单位，对其产品/服务等涉及的漏洞信息进行规范性评估与认证的服务。通过 CNNVD 兼容性服务的信息安全产品/服务，可实现其漏洞信息拥有统一的规范性命名与标准化描述，为漏洞挖掘、应用、验证与规避等技术研究提供基础支持，为开发更安全的信息产品或软件系统提供理论和技术支撑，进一步满足国家重要信息系统安全保障的需求。

来源： FreeBuf.COM

详情： <http://t.cn/EK5nWd9>

##### 湖南一网站遭黑客入侵发布大量招嫖信息被查处

2019 年 5 月 5 日，在湘西州公安局网技支队的大力支持下，保靖县公安局成功办理一起违反《中华人民共和国网络安全法》行政案件，及时查处一家涉黄网站。这是自今年扫黑除恶 " 大走访、大排查、大管控、大研判 " 专项整治行动开展以来，该县依法成功处置的全州第一起网络安全类行政案件，有效防止涉黄招嫖有害信息进一步扩散。

来源： 中国经济网

详情： <http://t.cn/EK5nTrp>

（信息来源于网络，安华金和搜集整理）


将 Fedora 29 升级到 Fedora 30

![](/data/attachment/album/201905/14/125156dtuotjgs5wto8z38.jpg)

Fedora 30 [已经发布了](https://fedoramagazine.org/announcing-fedora-30/)。你可能希望将系统升级到最新版本的 Fedora。Fedora 工作站版本有图形化升级的方法。另外，Fedora 也提供了一个命令行方法，用于将 Fedora 29 升级到 Fedora 30。

### 将 Fedora 29 工作站版本升级到 Fedora 30

在发布不久后，桌面会显示一条通知告诉你可以升级。你可以单击通知启动 “GNOME 软件” 应用。或者你可以从 GNOME Shell 中选择“软件”。

在 “GNOME 软件” 中选择*更新*选项卡，你会看到一个页面通知你可以更新 Fedora 30。

如果你在屏幕上看不到任何内容，请尝试点击左上角的重新加载按钮。发布后，所有系统都可能需要一段时间才能看到可用的升级。

选择“下载”获取升级包。你可以继续做其他的事直到下载完成。然后使用 “GNOME 软件” 重启系统并应用升级。升级需要时间，因此你可以喝杯咖啡，稍后再回来。

### 使用命令行

如果你过去升级过 Fedora 版本，你可能熟悉 `dnf upgrade` 插件。这是从 Fedora 29 升级到 Fedora 30 的推荐和支持的方式。使用这个插件将使你的 Fedora 30 升级简单易行。

#### 1、更新软件并备份系统

在你执行任何操作之前，你需要确保在开始升级之前拥有 Fedora 29 的最新软件。要更新软件，请使用 “GNOME 软件” 或在终端中输入以下命令。

```
sudo dnf upgrade --refresh
```

此外，请确保在继续之前备份系统。关于备份的帮助，请参阅 Fedora Magazine 上的[备份系列](https://fedoramagazine.org/taking-smart-backups-duplicity/)。

#### 2、安装 DNF 插件

接下来，打开终端并输入以下命令来安装插件：

```
sudo dnf install dnf-plugin-system-upgrade
```

#### 3、使用 DNF 开始更新

现在你的系统是最新的，完成了备份，并且已安装 DNF 插件，你可以在终端中使用以下命令开始升级：

```
sudo dnf system-upgrade download --releasever=30
```

此命令将开始在本地下载所有升级文件以准备升级。如果你因为没有更新包、错误的依赖，或过时的包在升级时遇到问题，请在输入上面的命令时添加 `-- allowerasing` 标志。这将允许 DNF 删除可能阻止系统升级的软件包。

#### 4、重启并升级

当前面的命令完成下载所有升级文件后，你的系统就可以重启了。要将系统引导至升级过程，请在终端中输入以下命令：

```
sudo dnf system-upgrade reboot
```

此后你的系统将重启。在许多版本之前，`fedup` 工具将在内核选择/引导页面上创建一个新选项。使用 `dnf-plugin-system-upgrade` 包，你的系统将使用当前 Fedora 29 安装的内核重启。这个是正常的。在内核选择页面后不久，系统开始升级过程。

现在可以休息一下了！完成后你的系统将重启，你就可以登录新升级的 Fedora 30 了。

![](/data/attachment/album/201905/14/125236ikivq4ixvexxppar.png)

### 解决升级问题

升级系统时偶尔可能会出现意外问题。如果你遇到任何问题，请访问 [DNF 系统升级的维基页面](https://fedoraproject.org/wiki/DNF_system_upgrade#Resolving_post-upgrade_issues)，以获取有关出现问题时的故障排除的更多信息。

如果你在升级时遇到问题并在系统上安装了第三方仓库，那么可能需要在升级时禁用这些仓库。有关 Fedora 对未提供仓库的支持，请与仓库的提供商联系。

---

via: <https://fedoramagazine.org/upgrading-fedora-29-to-fedora-30/>

作者：[Ryan Lerch](https://fedoramagazine.org/author/ryanlerch/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Ubuntu 和其他 Linux 发行版上使用 7Zip

>
> 不能在 Linux 中提取 .7z 文件？学习如何在 Ubuntu 和其他 Linux 发行版中安装和使用 7zip。
>
>
>

![](/data/attachment/album/201905/14/154515xqy7nbq6eyjzu7qj.jpg)

[7Zip](https://www.7-zip.org/)（更适当的写法是 7-Zip）是一种在 Windows 用户中广泛流行的归档格式。一个 7Zip 归档文件通常以 .7z 扩展结尾。它大部分是开源的，除了包含一些少量解压 rar 文件的代码。

默认大多数 Linux 发行版不支持 7Zip。如果你试图提取它，你会看见这个错误：

>
> 不能打开这种文件类型
>
>
> 没有已安装的适用 7-zip 归档文件的命令。你想搜索一个命令来打开这个文件吗？
>
>
>

![](/data/attachment/album/201905/14/155501xzl2lnf4ekgvk4bf.png)

不要担心，你可以轻松的在 Ubuntu 和其他 Linux 发行版中安装 7zip。

一个问题是你会注意到如果你试图用 [apt-get install 命令](https://itsfoss.com/apt-get-linux-guide/)，你会发现没有以 7zip 开头的候选安装。因为在 Linux 中 7Zip 包的名字是 [p7zip](https://sourceforge.net/projects/p7zip/)。以字母 “p” 开头而不是预期的数字 “7”。

让我们看一下如何在 Ubuntu 和其他 Linux 发行版中安装 7zip。

### 在 Ubuntu Linux 中安装 7Zip

你需要做的第一件事是安装 p7zip 包。你会在 Ubuntu 中发现 3 个包：p7zip、p7zip-full 和 pzip-rar。

pzip 和 p7zip-full 的不同是 pzip 是一个轻量级的版本，仅仅对 .7z 文件提供支持，而 p7zip-full 提供了更多的 7z 压缩算法（例如音频文件）。

p7zip-rar 包在 7z 中提供了对 [RAR 文件](https://itsfoss.com/use-rar-ubuntu-linux/) 的支持

在大多数情况下安装 p7zip-full 就足够了，但是你可能想安装 p7zip-rar 来支持 rar 文件的解压。

p7zip 包在 [Ubuntu 的 universe 仓库](https://itsfoss.com/ubuntu-repositories/) 因此保证你可以使用以下命令：

```
sudo add-apt-repository universe
sudo apt update
```

在 Ubuntu 和基于 Debian 的发行版中使用以下命令。

```
sudo apt install p7zip-full p7zip-rar
```

这很好。现在在你的系统就有了 7zip 归档的支持。

### 在 Linux 中提取 7Zip 归档文件

安装了 7Zip 后，在 Linux 中，你可以在图形用户界面或者 命令行中提取 7zip 文件。

在图形用户界面，你可以像提取其他压缩文件一样提取 .7z 文件。右击文件来提取它。

在终端中，你可以使用下列命令提取 .7z 归档文件：

```
7z e file.7z
```

### 在 Linux 中压缩文件为 7zip 归档格式

你可以在图形界面压缩文件为 7zip 归档格式。简单的在文件或目录上右击，选择“压缩”。你应该看到几种类型的文件格式选项。选择 .7z。

![7zip Archive Ubuntu](/data/attachment/album/201905/14/155503pywvbydeowybyeke.png)

作为替换，你也可以在命令行中使用。这里是你可以用来压缩的命令：

```
7z a 输出的文件名 要压缩的文件
```

默认，归档文件有 .7z 扩展。你可以通过在指定输出文件扩展名为 .zip 以压缩为 zip 格式。

### 总结

就是这样。看，在 Linux 中使用 7zip 多简单？我希望你喜欢这个快速指南。如果你有问题或者建议，请随意在下方评论让我知道。

---

via: <https://itsfoss.com/use-7zip-ubuntu-linux/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[warmfrog](https://github.com/warmfrog) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


PPython：PHP 拥抱 Python 的利器

Summary: PPython，这是一种从根本上将 PHP 与 Python 有效结合的技术。

PPython，这是一种从根本上将 PHP 与 Python 有效结合的技术。

![](/data/attachment/album/201905/14/164622ppbkxkvbr1vgxrxo.jpg)

### 介绍

Python 与 PHP 都是广泛使用的语言，各有所长，让人期待两者结合可以实现更丰富的效果。

在 PHP 中调用 Python 实现某些处理，这种需求虽然比较小众，还是实用的。目前网上可以查到很多资料仍在探讨 `exec()`（也包括 `system()`、`shell_exec()`、`passthru()` 等）执行外部的 Python 文件，但这只是一种通用的方式，调用成本比较高，在每次调用时，需要装载整个 Python 解释环境。

有此类需求的开发者非常适合看一下 PPython，这是一种从根本上将 PHP 与 Python 有效结合的技术。

PPython 最初见于 <https://code.google.com/p/ppython>，该作者将 [lajp](https://code.google.com/p/lajp)（一种 PHP 结合 Java 的技术）移植到了 Python 上。

该项目最初建立于 2012 年，而且似乎已经停止维护多年，不过目前来看其思路及效果还是值得肯定的，因此将此项目从停止运营的 Google Code 上迁移到了 [GitHub](https://www.github.com/maiwang79/ppython)，并遵循原 Apache 许可证重新发布和维护。

日前笔者对此作了一番尝试，对 PPython 的方便易用有所体会。

### 原理与架构

PHP 与 Python 通讯有两种不同的套接字机制：TCP 套接字和 UNIX 套接字。UNIX 套接字是 Unix/Linux 本地套接字，相对于 TCP 套接字，具有以下特点：

* 只能在同一台主机中通讯（IPC），不能跨主机；
* 传输速度大于 TCP 套接字；
* 服务端只向本机提供服务（没有对外侦听端口），相对安全，易于管理。

PHP 和 Python 各有其语言内部定义的数据类型，通常 PHP 进程与 Python 进程进行数据交互时，需要进行转码处理。此类转换如由应用自行实现，从开发效率到运行性能都会增加不少额外负担。

PPython 对 PHP 和 Python 间的通讯方式的处理支持 TCP 套接字和 UNIX 套接字两种机制，兼顾通讯效率和分布式，转码由服务统一处理，Python 为 PHP 的数据类型提供格式兼容，使 PHP 端开发无须为底层通讯担心。

Python 因其语言 GIL 特性，同一进程内多线程效率不高。PPython 可根据项目需要部署服务，多进程运行 Python，提高应用综合性能。

![](/data/attachment/album/201905/14/163259mlld9d4ysvl5bwyd.png)

### 使用方法

PPython 的代码可从[上述项目仓库](https://www.github.com/maiwang79/ppython)中下载。

下载得到的文件中，以下三个是 PPython 的核心代码，作用如下：

* `php_python.py`，Python 进程主文件，完成 Python 端监听请求并运行返回
* `process.py`，Python 端核心类，实现 Python 内部进程调用及 PHP 与 Python 数据结构转化等关键处理
* `php_python.php`，PPython 客户端，PHP 端引用此文件，可直接使用 PPython 函数实现调用。

将以上文件放置到任意目录。先修改准备运行 PPython 的端口，监听端口不限，只要 `php_python.py` 和 `php_python.php` 两端修改一致。笔者统一改为 10240。

在当前目录下运行 `php_python.py`，只要 Python 环境正常，便将运行起一个 PPython 的服务。

```
-------------------------------------------
- PPython Service
- Time: 2019-05-13 22:24:09
-------------------------------------------
Listen port: 10240
charset: utf-8
Server startup...
```

PHP 端引入 `php_python.php`，就可以用 `ppython` 函数与之前启动的 PPython 服务通讯，传入请求由 PPython 服务调用 Python 处理后返回结果，如 `$res = ppython('test::go')` 是调用`test.py` 中的 `go` 函数，也可加上更多参数，第二个参数起将为被调的函数传递更多参数。

`php_python.py` 是 PPython 启动后直接运行的全局代码，有全局配置或进程启动后的通用处理都写在这里，如原生代码中建立了数据库连接等，项目中应视情况作优化。

但 Python 令人感兴趣的主要方面不只是像 PHP 那样描述业务功能，它可以在人工智能等领域所需要的计算型任务提供对更复杂的数据结构的处理，因此二者的结合可以给 PHP 带来更多应用场景。

### 改进

此外，原生的 `php_python.py` 还有些不足。笔者用 `ppython` 调用自定义代码中遇到了三个问题，并相应做了解决：

1. 不支持 `complex`（复数类），复数是数学上的一种数据类型，主要包括 `real`（实部）和 `imag`（虚部）数据，虽然日常生活中遇到较少，但 AI 和各种专业研究领域或并不罕见。Python 里有 `complex` 类，对复数可以直接进行各种计算，但 `PPython` 序列化和反序列化对 `complex` 没有处理。为了能让 `complex` 包括的数据能正常返回，只要在 `process.py` 的 `z_encode()` 方法中加上符合 PHP 要求的序列化处理，代码如下：

```
elif isinstance(p, numpy.complex128):
    t1 = str(p.real)
    t2 = str(p.imag)
    return 'O:7:"complex":2:{s:4:"real";d:%s;s:4:"imag";d:%s;}' % (t1,t2)
```
2. 不支持 `ndarray`（多维数组）。相比 `complex`，`ndarray` 要普通得多，相信凡使用到 Python 的各种计算功能，`ndarray` 是无法回避的，甚至 `ndarray` 在一定程度上成就了 Python。但原 `php_python.py` 不能识别 `ndarray`。不过解决起来并不难，在 `process.py` 里找到`z_encode()` 方法，加上下面这段，可以直接将 `ndarray` 转化为符合 PHP 要求的数组（数字索引）。

```
    elif isinstance(p, numpy.ndarray):
        s = ''
        i = 0
        for d in p:
            s += 'i:%d;%s' % (i,z_encode(d))
            i += 1
        return "a:%d:{%s}" % (len(p),s)
```
3. 原代码不太稳健，如数据为 `ndarray` 类型，`if p == None:`报错`ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()`，因为`p == None`的结果也是`ndarray`，不返回`false` ，将判断方法改为`if p is None:`可避免出错。

相应地 PHP 端也要注意一下序列化和反序列化的处理。

处理回复中类似 `complex` 这样的对象数据时，如系统中没有定义相应的类，PHP 是可以反序列化的，但将显示为 “incomplete object”，`vardump` 看得到 `real` 和 `imag` 数据，但不能直接操作，自行定义 `complex` 类后，则按指定的类进行解析，与 PHP 内的一般对象无异，可以轻松进行所有操作。

至此，PHP 与 Python 的功能调讯已无问题。

### 补充：注册为服务

命令行下启动 `php_python.py` 主要是方便调试，可以看到观察反馈信息等，生产环境中手工启动 PPython 毕竟不太方便。可以将 PPython 配置成服务，修改端口也可以为不同的应用配置不同的 PPython 端。

Linux 下将一个进程注册为服务很简单，只要建立 `/usr/lib/systemd/system/ppython.service`，内容如下：

```
[Unit]
Description=PHP-Python Service
After=network.target remote-fs.target nss-lookup.target

[Service]
ExecStart={PPYTHON_PATH}/php_python.py

[Install]
WantedBy=multi-user.target
```

其中 `{PPYTHON_PATH}` 要改成实际路径。

### 总结

有了 PPython，可以摒弃 `exec()` 这种 shell 调用，使开发回归到逻辑本身。

个人认为该方案值得所有对 PHP 和 Python 都感兴趣的开发人员了解，也欢迎大家参与和贡献这个[项目](https://www.github.com/maiwang79/ppython)。


每日安全资讯：开源组件漏洞影响多个 CMS 系统

Summary: 运行 Drupal、Joomla 或 Typo3 系统的网站需要及时打上补丁。

运行 Drupal、Joomla 或 Typo3 系统的网站需要及时打上补丁。

![](/data/attachment/album/201905/15/081835brspbr44k019nk4p.jpg)

运行 Drupal、Joomla 或 Typo3 系统的网站需要及时打上补丁。编号为 CVE-2019-11831 的漏洞位于 PHP 组件 PharStreamWrapper 中，源于一个路径遍历 bug，允许攻击者用恶意的 phar 归档替换网站的合法相同文件。Drupal 开发者将这个漏洞标记中等危险级别，尽管不是高危，网站管理员还是应该尽可能快的打上补丁。发现该漏洞的安全研究员认为该漏洞属于高危。运行 Drupal 8.7 的网站需要升级到 8.7.1，8.6 或更早版本的网站需要更新到 8.6.16，7 需要升级到 7.67。Joomla 需要升级到 3.9.6。

来源：solidot.org

### 更多资讯

##### 报告称忠诚度计划是“黑客的蜜罐”

使用可以在用户最喜欢的餐馆或服装店节省几美元的忠诚度应用程序似乎是无害的。然而根据《纽约时报》上周六的报道，这正是黑客所依赖的 。据《纽约时报》报道，一个安全组织估计，每年因在线忠诚计划相关犯罪而损失10亿美元。此外，根据Javelin战略与研究公司的说法，此类犯罪从2017年到2018年翻了一番。

来源： cnBeta.COM

详情： <http://t.cn/EKiZ8Eg>

##### 研究人员拟公开来自政府、可能会被遗忘的网络攻击历史记录

据外媒报道，1989年，就在网络成为现实的几个月后，一种计算机蠕虫感染了全世界全球成千上万台计算机，其中包括了NASA的计算机。蠕虫病毒在受感染电脑的屏幕上显示一条信息:“你的系统已被正式 WANKed。”

来源： cnBeta.COM

详情： <http://t.cn/EKiZmLN>

##### 德国网络安全局警告卡巴斯基杀毒软件存在安全缺陷

德国网络安全机构 BSI 就卡巴斯基杀毒软件的安全漏洞发出警告，建议用户尽快安装最新补丁。虽然该建议不包括基于该缺陷可能网络攻击的任何详细信息，但BSI警告说，黑客只需向其目标发送包含特制文件的恶意电子邮件，在某些情况下，甚至不需要打开该文件。

来源： cnBeta.COM

详情： <http://t.cn/EKiZ1zJ>

##### 日本母公司遭黑客袭击 46 万客户信息泄露 而国内优衣库却这样说

日本迅销公司 5 月 14 日发布声明说，旗下品牌优衣库、GU 销售网站逾 46 万名客户个人消息遭未授权访问，可能造成信息泄露。优衣库方面当天对北京青年报记者表示，经调查，此次事件不涉及中国的网站及信息平台。

来源： 北青网

详情： <http://t.cn/EKiZDBP>

（信息来源于网络，安华金和搜集整理）


如何在你的 Python 游戏中添加一个玩家

Summary: 这是用 Python 从头开始构建游戏的系列文章的第三部分。

这是用 Python 从头开始构建游戏的系列文章的第三部分。

>
> 这是用 Python 从头开始构建游戏的系列文章的第三部分。
>
>
>

![](/data/attachment/album/201905/15/220708uu2vodtkjd5v7uvd.png)

在 [这个系列的第一篇文章](/article-9071-1.html) 中，我解释了如何使用 Python 创建一个简单的基于文本的骰子游戏。在第二部分中，我向你们展示了如何从头开始构建游戏，即从 [创建游戏的环境](/article-10850-1.html) 开始。但是每个游戏都需要一名玩家，并且每个玩家都需要一个可操控的角色，这也就是我们接下来要在这个系列的第三部分中需要做的。

在 Pygame 中，玩家操控的图标或者化身被称作<ruby> 妖精 <rt>  sprite </rt></ruby>。如果你现在还没有任何可用于玩家妖精的图像，你可以使用 [Krita](http://krita.org) 或 [Inkscape](http://inkscape.org) 来自己创建一些图像。如果你对自己的艺术细胞缺乏自信，你也可以在 [OpenClipArt.org](http://openclipart.org) 或 [OpenGameArt.org](https://opengameart.org/) 搜索一些现成的图像。如果你还未按照上一篇文章所说的单独创建一个 `images` 文件夹，那么你需要在你的 Python 项目目录中创建它。将你想要在游戏中使用的图片都放 `images` 文件夹中。

为了使你的游戏真正的刺激，你应该为你的英雄使用一张动态的妖精图片。这意味着你需要绘制更多的素材，并且它们要大不相同。最常见的动画就是走路循环，通过一系列的图像让你的妖精看起来像是在走路。走路循环最快捷粗糙的版本需要四张图像。

![](/data/attachment/album/201905/15/220634e7eu508egkhemwwk.jpg)

注意：这篇文章中的代码示例同时兼容静止的和动态的玩家妖精。

将你的玩家妖精命名为 `hero.png`。如果你正在创建一个动态的妖精，则需要在名字后面加上一个数字，从 `hero1.png` 开始。

### 创建一个 Python 类

在 Python 中，当你在创建一个你想要显示在屏幕上的对象时，你需要创建一个类。

在你的 Python 脚本靠近顶端的位置，加入如下代码来创建一个玩家。在以下的代码示例中，前三行已经在你正在处理的 Python 脚本中：

```
import pygame
import sys
import os # 以下是新代码

class Player(pygame.sprite.Sprite):
    '''
    生成一个玩家
    '''
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.images = []
    img = pygame.image.load(os.path.join('images','hero.png')).convert()
    self.images.append(img)
    self.image = self.images[0]
    self.rect  = self.image.get_rect()
```

如果你的可操控角色拥有一个走路循环，在 `images` 文件夹中将对应图片保存为 `hero1.png` 到 `hero4.png` 的独立文件。

使用一个循环来告诉 Python 遍历每个文件。

```
'''
对象
'''

class Player(pygame.sprite.Sprite):
    '''
    生成一个玩家
    '''
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.images = []
        for i in range(1,5):
            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
            self.images.append(img)
            self.image = self.images[0]
            self.rect  = self.image.get_rect()
```

### 将玩家带入游戏世界

现在已经创建好了一个 Player 类，你需要使用它在你的游戏世界中生成一个玩家妖精。如果你不调用 Player 类，那它永远不会起作用，（游戏世界中）也就不会有玩家。你可以通过立马运行你的游戏来验证一下。游戏会像上一篇文章末尾看到的那样运行，并得到明确的结果：一个空荡荡的游戏世界。

为了将一个玩家妖精带到你的游戏世界，你必须通过调用 Player 类来生成一个妖精，并将它加入到 Pygame 的妖精组中。在如下的代码示例中，前三行是已经存在的代码，你需要在其后添加代码：

```
world       = pygame.display.set_mode([worldx,worldy])
backdrop    = pygame.image.load(os.path.join('images','stage.png')).convert()
backdropbox = screen.get_rect()

# 以下是新代码

player = Player()   # 生成玩家
player.rect.x = 0   # 移动 x 坐标
player.rect.y = 0   # 移动 y 坐标
player_list = pygame.sprite.Group()
player_list.add(player)
```

尝试启动你的游戏来看看发生了什么。高能预警：它不会像你预期的那样工作，当你启动你的项目，玩家妖精没有出现。事实上它生成了，只不过只出现了一毫秒。你要如何修复一个只出现了一毫秒的东西呢？你可能回想起上一篇文章中，你需要在主循环中添加一些东西。为了使玩家的存在时间超过一毫秒，你需要告诉 Python 在每次循环中都绘制一次。

将你的循环底部的语句更改如下：

```
    world.blit(backdrop, backdropbox)
    player_list.draw(screen) # 绘制玩家
    pygame.display.flip()
    clock.tick(fps)
```

现在启动你的游戏，你的玩家出现了！

### 设置 alpha 通道

根据你如何创建你的玩家妖精，在它周围可能会有一个色块。你所看到的是 alpha 通道应该占据的空间。它本来是不可见的“颜色”，但 Python 现在还不知道要使它不可见。那么你所看到的，是围绕在妖精周围的边界区（或现代游戏术语中的“<ruby> 命中区 <rt>  hit box </rt></ruby>”）内的空间。

![](/data/attachment/album/201905/15/220634lu3vsl6i6zm98o99.jpg)

你可以通过设置一个 alpha 通道和 RGB 值来告诉 Python 使哪种颜色不可见。如果你不知道你使用 alpha 通道的图像的 RGB 值，你可以使用 Krita 或 Inkscape 打开它，并使用一种独特的颜色，比如 `#00ff00`（差不多是“绿屏绿”）来填充图像周围的空白区域。记下颜色对应的十六进制值（此处为 `#00ff00`，绿屏绿）并将其作为 alpha 通道用于你的 Python 脚本。

使用 alpha 通道需要在你的妖精生成相关代码中添加如下两行。类似第一行的代码已经存在于你的脚本中，你只需要添加另外两行：

```
            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
            img.convert_alpha()     # 优化 alpha
            img.set_colorkey(ALPHA) # 设置 alpha
```

除非你告诉它，否则 Python 不知道将哪种颜色作为 alpha 通道。在你代码的设置相关区域，添加一些颜色定义。将如下的变量定义添加于你的设置相关区域的任意位置：

```
ALPHA = (0, 255, 0)
```

在以上示例代码中，`0,255,0` 被我们使用，它在 RGB 中所代表的值与 `#00ff00` 在十六进制中所代表的值相同。你可以通过一个优秀的图像应用程序，如 [GIMP](http://gimp.org)、Krita 或 Inkscape，来获取所有这些颜色值。或者，你可以使用一个优秀的系统级颜色选择器，如 [KColorChooser](https://github.com/KDE/kcolorchooser)，来检测颜色。

![](/data/attachment/album/201905/15/220635mnesvs1e33z3yqbz.png)

如果你的图像应用程序将你的妖精背景渲染成了其他的值，你可以按需调整 `ALPHA` 变量的值。不论你将 alpha 设为多少，最后它都将“不可见”。RGB 颜色值是非常严格的，因此如果你需要将 alpha 设为 000，但你又想将 000 用于你图像中的黑线，你只需要将图像中线的颜色设为 111。这样一来，（图像中的黑线）就足够接近黑色，但除了电脑以外没有人能看出区别。

运行你的游戏查看结果。

![](/data/attachment/album/201905/15/220636hqqduw0wzcuqdv8c.jpg)

在 [这个系列的第四篇文章](https://opensource.com/article/17/12/program-game-python-part-4-moving-your-sprite) 中，我会向你们展示如何使你的妖精动起来。多么的激动人心啊！

---

via: <https://opensource.com/article/17/12/game-python-add-a-player>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[cycoe](https://github.com/cycoe) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 Cython 为 Python 编写更快的 C 扩展

>
> 在我们这个包含了 7 个 PyPI 库的系列文章中学习解决常见的 Python 问题的方法。
>
>
>

![](/data/attachment/album/201905/15/225506fnn2mz6l3u122n70.jpg)

Python 是当今使用最多的[流行编程语言](https://opensource.com/article/18/5/numbers-python-community-trends)之一，因为：它是开源的，它有广泛的用途（例如 Web 编程、业务应用、游戏、科学编程等等），它有一个充满活力和专注的社区支持它。这个社区可以让我们在 [Python Package Index](https://pypi.org/)（PyPI）中有如此庞大、多样化的软件包，用以扩展和改进 Python 并解决不可避免的问题。

在本系列中，我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。首先是 [Cython](https://pypi.org/project/Cython/)，一个简化 Python 编写 C 扩展的语言。

### Cython

使用 Python 很有趣，但有时，用它编写的程序可能很慢。所有的运行时动态调度会带来很大的代价：有时它比用 C 或 Rust 等系统语言编写的等效代码慢 10 倍。

将代码迁移到一种全新的语言可能会在成本和可靠性方面付出巨大代价：所有的手工重写工作都将不可避免地引入错误。我们可以两者兼得么？

为了练习一下优化，我们需要一些慢代码。有什么比斐波那契数列的意外指数实现更慢？

```
def fib(n):
  if n < 2:
    return 1
  return fib(n-1) + fib(n-2)
```

由于对 `fib` 的调用会导致两次再次调用，因此这种效率极低的算法需要很长时间才能执行。例如，在我的新笔记本电脑上，`fib(36)` 需要大约 4.5 秒。这个 4.5 秒会成为我们探索 Python 的 Cython 扩展能提供的帮助的基准。

使用 Cython 的正确方法是将其集成到 `setup.py` 中。然而，使用 `pyximport` 可以快速地进行尝试。让我们将 `fib` 代码放在 `fib.pyx` 中并使用 Cython 运行它。

```
>>> import pyximport; pyximport.install()
>>> import fib
>>> fib.fib(36)
```

只使用 Cython 而不*修改*代码，这个算法在我笔记本上花费的时间减少到大约 2.5 秒。几乎无需任何努力，这几乎减少了 50％ 的运行时间。当然，得到了一个不错的成果。

加把劲，我们可以让它变得更快。

```
cpdef int fib(int n):
  if n < 2:
    return 1
  return fib(n - 1) + fib(n - 2)
```

我们将 `fib` 中的代码变成用 `cpdef` 定义的函数，并添加了两个类型注释：它接受一个整数并返回一个整数。

这个变得快*多*了，大约只用了 0.05 秒。它是如此之快，以至于我可能开始怀疑我的测量方法包含噪声：之前，这种噪声在信号中丢失了。

当下次你的 Python 代码花费太多 CPU 时间时，也许会导致风扇狂转，为何不看看 Cython 是否可以解决问题呢？

在本系列的下一篇文章中，我们将看一下 Black，一个自动纠正代码格式错误的项目。

（题图：[Subgrafik San](https://dribbble.com)）

---

via: <https://opensource.com/article/19/5/python-cython>

作者：[Moshe Zadka](https://opensource.com/users/moshez/users/moshez/users/foundjem/users/jugmac00) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用于黑客渗透测试的 21 个最佳 Kali Linux 工具

>
> 这里是最好的 Kali Linux 工具列表，它们可以让你评估 Web 服务器的安全性，并帮助你执行黑客渗透测试。
>
>
>

如果你读过 [Kali Linux 点评](https://itsfoss.com/kali-linux-review/)，你就知道为什么它被认为是[最好的黑客渗透测试的 Linux 发行版](https://itsfoss.com/linux-hacking-penetration-testing/)之一，而且名副其实。它带有许多工具，使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。

它是<ruby> 道德黑客 <rt>  ethical hacker </rt></ruby>最推荐的 Linux 发行版之一。即使你不是黑客而是网站管理员 —— 你仍然可以利用其中某些工具轻松地扫描你的网络服务器或网页。

在任何一种情况下，无论你的目的是什么 —— 让我们来看看你应该使用的一些最好的 Kali Linux 工具。

*注意：这里不是所提及的所有工具都是开源的。*

### 用于黑客渗透测试的 Kali Linux 工具

![](/data/attachment/album/201905/15/234125c22rx77mmz9m37zo.jpg)

Kali Linux 预装了几种类型的工具。如果你发现有的工具没有安装，只需下载并进行设置即可。这很简单。

#### 1、Nmap

![Nmap](/data/attachment/album/201905/15/234154lua2xtm5mtxwmjbc.jpg)

[Nmap](https://nmap.org/) （即 “<ruby> 网络映射器 <rt>  Network Mapper </rt></ruby>”）是 Kali Linux 上最受欢迎的信息收集工具之一。换句话说，它可以获取有关主机的信息：其 IP 地址、操作系统检测以及网络安全的详细信息（如开放的端口数量及其含义）。

它还提供防火墙规避和欺骗功能。

#### 2、Lynis

![Lynis](/data/attachment/album/201905/15/234159etw87c5togz71gox.jpg)

[Lynis](https://cisofy.com/lynis/) 是安全审计、合规性测试和系统强化的强大工具。当然，你也可以将其用于漏洞检测和渗透测试。

它将根据检测到的组件扫描系统。例如，如果它检测到 Apache —— 它将针对入口信息运行与 Apache 相关的测试。

#### 3、WPScan

![WPScan](/data/attachment/album/201905/15/234205sgqfijtw4gp4nj1q.jpg)

WordPress 是[最好的开源 CMS](https://itsfoss.com/open-source-cms/)之一，而这个工具是最好的免费 WordpPress 安全审计工具。它是免费的，但不是开源的。

如果你想知道一个 WordPress 博客是否在某种程度上容易受到攻击，[WPScan](https://wpscan.org/) 就是你的朋友。

此外，它还为你提供了所用的插件的详细信息。当然，一个安全性很好的博客可能不会暴露给你很多细节，但它仍然是 WordPress 安全扫描找到潜在漏洞的最佳工具。

#### 4、Aircrack-ng

![Aircrack-ng](/data/attachment/album/201905/15/234207tsn5m1ajy5oonoa5.jpg)

[Aircrack-ng](https://www.aircrack-ng.org/) 是评估 WiFi 网络安全性的工具集合。它不仅限于监控和获取信息 —— 还包括破坏网络（WEP、WPA 1 和 WPA 2）的能力。

如果你忘记了自己的 WiFi 网络的密码，可以尝试使用它来重新获得访问权限。它还包括各种无线攻击能力，你可以使用它们来定位和监控 WiFi 网络以增强其安全性。

#### 5、Hydra

![Hydra](/data/attachment/album/201905/15/234209l9re145z7xeo3evr.jpg)

如果你正在寻找一个有趣的工具来破解登录密码，[Hydra](https://github.com/vanhauser-thc/thc-hydra) 将是 Kali Linux 预装的最好的工具之一。

它可能不再被积极维护，但它现在放在 [GitHub](https://github.com/vanhauser-thc/THC-Archive) 上，所以你也可以为它做贡献。

#### 6、Wireshark

![Wireshark](/data/attachment/album/201905/15/234212fyyex15seel21sj6.jpg)

[Wireshark](https://www.wireshark.org/) 是 Kali Linux 上最受欢迎的网络分析仪。它也可以归类为用于网络嗅探的最佳 Kali Linux 工具之一。

它正在积极维护，所以我肯定会建议你试试它。

#### 7、Metasploit Framework

![Metasploit Framework](/data/attachment/album/201905/15/234214zokxem4848exk2xl.jpg)

[Metsploit Framework](https://github.com/rapid7/metasploit-framework)（MSF）是最常用的渗透测试框架。它提供两个版本：一个开源版，另外一个是其专业版。使用此工具，你可以验证漏洞、测试已知漏洞并执行完整的安全评估。

当然，免费版本不具备所有功能，所以如果你在意它们的区别，你应该在[这里](https://www.rapid7.com/products/metasploit/download/editions/)比较一下版本。

#### 8、Skipfish

![Skipfish](/data/attachment/album/201905/15/234215xriizy0o002cumsx.jpg)

与 WPScan 类似，但它不仅仅专注于 WordPress。[Skipfish](https://gitlab.com/kalilinux/packages/skipfish/) 是一个 Web 应用扫描程序，可以为你提供几乎所有类型的 Web 应用程序的洞察信息。它快速且易于使用。此外，它的递归爬取方法使它更好用。

Skipfish 生成的报告可以用于专业的 Web 应用程序安全评估。

#### 9、Maltego

![Maltego](/data/attachment/album/201905/15/234217twwdt3ne3ted38ny.jpg)

[Maltego](https://www.paterva.com/web7/buy/maltego-clients.php) 是一种令人印象深刻的数据挖掘工具，用于在线分析信息并连接信息点（如果有的话）。 根据这些信息，它创建了一个有向图，以帮助分析这些数据之间的链接。

请注意，这不是一个开源工具。

它已预装，但你必须注册才能选择要使用的版本。如果个人使用，社区版就足够了（只需要注册一个帐户），但如果想用于商业用途，则需要订阅 classic 或 XL 版本。

#### 10、Nessus

![Nessus](/data/attachment/album/201905/15/234218pv5rorhufug8p8o9.jpg)

如果你的计算机连接到了网络，Nessus 可以帮助你找到潜在攻击者可能利用的漏洞。当然，如果你是多台连接到网络的计算机的管理员，则可以使用它并保护这些计算机。

但是，它不再是免费的工具了，你可以从[官方网站](https://www.tenable.com/try)免费试用 7 天。

#### 11、Burp Suite Scanner

![Burp Suite Scanner](/data/attachment/album/201905/15/234220os4hr7rwss43vxs1.jpg)

[Burp Suite Scanner](https://portswigger.net/burp) 是一款出色的网络安全分析工具。与其它 Web 应用程序安全扫描程序不同，Burp 提供了 GUI 和一些高级工具。

社区版仅将功能限制为一些基本的手动工具。对于专业人士，你必须考虑升级。与前面的工具类似，这也不是开源的。

我使用过免费版本，但是如果你想了解更多细节，你应该查看他们[官方网站](https://portswigger.net/burp)上提供的功能。

#### 12、BeEF

![BeEF](/data/attachment/album/201905/15/234221r5raarae5qnrafx0.jpg)

BeEF（<ruby> 浏览器利用框架 <rt>  Browser Exploitation Framework </rt></ruby>）是另一个令人印象深刻的工具。它专为渗透测试人员量身定制，用于评估 Web 浏览器的安全性。

这是最好的 Kali Linux 工具之一，因为很多用户在谈论 Web 安全时希望了解并修复客户端的问题。

#### 13、Apktool

![Apktool](/data/attachment/album/201905/15/234223slisododutl5a2u7.jpg)

[Apktool](https://github.com/iBotPeaches/Apktool) 确实是 Kali Linux 上用于逆向工程 Android 应用程序的流行工具之一。当然，你应该正确利用它 —— 出于教育目的。

使用此工具，你可以自己尝试一下，并让原开发人员了解你的想法。你认为你会用它做什么？

#### 14、sqlmap

![sqlmap](/data/attachment/album/201905/15/234225qmpj4y77mag7ilg0.jpg)

如果你正在寻找一个开源渗透测试工具 —— [sqlmap](http://sqlmap.org/) 是最好的之一。它可以自动化利用 SQL 注入漏洞的过程，并帮助你接管数据库服务器。

#### 15、John the Ripper

![John the Ripper](/data/attachment/album/201905/15/234226oqn3h6d2oqa4odo9.jpg)

[John the Ripper](https://github.com/magnumripper/JohnTheRipper) 是 Kali Linux 上流行的密码破解工具。它也是自由开源的。但是，如果你对[社区增强版](https://github.com/magnumripper/JohnTheRipper)不感兴趣，可以用于商业用途的[专业版](https://www.openwall.com/john/pro/)。

#### 16、Snort

想要实时流量分析和数据包记录功能吗？[Snort](https://www.snort.org/) 可以鼎力支持你。即使它是一个开源的入侵防御系统，也有很多东西可以提供。

如果你还没有安装它，[官方网站](https://www.snort.org/#get-started)提及了安装过程。

![Snort](/data/attachment/album/201905/15/235214n8qeq2exha2za1qv.jpg)

#### 17、Autopsy Forensic Browser

![Autopsy Forensic Browser](/data/attachment/album/201905/15/234228yb1sxjsi3kvgkroz.jpg)

[Autopsy](https://www.sleuthkit.org/autopsy/) 是一个数字取证工具，用于调查计算机上发生的事情。那么，你也可以使用它从 SD 卡恢复图像。它也被执法官员使用。你可以阅读[文档](https://www.sleuthkit.org/autopsy/docs.php)来探索可以用它做什么。

你还应该查看他们的 [GitHub 页面](https://github.com/sleuthkit/autopsy)。

#### 18、King Phisher

![King Phisher](/data/attachment/album/201905/15/234230o3szcfcbs0n0kpvn.jpg)

网络钓鱼攻击现在非常普遍。[King Phisher 工具](https://github.com/securestate/king-phisher)可以通过模拟真实的网络钓鱼攻击来帮助测试和提升用户意识。出于显而易见的原因，在模拟一个组织的服务器内容前，你需要获得许可。

#### 19、Nikto

![Nikto](/data/attachment/album/201905/15/234231pol785wduuoagdya.jpg)

[Nikto](https://gitlab.com/kalilinux/packages/nikto/) 是一款功能强大的 Web 服务器扫描程序 —— 这使其成为最好的 Kali Linux 工具之一。 它会检查存在潜在危险的文件/程序、过时的服务器版本等等。

#### 20、Yersinia

![Yersinia](/data/attachment/album/201905/15/234233yzszztg2rzbsig0s.jpg)

[Yersinia](https://github.com/tomac/yersinia) 是一个有趣的框架，用于在网络上执行第 2 层攻击（第 2 层是指 [OSI 模型](https://en.wikipedia.org/wiki/OSI_model)的数据链路层）。当然，如果你希望你的网络安全，则必须考虑所有七个层。但是，此工具侧重于第 2 层和各种网络协议，包括 STP、CDP，DTP 等。

#### 21、Social Engineering Toolkit (SET)

![Social Engineering Toolkit (SET)](/data/attachment/album/201905/15/234234itgtttlthkl6satr.jpg)

如果你正在进行相当严格的渗透测试，那么这应该是你应该检查的最佳工具之一。社交工程是一个大问题，使用 [SET](https://www.trustedsec.com/social-engineer-toolkit-set/) 工具，你可以帮助防止此类攻击。

### 总结

实际上 Kali Linux 捆绑了很多工具。请参考 Kali Linux 的[官方工具列表页面](https://tools.kali.org/tools-listing)来查找所有内容。

你会发现其中一些是完全自由开源的，而有些则是专有解决方案（但是免费）。但是，出于商业目的，你应该始终选择高级版本。

我们可能错过了你最喜欢的某个 Kali Linux 工具。请在下面的评论部分告诉我们。

---

via: <https://itsfoss.com/best-kali-linux-tools/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


每日安全资讯：SHA-1 碰撞攻击正变得切实可行

Google 在 2017 年宣布了对 SHA-1 哈希算法的首个成功碰撞攻击。所谓碰撞攻击是指两个不同的信息产生了相同的哈希值。在 Google 的研究中，攻击所需的计算量十分惊人，用 Google 说法，它用了 6,500 年的 CPU 计算时间去完成了碰撞的第一阶段，然后用了 110 年的 GPU 计算时间完成第二阶段。

现在，SHA-1 碰撞攻击正变得切实可行。上周一组来自新加坡和法国的研究人员演示了首个构造前缀碰撞攻击，即攻击者可以自由选择两个碰撞信息的前缀。

构造前缀碰撞攻击所需的计算费用不到 10 万美元，意味着伪造 SHA-1 签名文件将变得可能，这些文档可能是商业文件也可能是 TLS 证书。现在是时候完全停止使用 SHA-1 了。

![](/data/attachment/album/201905/16/082722ob6kqomkdorrrpoq.jpg)

来源：solidot.org

### 更多资讯

##### 旧金山可能成为禁止面部识别技术的第一个美国城市

旧金山市将于周二投票决定是否禁止警察局和其他城市机构对居民进行面部识别。如果获得批准，这将是美国首次禁用该技术的城市。该法令还为警察部门制定了一个流程，以披露他们使用的监控技术，例如车牌阅读器和可以跟踪居民随时间变动的手机基站模拟器。但它特别指出面部识别对居民的公民自由太有害处，甚至不考虑使用。

来源： cnBeta.COM

详情： <http://t.cn/EKCwMtT>

##### “三只小猫”漏洞威胁全球数百万思科路由器

美国 Red Ballon 安全研究公司近日发布了一份报告，公布了思科产品的两个漏洞。第一个漏洞被称为Thrangrycat，允许攻击者通过现场可编程门阵列（FPGA）比特流操作完全绕过思科的信任锚模块（TAm）。

来源： 开源中国

详情： <http://t.cn/EKCwiEi>

##### 银行客户信息核实工作开启：手机号重复过多停办业务

近日，多家银行集体发布公告称将开展客户个人信息核实工作，与以往不同的是，此次核实信息包括姓名、性别、国籍、职业、联系电话、联系地址（家庭地址或工作地址）、身份证件类型及号码、证件有效期限。核实信息之多，可谓史上最严。

来源： 证券日报

详情： <http://t.cn/EKCwagX>

##### 不亚于 WannaCry：微软面向 Windows XP 发布紧急修复补丁

如果你依然在使用联网的 Windows XP 或者 Windows Server 2003 系统，同时也包括 Windows 7、Windows Server 2008 以及 2008 R2 系统，那么应该立即安装微软刚刚推出的紧急修复补丁。为了修复不亚于 Wannacry 的 RDP 服务漏洞，微软于今天面向包括 XP 在内的上述系统发布了紧急修复补丁，要求用户尽快完成安装。

来源： cnBeta.COM

详情： <http://t.cn/EKCwKT5>

（信息来源于网络，安华金和搜集整理）


Maker DAO 通证解释：DAI、WETH、PETH、SIN、MKR 都是什么？（一）

![](/data/attachment/album/201905/16/122647ypl8i3y21l2pel38.jpeg)

>
> Maker DAO 使用了多个用于特定目的 ERC-20 通证，以确保 DAI 稳定币的稳定性。本文描述了基于 Bloxy.info 通证流工具的角色和使用模式。
>
>
>

### Maker DAO 通证

Maker DAO 系统是由多个智能合约（Sai Tap、Sai Tub、Vox、Medianiser 等）和 ERC-20 通证组成. 它们一起来确保 DAI 通证的稳定性。

在这篇文章中，我们主要关注通证是如何周转和使用的。下图显示了主要的通证流动周转和智能合约的使用方式，如何将一个通证转换为另一个通证：

![Maker DAO Token流动周转和智能合同使用方式](/data/attachment/album/201905/16/122658vyc9h9hxmazbca6a.jpg)

*Maker DAO 通证流动周转和智能合约的使用方式*

上图中通证显示为圆形，而智能合约及其实体显示为圆角矩形。图表上的箭头表示使用这些智能合约的方法，你可以将余额从一个通证转换为另一个通证。

例如，调用 `join()` 将从你那里删除 WETH 通证，并为你提供适当数量的 PETH 通证。

### 不稳定（类“ETH”）通证

图的左侧显示了与以太币相关的令牌：

|  |  |
| --- | --- |
|  | [ETH](https://bloxy.info/tokens/ETH)：它本身并没有在 Maker DAO 系统中直接使用。如果你原来有 ETH (和我们大多数人一样)，你必须首先将它转换成 WETH（“<ruby> 包装过的 ETH <rt>  Wrapped ETH </rt></ruby>”）通证。 |
|  | [WETH](https://bloxy.info/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)：是 ETH 的一对一映射，但是作为 ERC-20 的通证存在。在任何时候，你都可以把 ETH 换成 WETH，或反之。缺点是，每一次这样的转变都需要花费燃料。 |
|  | [PETH](https://bloxy.info/address/0xf53ad2c6851052a81b42133467480961b2321c09)：是 “<ruby> 集合 ETH <rt>  Pooled Ether </rt></ruby>”的缩写。当你把 WETH 存入 Maker DAO 时，你会得到这个通证。请注意，它并不完全是一对一的，它的汇率是计算出来的。  |

### 稳定（类“DAI”)通证

|  |  |
| --- | --- |
|  | [DAI](https://bloxy.info/address/0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359)：MakerDAO 的稳定币，预计将接近 1 美元。当你用 CDP 生成贷款时，它会为你创造 DAI。 |
|  |  [SIN](https://bloxy.info/address/0x79f6d0f646706e1261acf0b93dcb864f357d4680)：代表已清算的债务。它的价值等于 1DAI，在债务清算过程中使用而不是 DAI。 |

### Maker DAO 功能通证

|  |  |
| --- | --- |
|  | [MKR](https://bloxy.info/address/0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2)：用于偿还债务时支付佣金的通证（通过擦除方法）。 |

### 智能合约

|  |  |
| --- | --- |
|  | [Sai Tub 智能合约](https://bloxy.info/address/0x448a5065aebb8e423f0896e6c5d525c040f59af3)：抵押债仓（CDP）系统。CDP 是你在 PETH 抵押后生成的 DAI 的债务。Maker DAO 的大多数操作都是使用它完成的。 |
|  | [Sai Tap 智能合约](https://bloxy.info/address/0xbda109309f9fafa6dd6a9cb9f1df4085b27ee8ef)：可以用于清算债务并从中产生利润。 |

### 智能合约使用方法

Maker DAO 智能合约有很多的使用方法，下表对其中的主要部分进行了分类：

![Maker DAO智能合约使用方法](/data/attachment/album/201905/16/122659l1yj233t82yez3m3.jpg)

*Maker DAO 智能合约使用方法*

大多数方法都是使用我们上面列出的通证来操作，并且 CDP 作为 Sai Tub 内部的实体。这些方法的更详细描述可以在 [Maker DAO 事务图解](https://medium.com/coinmonks/maker-dao-transactions-illustrated-691ad2715cf7)这篇文章之中看到。

### 通证使用模式

下面的材料是基于 [Bloxy.info](https://bloxy.info/) 通证的周转工具和 Maker DAO 分析的[仪表板](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true)。

>
> [Bloxy.info](https://bloxy.info/) 网站为分析师、交易者、公司和加密爱好者提供了一套工具。
>
>
> 这些工具包括 API、仪表板和搜索引擎，所有这些都是现场提供，提供准确的数据，直接从区块链实时节点索引。
>
>
> Bloxy 的使命是使区块链更加透明，让人们和企业都可以访问。
>
>
> 请引用本文时指出数据来源。
>
>
>

我们的目标是将智能合约代码和上面的图表与关于这些通证的实际通证周转和用户操作相匹配。我们将使用我们的工具和分析方法，从不同的角度逐一调查这些通证。

我们要看的第一个通证是…

#### WETH（Wrapped Ether）

WETH 解释在 [weth.io](https://weth.io/) 网站上。WETH 被称为“<ruby> 包装过的 ETH <rt>  Wrapped ETH </rt></ruby>”，可以在需要 ERC-20 通证的地方代替 ETH。我们首先想到的是去中心化交换 (DEX)。通常，DEX 协议更希望使用 ERC20 通证作为买/卖方之间的资产，并且不能直接使用 ETH。所以你先把你的 ETH 包装成 WETH，交换后的 WETH 可以换回 ETH。

这个通证与 Maker DAO 协议于 2017 年 12 月同时发起。请注意，其最大的持有者是 Maker DAO 的智能合约：

![WETH 最大持有者](/data/attachment/album/201905/16/122659l2ii5fotnmt02goq.jpg)

*WETH最大持有者*

所有者与其他通证的交集还显示了 Maker DAO 通证:

![](/data/attachment/album/201905/16/122659val48bamkd5q95yy.jpg)

*共同持有者相关的令牌，来源: [bloxy.info](https://bloxy.info/token_holders/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)*

Maker DAO Sai Tub 智能合约上出现的这种高 WETH 余额，是因为用户将 WETH 存入 Maker DAO 的 Sai Tub 智能合约，以便之后创建 CDP。我们分析了这个过程中动态的 [MakerDAO 仪表板](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true):

![](/data/attachment/album/201905/16/122700rs5oz6z4h62rqrxi.jpg)

*WETH 锁定的金额、存款和取款。来源: bloxy.info [MakerDAO dashboard](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true)*

从这张图表中可以看出，在 2019 年 5 月 10 日，锁定的 WETH 金额约为 200 万 ETH (橙色线)，而创造的总金额超过了 400 万 ETH。

参与这项活动的人有多少？交易者的数量可以通过唯一地址在 Sai Tub 智能合约上启动的退出/加入交易记录来估计：

![](/data/attachment/album/201905/16/122700kimtvgj1ccmtpmek.jpg)

*在 Maker DAO 智能合约上唯一的地址数、锁定和释放 WETH。来源:bloxy.info [MakerDAO dashboard](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true)*

交易者的行为是由每月锁定和释放的 WETH 数量来呈现的：

![](/data/attachment/album/201905/16/122700tcudl2wfl9spjo9u.jpg)

*每月锁定和释放 WETH 的金额。来源: bloxy.info [MakerDAO dashboard](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true)*

图中右侧的两列展示了，在 2019 年 4 月前，当更多的人开始从 Maker DAO 锁定和释放 WETH 时，锁定和释放的数量的趋势相当对称。那反过来也可导致 Maker DAO 的 WETH 数量减少。

#### Maker DAO 之外的 WETH?

那么问题来了，除了 Maker DAO 之外，它可以在任何地方使用吗？

答案是肯定的。首先，它在 ZeroX 和 Oasis (匹配市场) 交易所交易中非常活跃，下图是 bloxyinfo 中展示的 [WETH 交易页面](http://localhost:3000/token_trades/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)。

[通证周转工具](http://localhost:3000/token_graphs/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#) 显示 WETH 的主要流量：

![](/data/attachment/album/201905/16/122700vlhqlgw6gq1g1bsk.jpg)

*主要的 WETH 周转路线。来源: [bloxy.info](http://localhost:3000/token_graphs/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#)*

正如你所看到的，WETH 通证 有几个 “重心”：

1. MakerDAI 的 Sai Tub 合约
2. Oasis、DDEX 等交易所
3. ZeroX（不涉及转账，所以没有在这个图表上明确显示）

我们拿 DEX（去中心化交易所）上一个最活跃的交易者的 WETH 交易作为例子：

![](/data/attachment/album/201905/16/122700kcvfk49981hlqsk7.jpg)

*DEX 上 WETH/DAI 交易对的多方交易。来源: [bloxy.info](https://bloxy.info/tx/0xc538725a76c26695c3fae183bea430bfb86449bc9a066288e52716d22b10f009)*

WETH 的交易不仅仅是针对 DAI 的交易，以下是 DEX 交易所的前 10 组交易对:

![](/data/attachment/album/201905/16/122701ryca7cb6b8eezyjv.jpg)

*DEX 上的前 10 组 WETH 交易对。来源: [bloxy.info DEX API](https://bloxy.info/api_methods)*

#### PETH（Pooled Ether）

PETH 代表了 ETH，你在 Maker DAO 智能合约中投入了 ETH，以在未来创造 DAI 债务。它对 WETH 的费率等于：

```
PETH = WETH * (Total PETH supply) / (WETH balance )
```

现在等于 1.04，因为 PETH 的一部分由于债务清算而被销毁。如图所示，这个数字随着时间的推移而增加:

![](/data/attachment/album/201905/16/122701t17wthi1crhzltig.jpg)

*与 PETH/WETH 相关的费率和利润。来源：bloxy.info [MakerDAO dashboard](https://stat.bloxy.info/superset/dashboard/makerdao/?standalone=true)*

PETH/WETH 费率的变化为早期进入并用 PETH 换取 WETH 的用户创造了<ruby> 年利率 <rt>  Annual Percentage Rate </rt></ruby>（APR）和利润，他们的总利润估计在 80,000 ETH 左右。

PETH 是不能在 DEX 上进行交易的，似乎只作为 Maker DAO 的基础设施在其内部使用。

下面的通证周转显示，主要的 PETH 周转量是 Sai Tub 智能合约之间的互相转移。然后，部分周转量会转到 Sai Tap (在债务清算的情况下)，或者转到系统地址（用于销毁）：

![](/data/attachment/album/201905/16/122701d6n0msbnqb0kz01q.jpg)

*PETH 通证周转。来源：[bloxy.info token flow tool](https://bloxy.info/token_graphs/0xf53ad2c6851052a81b42133467480961b2321c09#)*

继续! 在第二部分，我们将讨论 DAI、MKR 和 SIN 通证 !

---

via：<https://medium.com/coinmonks/makerdao-tokens-explained-dai-weth-peth-sin-mkr-part-1-a46a0f687d5e>

作者：Aleksey Studnev 译者：zionfuo


使用 Black 自由格式化 Python

>
> 在我们覆盖 7 个 PyPI 库的系列文章中了解解决 Python 问题的更多信息。
>
>
>

![](/data/attachment/album/201905/16/220249ethkikh5h1uib5iy.jpg)

Python 是当今使用最多的[流行编程语言](https://opensource.com/article/18/5/numbers-python-community-trends)之一，因为：它是开源的，它有广泛的用途（例如 Web 编程、业务应用、游戏、科学编程等等），它有一个充满活力和专注的社区支持它。这个社区可以让我们在 [Python Package Index](https://pypi.org/)（PyPI）中有如此庞大、多样化的软件包，用以扩展和改进 Python 并解决不可避免的问题。

在本系列中，我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。在第一篇文章中，我们了解了 [Cython](https://opensource.com/article/19/4/7-python-problems-solved-cython)。今天，我们将使用 [Black](https://pypi.org/project/black/) 这个代码格式化工具。

### Black

有时创意可能是一件美妙的事情。有时它只是一种痛苦。我喜欢创造性地解决难题，但我希望我的 Python 格式尽可能一致。没有人对使用“有趣”缩进的代码印象深刻。

但是比不一致的格式更糟糕的是除了检查格式之外什么都没有做的代码审查。这对审查者来说很烦人，对于被审查者来说甚至更烦人。当你的 linter 告诉你代码缩进不正确时，但没有提示*正确*的缩进量，这也会令人气愤。

使用 Black，它不会告诉你*要*做什么，它是一个优良、勤奋的机器人：它将为你修复代码。

要了解它如何工作的，请随意写一些非常不一致的内容，例如：

```
def add(a, b): return a+b

def mult(a, b):
      return \
        a              *        b
```

Black 抱怨了么？并没有，它为你修复了！

```
$ black math
reformatted math
All done! ✨ ? ✨
1 file reformatted.
$ cat math
def add(a, b):
    return a + b

def mult(a, b):
    return a * b
```

Black 确实提供了报错而不是修复的选项，甚至还有输出 diff 编辑样式的选项。这些选项在持续集成 （CI）系统中非常有用，可以在本地强制运行 Black。此外，如果 diff 输出被记录到 CI 输出中，你可以直接将其粘贴到 `patch` 中，以便在极少数情况下你需要修复输出，但无法本地安装 Black 使用。

```
$ black --check --diff bad
--- math 2019-04-09 17:24:22.747815 +0000
+++ math 2019-04-09 17:26:04.269451 +0000
@@ -1,7 +1,7 @@
-def add(a, b): return a + b
+def add(a, b):
+    return a + b

 def mult(a, b):
-          return \
-                  a             *             b
+    return a * b

would reformat math
All done! ? ? ?
1 file would be reformatted.
$ echo $?
1
```

在本系列的下一篇文章中，我们将介绍 attrs ，这是一个可以帮助你快速编写简洁、正确的代码的库。

（题图：[Subgrafik San](https://dribbble.com/)）

---

via: <https://opensource.com/article/19/5/python-black>

作者：[Moshe Zadka](https://opensource.com/users/moshez/users/moshez/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何使用 rsync 的高级用法进行大型备份

Summary: 基础的 rsync 命令通常足够来管理你的 Linux 备份，但是额外的选项使大型备份集更快、更强大。

很好的备份方案

>
> 基础的 `rsync` 命令通常足够来管理你的 Linux 备份，但是额外的选项使大型备份集更快、更强大。
>
>
>

![Filing papers and documents](/data/attachment/album/201905/16/231555em80ofla6fqz5qkq.png "Filing papers and documents")

很明显，备份一直是 Linux 世界的热门话题。回到 2017，David Both 为 [Opensource.com](http://Opensource.com) 的读者在[使用 rsync 备份 Linux 系统](/article-8237-1.html)方面提了一些建议，在这年的更早时候，他发起了一项问卷调查询问大家，[在 Linux 中你的 /home 目录的主要备份策略是什么](https://opensource.com/poll/19/4/backup-strategy-home-directory-linux)，在今年的另一个问卷调查中，Don Watkins 问到，[你使用哪种开源备份解决方案](https://opensource.com/article/19/2/linux-backup-solutions)。

我的回复是 [rsync](https://en.wikipedia.org/wiki/Rsync)。我真的非常喜欢 rsync！市场上有大量大而复杂的工具，对于管理磁带机或者存储库设备，这些可能是必要的，但是可能你需要的只是一个简单的开源命令行工具。

### rsync 基础

我为一个大概拥有 35,000 开发者并有着几十 TB 文件的全球性机构管理二进制仓库。我经常一次移动或者归档上百 GB 的数据。使用的是 `rsync`。这种经历使我对这个简单的工具充满信心。（所以，是的，我在家使用它来备份我的 Linux 系统）

基础的 `rsync` 命令很简单。

```
rsync -av 源目录 目的地目录
```

实际上，在各种指南中教的 `rsync` 命令在大多数通用情况下都运行的很好。然而，假设我们需要备份大量的数据。例如包含 2,000 个子目录的目录，每个包含 50GB 到 700GB 的数据。在这个目录运行 `rsync` 可能需要大量时间，尤其是当你使用校验选项时（我倾向使用）。

当我们试图同步大量数据或者通过慢的网络连接时，可能遇到性能问题。让我给你展示一些我使用的方法来确保好的性能和可靠性。

### rsync 高级用法

`rsync` 运行时出现的第一行是：“正在发送增量文件列表。” 如果你在网上搜索这一行，你将看到很多类似的问题：为什么它一直运行，或者为什么它似乎挂起了。

这里是一个基于这个场景的例子。假设我们有一个 `/storage` 的目录，我们想要备份到一个外部 USB 磁盘，我们可以使用下面的命令：

```
rsync -cav /storage /media/WDPassport
```

`-c` 选项告诉 `rsync` 使用文件校验和而不是时间戳来决定改变的文件，这通常消耗的时间更久。为了分解 `/storage` 目录，我通过子目录同步，使用 `find` 命令。这是一个例子：

```
find /storage -type d -exec rsync -cav {} /media/WDPassport \;
```

这看起来可以，但是如果 `/storage` 目录有任何文件，它们将被跳过。因此，我们如何同步 `/storage` 目录中的文件呢？同样有一个细微的差别是这些选项将造成 `rsync` 会同步 `.` 目录，该目录是源目录自身；这意味着它会同步子目录两次，这并不是我们想要的。

长话短说，我的解决方案是一个 “双-递增”脚本。这允许我分解一个目录，例如，当你的家目录有多个大的目录，例如音乐或者家庭照片时，分解 `/home` 目录为单个的用户家目录。

这是我的脚本的一个例子：

```
HOMES="alan"
DRIVE="/media/WDPassport"

for HOME in $HOMES; do
cd /home/$HOME
rsync -cdlptgov --delete . /$DRIVE/$HOME
find . -maxdepth 1 -type d -not -name "." -exec rsync -crlptgov --delete {} /$DRIVE/$HOME \;
done
```

第一个 `rsync` 命令拷贝它在源目录中发现的文件和目录。然而，它将目录留着不处理，因此我们能够通过 `find` 命令迭代它们。这通过传递 `-d` 参数来完成，它告诉 `rsync` 不要递归目录。

```
-d, --dirs 传输目录而不递归
```

然后 `find` 命令传递每个目录来单独运行 `rsync`。之后 `rsync` 拷贝目录的内容。这通过传递 `-r` 参数来完成，它告诉 `rsync` 要递归目录。

```
-r, --recursive 递归进入目录
```

这使得 `rsync` 使用的增量文件保持在一个合理的大小。

大多数 `rsync` 指南为了简便使用 `-a` （或者 `archive`） 参数。这实际是一个复合参数。

```
-a, --archive 归档模式；等价于 -rlptgoD（没有 -H,-A,-X）
```

我传递的其他参数包含在 `a` 中；这些是 `-l`、`-p`、`-t`、`-g`和 `-o`。

```
-l, --links 复制符号链接作为符号链接
-p, --perms 保留权限
-t, --times 保留修改时间
-g, --group 保留组
-o, --owner 保留拥有者（只适用于超级管理员）
```

`--delete` 选项告诉 `rsync` 删除目的地目录中所有在源目录不存在的任意文件。这种方式，运行的结果仅仅是复制。你同样可以排除 `.Trash` 目录或者 MacOS 创建的 `.DS_Store` 文件。

```
-not -name ".Trash*" -not -name ".DS_Store"
```

### 注意

最后一条建议： `rsync` 可以是破坏性的命令。幸运的是，它的睿智的创造者提供了 “空运行” 的能力。如果我们加入 `n` 选项，rsync 会显示预期的输出但不写任何数据。

```
`rsync -cdlptgovn --delete . /$DRIVE/$HOME`
```

这个脚本适用于非常大的存储规模和高延迟或者慢链接的情况。一如既往，我确信仍有提升的空间。如果你有任何建议，请在下方评论中分享。

---

via: <https://opensource.com/article/19/5/advanced-rsync>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss/users/marcobravo) 选题：[lujun9972](https://github.com/lujun9972) 译者：[warmfrog](https://github.com/warmfrog) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


每日安全资讯：Let's Encrypt 发布自己的证书透明度日志

![](/data/attachment/album/201905/17/075600avng79v2me7nm7k6.jpg)

旨在让每个网站都能使用 HTTPS 加密的非赢利组织 Let's Encrypt 发布了自己的证书透明度（CT）日志 Oak，它欢迎其他 CA 递交证书日志。该项目得到了 Sectigo 的赞助。证书透明度是一个记录和监视证书签发的系统，有助于改进 CA 生态系统和 Web 安全，因此迅速成为关键的互联网基础设施。

Let's Encrypt 决定创建和运作自己的 CT 是出于多个理由：首先是 CT 与该组织让互联网变得更安全和尊重隐私的使命相一致，它相信透明能增强安全，能让人做出深思熟虑的决定；

其次是运作一个日志有助于控制其命运，Google Chrome 要求所有的新签发证书递交到两个不同的日志系统，

因此 Let's Encrypt 的运营必须要有多个日志选项；第三是它每天签发超过 100 万个证书，它想要设计一个能优化处理大量证书日志的系统。

来源：solidot.org

### 更多资讯

##### 两家提供勒索软件解决方案的公司被发现是支付赎金

对于遭到勒索软件攻击的企业和机构，是向攻击者支付赎金还是寻找其它解决方案？支付赎金被认为会鼓励攻击者，被认为是不道德的。但其他解决方案可能会需要花更长的时间耗费更多金钱。

来源： solidot.org

详情： <http://t.cn/EKjCif9>

##### 美国联邦通信委员会计划为运营商提供更多权力来打击自动骚扰电话

美国联邦通信委员会主席 Ajit Pai 希望为移动电话公司提供更大的权力来阻止不受欢迎的自动骚扰电话。这项提议如果获得通过，将允许无线运营商默认为客户阻止这些自动骚扰电话。公司还允许消费者自己阻止来自未知号码的呼叫。

来源： cnBeta.COM

详情： <http://t.cn/EKjCaDT>

##### CEO 透露：Coinbase 现管理着 10 亿美元的加密货币资产

在周三举办的 CoinDesk Consensus 2019 大会上，Coinbase CEO Brian Armstrong 表示：尽管推出仅 12 个月，该交易所目前还是托管了 10 亿美元的加密货币资产（AUM）。在现场讨论环节，当《华尔街日报》记者 Paul Vigna 向 Armstrong 询问有关加密货币行业的机构参与状况，他答道：“从 12 个月前开始，我们管理的加密货币资产刚刚超过了 10 亿美元”。

来源： cnBeta.COM

详情： <http://t.cn/EKjCCIo>

##### 「净网 2019」4 万余条公民信息被窃取，怀化公安跨省抓获黑客

“我真没想到这触犯了法律”周某做梦也没有想到，因为自己一时炫技竟惹上了牢狱之灾。5 月 15 日晚，怀化市公安局鹤城分局网安大队民警将涉嫌侵犯公民个人信息及破坏计算机信息系统的违法犯罪嫌疑人周某从深圳带回怀化。周某因涉嫌窃取怀化市某高校学生信息数据 46767 条，目前已被刑事拘留。

来源： 怀化网警巡查执法

详情： <http://t.cn/EKjCOrq>

（信息来源于网络，安华金和搜集整理）


使用 Python 构建可扩展的社交媒体情感分析服务

>
> 学习如何使用 spaCy、vaderSentiment、Flask 和 Python 来为你的作品添加情感分析能力。
>
>
>

![](/data/attachment/album/201905/17/235241zr0cs4czu4psmrl6.jpg)

本系列的[第一部分](/article-10852-1.html)提供了情感分析工作原理的一些背景知识，现在让我们研究如何将这些功能添加到你的设计中。

### 探索 Python 库 spaCy 和 vaderSentiment

#### 前提条件

* 一个终端 shell
* shell 中的 Python 语言二进制文件（3.4+ 版本）
* 用于安装 Python 包的 `pip` 命令
* （可选）一个 [Python 虚拟环境](https://virtualenv.pypa.io/en/stable/)使你的工作与系统隔离开来

#### 配置环境

在开始编写代码之前，你需要安装 [spaCy](https://pypi.org/project/spacy/) 和 [vaderSentiment](https://pypi.org/project/vaderSentiment/) 包来设置 Python 环境，同时下载一个语言模型来帮助你分析。幸运的是，大部分操作都容易在命令行中完成。

在 shell 中，输入以下命令来安装 spaCy 和 vaderSentiment 包：

```
pip install spacy vaderSentiment
```

命令安装完成后，安装 spaCy 可用于文本分析的语言模型。以下命令将使用 spaCy 模块下载并安装英语[模型](https://spacy.io/models)：

```
python -m spacy download en_core_web_sm
```

安装了这些库和模型之后，就可以开始编码了。

#### 一个简单的文本分析

使用 [Python 解释器交互模式](https://docs.python.org/3.6/tutorial/interpreter.html) 编写一些代码来分析单个文本片段。首先启动 Python 环境：

```
$ python
Python 3.6.8 (default, Jan 31 2019, 09:38:34)
[GCC 8.2.1 20181215 (Red Hat 8.2.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

*（你的 Python 解释器版本打印可能与此不同。）*

1、导入所需模块：

```
>>> import spacy
>>> from vaderSentiment import vaderSentiment
```

2、从 spaCy 加载英语语言模型：

```
>>> english = spacy.load("en_core_web_sm")
```

3、处理一段文本。本例展示了一个非常简单的句子，我们希望它能给我们带来些许积极的情感：

```
>>> result = english("I like to eat applesauce with sugar and cinnamon.")
```

4、从处理后的结果中收集句子。SpaCy 已识别并处理短语中的实体，这一步为每个句子生成情感（即时在本例中只有一个句子）：

```
>>> sentences = [str(s) for s in result.sents]
```

5、使用 vaderSentiments 创建一个分析器：

```
>>> analyzer = vaderSentiment.SentimentIntensityAnalyzer()
```

6、对句子进行情感分析：

```
>>> sentiment = [analyzer.polarity_scores(str(s)) for s in sentences]
```

`sentiment` 变量现在包含例句的极性分数。打印出这个值，看看它是如何分析这个句子的。

```
>>> print(sentiment)
[{'neg': 0.0, 'neu': 0.737, 'pos': 0.263, 'compound': 0.3612}]
```

这个结构是什么意思？

表面上，这是一个只有一个字典对象的数组。如果有多个句子，那么每个句子都会对应一个字典对象。字典中有四个键对应不同类型的情感。`neg` 键表示负面情感，因为在本例中没有报告任何负面情感，`0.0` 值证明了这一点。`neu` 键表示中性情感，它的得分相当高，为 `0.737`（最高为 `1.0`）。`pos` 键代表积极情感，得分适中，为 `0.263`。最后，`cmpound` 键代表文本的总体得分，它可以从负数到正数，`0.3612` 表示积极方面的情感多一点。

要查看这些值可能如何变化，你可以使用已输入的代码做一个小实验。以下代码块显示了如何对类似句子的情感评分的评估。

```
>>> result = english("I love applesauce!")
>>> sentences = [str(s) for s in result.sents]
>>> sentiment = [analyzer.polarity_scores(str(s)) for s in sentences]
>>> print(sentiment)
[{'neg': 0.0, 'neu': 0.182, 'pos': 0.818, 'compound': 0.6696}]
```

你可以看到，通过将例句改为非常积极的句子，`sentiment` 的值发生了巨大变化。

### 建立一个情感分析服务

现在你已经为情感分析组装了基本的代码块，让我们将这些东西转化为一个简单的服务。

在这个演示中，你将使用 Python [Flask 包](http://flask.pocoo.org/) 创建一个 [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer) HTTP 服务器。此服务将接受英文文本数据并返回情感分析结果。请注意，此示例服务是用于学习所涉及的技术，而不是用于投入生产的东西。

#### 前提条件

* 一个终端 shell
* shell 中的 Python 语言二进制文件（3.4+ 版本）
* 安装 Python 包的 `pip` 命令
* `curl` 命令
* 一个文本编辑器
* (可选) 一个 [Python 虚拟环境](https://virtualenv.pypa.io/en/stable/)使你的工作与系统隔离开来

#### 配置环境

这个环境几乎与上一节中的环境相同，唯一的区别是在 Python 环境中添加了 Flask 包。

1、安装所需依赖项：

```
pip install spacy vaderSentiment flask
```

2、安装 spaCy 的英语语言模型：

```
python -m spacy download en_core_web_sm
```

#### 创建应用程序文件

打开编辑器，创建一个名为 `app.py` 的文件。添加以下内容 *（不用担心，我们将解释每一行）*：

```
import flask
import spacy
import vaderSentiment.vaderSentiment as vader

app = flask.Flask(__name__)
analyzer = vader.SentimentIntensityAnalyzer()
english = spacy.load("en_core_web_sm")

def get_sentiments(text):
    result = english(text)
    sentences = [str(sent) for sent in result.sents]
    sentiments = [analyzer.polarity_scores(str(s)) for s in sentences]
    return sentiments

@app.route("/", methods=["POST", "GET"])
def index():
    if flask.request.method == "GET":
        return "To access this service send a POST request to this URL with" \
                " the text you want analyzed in the body."
    body = flask.request.data.decode("utf-8")
    sentiments = get_sentiments(body)
    return flask.json.dumps(sentiments)
```

虽然这个源文件不是很大，但它非常密集。让我们来看看这个应用程序的各个部分，并解释它们在做什么。

```
import flask
import spacy
import vaderSentiment.vaderSentiment as vader
```

前三行引入了执行语言分析和 HTTP 框架所需的包。

```
app = flask.Flask(__name__)
analyzer = vader.SentimentIntensityAnalyzer()
english = spacy.load("en_core_web_sm")
```

接下来的三行代码创建了一些全局变量。第一个变量 `app`，它是 Flask 用于创建 HTTP 路由的主要入口点。第二个变量 `analyzer` 与上一个示例中使用的类型相同，它将用于生成情感分数。最后一个变量 `english` 也与上一个示例中使用的类型相同，它将用于注释和标记初始文本输入。

你可能想知道为什么全局声明这些变量。对于 `app` 变量，这是许多 Flask 应用程序的标准过程。但是，对于 `analyzer` 和 `english` 变量，将它们设置为全局变量的决定是基于与所涉及的类关联的加载时间。虽然加载时间可能看起来很短，但是当它在 HTTP 服务器的上下文中运行时，这些延迟会对性能产生负面影响。

```
def get_sentiments(text):
    result = english(text)
    sentences = [str(sent) for sent in result.sents]
    sentiments = [analyzer.polarity_scores(str(s)) for s in sentences]
    return sentiments
```

这部分是服务的核心 —— 一个用于从一串文本生成情感值的函数。你可以看到此函数中的操作对应于你之前在 Python 解释器中运行的命令。这里它们被封装在一个函数定义中，`text` 源作为文本变量传入，最后 `sentiments` 变量返回给调用者。

```
@app.route("/", methods=["POST", "GET"])
def index():
  if flask.request.method == "GET":
      return "To access this service send a POST request to this URL with" \
              " the text you want analyzed in the body."
  body = flask.request.data.decode("utf-8")
  sentiments = get_sentiments(body)
  return flask.json.dumps(sentiments)
```

源文件的最后一个函数包含了指导 Flask 如何为服务配置 HTTP 服务器的逻辑。它从一行开始，该行将 HTTP 路由 `/` 与请求方法 `POST` 和 `GET` 相关联。

在函数定义行之后，`if` 子句将检测请求方法是否为 `GET`。如果用户向服务发送此请求，那么下面的行将返回一条指示如何访问服务器的文本消息。这主要是为了方便最终用户。

下一行使用 `flask.request` 对象来获取请求的主体，该主体应包含要处理的文本字符串。`decode` 函数将字节数组转换为可用的格式化字符串。经过解码的文本消息被传递给 `get_sentiments` 函数以生成情感分数。最后，分数通过 HTTP 框架返回给用户。

你现在应该保存文件，如果尚未保存，那么返回 shell。

#### 运行情感服务

一切就绪后，使用 Flask 的内置调试服务器运行服务非常简单。要启动该服务，请从与源文件相同的目录中输入以下命令：

```
FLASK_APP=app.py flask run
```

现在，你将在 shell 中看到来自服务器的一些输出，并且服务器将处于运行状态。要测试服务器是否正在运行，你需要打开第二个 shell 并使用 `curl` 命令。

首先，输入以下命令检查是否打印了指令信息：

```
curl http://localhost:5000
```

你应该看到说明消息：

```
To access this service send a POST request to this URI with the text you want analyzed in the body.
```

接下来，运行以下命令发送测试消息，查看情感分析：

```
curl http://localhost:5000 --header "Content-Type: application/json" --data "I love applesauce!"
```

你从服务器获得的响应应类似于以下内容：

```
[{"compound": 0.6696, "neg": 0.0, "neu": 0.182, "pos": 0.818}]
```

恭喜！你现在已经实现了一个 RESTful HTTP 情感分析服务。你可以在 [GitHub 上找到此服务的参考实现和本文中的所有代码](https://github.com/elmiko/social-moments-service)。

### 继续探索

现在你已经了解了自然语言处理和情感分析背后的原理和机制，下面是进一步发现探索该主题的一些方法。

#### 在 OpenShift 上创建流式情感分析器

虽然创建本地应用程序来研究情绪分析很方便，但是接下来需要能够部署应用程序以实现更广泛的用途。按照[Radnaalytics.io](https://github.com/radanalyticsio/streaming-lab) 提供的指导和代码进行操作，你将学习如何创建一个情感分析仪，可以容器化并部署到 Kubernetes 平台。你还将了解如何将 Apache Kafka 用作事件驱动消息传递的框架，以及如何将 Apache Spark 用作情绪分析的分布式计算平台。

#### 使用 Twitter API 发现实时数据

虽然 [Radanalytics.io](http://Radanalytics.io) 实验室可以生成合成推文流，但你可以不受限于合成数据。事实上，拥有 Twitter 账户的任何人都可以使用 [Tweepy Python](https://github.com/tweepy/tweepy) 包访问 Twitter 流媒体 API 对推文进行情感分析。

---

via: <https://opensource.com/article/19/4/social-media-sentiment-analysis-python-scalable>

作者：[Michael McCune](https://opensource.com/users/elmiko/users/jschlessman) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


用 Linux Shell 脚本来监控磁盘使用情况并发送邮件

对于那些，只有几台，十几台的设备来说很好，对于那些几百上千台的规模就需要监控平台了

![](/data/attachment/album/201905/18/002118aaeaejeejrengyvg.jpg)

市场上有很多用来监控 Linux 系统的监控工具，当系统到达阀值后它将发送一封邮件。它监控所有的东西例如 CPU 利用率、内存利用率、交换空间利用率、磁盘空间利用率等等。然而，它更适合小环境和大环境。

想一想如果你只有少量系统，那么什么是最好的方式来应对这种情况。

是的，我们想要写一个 [shell 脚本](https://www.2daygeek.com/category/shell-script/) 来实现。

在这篇指南中我们打算写一个 shell 脚本来监控系统的磁盘空间使用率。当系统到达给定的阀值，它将给对应的邮件地址发送一封邮件。在这篇文章中我们总共添加了四个 shell 脚本，每个用于不同的目的。之后，我们会想出其他 shell 脚本来监控 CPU，内存和交换空间利用率。

在此之前，我想澄清一件事，根据我观察的磁盘空间使用率 shell 脚本使用情况。

大多数用户在多篇博客中评论说，当他们运行磁盘空间使用率脚本时他们获得了以下错误。

```
# sh /opt/script/disk-usage-alert-old.sh

/dev/mapper/vg_2g-lv_root
test-script.sh: line 7: [: /dev/mapper/vg_2g-lv_root: integer expression expected
/ 9.8G
```

是的，这是对的。甚至，当我第一次运行这个脚本的时候我遇到了相同的问题。之后，我发现了根本原因。

当你在基于 RHEL 5 & RHEL 6 的系统上运行包含用于磁盘空间警告的 `df -h` 或 `df -H` 的 shell 脚本中时，你会发现上述错误信息，因为输出格式不对，查看下列输出。

为了解决这个问题，我们需要用 `df -Ph` （POSIX 输出格式），但是默认的 `df -h` 在基于 RHEL 7 的系统上运行的很好。

```
# df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_2g-lv_root
                       10G  6.7G  3.4G  67% /
tmpfs                 7.8G     0  7.8G   0% /dev/shm
/dev/sda1             976M   95M  830M  11% /boot
/dev/mapper/vg_2g-lv_home
                      5.0G  4.3G  784M  85% /home
/dev/mapper/vg_2g-lv_tmp
                      4.8G   14M  4.6G   1% /tmp
```

### 方法一：Linux Shell 脚本来监控磁盘空间使用率和发送邮件

你可以使用下列 shell 脚本在 Linux 系统中来监控磁盘空间使用率。

当系统到达给定的阀值限制时，它将发送一封邮件。在这个例子中，我们设置阀值为 60% 用于测试目的，你可以改变这个限制来符合你的需求。

如果超过一个文件系统到达给定的阀值，它将发送多封邮件，因为这个脚本使用了循环。

同样，替换你的邮件地址来获取这份警告。

```
# vi /opt/script/disk-usage-alert.sh

#!/bin/sh
df -Ph | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5,$1 }' | while read output;
do
  echo $output
  used=$(echo $output | awk '{print $1}' | sed s/%//g)
  partition=$(echo $output | awk '{print $2}')
  if [ $used -ge 60 ]; then
  echo "The partition \"$partition\" on $(hostname) has used $used% at $(date)" | mail -s "Disk Space Alert: $used% Used On $(hostname)" [email protected]
  fi
done
```

输出：我获得了下列两封邮件警告。

```
The partition "/dev/mapper/vg_2g-lv_home" on 2g.CentOS7 has used 85% at Mon Apr 29 06:16:14 IST 2019

The partition "/dev/mapper/vg_2g-lv_root" on 2g.CentOS7 has used 67% at Mon Apr 29 06:16:14 IST 2019
```

最终添加了一个 [cronjob](https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/) 来自动完成。它会每 10 分钟运行一次。

```
# crontab -e
*/10 * * * * /bin/bash /opt/script/disk-usage-alert.sh
```

### 方法二：Linux Shell 脚本来监控磁盘空间使用率和发送邮件

作为代替，你可以使用下列的 shell 脚本。对比上面的脚本我们做了少量改变。

```
# vi /opt/script/disk-usage-alert-1.sh

#!/bin/sh
df -Ph | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5,$1 }' | while read output;
do
  max=60%
  echo $output
  used=$(echo $output | awk '{print $1}')
  partition=$(echo $output | awk '{print $2}')
  if [ ${used%?} -ge ${max%?} ]; then
  echo "The partition \"$partition\" on $(hostname) has used $used at $(date)" | mail -s "Disk Space Alert: $used Used On $(hostname)" [email protected]
  fi
done
```

输出：我获得了下列两封邮件警告。

```
The partition "/dev/mapper/vg_2g-lv_home" on 2g.CentOS7 has used 85% at Mon Apr 29 06:16:14 IST 2019

The partition "/dev/mapper/vg_2g-lv_root" on 2g.CentOS7 has used 67% at Mon Apr 29 06:16:14 IST 2019
```

最终添加了一个 [cronjob](https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/) 来自动完成。它会每 10 分钟运行一次。

```
# crontab -e
*/10 * * * * /bin/bash /opt/script/disk-usage-alert-1.sh
```

### 方法三：Linux Shell 脚本来监控磁盘空间使用率和发送邮件

我更喜欢这种方法。因为，它工作起来很有魔力，你只会收到一封关于所有事的邮件。

这相当简单和直接。

```
*/10 * * * * df -Ph | sed s/%//g | awk '{ if($5 > 60) print $0;}' | mail -s "Disk Space Alert On $(hostname)" [email protected]
```

输出： 我获得了一封关于所有警告的邮件。

```
Filesystem                            Size  Used Avail Use Mounted on
/dev/mapper/vg_2g-lv_root              10G  6.7G  3.4G  67 /
/dev/mapper/vg_2g-lv_home             5.0G  4.3G  784M  85 /home
```

### 方法四：Linux Shell 脚本来监控某个分区的磁盘空间使用情况和发送邮件

```
# vi /opt/script/disk-usage-alert-2.sh

#!/bin/bash
used=$(df -Ph | grep '/dev/mapper/vg_2g-lv_dbs' | awk {'print $5'})
max=80%
if [ ${used%?} -ge ${max%?} ]; then
echo "The Mount Point "/DB" on $(hostname) has used $used at $(date)" | mail -s "Disk space alert on $(hostname): $used used" [email protected]
fi
```

输出： 我得到了下面的邮件警告。

```
The partition /dev/mapper/vg_2g-lv_dbs on 2g.CentOS6 has used 82% at Mon Apr 29 06:16:14 IST 2019
```

最终添加了一个 [cronjob](https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/) 来自动完成这些工作。它将每 10 分钟运行一次。

```
# crontab -e
*/10 * * * * /bin/bash /opt/script/disk-usage-alert-2.sh
```

注意： 你将在 10 分钟后收到一封邮件警告，因为这个脚本被计划为每 10 分钟运行一次（但也不是精确的 10 分钟，取决于时间）。

例如这个例子。如果你的系统在 8:25 到达了限制，你将在 5 分钟后收到邮件警告。希望现在讲清楚了。

---

via: <https://www.2daygeek.com/linux-shell-script-to-monitor-disk-space-usage-and-send-email/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[warmfrog](https://github.com/warmfrog) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


每日安全资讯：Stack Overflow 遭遇黑客攻击

![](/data/attachment/album/201905/18/111012dva6476uppunh84r.jpg)

Stack Overflow 是面向编程和开发相关话题的互联网最大 IT 技术问答网站。在其官网上发布的一则简短公告中表示，有黑客访问了公司的内部网络。Stack Overflow 工程副总裁 Mary Ferguson 表示：“上周末，Stack Overflow 遭到了网络攻击。”

在公告中写道：“我们已经确认黑客于 5 月 11 日获得了一定程度的生产环境的访问。我们在发现入侵之后就立即调查了黑客访问的范围并解决了所有已知的漏洞。”Ferguson 表示目前并没有直接证据表明黑客窃取了用户的登陆凭证，但是目前不能百分百排除这种可能。在公告中 Ferguson 表示在调查结束之后会公布更多的细节。

Stack Overflow 是一个程序设计领域的问答网站，隶属 Stack Exchange Network。网站允许注册用户提出或回答问题，还可对已有问题或答案加分、扣分或进行修改，条件是用户达到一定的“声望值”。“声望值”就是用户进行网站交互时能获取的分数，例如，用户 A 回答了一个问题，用户 B 对用户 A 的解答给予了“加分”，用户 A 就会因而获得 10 点声望值。当声望值达到某个程度，用户的权限就会增加，如声望值超过 50 点就可以评论答案，另外网站也会根据用户的贡献颁发徽章。用户创建的内容都使用知识共享协议授权。

直至 2018 年9月，Stack Overflow 有超过 9,400,000 名注册用户和超过 16,000,000 个问题，其中最常见的主题有JavaScript、Java、C#、PHP、Android、Python、jQuery 和 HTML。

来源：cnBeta.COM

### 更多资讯

##### FBI 指控网络犯罪头目试图从全球 44000 台电脑中窃取 1 亿美元

美国联邦调查局（FBI）和全球执法合作伙伴周四上午称，一名策划了一项犯罪阴谋的网络黑客头目已被逮捕，该阴谋闯入了 44000 台电脑，可能窃取了数百万美元。欧洲警察组织和联邦调查局证实，亚历山大·科诺沃洛夫和他的同谋玛拉特·卡赞德吉因涉嫌参与所谓的 Goznym 犯罪网络而在格鲁吉亚受到起诉。

来源： cnBeta.COM

详情： <http://t.cn/EKnBrw8>

##### 新文件显示纽约警察局在其面部识别系统中使用了修改后的图像

乔治敦大学隐私和技术中心（CPT）的一份新报告揭露了纽约警察局面部识别系统的广泛滥用，包括图像改变和使用非可疑图像。在一个案例中，官员根据一名看起来像哈里森的嫌疑人的证人描述，上传了演员伍迪·哈里森的照片，嫌疑人后来因小偷窃而被捕。

来源： cnBeta.COM

详情： <http://t.cn/EKnBDS4>

##### 报告称黑客利用华硕云存储在 PC 上安装 Plead 后门

安全研究人员近日报告称，黑客组织 BlackTech 在中国台湾通过中间人攻击（“MITM 攻击”）部署了 Plead 恶意软件。该组织被曝利用华硕 WebStorage 软件的漏洞来上传绕过身份验证的恶意软件。

来源： cnBeta.COM

详情： <http://t.cn/EKnrv6e>

##### 俄罗斯政府网站被爆泄露 225 万用户社保和护照等信息

多家俄罗斯政府网站泄露了超过 225 万公民、公务员和高层政治家的私人和护照信息。俄罗斯非政府组织 Informational Culture 的联合创始人 Ivan Begtin 最先发现并公开了本次严重的数据泄露事件。由三篇博文组成的系列报道中，Begtin 表示他对政府在线认证中心、50 家政府门户网站以及政府机构使用的电子投标平台进行了调查。

来源： cnBeta.COM

详情： <http://t.cn/EKnrzyf>

（信息来源于网络，安华金和搜集整理）


9102 年的 PHP

![](/data/attachment/album/201905/18/183202tdg7r7g5kl3du7ms.jpg)

你还记得篇流行的博客文章《[PHP：设计糟糕的分形](https://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/)》吗？我第一次读到它时，我在一个有很多遗留的 PHP 项目的糟糕地方工作。这篇文章让我觉得我是否应该放弃，并去做与编程完全不同的事情。

还好，我之后很快就换了工作，更重要的是，自从 5.x 版本以来，PHP 成功地进步了很多。今天，我在向那些不再使用 PHP 编程，或者陷入遗留项目的人们致意。

剧透：今天有些事情仍然很糟糕，就像几乎每种编程语言都有它的怪癖一样。许多核心功能仍然有不一致的调用方法，仍然有令人困惑的配置设置，仍然有许多开发人员在那里写蹩脚的代码 —— 因为他们必须如此，或是他们不知道更好的写法。

今天我想看看好的一面：让我们关注已经发生变化的事情，以及编写干净而可维护的 PHP 代码的方法。在此之前，我想请你暂时搁置任何偏见。

然后，你可以像以前一样对 PHP 自由吐槽。虽然，你可能会对 PHP 在过去的几年里的一些改进感到惊讶。（LCTT 译注：说实话，我是真的感到吃惊）

### 提前看结论

* PHP 在积极地开发，每年都有新版本
* 自 PHP 5 时代以来的性能已经翻倍，如果不是三倍的话
* 有一个非常活跃的框架、包和平台的生态系统
* PHP 在过去几年中添加了许多新功能，并且这种语言在不断发展
* 像静态分析这样的工具在过去几年中已经成熟，并且一直保持增长 更新：人们让我展示一些实际的代码。我觉得这没问题！这是我的一个业余项目的[源代码](https://github.com/brendt/aggregate.stitcher.io)，用 PHP 和 Laravel 编写的；[这里](https://spatie.be/open-source/packages)列出了我们在办公室维护的几百个自由开源软件包。这两者都是现代 PHP 项目的好例子。

那让我们开始吧。

### 历史总结

出于更好地衡量的目的，让我们快速回顾一下如今的 PHP 发布周期。我们现在的 PHP 为 7.3，预计在 2019 年底为 7.4。PHP 8.0 将是 7.4 之后的下一个版本。

自从 5.x 时代以来，核心团队试图保持每年发布一个版本的周期，并且他们在过去的四年中成功地做到了这一点。

一般来说，每个新版本都会在两年内得到积极支持，并再获得一年以上的“安全修复”。其目标是激励 PHP 开发人员尽可能保持最新：例如，每年进行小规模升级比在 5.4 到 7.0 之间跳转更容易。

可以在 [这里](https://www.php.net/supported-versions.php) 找到 PHP 时间轴的活动概述。

![](/data/attachment/album/201905/18/182816searmxew6rmq692a.jpg)

最后，PHP 5.6 是最新的 5.x 版本，而 8.0 是当前的下一个大版本。如果你想知道 PHP 6 发生了什么，你可以听听 [PHP Roundtable 播客](https://www.phproundtable.com/episode/what-happened-to-php-6)。

了解了这个，让我们揭穿一些关于现代 PHP 的常见误解。

### PHP 的性能

早在 5.x 时代，PHP 的表现就是……嗯，平均水平。但是在 7.0 版本中，PHP 从头开始重写了核心部分，导致其性能提升了两到三倍！

但光是嘴说是不够的。让我们来看看基准测试。幸运的是，人们花了很多时间对 PHP 性能进行了基准测试。 我发现 [Kinsta](https://kinsta.com/blog/php-benchmarks/) 有一个很好的更新的测试列表。

自 7.0 升级以来，性能就一直在提升而没有回退。PHP Web 应用程序的性能可与其它语言中的 Web 框架相提并论，甚至在某些情况下更好。你可以看看这个[广泛的基准测试套件](https://github.com/the-benchmarker/web-frameworks)。

当然 PHP 框架不会胜过 C 和 Rust，但它们比 Rails 或 Django 要好得多，并且与 ExpressJS 相当。

### 框架和生态系统

说到框架：PHP 可不仅仅是 WordPress。让我告诉你 —— 某些专业的 PHP 开发人员：WordPress 绝不代表当代的 PHP 生态系统。

一般来说，有两个主要的 Web 应用程序框架，[Symfony](https://symfony.com/) 和 [Laravel](https://laravel.com/)，以及一些较小的应用程序框架。当然还有 Zend、Yii、Cake、Code Igniter 等等，但是如果你想知道现代 PHP 开发是怎么样的，这两者之一都是很好的选择。

这两个框架都有一个庞大的包和产品的生态系统。从管理面板和 CRM 到独立软件包，从 CI 到分析器，以及几个 Web 套接字服务器、队列管理器、支付集成等众多服务。老实说，要列出的内容太多了。

这些框架虽然适用于实际开发。如果你只是需要个内容管理系统（CMS），WordPress 和 CraftCMS 等平台就够了。

衡量 PHP 生态系统当前状态的一种方法是查看 Packagist，这是 PHP 主要的软件包存储库。它现在呈指数级增长。每天下载量达到了 2500 万次，可以说 PHP 生态系统已不再是以前的小型弱势群体了。

请查看此图表，它列出一段时间内的软件包和版本数量变化。它也可以在 [Packagist 网站](https://packagist.org/statistics)上找到它。

![](/data/attachment/album/201905/18/183234wkk9xxfnop0dxxno.png)

除了应用程序框架和 CMS 之外，我们还看到过去几年里异步框架的兴起。

这些是用 PHP 或其他语言编写的框架和服务器，允许用户运行真正的异步 PHP，这些例子包括 [Swoole](https://www.swoole.co.uk/)（创始人韩天峰），以及 [Amp](https://amphp.org/) 和 [ReactPHP](https://reactphp.org/)。

我们已经进入了异步的世界，像 Web 套接字和具有大量 I/O 的应用程序之类的东西在 PHP 世界中已经变得非常重要。

在内部邮件列表里（PHP 核心开发人员讨论语言开发的地方）已经谈到了[将 libuv 添加到核心](https://externals.io/message/102415#102415)。如果你还不知道 libuv：Node.js 全有赖它提供异步性。

### 语言本身

虽然尚未提供 `async` 和 `await`，但在过去几年中，PHP 语言本身已经有了很多改进。这是 PHP 中新功能的非详尽列表：

* [短闭包](https://stitcher.io/blog/short-closures-in-php)（箭头函数）
* [Null 合并操作符](https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator)（`??`）
* [Trait](https://www.php.net/manual/en/language.oop5.traits.php)（一种代码重用方式）
* [属性类型](https://stitcher.io/blog/new-in-php-74#typed-properties-rfc)
* [展开操作符](https://wiki.php.net/rfc/argument_unpacking)（参数解包 `...`）
* [JIT 编译器](https://wiki.php.net/rfc/jit)（即时编译器）
* [FFI](https://wiki.php.net/rfc/ffi)（外部函数接口）
* [匿名类](https://www.php.net/manual/en/language.oop5.anonymous.php)
* [返回类型声明](https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration)
* [现代化的加密支持](https://wiki.php.net/rfc/libsodium)
* [生成器](https://wiki.php.net/rfc/generators)
* [等等](https://www.php.net/ChangeLog-7.php)

当我们讨论语言功能时，我们还要谈谈当今该语言的发展过程。虽然社区可以提出 RFC，但是得有一个活跃的志愿者核心团队才能推着它前进。

接下来，这些 RFC 将在“内部”邮件列表中进行讨论，这个邮件列表也可以[在线阅读](https://externals.io/)。在添加新的语言特性之前，必须进行投票。只有得到了至少 2/3 多数同意的 RFC 才能进入核心。

可能有大约 100 人能够投票，但不需要每个人对每个 RFC 进行投票。核心团队的成员当然可以投票，他们是维护代码库的人。除了他们之外，还有一群人从 PHP 社区中被单独挑选出来。这些人包括 PHP 文档的维护者，对 PHP 项目整体有贡献的人，以及 PHP 社区中的杰出开发人员。

虽然大多数核心开发都是在自愿的基础上完成的，但其中一位核心 PHP 开发人员 Nikita Popov 最近受雇于 [JetBrains](https://blog.jetbrains.com/phpstorm/2019/01/nikita-popov-joins-phpstorm-team/) 全职从事于 PHP 语言的开发。另一个例子是 Linux 基金会最近决定[投资 Zend 框架](https://getlaminas.org/)。像这样的雇佣和收购确保了 PHP 未来发展的稳定性。

### 工具

除了核心本身，我们看到过去几年中围绕它的工具有所增加。首先浮现于我脑海中的是静态分析器，比如由 Vimeo 创建 [Psalm](https://github.com/vimeo/psalm)，以及 [Phan](https://github.com/phan/phan) 和 [PHPStan](https://github.com/phpstan/phpstan)。

这些工具将静态分析你的 PHP 代码并报告任何类型错误和可能的错误等。在某种程度上，它们提供的功能可以与 TypeScript 进行比较，但是现在这种语言不能<ruby> 转译 <rt>  transpiling </rt></ruby>，因此不支持使用自定义语法。

尽管这意味着我们需要依赖 docblocks，但是 PHP 之父 Rasmus Lerdorf 确实提到了[添加静态分析引擎](https://externals.io/message/101477#101592)到核心的想法。虽然会有很多潜力，但这是一项艰巨的任务。

说到转译，以及受到 JavaScript 社区的启发；他们已经努力在用户领域中扩展 PHP 语法。一个名为 [Pre](https://preprocess.io/) 的项目正是如此：允许将新的 PHP 语法转译为普通的 PHP 代码。

虽然这个思路已经在 JavaScript 世界中被证明了，但如果提供了适当的 IDE 和静态分析支持，它就能在 PHP 中工作了。这是一个非常有趣的想法，但必须发展起来才能称之为“主流”。

### 结语

尽管如此，你仍然可以将 PHP 视为一种糟糕的语言。虽然这种语言肯定有它的缺点和背负了 20 年的遗产；但我可以放胆地说，我喜欢用它工作。

根据我的经验，我能够创建可靠、可维护和高质量的软件。我工作的客户对最终结果感到满意，“俺也一样”。

尽管仍然可以用 PHP 做很多乱七八糟的事情，但我认为如果明智和正确地使用的话，它是 Web 开发的绝佳选择。

你不同意吗？让我知道为什么！你可以通过 [Twitter](https://twitter.com/brendt_gd) 或 [电子邮件](mailto:brendt@stitcher.io) 与我联系。

---

via: <https://stitcher.io/blog/php-in-2019>

作者：[Brent](https://stitcher.io/blog/php-in-2019) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 attrs 来告别 Python 中的样板

>
> 在我们覆盖 7 个 PyPI 库的系列文章中了解更多解决 Python 问题的信息。
>
>
>

![](/data/attachment/album/201905/18/211211lhqqbemqwkeqc2bb.jpg)

Python是当今使用最多[流行的编程语言](https://opensource.com/article/18/5/numbers-python-community-trends)之一，因为：它是开源的，它具有广泛的用途（例如 Web 编程、业务应用、游戏、科学编程等等），它有一个充满活力和专注的社区支持它。这个社区是我们在 [Python Package Index](https://pypi.org/)（PyPI）中提供如此庞大、多样化的软件包的原因，用以扩展和改进 Python。并解决不可避免的问题。

在本系列中，我们将介绍七个可以帮助你解决常见 Python 问题的 PyPI 库。今天，我们将研究 [attrs](https://pypi.org/project/attrs/)，这是一个帮助你快速编写简洁、正确的代码的 Python 包。

### attrs

如果你已经写过一段时间的 Python，那么你可能习惯这样写代码：

```
class Book(object):

    def __init__(self, isbn, name, author):
        self.isbn = isbn
        self.name = name
        self.author = author
```

接着写一个 `__repr__` 函数。否则，很难记录 `Book` 的实例：

```
def __repr__(self):
    return f"Book({self.isbn}, {self.name}, {self.author})"
```

接下来你会写一个好看的 docstring 来记录期望的类型。但是你注意到你忘了添加 `edition` 和 `published_year` 属性，所以你必须在五个地方修改它们。

如果你不必这么做如何？

```
@attr.s(auto_attribs=True)
class Book(object):
    isbn: str
    name: str
    author: str
    published_year: int
    edition: int
```

使用新的类型注释语法注释类型属性，`attrs` 会检测注释并创建一个类。

ISBN 有特定格式。如果我们想强行使用该格式怎么办？

```
@attr.s(auto_attribs=True)
class Book(object):
    isbn: str = attr.ib()
    @isbn.validator
    def pattern_match(self, attribute, value):
        m = re.match(r"^(\d{3}-)\d{1,3}-\d{2,3}-\d{1,7}-\d$", value)
        if not m:
            raise ValueError("incorrect format for isbn", value)
    name: str
    author: str
    published_year: int
    edition: int
```

`attrs` 库也对[不可变式编程](https://opensource.com/article/18/10/functional-programming-python-immutable-data-structures)支持良好。将第一行改成 `@attr.s(auto_attribs=True, frozen=True)` 意味着 `Book` 现在是不可变的：尝试修改一个属性将会引发一个异常。相反，比如，如果希望将发布日期向后一年，我们可以修改成 `attr.evolve(old_book, published_year=old_book.published_year+1)` 来得到一个*新的*实例。

本系列的下一篇文章我们将来看下 `singledispatch`，一个能让你向 Python 库添加方法的库。

**查看本系列先前的文章：**

* [Cython](/article-10859-1.html)
* [Black](/article-10864-1.html)

---

via: <https://opensource.com/article/19/5/python-attrs>

作者：[Moshe Zadka](https://opensource.com/users/moshez/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出