Linux代理设置

网上找了一堆的教程,其实都提到了,但没提到关键的容易踩中的坑:两者的环境变量名不同!

  1. shell中可用的全局代理,是在/etc/profile文件或~/.bash_profile中export http_proxy=http://xxxx的方式实现;注意:环境变量名是http_proxy;
  2. yum则需要修改/etc/yum.conf文件,而其中的变量名是proxy!!!

Continue Reading

MySQL常用操作

安装

在CentOS7上安装MySQL Community Server 8.0

通过Yum安装的是mariadb,为安装社区标准版,做如下操作:

  1. 官网查找最新的rpm包(repo)的下载地址https://dev.mysql.com/downloads/repo/yum/
  2. 下载rpm包,对CentOS7上的MySQL8来说是这个:https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  3. 安装rpm包到系统:rpm -ivh xxxxx.rpm 其中xxxx.rpm是上面下载的rpm文件
  4. 安装mysql,注意mysql是命令行客户端,需要安装mysql-community-server
  5. 配置my.cnf文件:lower_case_table_names
    • lower_case_table_names=1
    • 此配置一定要在第一次启动MySQL前完成,否则将导致异常冲突;
    • 默认情况下:Linux=0, Windows=1, OSX=2
    • 区别在于:0,保存表名时大小写敏感(与create table语句一致),查找(比较)时亦是;1,保存表名时统一转换为小写,查找时亦统一转换为小写查询;2,保存表名时大小写敏感(与create table语句一致),查询(比较)时统一都转换为小写。
  6. 配置my.cnf文件,其它:
    • sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    • 配置此内容是为应对部分MySQL5.7与8.0的语法不兼容的问题,例如5.7的数据库在升级到8.0时,datetime字段不支持0000-00-00的字符串作为默认值(Wordpress)将提示:Invalid default value for xxxx;
    • MySQL8不支持NO_AUTO_CREATE_USER,删除此项配置即可;
  7. 启动MYSQL,常规的7.0启动服务命令:systemctl start mysqld,注意后面的d;
  8. 首次启动后会在日志中生成默认密码,通过grep ‘temporary password’ /var/log/mysqld.log查看默认密码;
  9. 修改密码ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘root_new_pwd’;
  10. 或通过mysql还是mysqladmin连接一次会自动提示修改密码;
  11. 通过update user set host =’%’ where user=’root’;允许任意IP连接;
  12. 注意上述操作需要执行flush privileges;

其它安装相关技巧

  1. rpm查询相关包:rpm -qa | grep “mysql”
  2. 删除相关rpm包:rpm -e –nodeps mariadb-server,其中mariadb-server是包名;
  3. 删除mysql的相关文件:sudo rm -rf /var/lib/mysql /var/log/mysqld.log
  4. 查看yum中的repo库:yum repolist
  5. 启用或禁用yum中某个安装包:sudo yum-config-manager –disable mysql80-community,其中–disable改为–enable即为启用;可以通过启用或禁用5.7或8.0版本来安装(当然也可直接指定版本安装);
  6. 查看密码策略:SHOW VARIABLES LIKE ‘validate_password%’;
  7. 本机启用防火墙的情况下,添加防火墙规则:firewall-cmd –zone=public –add-port=3306/tcp –permanent,还需要通过firewall-cmd –reload加载一次方能生效。
  8. 可以通过创建root@%的新用户的方式来允许远程IP连接入;需要执行如下指令:
    1. CREATE USER ‘root’@’%’ IDENTIFIED BY ‘root’;
    2. GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ WITH GRANT OPTION;
Continue Reading

Word高级经验

说明

以下描述均在Word(16.45 21011103)for OSX上操作,Windows版可能有更简单的操作方法。

样式基本概念

样式库(Style Gallery)

显示在Home中的样式;这些样式是常用样式,可以移除,也可以添加。点击删除时,右键显示的名称叫:Style gallery,而在添加到此列表时叫Quick Style List。

