python3去除emoji表情符号

最近项目中使用load file导入文件到低版本MySQL中遇到卡住问题,最终问题为文本文件中某些行包含了emoji表情符号。所以使用python去掉这个emoji符号,然后再导出数据库。

需要安装如下模块:

https://pypi.org/project/demoji/

安装完demoji模块后需要手动下载emoji json文件,如果服务器无法上网,可以本地电脑运行,然后提取这个codes.json文件上传到服务器对应的目录。

>>> import demoji
>>> demoji.download_codes()
Downloading emoji data ...
... OK (Got response in 0.14 seconds)
Writing emoji data to /Users/brad/.demoji/codes.json ...
... OK

代码如下:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import demoji

file_path = "org_loadfile.txt"
final_fine = "loadfile.txt"

# 如果最终文件存在,则删除
if os.path.exists(final_fine):
    os.remove(final_fine)

with open(file_path, 'r') as file:
    for line in file:
        # print(demoji.replace(line, "__"))
        # 替换表情符号为 空
        rap_line = demoji.replace(line, "")
        # 写入文件
        with open(final_fine, 'a') as f:
            f.write(rap_line)


记录几个内网广播包

最近在VM虚拟机里调试iptables,发现网卡上面有很多DROP的数据包,开启iptables 记录日志功能,发现了以下几个日志非常频繁。

# 开启iptables 记录日志
iptables -A INPUT -i ens38 -j LOG --log-prefix "iptables_INPUT_ens38_DROP: " --log-level notice
iptables -A INPUT -i ens38 -j DROP

iptables -A OUTPUT -o ens38 -j LOG --log-prefix "iptables_OUTPUT_ens38_DROP: " --log-level notice
iptables -A OUTPUT -o ens38 -j DROP

日志文件

Jan 26 21:06:43 localhost kernel: iptables_INPUT_ens38_DROP: IN=ens38 OUT= MAC=ff:ff:ff:ff:ff:ff:00:50:56:c0:00:02:08:00 SRC=192.168.81.1 DST=192.168.81.255 LEN=291 TOS=0x00 PREC=0x00 TTL=128 ID=19920 PROTO=UDP SPT=54915 DPT=54
915 LEN=271 

Jan 27 09:50:13 localhost kernel: iptables_INPUT_ens38_DROP: IN=ens38 OUT= MAC=ff:ff:ff:ff:ff:ff:00:50:56:c0:00:02:08:00 SRC=192.168.81.1 DST=192.168.81.255 LEN=173 TOS=0x00 PREC=0x00 TTL=128 ID=59712 PROTO=UDP SPT=17500 DPT=17500 LEN=153 

第一个 UDP 5419端口的为 鼠标Logitech‘s 程序的广播包,详细的文档如下:

http://support.moonpoint.com/network/udp/port_54915/

Why may you see UDP packets with a source port of 54915 and a destination port of 54915 being sent to the broadcast address for a subnet? When I searched for information on these packets, I found they are associated with Logitech‘s Arx control software. Logitech states in regards to that software:

Win the information war and stay ahead of the competition with critical in-game information on your tablet or smartphone. Arx control serves as a second screen for supported titles.

Arx Control lets you monitor and control your Logitech G peripherals without ever leaving the game. Fine-tune your mouse DPI in real time, or call up a list of your G-Key macros for quick reference right on your smartphone or tablet device.

Troubleshoot and monitor your system hardware with GPU/CPU temperatures and usage levels. Control your media or launch games remotely with built-in controls.

Arx Control is available on Android and iOS on tablets and smartphones, and works on any system with Logitech Gaming Software installed. Stand your smartphone upright in the adjustable Arx Smart Dock, on select Logitech keyboards, for convenient viewing.

You can find the software on Apple’s App Store at Logitech Arx Control. The page states “This app is only available on the App Store for iOS devices. Apple employs the iOS operating system on its iPhoneiPad, and iPod Touch devices. The software apparently looks for other devices with the Arx Conrol software installed by sending out the broadcast packets to UDP port 54,915 and then waits for those devices to respond.

第二个 UDP 包17500 为 DropBox 的LAN同步功能发的广播包。

关闭掉程序或者禁用这个LAN同步,以上两个广播包消失。

Linux Mint 20 gnome-terminal 使用等距更纱黑体 SC字体

最近在使用Linux Mint 20 Cinnamon桌面,默认的终端为 gnome terminal,一直无法修改为我想要的等宽字体,比如最近喜欢上的 等距更纱黑体 SC,英文名为:Sarasa Mono SC

原因是gnome terminal只认Monospace系列家族字体,所以想办法让系统认为等距更纱黑体 SC就是monospace字体就能解决这个问题。

还是先记录一下怎么安装等距更纱黑体 SC字体吧,从github下载最新压缩包,然后使用7z解压,只要复制sarasa-mono-sc-regular.ttf到/usr/share/fonts/目录下的其中一个目录即可。