添加快速样式:打开样式面板,点击样式右侧的向下箭头,点击修改(modify),然后添加到快速样式(Quick Style List )

删除快速样式:在样式库上右键点击,选择Remove from Style Gallery。

样式类型

这里的样式类型主要是指可见性:

  1. ALL STYLES:本文档,包括模板中定义的所有有效样式;
  2. IN CURRENT DOCUMENT:本文档中的样式,这里我还不太能准确的理解。
  3. STYLE IN USE:本文档中已被使用的样式;
  4. RECOMMENDED:推荐样式(这个没什么用)

注意这个类型五样式库没有必然关系,即:在样式库的样式可以不在3和4中,但一定在1和2 中。一般情况下,关注123即可。

当1中样式过多,确定不会使用时,可以删除。

常用样式说明

Heading1~9:标题

TOC1~9:目录(Table of conetnt)标题,注意:这是与Heading1∽9对应目录项的样式。

Toc Title:目录标题

Normal:标准段落,建议所有的样式以此为基础,即:基准样式,主要是字体,间距,对齐,缩进等的定义。我的习惯是这里不定义中文的首行缩进。

IndentFirstLine:首行缩进做段落,在Normal的基础上首行缩进两汉字。

caption:题注(图表等)

高级操作

重新打包

所有的docx文件其本质是zip文件我,解压后大多数文件可直接修改,完成修改后重新打包即可。

注意的是:

  1. 打包成zip
  2. 注意是打包根目录,即包含了:[Content_Types].xml和word/docProps/customXml文件夹的目录,不要再套目录;
  3. 如果在打包的目录加入了一些不相关的文件,无论是放到根目录还是子目录中,打开时将提示文件发现不可达的内容(unreachable content),点击YES(信任)可修复此错误;
  4. 默认的XML文件是紧凑排列(无空格的),可以格式化(增加空格和换行)后保存,不影响打包后打开此文件,并且不会在一般的保存操作时重新格式化为紧凑(即:先解压,打开xxx.xml,重新格式化增加换行和缩进,再打包为zip,改名为docx打开,修改文件再保存,再将此文件修改为zip 后再解压并查看xxx.xml文件,此文件仍为之前已经格式化过的状态,而不是紧凑状态)。
  5. 在styles.xml中删除样式
    1. 只删除样式定义部分的内容<w:style w:type=”paragraph” w:styleId=”Heading6″>此操作将导致样式丢失,文档打开时重建此“名称”的样式,格式为默认;如果样式此前显示在Style Gallery中仍将显示重建后的样式;
    2. 删除样式定义部分的同时,删除前部的引用如:<w:lsdException w:name=”heading 6″ w:uiPriority=”9″ w:qFormat=”1″ />,此时样式从StyleGallery中消失。

样式库排序

有时会出现样式合并后顺序错乱,此时在Windows平台上可以通过窗口方便的调整顺序,但在OSX上无此功能。

解决的方案是,将docx重命名为zip后解压,然后修改/word/styles.xml文件。

关于样式的定义大体如下:

<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
        <w:name w:val="Normal" />
        <w:uiPriority w:val="95" />

        <w:qFormat />
</w:style>

可以通过搜索styleId="Normal"的方式来查找相应的片段,添加其中<w:uiPriority w:val="95" />这一行或修改后面的数字即可修改排序。

修改完成重新压缩为zip文件即可。

Continue Reading

Linux配置虚拟内存

  1. 用root用户登录系统
  2. 创建/usr/swap目录
  3. 执行dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096
  4. 其中的4096可修改为2048或其它大小,为虚拟内存大小;
  5. mkswap /usr/swap/swapfile
  6. swapon /usr/swap/swapfile
  7. 修改/etc/fstab,在第一行后(视情况)增加一行/usr/swap/swapfile swap swap defaults 0 0
  8. 重启:)通过free -m检查
Continue Reading

Linux命令经验——mount相关

之前用过很多次mount相关的功能,包括加载远程NFS等,最近因为配置vsftpd又用到,所以记录一下。

绑定A与B目录

这一操作感觉上类似于ln -s或者ln(实际上)。区别在于ln根本不能实现(硬链接不支持目录),而ln -s实际上是创建了一个文件指向了目标。

需求来自于一个ftp的配置。多个帐户要求共享若干个目录,每个帐户又有各自独立的目录,并且这些目录需要隐藏而不仅仅是禁止访问。

解决的方案是:

mount -bound /source/dir /target/dir

在fstab中启动时加载

这也是经常需要的功能,毕竟一次性加载的时候不多。

方法是编辑/etc/fstab文件,此文件的各个字段的标准解释参考这里

简单点说包括:fs_spec(加载系统) fs_file(挂载点<目录>) fs_type(文件系统类型) fs_options(参数) fs_dump(转储频率) fs_pass(启动时加载顺序)

翻译得通俗一点就是;

/source/dirOrDevice    /target/dir     file_system_type option1,option2 #1 #2

其中#1,#2一般为0,0。

对于上面提到的A目录挂载B目录时,对应的写法是:

/ftp/public     /ftp/users/ftp/public       none defaults,bind 0 0

字段之间可以使用“任意数量”的“空字符”分隔,至少包括:空格和制表符,且允许多个。

选项(option)之间使用逗号分隔。常用的除了上面的defaults,bind之外,还有ro(只读),rw(读写)等。

在另一个项目中,我试过用如下的方式加载远程的目录,通过NFS方式共享文件,实现上传文件的统一管理。

172.17.16.24:/nfs/upload    /nfs/upload    nfs    defaults 0 0

172.17.16.24:/nfs/archive    /nfs/archive    nfs    defaults 0 0

172.17.16.24:/nfs/share    /nfs/share    nfs    defaults 0 0

与之对应的的NFS配置虽然与mount无关,这里也列一下以便对照。

/nfs/share 172.17.16.25/32(rw,sync,no_root_squash,no_all_squash)
/nfs/share 172.17.16.30/32(rw,sync,no_root_squash,no_all_squash)
/nfs/share 172.17.16.45/32(rw,sync,no_root_squash,no_all_squash)
/nfs/archive 172.17.16.25/32(ro,sync)
/nfs/archive 172.17.16.30/32(ro,sync)
/nfs/archive 172.17.16.45/32(ro,sync)
/nfs/upload 172.17.16.25/32(rw,sync,no_root_squash,no_all_squash)
/nfs/upload 172.17.16.30/32(rw,sync,no_root_squash,no_all_squash)

fstab校验

之前遇到过一次修改了fstab把主机搞挂了的情况,所以一直对修改这个文件有点发怵,今天上网发现了一个命令,应该是非常实用的:

mount -a

该命令尝试加载fstab文件,可以不重启验证fstab文件是否有异常。

解除挂载

其实这个命令很简单,就是umount 挂载点路径

唯一需要说明的就是不是unmount,而是umount,一开始打错了。

Continue Reading

Mikrotik(ROS)知识整理

家里的RouterOS功能很强大,但太复杂有时有些东西记不住了,整理一下备用。

  1. ARP白名单
    1. 要求①为所有设备增加相应的静态ARP记录;
    2. 要求②将相应设备的接口(interface)的ARP设置改为reply-only;
    3. 由于大部分是WIFI设备而不是有线,所以实际是将bridge接口设置为reply-only;
    4. 取消白名单的设置是将ARP设置为enabled!
    5. 注意一定不是设置为disabled,在设置为disabled之后路由器将不应答任何ARP请求(包括正常的),导致MAC层通信完全瘫痪(MAC地址和IP地址无法映射和转换)。
  2. 先记到这……
Continue Reading

清除QQ同步助手的拼音排序

习惯用QQ同步助手做额外的备份,其中有一个功能叫:联系人排序,通过给联系人增加Phonetic First/Middle/Last Name字段,并为其中添加相应字段的“拼音”实现排序。