# https://github.com/be5invis/Sarasa-Gothic/releases

sudo mkdir /usr/share/fonts/sarasa_mono_sc
sudo cp sarasa-gothic-ttf-0.15.3/sarasa-mono-sc-regular.ttf /usr/share/fonts/sarasa_mono_sc/
# 刷新字体缓存
sudo fc-cache  -fv

# 使用如下命令可查看字体
fc-match "Sarasa Mono SC"
# 或者使用 fonts 工具也可以查看到安装好的字体。

下面是修改字体配置文件,替换字体,我是从ArchLinux Wiki中查找到的方法,网上使用alias的方法没有效果。

vim ~/.config/fontconfig/fonts.conf

在<fontconfig></fontconfig>里面增加下面一段:

<match target="pattern">
    <test qual="any" name="family"><string>Monospace</string></test>
    <edit name="family" mode="assign" binding="same"><string>Sarasa Mono SC</string></edit>
</match>


保存文件,重新打开 gnome-terminal 即可看到字体变化为等距更纱黑体 SC的效果了。

ArchLinux Wiki上的描述为:

关键点在于使用“binding”属性可以有更好的效果,例如在Firefox你可能只想替换字体但并不想改变被替换字体的属性。

可以使用一下命令检查是否生效:

# 查看 Monospace 目前使用的是哪个字体
fc-match "Monospace"
# 排序,这里可以看到排在第一行的为 等距更纱黑体 SC
fc-match --sort "Monospace"

sarasa-mono-sc-regular.ttf: "等距更纱黑体 SC" "Regular"


注意:在gnome-terminal的首选项设置中 需要钩选自定义字体,选择Monospace Regular 字体。

FreeBSD12安装GoLand编辑器

最近重新燃起学 go 语言的兴趣,起因是修改一个告警信息发送到 IM 的脚本,刚拿到脚本一脸蒙,再后来又要修改这个脚本又是头大。都怪我之前没有学习 go 的基础语法,临时抱佛脚行不得。所以这次下得决心把 go 作为2021年必修技能。

为了减少家庭矛盾 !_!,把家里台式电脑主系统切换到了 FreeBSD,跟游戏彻底88了,经过一个多月已经没有想玩游戏的念头了,更多的时间是在陪家人及怎么打发业余时间,经常996+大小周工作制也没有多少自己的时间,所以现在才知时间的宝贵,而人已到中年。

下面记录了如何在 FreeBSD 里安装 openjdk,安装 jetbrains 出口的 goland IDE编辑器。

pkg search ^openjdk

openjdk8-8.265.01.1            Java Development Kit 8

pkg install openjdk8

New packages to be INSTALLED:
        java-zoneinfo: 2020.a
        javavmwrapper: 2.7.6
        openjdk8: 8.265.01.1

=====
Message from openjdk8-8.265.01.1:

--
This OpenJDK implementation requires fdescfs(5) mounted on /dev/fd and
procfs(5) mounted on /proc.

If you have not done it yet, please do the following:

        mount -t fdescfs fdesc /dev/fd
        mount -t procfs proc /proc

To make it permanent, you need the following lines in /etc/fstab:

fdesc   /dev/fd         fdescfs         rw      0       0
proc    /proc           procfs          rw      0       0

# java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)


pkg install openjdk8 cmake gdb

New packages to be INSTALLED:
        cmake: 3.18.3
        gdb: 9.2_1
        jsoncpp: 1.9.4
        mpfr: 4.1.0
        rhash: 1.3.9
        source-highlight: 3.1.9_1

Number of packages to be installed: 6


- Edit clion-2016.3/bin/idea.properties and change run.processes.with.pty=false
- Start CLion and open Settings | Build, Execution, Deployment | Toolchains
- Specify CMake path: /usr/local/bin/cmake and GDB path: /usr/local/bin/gdb


# pkg search jetbrains
jetbrains-clion-2020.2.4       JetBrains CLion IDE
jetbrains-goland-2020.1.4      JetBrains GoLand IDE
jetbrains-mono-2.001,1         Free and open source typeface for developers
jetbrains-phpstorm-2020.2.2    JetBrains PhpStorm IDE
jetbrains-webstorm-2019.3.2    JetBrains JavaScript IDE

pkg install jetbrains-goland-2020.1.4

New packages to be INSTALLED:
        delve: 1.5.0
        intellij-fsnotifier: 20160221_6
        jetbrains-goland: 2020.1.4

Number of packages to be installed: 3

The process will require 618 MiB more space.
196 MiB to be downloaded.


=====
Message from intellij-fsnotifier-20160221_6:

--
===>   NOTICE:

The intellij-fsnotifier port currently does not have a maintainer. As a result, it is
more likely to have unresolved issues, not be up-to-date, or even be removed in
the future. To volunteer to maintain this port, please create an issue at:

https://bugs.freebsd.org/bugzilla

More information about port maintainership is available at:

https://www.freebsd.org/doc/en/articles/contributing/ports-contributing.html#maintain-port
=====
Message from delve-1.5.0:

--
Please execute the following commands to prep this system to run delve:

echo "# required for delve" >>/etc/sysctl.conf.local
echo "security.bsd.unprivileged_proc_debug=1" >>/etc/sysctl.conf.local

Then, either reboot or run the following commands to implement the above
changes:

service sysctl reload
=====
Message from jetbrains-goland-2020.1.4:

--
There is a native (faster) file watching support backed by kqueue which is
enabled by default.  If you encounter problems with watching large
trees, you can disable it by adding the following property via the menu
entry Help -> Edit Custom Properties...

      idea.filewatcher.disabled=true


# install golang
pkg install go

New packages to be INSTALLED:
        go: 1.15.5,1

Number of packages to be installed: 1

The process will require 283 MiB more space.
76 MiB to be downloaded.

go version
go version go1.15.5 freebsd/amd64


go env

GOPATH="/home/shing/go"
GOROOT="/usr/local/go"

解决 FreeBSD12.1 XFCE4 锁屏无效问题

最近在使用FreeBSD12.1,并安装了 XFCE4,一切都调试的不错,但发现点击屏幕右上角的锁屏按钮没有反应,这个时候点切换用户,就进入了锁屏状态,但无论你输入正确的密码都无法解锁进入桌面,只能重启系统。

解决方法其实很简单,就是少安装了一个xfce4组件 xfce4-screensaver,使用pkg安装过程记录如下:

pkg install xfce4-screensaver
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 2 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	pam_helper: 1.1
	xfce4-screensaver: 0.1.10

Number of packages to be installed: 2

The process will require 1 MiB more space.
226 KiB to be downloaded.

Proceed with this action? [y/N]: y
[1/2] Fetching xfce4-screensaver-0.1.10.txz: 100%  222 KiB 227.1kB/s    00:01    
[2/2] Fetching pam_helper-1.1.txz: 100%    4 KiB   3.8kB/s    00:01    
Checking integrity... done (0 conflicting)
[1/2] Installing pam_helper-1.1...
[1/2] Extracting pam_helper-1.1: 100%
[2/2] Installing xfce4-screensaver-0.1.10...
[2/2] Extracting xfce4-screensaver-0.1.10: 100%

安装完成后需要注销重新登录一下XFCE4桌面才会生效。发现还存在的一个问题就上面说过切换用户时会卡住的问题,可使用 CRTL + ALT + F10 快捷键 解决 锁屏时点了切换用户导致解锁不了的问题。

其它后面安装的组件有:

# 强大的图片处理工具,代替photoshop
pkg install gimp
# 系统任务管理器
pkg install xfce4-taskmanager
# 音量调节工具
pkg install xfce4-pulseaudio-plugin
# 截图工具
pkg install xfce4-screenshooter-plugin
# Ristretto 是 Xfce 桌面环境下的图片查看器。
pkg install ristretto
# 简单PDF查询工具,需要在命令行运行
pkg install mupdf
mupdf redme.pdf
# xfce4 安装GUI解压缩软件
pkg install thunar-archive-plugin xarchiver zip unzip p7zip arj lzop gcpio unrar

挂载U盘相关

FreeBSD 13 之后变为了 fusefs.ko,/boot/loader.conf 文件中需要修改为 fusefs_load="YES"
手动加载命令:
kldload fusefs
查看内存模块:
kldstat |grep fuse

fdisk /dev/da0
gpart show /dev/da0
gpart list da0

# FAT32
mount -v -t msdosfs /dev/da0 /mnt/u/
# 解决中文乱码
ntfs-3g /dev/ad0s1 /mnt/u -o silent,umask=0,locale=zh_CN.utf8

# NTFS
ntfs-3g /dev/ada1s1 /mnt/a -o silent,umask=0,locale=zh_CN.utf8

GPG 相关

# gpg GUI 管理
pkg install kleopatra

月季 那不勒斯

“那不勒斯”是丹麦微月永恒系列之一。整株形状美观漂亮,且很容易开满盆,很适合阳台种植。

永远的那不勒斯最大的特点就是分枝性特别的好,不需要特别的修剪就能够爆满盆,而且植株矮小,12公分的花盆就能够满足它的生长需求。永远的那不勒斯的花朵在半开的时候是最美的,完全开放以后花瓣有些卷。

日文名称:ナポリ?フォーエバー

找到了几个日本网友种那不勒斯的日记

http://iyasinoniwa.blog39.fc2.com/blog-category-43.html

https://ameblo.jp/mille-feuille2008/entry-10953285555.html