本来说这个功能只用于排序,但实测发现这个字段会用于siri的语音识别和朗读,结果就是你用拼音的方法读名字时它认不出来,而siri读通讯录名字会感觉很奇怪。

重新安装了QQ同步助手,发现只有排序功能而没有清除,于是想到了Apple Script,经过一翻搜索和实验,脚本如下:

  1. 打开Script editor,新建一个文件;
  2. 输入如下脚本:
tell application "Contacts"
	activate
	set the_people to every person
	repeat with tp in the_people
		try -- lazy way of skipping companies
			log tp
			set pfn to phonetic first name of tp
			set pln to phonetic last name of tp
			
			if pfn is not missing value then
				set phonetic first name of tp to missing value
			end if
			
			if pln is not missing value then
				set phonetic last name of tp to missing value
			end if
		end try
	end repeat
	
	save
end tell

执行即可:)

Continue Reading

Java 21个锁的概念

今天逛知乎看到一个不错的文章,文章的标题其实不太贴切,其实并不是按同一分类方法有21种锁,而是按不同方法分类的。不过以前从没想过竟然有这么多锁的概念:)

先帖地址:https://zhuanlan.zhihu.com/p/215271906

以下是一些总结和理解,有些关键或自己理解深的照抄原文:)

悲观 vs 乐观

悲观锁是通常意义上的锁,无论读写均锁定,一致性得到保证。如:Synchronized;

乐观锁则认为读多写少,读写冲突概率低,所以读时不锁,仅写时锁。乐观锁在更新前会把目标值与期望值做比较,仅当一致时更新(锁定)。如:CAS。

自旋

自旋只一种锁的等待方案。一般的线程当遇到资源已经被锁定时,直接切换线程环境,把CPU资源交给其它线程。而自旋则是线程空转,等待资源释放。适用于:1)多核(线程)结构CPU,单核显然是不适用的;2)资源使用时间短,快速释放的场合。

自旋锁,有一个自旋次数配置(-XX:PreBlockSpin),当超过特定的次数,线程仍未等到资源释放,则切换线程资源。JVM默认为10,可配置。同时,可配置为自适应自旋,根据上次旋转的次数等参数来动态调整这个次数。

CAS使用自旋锁。

可重入锁

可重入锁表示同一线程可以多次获取同一锁。如:ReentrantLock,Synchronized是可重入的。

读写锁

读写分离锁;读锁定时允许多线程读,一旦写锁定,则与悲观锁相同(不可再获取读锁)。

公平锁VS非公平锁

公平锁,线程请求某个资源时如遇到锁,则会进行排除,按FIFO的顺序依次获取资源;非公平锁:没有队列,谁先获得锁是不一定的。

非公平锁效率更高,但可能导致某些线程始终不能得到锁(线程饥饿)。synchronized是非公平锁,ReentrantLock通过构造函数指定该锁是公平的还是非公平的,默认是非公平的。

共享锁

用ReentrantReadWriteLock实现,其实就是乐观锁,读写锁的意思。

独占锁/互斥锁/同步锁===悲观锁

与悲观锁,互斥锁同义,即同一时刻只有一个线程能获取资源。synchronized,ReentrantLock

重量级 VS 轻量级锁

通过锁的实现方式区分锁的类型。

synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的,监视器锁本身依赖底层的操作系统的 Mutex Lock来实现。操作系统实现线程的切换需要从用户态切换到核心态,成本非常高。这种依赖于操作系统 Mutex Lock来实现的锁称为重量级锁。为了优化synchonized,引入了轻量级锁偏向锁

轻量级锁是JDK6时加入的一种锁优化机制: 轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量。轻量级是相对于使用操作系统互斥量来实现的重量级锁而言的。轻量级锁在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。如果出现两条以上的线程争用同一个锁的情况,那轻量级锁将不会有效,必须膨胀为重量级锁。出现此情形时,轻量级锁性能要差于重量级锁。