https://ameblo.jp/niwa0/entry-11566782622.html

perl替换功能备忘录

Perl 替换字符串

一. 介绍使用

s/regex/replacement/modifiers

进行查找替换

二. 实例
(1) s///
(2) s///r
用它进行匹配后,原始标量的值不会发生变化,可以把新值赋值给一个新的标量
(3) s///g 多次查找替换
(4) s///e 求值
(5) 如果 regex 里有 / 斜线这样的特殊符号,可以使用如下的定界符
s/// 可以用 s!!! , s{}{} , s{}// 进行替换,m#…# 或 s|…|…| 也都可以。

《Perl语言入门》一书中第八章开篇就有讲到,可以选择任何成对的定界符: m(fred)、m、m{fred}、m[fred]
也可以用其他不成对的定界符:m,fred,、m|fred|、m^fred^等等

不成对定界符就是没有左右之分的符号,所以模式两边使用同样的标点符号。

比如之前提写的使用 perl 去掉 utf-8 文件的 bom 头

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

模式定界符为斜线 /,但其可用字母m自行指定,如:

m!/u/iqpublic/perl/prog1! 等价于 /\/u\/jqpublic\/perl\/prog1/

当用字符’作为定界符时,不做变量替换;当用特殊字符作为定界符时,其转义功能或特殊功能即不能使用。成对的符号必须成对的使用。

perl 中通常使用 / 斜线或者 {} 花括号来作为定界符,在 IDE 中,一般都具有从左括号跳到相应的右括号的功能,在维护代码中要快速移动光标时就非常方便。
比如:
IntelliJ IDEA 快捷键
Ctrl+[ OR ] 可以跑到大括号的开头与结尾
ctrl+shift+m 移动到括号外面

打了左括号之后,自动出现一对括号,并在右边的括号后面出现一个切换点,输入完之后按一下Tab键就跳到右边括号的外边了
IntelliJ IDEA 可以使用 tab 键跳出括号和引号吗?
2018.2 EAP version 中,官方加入了新的特性,默认关闭,需要自行开启:在 Settings->Editor->General->Smart Keys 中就能找到 Jump outside closing bracket/quote with Tab 点击即可。

替换操作符的选项(modifiers )如下表:
选项 描述
g 改变模式中的所有匹配
i 忽略模式中的大小写
e 替换字符串作为表达式
m 将待匹配串视为多行
o 仅赋值一次
s 将待匹配串视为单行
x 忽略模式中的空白


关于Perl正则的一些规范,很多妙用。

1,定界符

    =~ m/there/;
    =~ s/there/here/;

还有其它的定界符:

    =~ /there/
    =~ m#there#;
    =~ s#there#here#;

    =~ m(there);
    =~ s(there)(here);

    =~ m{there};
    =~ s{there}{here};

    =~ m[there];
    =~ s[there][here];

    =~ m,there,;
    =~ s,there,here,;

    =~ m.there.;
    =~ s.there.here.;

    =~ m|there|;
    =~ s|there|here|;

    =~ m'there';
    =~ s'there'here';

2,修改符
修改符一般放在语句最后一个正斜杠(或者其他分隔符)的后面,修改符还可在匹配范式内定义,这是用(? 修改符)来实现的。
/x 允许在范式中加上注释和额外的空白字符,以提高程序的可读性。
/i 允许不分大小写的匹配范式。
/s 单行方式,决定了圆点 . 是否匹配换行符,使用了/s,圆点就匹配换行符,否则就不匹配。
比如:

#!/usr/bin/perl

use strict;
use warnings;

my $string = ".\n.";
print "The original string is: $string\n";

my $num = $string =~ s|(.)|#|sg;
print "$num occurences change, and be changed to: $string\n";

exit;

/m 多行方式,决定了脱字号 ^ 和美圆符 $ 是否匹配换行符,如果不用/s,^和$只能定位在字串的开始和结束处,它们并不匹配嵌入的换行符,这种情况等同于\A和\Z,否则不仅仅匹配字串的开始和结束,也匹配刚好处在嵌入换行符前后的一个位置。
/o 仅仅一次计算表达式的值
/e 将替代字符串作为一个表达式(仅仅在替代操作时有效)
/g 是一个全局修改符。另外,/g与while使用能在字串的所有匹配中进行遍历。
修改符 /G 必须与 /g 一起使用,用来匹配前一个 /g 匹配的停止位置。
如

#!/usr/bin/perl

use strict;
use warnings;

my $string = "~32sda13dAZ.'sDa#!3_C-!";
print "The original string is: $string\n";

my $num = $string =~ s.\w.#.g;
print "$num occurences change, and be changed to: $string\n";

exit;