偏向锁,则是轻量级锁的进一步优化,如果资源没有竞争,且总是倾向于使用同一个线程处理,则可以使用偏向锁。偏向锁会连CAS也忽略掉。

分段锁

一次不把所有资源都锁定,类似库库的页面级和行级锁这样的。文中以ConcurrentHashMap为例,ConcurrentHashMap里面包含了多个(默认16)个HashMap,每一个HashMap就是一个segment,在锁定时先计算出KEY,确定属于哪个segment,然后只锁定这个segment,提高并发效率。

死锁:不用解释

锁粗化

如果一段连续代码中有几处需要锁定同一资源,没必要反复加锁,解锁,在增加开销的同时还增加了竞争的可能性,将锁定放到更大的范围(代码段),即为锁粗化,是一种锁优化技术。

锁消除

如果通过技术手段可以不用加锁,称之为锁消除,也是一种锁优化技术。

synchronized——Java关键字

关键字,独占(互斥,悲观)锁,可重入锁,非公平锁。

作用于实例方法时,锁定一个对象;作用于静态方法时,锁定Class类,相当于全局锁。

作用于一个非null的对象实例时,锁定所有以该对象为锁的代码块。

Lock——Java接口

Java中的接口,属于可重入,悲观(独占,互斥,同步)锁。

需要手动获取和释放,而synchronized是完全自动的(锁定相当的代码段)

synchronized出现异常时,自动释放当前线程锁,不会导致死锁;而lock发生异常需要捕获并手动释放锁(unLock),因此建议在finally块中释放锁。

lock可以让等待线程响应中断,而synchornized会一直等待。

lock可以知道是否获取成功锁,而synchronized则不行。

lock可通过读写锁,实现共享锁,提高效率。

ReentrantLock——Lock的实现类

ReentrantLock是一个类,继承了lock接口,是可重入,悲观锁(同步,互斥,独占)。

ReentrantLock可以实现公平与非公平锁,而synchornized则只能是非公平锁。

ReentrantLock可通过Condition绑定多个条件。

Continue Reading

OSX外接机械键盘配置

最近入手了一个GS87D,摸索了一下配置。

GS87D的键盘布局与magic keyboard不太一样,最大的问题是底部的Modifier键布局不同。MagicKeyboard和内置键盘空格左侧都是FN,Ctrl,Option,Command右侧是 Command,Option。而87D则左边只有3个按键,右边则有4个,其中第2个是键盘的FN键不可重新映射的。

为了不和MAC键盘上的FN键冲突,以下GS87D键盘内置的FN键(空格右侧第二健)用FNX代替。

先尝试了键盘内置的切换ALT/WIN位置的快捷键(FNX+ALT),这样键位变成了:

Ctrl,Option,Command,Space,Option,FNX,Application(右键菜单),Ctrl。

这样看起来很恶心,首先是左右不对称,然后是没有了FN键,很多OSX上的操作都不能用了,为了解决这个问题,找到了一个相当不错的软件:Karabiner-Elements,这玩意可以映射键盘按键,并且是开源的。

先安装,有两个Application,一个是配置用的将常驻内存;一个是EventViewer。这个应用最常用的功能应该就是可以测试一下你按下的是哪个按键。

装完后我的配置如下:

这样的话,底部功能键就变成了:

Ctrl ,Option,Command,Space,Command,FNX,Option,FN。

这样一来相对内置键盘就有两个区别:

  1. FN从最左侧移动到最右侧。
  2. 右Command和右Option之间多了一个FNX键。

这两个问题都是键盘布局造成的,无法解决。

在安装步骤中有一个问题困扰了我很久,并导致内置键盘的功能键+Touchbar上虚拟按键的组合键完全失效,例如:Command+ESC,Ctrl+F4这样的都不能用。解决办法是:

  1. 在配置程序的设备页面中同时勾选No product name和Apple Internal Keyboard这两个设备(前面的勾即可),他们的VenderID应该相同,都是1452。
  2. 在配置程序的功能键页面,勾选Use all F1,F2…为标准功能键。