3,正则里一些特殊字符
() 将表达式结组
[] 寻找一组字符
\d 等于 [0-9]
\D 等于 [^0-9]
\w 等于 [0-9A-Za-z_]
\W 等于 [^0-9A-Za-z_]
\s 等于 [\f\n\r\t ]
\S 等于 [^\f\n\r\t ]
. 等于 [^\n]

4,关于一些特殊符号
\b 不属于空白字符,向前缩进一个字符
\t 属于空白字符,匹配制表符
\r 属于空白字符,匹配回车符
\a 不属于空白字符,匹配闹钟符
\e 不属于空白字符,匹配转义符
\033 不属于空白字符,匹配八进制符
\x1B 不属于空白字符,匹配十六进制符
\c[ 不属于空白字符,匹配控制字符
属于空白字符,匹配空格
属于空白字符,匹配制表符
\f 属于空白字符,匹配换页符
\n 属于空白字符,匹配换行符
\0 不属于空白字符,功能不详
\c 不属于空白字符,功能不详
\x 不属于空白字符,功能不详

5,注意正则里的选择符的特殊性
选择运算符是所有运算符中优先级最低的,这意味着它最后执行。

6,正则里的限定符的一些经典用法
限定符常常与一些字符或词联合使用
* 匹配任意数个;
+ 匹配一个或多个;
? 匹配零个或一个;
{n} 匹配 n 个;
{n,m} 匹配 n 至 m 个;
{n,} 匹配 n 和 n 个以上;

限定符贪婪好像与生俱有的。在缺省状态下,*或+限定符匹配满足正则表达式的一个范式的最大实例数。可用?号显式的规定限定符的不贪婪。如果问号放在另一个限制符之后(甚至另一个问号之后),都可以使限定符不贪婪。

7,声明与断言
首先注意声明的长度为 0;
Perl种有一组控制大小写和换码的声明:
\u 使下一个字母变大写;
\l 使下一个字母变小写;
\U 使文本的剩余字符变成大写;
\L 使文本的剩余字符变成小写;
\Q 会除字母之外的其他字符进行换码处理,直至遇到 \E 声明、常规表达式结束或者字串结束。
\A声明和脱字符号(^)匹配字串的开始;
\Z声明和美元符号($)匹配字串的结束或刚好在字串结束前的换行符;
\z 只匹配字串的结束;
\b 匹配一个单词(字)边界;
\B 匹配一个非单词(字)边界;

(?#text) 忽略括号内的注释文本;
(?:pattern) 与组一致,但匹配时不生成$1,$2;
(?imsx:pattern) 与组一致,但匹配时不生成$1,$2,在特定的风格有效期间,内嵌风格匹配修饰符,等价于/pattern/option; 其中 option 为 i m s x;
(?=pattern) 前看声明,如果正则表达式在下一次匹配 pattern 风格,就开始匹配,而且不影响匹配效果。如/\w+(?=\t)/将匹配制表符是否恰好在一个字\w+后面出现,并且制表符不添加到$&amp;amp;amp;的值中;
(?!pattern) 如果正则表达式在后面不匹配 pattern ,才会开始匹配。如/foo(?!bar)/,只有当出现 foo,并且后面不出现 bar 时才开始匹配;
(?&amp;amp;lt;=pattern) 后看声明,只有在pattern已经匹配下面的表达式,并且不将 pattern 的结果放入$&amp;amp;amp;变量中,才匹配下面的语句。如/(?&amp;amp;lt;=\t)\W+/匹配制表符是否恰好在\W+前出现,但又不将制表符送到$&amp;amp;amp;中;
(? (?{code}) 表示对 code 的使用是试验性的。如果返回真,就认为是与(?:pattern)断言同一行里的匹配。code 不插入变量。这个断言仅仅在 use re 'eval' 编译指示符时才有效;
(?&amp;amp;gt;pattern) 如果类型锁定在当前位置,就使用单独的 pattern 匹配子字符串。如正则表达式/^(?&amp;amp;gt;a*)ab/永远不会匹配,因为语句(?&amp;amp;gt;a*)将匹配字符串开头所有的 a 字符,并删除与 ab 匹配的字符 a;
(!&amp;amp;lt;=pattern) 非后看声明,与后看声明意思相反;
(!=pattern) 非前看声明,与前看声明意思相反;
(?(condition)yes-pattern|no-pattern) 条件表达式——条件语句或者是一个圆括号中的整数,或者是一个断言;
(?(condition)yes-pattern)
(?imsx) 嵌入风格匹配修饰符。当要把表达式修改符嵌入在变量中,然后把变量用在不指定自己的修饰符的一般规则表达式中;
(?-imsx) 这个断言很有用——后面带任何内容都会关闭修饰符,直到出现另一个嵌入的修饰符。

8,向后引用
Perl的正则表达式引擎允许使用前面匹配好的值,这些值叫做向后引用。
例如:

    =~ m/(\w)\W*(\w)\W*(\w)\W*(\w)\W*\4\W*\3\W*\2\W*\1/;
    =~ s/(\w)\W*(\w)\W*(\w)\W*(\w)/$4$3$2$1/;

原文地址:http://my.huhoo.net/archives/2006/04/perl.html

CentOS 6.10 yum 报PyUnicodeUCS4_AsUTF8String解决过程

近日朋友向我求助说是在CentOS6中编译安装了python2.7后面不知怎么搞的yum也用不了的,本以为很简单的事情,把yum里的头替换一下就好了,结果事情不是那个简单。

参考这篇文章重装 https://www.lizenghai.com/archives/17330.html,所使用的包如下:

libxml2-python-2.7.6-21.el6_8.1.x86_64.rpm
python-2.6.6-66.el6_8.x86_64.rpm
python-backports-1.0-5.el6.x86_64.rpm
python-backports-ssl_match_hostname-3.4.0.2-5.el6.noarch.rpm
python-chardet-2.2.1-1.el6.noarch.rpm
python-devel-2.6.6-66.el6_8.x86_64.rpm
python-iniparse-0.3.1-2.1.el6.noarch.rpm
python-libs-2.6.6-66.el6_8.x86_64.rpm
python-pycurl-7.19.0-9.el6.x86_64.rpm
python-setuptools-0.6.10-4.el6_9.noarch.rpm
python-urlgrabber-3.9.1-11.el6.noarch.rpm
rpm-build-4.8.0-59.el6.x86_64.rpm
rpm-libs-4.8.0-59.el6.x86_64.rpm
rpm-python-4.8.0-59.el6.x86_64.rpm
yum-3.2.29-81.el6.centos.noarch.rpm
yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
yum-plugin-aliases-1.1.30-41.el6.noarch.rpm
yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm
yum-utils-1.1.30-41.el6.noarch.rpm

下面这些是一些记录,看不懂可忽略这一段
rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps        ##强制清除已安装的程序及其关联
 whereis python |xargs rm -frv ##删除所有残余文件 ##xargs,允许你对输出执行其他某些命令
 whereis python ##验证删除,返回无结果说明清除干净
 删除现有的yum
 [root@localhost rx]# rpm -qa|grep yum
 yum-metadata-parser-1.1.2-16.el6.x86_64
 yum-plugin-aliases-1.1.30-41.el6.noarch
 yum-plugin-fastestmirror-1.1.30-41.el6.noarch
 yum-plugin-protectbase-1.1.30-41.el6.noarch
 yum-3.2.29-81.el6.centos.noarch
 yum-utils-1.1.30-41.el6.noarch
 rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps    
 创建一个目录:python-need-pkg,将这些包下载下来,我是用centos6.10  DVD1 ios 镜像中提取的包。下载响应的包(注意:根据自己的系统下载,源中版本会更新,具体查看URL中的版本再下载!)
 5.执行命令安装
 1>执行这一步的时候没有依赖问题
 rpm -Uvh --replacepkgs python*.rpm
 行这一步的时候报依赖问题,有两个,
 rpm -Uvh --replacepkgs rpm-python.rpm yum.rpm
 error: Failed dependencies:
         libxml2-python is needed by yum-utils-1.1.30-41.el6.noarch
 rpm -ivh --force yum-utils-1.1.30-41.el6.noarch.rpm
 find /usr/lib64/  -type f -name "*.so" | xargs nm -AD | grep PyUnicodeUCS4_AsUTF8String 
 /usr/lib64/python2.6/lib-dynload/_sqlite3.so:                 U PyUnicodeUCS4_AsUTF8String
 /usr/lib64/python2.6/lib-dynload/cPickle.so:                 U PyUnicodeUCS4_AsUTF8String
 /usr/lib64/python2.6/site-packages/rpm/_rpmmodule.so:                 U PyUnicodeUCS4_AsUTF8String
 rpm -qf /usr/lib64/python2.6/lib-dynload/_sqlite3.so
 python-libs-2.6.6-66.el6_8.x86_64
 rpm -qf /usr/lib64/python2.6/lib-dynload/cPickle.so
 python-libs-2.6.6-66.el6_8.x86_64
 rpm -qf /usr/lib64/python2.6/site-packages/rpm/_rpmmodule.so
 rpm-python-4.8.0-59.el6.x86_64
 nm -AD /lib/libpython2.6.so.1.0 | grep PyUnicodeUCS4_AsUTF8String 
 libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00007f139db99000)
 libpython2.6.so.1.0 => /lib/libpython2.6.so.1.0 (0x00007f6be9933000)
 libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f139cb90000)
 libnssutil3.so => /usr/lib/libnssutil3.so (0x00007f6be892a000)

后面重装了系统自己带的python2.6.6及yum也还是报 /usr/lib64/python2.6/site-packages/rpm/_rpmmodule.so undefined symbol:PyUnicodeUCS4_AsUTF8String

后面自己在虚拟机中安装了一个干净的CentOS6.10对比才发现问题所在。下面这个是干净系统的 ldd

[root@localhost ~]# ldd /usr/lib64/python2.6/site-packages/rpm/_rpmmodule.so
         linux-vdso.so.1 =&gt;  (0x00007fff9c3e9000)
         librpm.so.1 =&gt; /usr/lib64/librpm.so.1 (0x00007f6a00ddf000)
         libselinux.so.1 =&gt; /lib64/libselinux.so.1 (0x00007f6a00bc0000)
         libcap.so.2 =&gt; /lib64/libcap.so.2 (0x00007f6a009bb000)
         libacl.so.1 =&gt; /lib64/libacl.so.1 (0x00007f6a007b3000)
         libdb-4.7.so =&gt; /lib64/libdb-4.7.so (0x00007f6a0043e000)
         librpmio.so.1 =&gt; /usr/lib64/librpmio.so.1 (0x00007f6a0020e000)
         libnss3.so =&gt; /usr/lib64/libnss3.so (0x00007f69ffec6000)
         libbz2.so.1 =&gt; /lib64/libbz2.so.1 (0x00007f69ffcb5000)
         libz.so.1 =&gt; /lib64/libz.so.1 (0x00007f69ffa9e000)
         libelf.so.1 =&gt; /usr/lib64/libelf.so.1 (0x00007f69ff888000)
         libpopt.so.0 =&gt; /lib64/libpopt.so.0 (0x00007f69ff67f000)
         liblzma.so.0 =&gt; /usr/lib64/liblzma.so.0 (0x00007f69ff45d000)
         liblua-5.1.so =&gt; /usr/lib64/liblua-5.1.so (0x00007f69ff230000)
         libm.so.6 =&gt; /lib64/libm.so.6 (0x00007f69fefac000)
         libpython2.6.so.1.0 =&gt; /usr/lib64/libpython2.6.so.1.0 (0x00007f69fec05000)
         librt.so.1 =&gt; /lib64/librt.so.1 (0x00007f69fe9fd000)
         libpthread.so.0 =&gt; /lib64/libpthread.so.0 (0x00007f69fe7e0000)
         libc.so.6 =&gt; /lib64/libc.so.6 (0x00007f69fe44b000)
         libdl.so.2 =&gt; /lib64/libdl.so.2 (0x00007f69fe247000)
         /lib64/ld-linux-x86-64.so.2 (0x00005617d7672000)
         libattr.so.1 =&gt; /lib64/libattr.so.1 (0x00007f69fe042000)
         libgcc_s.so.1 =&gt; /lib64/libgcc_s.so.1 (0x00007f69fde2b000)
         libnssutil3.so =&gt; /usr/lib64/libnssutil3.so (0x00007f69fdbfc000)
         libplc4.so =&gt; /lib64/libplc4.so (0x00007f69fd9f7000)
         libplds4.so =&gt; /lib64/libplds4.so (0x00007f69fd7f2000)
         libnspr4.so =&gt; /lib64/libnspr4.so (0x00007f69fd5b3000)
         libutil.so.1 =&gt; /lib64/libutil.so.1 (0x00007f69fd3af000)

对比发现这两处不一样:

libpython2.6.so.1.0 => /usr/lib64/libpython2.6.so.1.0 (0x00007f139db99000)
libpython2.6.so.1.0 => /lib/libpython2.6.so.1.0 (0x00007f6be9933000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f139cb90000)
libnssutil3.so => /usr/lib/libnssutil3.so (0x00007f6be892a000)

解决它:

cd /etc/ld.so.conf.d/
echo “/usr/lib64/” > libnssutil3.conf
echo “/usr/lib64/” > libpython2.6.conf
echo “/lib64/” > libdb-4.7.conf

又遇到 无法 import time 的问题,解决方法:

vim /etc/profile.d/python.sh export PYTHONPATH=$PYTHONPATH:/usr/lib64/python2.6:/usr/lib64/python2.6/lib-dynload/

FreeBSD ports 使用proxychains解决下载慢问题

proxychains

每次新安装FreeBSD后我都会手动使用port安装vim及tmux等常用工具,时常下载依赖包源代码的时候卡很久或者龟速,FreeBSD又没有一个镜像源,那些依赖包的源代码的下载地址默认使用的是源代码软件提供的下载地址。
遇到下载慢的,我通常是把下载地址复制到浏览器手动下载,然后上传到FreeBSD 里的 /usr/port/distfile目录,所以想使用代理。
说到代理,传统上面都使用http https ftp之类的类型,还要配置一大堆,比如:

FETCH_ENV=http_proxy=http://proxy.123.com:3128 \http代理
FETCH_ENV=ftp_proxy=http://proxy.123.com:3128 \ftp代理

我一直使用socks5作为浏览器的代理首选,找了一圈发现 proxychains 就是我想找的工具。下面说说怎么安装和配置吧。

1、安装 proxychains
cd /usr/ports/net/proxychains/ && make install clean

安装后的配置文件路径
/usr/local/etc/proxychains.conf
打开后你需要在末尾添加你使用的代理。例如:

安装后的配置文件路径
/usr/local/etc/proxychains.conf
打开后你需要在末尾添加你使用的代理。例如:
[ProxyList]  

socks5  127.0.0.1 8080

使用:
使用方法就是在你使用的命令工具之前加上 proxychains,比如:

proxychains wget
proxychains curl

配置 port,让port下载软件的时候自动使用代理,因我使用axel替换了默认的下载工具。

vim /etc/make.conf
FETCH_CMD = proxychains axel
FETCH_BEFORE_ARGS = -n 8 -a
FETCH_AFTER_ARGS =
DISABLE_SIZE = yes

经过以上配置之后,使用port安装软件现也不担心下载慢的问题了。

Kafka Eagle中ZK & Kafka Info页面显示域名地址的配置方法

Kafka Eagle监控系统是一款用来监控Kafka集群的工具,支持管理多个Kafka集群、管理Kafka主题(包含查看、删除、创建等)、消费者组合消费者实例监控、消息阻塞告警、Kafka集群健康状态查看等。

为了让ZK & Kafka Info页面显示域名,如下图所示:

2019-12-04_180059

步骤一:修改kafka advertised.listeners配置为域名,并重启,首先域名得先做好解析。
kafka/config/server.properties

advertised.listeners=PLAINTEXT://kafka.liurongxing.com:9092

advertised.listeners

Advertised 的含义表示宣称的、公布的,就是说这组监听器是 Broker 用于对外发布的。就是用client连接zk的时候能够获得主机名端口自等信息。

监听器:是由逗号分隔的三元组,每个三元组的格式为 <协议名,主机名,端口号>。协议名可能是标准的名字,如:PLAINTEXT表示明文传输、SSL表标使用SSL或者TLS加密传输,也可能是自定义的名字。自定义后还需要指定 listener.security.protocol.map参数告诉这个协议底层使用了哪种安全协议。

有关 advertised.listeners 的作用请阅读:https://blog.csdn.net/lsr40/article/details/84135959

步骤二:修改kafka-eagle-web配置system-config.properties 中的cluster1.zk.list为zookeeper的域名地址,并重启。

kafka-eagle-web/conf/system-config.properties
cluster1.zk.list=zookeeper.liurongxing.com:2181

cluster1.zk.list

此时访问 kafka-eagle-web 页面查看即会显示为域名,本文只是在测试环境部署使用了域名,是否有副作用还有待验证。

Linux下utf-8 BOM 文件的检查与删除

当源程序是 gbk 格式,你转换为 utf8 的时候,很多情况是头部会出现 bom,如果是 php 代码,这样会出现很多意想不到的事情,那怎么办呢,你可以用 linux 命令来查找,然后对文件的 bom 进行删除。

grep -r $'\xef\xbb\xbf' * |grep .php

bom:UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark)

查询BOM:

:set bomb?

用 vim 去掉 utf-8 BOM

:set nobomb

保留 utf-8 BOM

:set bomb

vim 转换文件为 unix 格式

:set ff=unix

使用 grep 查找带 bom 的文件,并使用 perl 去掉 bom 头

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

jdbc om.microsoft.sqlserver.jdbc.SQLServerDriver 受 DNS 解析速度影响,卡顿问题

问题原因是线上跑java的服务器接口从昨天晚上开始大量报超时,检查服务器负载及网络正常。后面通过一个/check健康检查接口找到慢的原因为与MSSQL数据库连接慢。
分析及解决步骤:
1、把/check接口与业务代码剥离,单独抽出jdbc连接的模块。
2、分别在多台不同的服务器上跑,发现有的服务器响应正常,有的需要5秒、10秒左右的时间。
3、通过sqlmd命令直接连接MSSQL服务器响应在0.05秒左右,非常快,排除网络问题。
4、查看系统DNS,有两个,其中一个为 202.96.128.166 ,ping不通,把这个DNS注释掉,再/check接口,响应时间正常。
5、多次替换不同DNS,确认为是其中一个DNS失效,导致java在请求的时候请求到这个DNS不通,等ttl超时后再请求另一个DNS,造成卡顿问题。
6、检查所有服务器系统DNS是否正常,修改为正常的DNS服务器ip.

后面需要研究一下为什么JDBC在使用ip的情况下,还是会走一次系统的DNS请求。

还有一个原因是系统hostname 没有加入到hosts文件中,导致hostname无法解析。