还有问题,如果你将键盘关机再开机,那么键位将恢复到Ctrl,Win,Alt的顺序;又要再按一次FNX+ALT来切换两个键位的位置,所以我后面干脆把左侧的两个按键也用Karabiner来重新映射而不是使用键盘内置的切换功能,一劳永逸。上图中已经体现了这个配置结果。

Continue Reading

给ESXi应用阿里云证书

网上有很多教程如何给ESXi使用自己的证书,我折腾了一回还把ESXi搞瘫了几天,记录一下供各位参考,免得你们跳进同一个坑。

这里有一个Windows下比较完整的教程,我的主要操作步骤也是参考这个的:

https://koolshare.cn/thread-137269-1-1.html

 

Step 1:购买域名并购买阿里云证书

略,这个不知道也没必要折腾这个了。

 

Step 2:生成CSR文件,这一步就是坑关键

生成CSR文件的openssl命令,注意参数:

openssl req -new -nodes -out rui.csr -keyout rui-orig.key -config openssl.cfg

根据这个教程是需要在windows下下载openssl,其实在OSX下本身就支持这个命令,关键是openssl.cfg文件,其实也是不需要的,openssl支持在命令行提示中输入(完成)配置。

后面回头看这个命令,其实也非常好理解-keyout rui-orig.key,这个参数的意思是:生成一个key文件,而我则是在参考了这个文章中的内容后,按如下顺序执行的:

https://yq.aliyun.com/articles/47314

命令1:openssl genrsa -out some.key 2048

命令2:openssl req -new -key some.key -out some.csr

这两个命令一个生成.key文件,一个生成.csr文件。第2个命令会提示你输入相关信息(比如:CN/HN/CS等,注意common name必须是你的域名,其它包括邮箱密码都可保持为空)

生成的.key文件最后需要上传到ESXi上,而csr文件则用于申请证书。

注意在windows版的教程中还有一个命令是

openssl rsa -in rui-orig.key -out rui.key

如果按我的两个命令的方法执行则不需要再执行这个转换的命令,因为用openssl genrsa本来生成的就已经是RSA的私钥。

在没有解决这个问题之前,我先通过搜索找到这样一篇文章,可以通过keychain生成csr但很遗憾我没有找到方法得到.key文件,所以就卡在这了。

https://www.jianshu.com/p/f20caf82938d

而我最大的特点是勇于折腾,在没有key文件的情况下,覆盖了crt文件并重启了ESXi,然后就没有WebUI了,解决的方法后面讲。

 

Step 3:用生成的csr文件生成证书

这个与前面的windows教程完成一致,只强调一个:申请证书时填的域名必须与CSR文件中的common name中的域名完全一致。

Step 4:下载并替换证书

从阿里云下载签发域名的Nginx版证书,后缀应是pem格式,假设这个文件为A

之前生成的some.key文件,假设这个文件为B。

通过SSH登录到ESXi,进入目录/etc/vmware/ssl目录,备份(我理解其实删除也完全没问题)rui.crt/rui.key这两个文件。

然后,通过vi命令创建新的rui.crt/rui.key这两个文件并保存,内容是:

A-> rui.crt

B->rui.key

 

Step 5:重启Management Agent

不知道命令行怎么重启,我正好连在console上,用键盘重启的,没有连接console的话直接重启ESXi效果也一样。

前面生成csr的时候因为没有生成正确的key文件,所以出现了一个非常严重的问题就是Management Agent(WebUI)连接不上了,但SSH正常。

解决的方法非常简单(需通过SSH连接):

1)备份后移除/etc/vmware/ssl下的rui.crt/rui.key这两个文件

2)执行/sbin/generate-certificates命令重新生成证书

3)重启Management Agents

 

操作完成后,可通过域名直接访问ESXi,Chrome不会提示证书异常,同时也可以保存密码了,对我等强迫症来说是个好事。

 

Continue Reading
1 2 3 10