错误提示

目录可能被另一个进程锁定或被设置为只读.
目录: ‘/Users/user-name/Library/Application Support/Autodesk/AutoCAD LT 2019 Standalone/R23.0/local/@zh_CN@’

错误原因

汉化补丁仅仅是对系统的界面进行了汉化,没有汉化AutoCAD启动向导页面的模板文件,因此/Users/user-name/Library/Application Support/Autodesk/AutoCAD LT 2019 Standalone/R23.0/local/目录下没有相关的简体中文的模板文件,CAD找不到目录,就认为CAD对 @zh_CN@文件夹 没有相关的权限,因此就报了一个只读的权限错误。

解决办法

这里只给命令行截面下的解决办法

# 1. 打开MAC的命令行工具
# 2. 定位到local语言目录下
cd /Users/user-name/Library/Application Support/Autodesk/AutoCAD LT 2019 Standalone/R23.0/local/
# 注意 /Users/user-name 中 user-name是你的用户名
# 3. 将英文版的向导模板文件拷贝为简体中文版
cp  -r \@en\@/  \@zh_CN\@
# 注意 这不是一种优雅的fix,真正的解决办法有待于官方release完整的中文语言包
# 本解决办法仅能解决安装简体中文版本后无法启动的问题
# 重新打开AutoCAD之后,中文截面就有了,就可以正常启动了。

从终端启动APP

open /Applications/App-name.app

设置MAC的Daemon启动项

Crontab在OSX上不是很好使,因为一旦重启的话,cron记录就会丢失,因此使用系统自带的Launchd Daemon来启动必要的服务。配置Launchd Daemon只需要一个plist文件,简单而且放便,适用于对系统已经安装过的服务设置自启动。OSX另外一种自启动的方式为StartupItems,这种方式不进需要使用plist来这设置,而且需要在plist的文件夹下指定可执行文件,比如一个脚本。因此Launchd Daemon是比较简单和方便的。配置Launchd是Mac OS下用于初始化系统环境的关键进程,它是内核装载成功之后在OS环境下启动的第一个进程。

以下以设置ngrok自启动为例

通常Launchd Daemon 放置在 /System/Library/LaunchAgents目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>

    <key>Label</key>
    <string>com.localhost.ngrok.plist</string>

    <key>RunAtLoad</key>
    <true/>

    <key>StandardErrorPath</key>
    <string>/Users/nz/Documents/Crons/ngrok/ngrok-err.log</string>

    <key>StandardOutPath</key>
    <string>/Users/nz/Documents/Crons/ngrok/ngrok.log</string>

    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string><![CDATA[/usr/local/bin:/usr/bin:/bin]]></string>
    </dict>

    <key>WorkingDirectory</key>
    <string>/Users/nz/Documents/Crons</string>

    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/ngrok</string>
      <string>start</string>
      <string>ssh</string>
    </array>

  </dict>
</plist>

载入启动项

launchctl load /System/Library/LaunchAgents/com.localhost.ngrok.plist

取消启动项

launchctl unload /System/Library/LaunchAgents/com.localhost.ngrok.plist

如何不用任何第三方工具挂载系统的隐藏分区如EFI分区等

# 这里主要用到系统的命令行工具
# 使用以下命令打印系统已经识别的可以挂载的分区信息,如下面的列表显示,我的分区比较多可能列表有点长

sudo diskutil list

   #:                       TYPE NAME                    SIZE       IDENTIFIER
   # 0:      GUID_partition_scheme                        *120.0 GB   disk0
   # 1:                        EFI NO NAME                 314.6 MB   disk0s1
   # 2:         Microsoft Reserved                         314.6 MB   disk0s2
   # 3:       Microsoft Basic Data                         42.4 GB    disk0s3
   # 4:           Windows Recovery                         502.3 MB   disk0s4
   # 5:                 Apple_APFS Container disk1         76.5 GB    disk0s5

   # /dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   # 0:      APFS Container Scheme -                      +76.5 GB    disk1
   #                               Physical Store disk0s5
   # 1:                APFS Volume OSX                     51.9 GB    disk1s1
   # 2:                APFS Volume Preboot                 45.0 MB    disk1s2
   # 3:                APFS Volume Recovery                522.7 MB   disk1s3
   # 4:                APFS Volume VM                      3.2 GB     disk1s4

   # /dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   # 0:      GUID_partition_scheme                        *1.0 TB     disk2
   # 1:         Microsoft Reserved                         134.2 MB   disk2s1
   # 2:       Microsoft Basic Data Programs                85.9 GB    disk2s2
   # 3:       Microsoft Basic Data Documents               107.4 GB   disk2s3
   # 4:       Microsoft Basic Data Others                  214.7 GB   disk2s4
   # 5:                        EFI                         314.6 MB   disk2s5
   # 6:                  Apple_HFS osxhd1                  107.2 GB   disk2s6
   # 7:                  Apple_HFS osxhd2                  214.6 GB   disk2s7
   # 8:                  Apple_HFS osxhd3                  269.5 GB   disk2s8

# 使用 mount命令挂载你想挂载的分区,OSX默认的会挂载一般的分区,如APFS、NTFS文件系统的分区。默认的为了系统安全着想,EFI分区或是双系统Windows的DOS文件分区是隐藏的,如要查看这些隐藏分区的文件,就需要手动来挂载。这里我们以挂载EFI分区为例。

# 如要挂载EFI分区,这里 EFI 分区对应的就是标识符是 disk0s1
# 第一步 -> 新建一个目录作为磁盘的挂载位置
mkdir /Users/user-name/Documents/efi_temp
# 第二步 -> 挂载 EFI 分区到目录 /Volumes/efi
mount -t msdos /dev/disk0s1 /Users/user-name/Documents/efi_temp
# 第三步 -> 操作完成后取消挂载,防止误操作
diskutil unmount /dev/disk0s1

如何从OSX中移出已删除的重复的APP链接

很多时候当我们更新OSX系统中的某个软件,比如我把Microsoft office 从 15.0 更新到 16.0, 在卸载了15.0的版本之后,当我在Finder中用右键选择打开xlsx表格文件时,Finder还是回显示已经卸载的15.0版本的链接。显然在我们非正常卸载APP后(直接将旧版本APP删除到回收站),系统并没有自动实时更新内置的软件列表,这样就会导致这样的问题。

So 问题是 怎么办?

以下给出命令行的解决办法,简单粗暴。

# 重置系统的内置软件索引,去除旧版本和重复软件的注册
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user
# 重启Finder使设置生效
killall Finder

之后再查看,发现右键烦人的重复老版本软件全都拜拜了。:)

-- 写在前

折腾这个的原因:

  1. 公司的没有钱部署自己的本地服务器,而只好用自己的办公电脑同时兼做服务器
  2. 网络为联通直连光纤,且联通线路维护人员拒不提供光猫的超级管理员密码,无法进入光猫设置光猫路由的lan端的端口映射
  3. 公司内部网络的布线决定了,无法将光猫运行模式改为PPPOE,且DDNS的方式也存在不稳定的情况
  4. 国内可以解决此问题的NAT123或是花生壳吃相太难看并且他们提供免费线路限流且极不稳定

使用NGROK解决此问题的前提

  1. 拥有公网IP的独立主机或是VPS
  2. 一定的Linux运维经验,能够熟练使用shell相关命令
  3. 熟悉linux的daemon运行模式,熟悉systemctl或是init.d的相关设置
# 注意我的服务器环境为Debian
# 建立编译操作的临时目录
mkdir ngrok_tmp
cd ngrok_tmp

# 配置和生成NGROK连接验证证书 #
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.domain.com" -days 5000 -out rootCA.pem 
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=ngrok.domain.com" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

# 获取NGROK源码
git clone https://github.com/inconshreveable/ngrok.git

# 为NGROK编译指定证书文件,覆盖NGROK默认的证书文件
cd ngrok
yes | cp ../server.key ./assets/server/tls/snakeoil.key
yes | cp ../server.crt ./assets/server/tls/snakeoil.crt
yes | cp ../rootCA.pem ./assets/client/tls/ngrokroot.crt

make release-server

# 安装 NGROKD (Daemon) 到系统的常用路径PATH下
cp bin/ngrokd /usr/local/bin/

# 添加 NGROKD 服务项,以便自启动和使用service命令来启动和关闭
vim /etc/systemd/system/ngrokd.service

##################################
[Unit]
Description=ngrok service
After=network.target
After=syslog.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ngrokd -domain=ngrok.domain.com -httpAddr 0.0.0.0:9280 -httpsAddr 0.0.0.0:9243  -tunnelAddr 0.0.0.0:9443 -log=/var/log/ngrokd.log -log-level=WARNING
ExecStop=/bin/kill $MAINPID
ExecReload=/bin/kill -USR1 $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target
##################################
# 创建log日志文件,否则ngrokd无法启动
touch /var/log/ngrokd.log

# 将NGROD添加到系统自启动项
systemctl enable ngrokd

# 启动NGROD服务,或是使用service命令也可以
systemctl start ngrokd

# 查看NGROK服务端系统状态,或是使用service命令也可以
systemctl status ngrokd

# 编译客户端 
# 由于我的本地环境为iMAC,因此这里仅编译MAC环境下的客户端
GOOS=darwin GOARCH=amd64 make release-client

scp拷贝编译后的客户端到本地主机上

# 新建NGROK客户端配置文件,注意客户端配置文件为yml格式
vim .ngrok.yml 并写入以下配置项

#################################
server_addr: ngrok.domain.com:9443 # 这里指定客户端要连接的服务端的域名和端口号,4443是默认的监听的端口,可以在服务端进行更改
trust_host_root_certs: false # 这里指定是否验证服务端的证书,如果是从证书机构获取的证书则可以写为true,如果是自己生成的证书这里写为false
tunnels: # 这个配置项是你要开启的通道的配置
    ssh: # ssh是这个通道的名称,可以随意命名
        remote_port: 10039 # 该配置项可以申请远程服务器的固定端口,如果不设置该参数,每次在启动客户端的时候服务端都会随机分配一个端口号
        proto: # 该配置项指明该通道使用哪些协议
            tcp: 80 # 该配置项指明该通道开启本地tcp协议的80端口,即将远程的10039端口转发到本地80端口
#################################

# 创建 ngrok客户端日志文件,你可以根据自己的情况设置别的路径
touch /Users/user-name/Documents/Crons/ngrok.log

# 启动客户端,创建tunnel
/usr/local/bin/ngrok -log=/Users/user-name/Documents/Crons/ngrok.log -log-level=WARNING -config=/Users/nz/.ngrok.yml start-all

# 服务端运行如下提示
ngrok                                                                                                                                        (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    tcp://ngrok.domain.com:10039 -> 127.0.0.1:80
Web Interface                 127.0.0.1:4040
# Conn                        1
Avg Conn Time                 4821.21ms

# 以上输出证明端口映射成功,至此完结撒花

# 有时间考虑进一步研究以下,补齐添加额外tunnel和添加到mac自启动的相关操作

余姓曾字博约,豫南蓼城人。少惇信明义,好朋友喜宾客,国高肄业读于殷南安工,习国际贸易。初到安工,尝与院长争识论知,针砭学院之弊,较计自由之理。虽师国贸,然终日摆弄电脑硬件,研修编程,始于系统安装,终于helloworld。四年大学,修电脑无数,得佳人几无。每遇良师,凝精会神以期知致; 未即否室,直转遁逸。或沐阳光,或归书馆,或游郊野,狂放羁荡以至于斯,终阍然结业,何其幸也。

后七月归宁,得工业仓储国贸销售一职,后三月正职之时,终觉非吾之所愿即去之。归途偶识吾兄璟炎,相谈甚欢,遂效之以任电商客服于瑞东。初到瑞东,每日端坐于电脑之前,静待洋人发问而答。是时拼写错漏,英语浅薄,每检视工作日志,多贻笑大方。时因我之粗漏而多使公司有所损益者,兄亦不较计,每每笑言,此错可改,况吾未有言在先,以至有此,乃我之过,汝可鉴之。有所问必答之,有所惑必解之,多年浮沉未尝见有如兄之无私藏而乐身教者。

电商工作满一年遂驾轻就熟诸事平稳,即起倦厌之心。时瑞东亦有电商开发部门,且与我部同室办公。其部之众多终日静坐寡言少语,闻键盘沓沓之声,见屏幕未解天书,三五日即成精美绝伦之网站,遂惊奇慨叹此神技如隔空取物御笔而书。吾情难自禁而多溢赞其人神工,其人皆哭笑不得,谓我曰非也,盖非汝之所见,听我肺腑之言,戒入此行,呜呼苦焉。吾深不以为然,多求得以拜子元为师,跨入此门。先斩W3C HTML,大破CSS,闪击JS收JQ,围PHP于函数,克MYSQL于JOINS,六月之后小有所成,遂辅子元以兼WEB开发工作。是时,每日皆遇新问题,时时皆需学习新知识,变通从权,临学现卖。初倍爱己之慧明竟如无敌,尝慨然而叹,何难之有,唯手熟尔;后观同好之作,乃觉已之知浅识薄如劣石之于璞玉,彼之妙道善解令我目瞪口呆,始知入行非一日之功,编程之道仰之弥高,钻之弥坚,非谦勤苦修不能得也。至此,终平复静心积跬步垒土丘,然至今里不满百山不十丈,暗笑:何其曰成?今念瑞东之日犹如昨之历历入目,深感怀之。

我本简达放浪之人,自由洒脱惯了,然家中琐事多使我耳塞口滞心倦神疲,高堂有绵绵导教之意,我实无革己奉命之心,即彼此折磨不若早出家门别寻他处生活。时振焕刘琦等同好吾弟华清皆在郑北,遂辞瑞东别父母登车北向。初到郑,饮食器具一无所备,投刘琦处暂住,琦兄不因我困穷而弃我,食同桌寝分榻,月余之后仍无半句拖厌之词,吾实惭愧难当。又半月得城铭电商主管之位,乃徙城东租陋室起灶台而小家始立。

匹配文件中的邮箱地址

grep -Eiorh '([[:alnum:]_.-]+@[[:alnum:]_.-]+?.[[:alpha:].]{2,6})' [filename]  | sort | uniq

正则表达式语法参考链接

使用sed获取proxy中的ip和port

proxy样本的链接地址

这里的proxy很好,但问题是list中proxy的字段顺序并不是每一行都是一致的,这样的话正则表达式不是很好写

# 样本

{"type": "https", "host": "180.210.201.57", "export_address": ["180.210.201.57"], "response_time": 11.28, "country": "SG", "anonymity": "high_anonymous", "from": "proxylist", "port": 3130}

{"country": "US", "anonymity": "high_anonymous", "export_address": ["12.162.8.175"], "host": "12.162.8.175", "response_time": 6.42, "type": "https", "port": 80, "from": "txt"}

# sed命令
# 正则匹配的$1/$2/$3/$4,自由$2和$3是我们需要的
sed -r 's/(\{.*"host":\s")([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})".*"port":\s([0-9]{2,5})(.*\})/\2:\3/g'

# grep命令
# @TODO 需要进一步完善
grep -o  -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

网站添加文章基本都是由Markdown写成的,但是由于网站针对内容的排版有专门的定制,而markdown转换以后的html中有很多我不需要的东西,因此就需要将这部分不需要的东西清理掉。

不需要的html元素

  • 去除头尾的 artile 标签
  • a链接元素
  • 元素的Class、ID、Title等属性

正则替换


# 替换所有 a 链接标签 正则
<a\s.*?</a>
# 替换所有ID / Class / Title属性
\s{0,1}(class|id|title)=".*?"

关于table 表格 转 html代码清洁化的问题

很多具有标准化产品的公司,产品信息很多时候都是存储在MS Excel表格之中,而当这些公司需要建站时,就需要将这些Excel的产品信息转化为单个网页页面放到网站上。很多人Dirty的做法是将Excel表格打开,然后将数据表格截图,以图片的方式上传到网站上。是的,很省事,但是搜索引擎是无法直接快速而准确的识别图片的内容的,对营销推广的工作不利。再者,如果客户对你的产品感兴趣,就不的不去手动打出来你产品的某个型号参数等信息,这样也给客户增加了麻烦。所以将MS Excel转HTML代码是必须要做的工作,不可图懒省事。那么问题来了,怎么做这件事?

其实转出来的最好结果是干干净净的HTML,只含有我们需要 table元素的基本标签比如table、thead、tbody、tr、td和包括colspan等基本属性的代码。至于class、id、fonts以及设计表格样式的inline css style完全是多余的,因为这些东西在我们设计网站的时候,已经预定义了。

比较简单的table我们可以用markdown来直接写,就是使用Dreamweaver或是其他可视化的HTML表格编辑工具来手动的敲一个个表格,但是如果一个表格几百行,这种效率显然是无法接受的。网上有很多EXCEL转HTML的网页工具,很多我都已经试过了,都存在各种各样的问题,比如转码之后表格布局改变了,或是误删除了空格表单。或是删不干净,最终还是留下我们很多代码中的脏东西。那么是不是还有其他方法,可以快速而高效的转换把MS EXCEL转 清洁的HTML?

答案是有的。大致的步骤:MS EXCEl 转存 htm格式,然后对 生成的代码进行替换。

这样做当然是有问题的,如果这样直接就能干,我就没有必要写下面的东西了。因为MS生成的htm格式文件的代码实在是太TM脏了,原谅我粗口,我是真的生气。MS不光加了一堆无用的格式信息,还添加了很多自定义的标签和属性,这真的是视W3C的标准不存在,对于这种没有节操又任性的公司,直接放弃,转向另外一种方式。既然魏然不支持W3C标准,那么我们就找支持W3C标准的办公软件,尤其是有表格SpreadSheet功能Office软件。你脑袋一亮,对确实有一家这样的公司,他就是Apache基金会,他除了有Apache这样享誉全球的服务器软件,还有大数据处理的系统工具Spark,当然还有我们今天的主角 Apache OpenOffice。Apache基金会维护了350+大型而健壮的软件项目,而且这一数量还在不断上升,而这些大型的软件绝大部分都是开源的,意味着他们都是免费的。So BIG DISS to MS.

以下是OpenOffice下的调整好的表格基本样式。

OpenOffice表格

直接将编辑好的表格另存为html,然后你就会惊喜的发现生成的代码非常规范和美观。

完全没有乱七八糟的东西,我们只需要删除代码中的frame、rule、border、fonts 信息就可以直接Copy到网站上了。

当然如果你对字体这块没要求的话,不删除就可以直接放到网站上。

# 正则替换 table 标签多余元素
\s{0,1}(frame|rules|border)=".*?"

# 正则替换字体信息
<font.*?>|</font>

最终的结果就是这样

完美撒花。

@TODO 后期考虑专门针对这种情况做一个小软件

工作上我需要建立一个新的adwords账户,由于账户设置的复杂性,我需要使用Google Adwords Editor来设置结构化的广告Campaign,之所以不用adwords的web界面是因为效率太低了。

然而最新版适用于Mac OSX EI Capitan 10.11的Google Adwords Editor 版本是 12.2.3, 如果你碰巧手贱跟我一样更新了他,抱歉你就再也回不去了,因为从12.2.3版本以上就不再支持EI Capitan版本,因此你需要Rollback。如果你回到Google的官网寻找历史版本,不好意思,没有相关的链接指向历史版本的下载地址。我第一次觉得Google如此脑残,历史版本不放出来,因此忍不住就在Google Adwords的Community上开帖吐槽, 最后Google内部的Adwords工程师Igor贴出了12.2.3的下载链接。如果你和我遇到了同样的问题,你可以在这里下载。

Rollback之后,遇到了另一个问题。以下Google Adwords Editor简称GADE。这个版本的GADE不支持Socks代理,仅支持http代理,而我这里的情况是https代理极不稳定,而留给我的选择就只剩下VPN。而目前市场上活着的VPN也是各种不稳定,所以我决定自己搭建VPN,最终了Wireguard解决方案。

远端的服务器环境是Debian 9 Stretch,可以按照官方文档apt-get直接安装。Wireguard主要有wireguard-dkms和wireguards-tools两个组件,而这两个组件依赖linux-header来运作,而安装当前系统内核相配套的linux-header则需要安装GCC6.0以上的版本。如果你的debian的GCC版本为4.0,而apt安装最新的gcc报了一堆依赖‘you have held broken packages.’不满足条件的错误,你需要检查一下你的distribution的具体版本。

# gcc版本4.0并且报依赖错误
# 先检查服务器版本,两个方法
# LSB - Linux Standard Base
lsb_release -da

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.5 (stretch)
Release:    9.5
Codename:   stretch

# 或是读取etc目录下的系统版本os-release配置文件

cat /etc/os-release

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/

# 这里出现依赖错误的原因是,我在更新vps的时候,误将jessie更新到了stretch,而source.list.d依然使用的是jessie版本的配置文件,自然依赖就报错了。
# 在更新了source.list和source.list.d的配置,update之后,依赖的问题解决。

# 这里贴一下stretch的Debian Official Reposity,以便以后使用
deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free

deb http://deb.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://deb.debian.org/debian-security/ stretch/updates main contrib non-free

deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free

# wireguards 是基于Linux内核的,所以依赖于linux-kernel-header 和 kernel模块。
# header 模块的正常编译和加载并不一定要求header版本和kernel版本一致,但是如果kernel header版本太老,
# 一些新的kernel header的特性就无法在编译是被应用
# 这里,我们建议将linux-kernel-header 是跟当前系统内核版本保持一致,这样就会少出问题
# 注意 uname -a 检查的只是内核的版本
# uname -r 返回结果含有内核的版本号和发行版的版本号
# 由于Linode vps的特殊性,在安装完新的kernel和header之后,你需要检查vps的profile是否是grub2引导方式
# 如果不是,需要在console页面修改,修改完之后需要在terminal界面运行 update-grub 命令来进行更新引导加载

# 安装linux header
# Debian 默认的kernel header安装目录为/usr/src

apt install linux-headers-$(uname -r)

# 安装 wireguard
apt-get install wireguard

# 注意安装和配置wireguard需要root权限

...
wireguard:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/4.9.0-3-amd64/updates/dkms/

depmod...

DKMS: install completed.

# wireguard 安装时,会根据当前的header来编译内核模块
# depmod -> 生成模块
# 编译后的内核模块位置为 /lib/modules/4.9.0-3-amd64/updates/dkms/wireguard.ko

# 检查wireguard模块是否被安装
dkms status

# 检查wireguard内核模块是否加载
# 如果没有返回任何结果,则表示模块没有被自动加载,那么wireguard就无法正常运行
lsmod | grep wireguard

# 加载激活 wireguard 内核模块
modprobe wireguard

# 配置 wireguard

# Wireguard是双向对等的VPN,这里为了方便理解,我就称公网服务器为服务端,自己的电脑为客户端

# 生成服务端公钥和私钥
# 分别会在当前目录生成 publickey 和 privatekey 文件
wg genkey | tee privatekey | wg pubkey > publickey

# 注意: 如果你不小心多次生成了密钥,而不是到当前服务端或是客户端使用的到底是哪个密钥,可以通过先启动 wireguard 服务, 使用 wg showconf 命令来打印 密钥的相关信息

# 配置/etc/wireguard/wg0.conf 文件

touch wg0.conf
vi wg0.conf

----------------------------------------------------------
[Interface]
# 服务端在VPN内网IP地址
Address = 192.168.9.1/24
# 如果动态添加客户端或是peer的信息,这里会自动保存
SaveConfig = true
# 添加流量转发的防火墙规则,如wireguard激活则转发生效,不激活则删除规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 服务端监听节点
ListenPort = (端口号)
# 服务端私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[Peer]
# 客户端的公钥,针对我的情况,就是Mac主机上生成的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端接入时,客户端在VPN内网的IP地址
AllowedIPs = 192.168.9.101/24
----------------------------------------------------------

# 更方便的方法是,不将客户端的信息写在配置文件中,采用命令的方式添加客户端信息
# 在公网服务器运行一下命令
# 由于我们设置了SaveConfig = true,因此一下命令运行后,peer信息会自动添加到wg0.conf中
wg set wg0 peer [客户端公钥] allowed-ips 192.168.9.101/24

# 激活 wireguard 服务

wg-quick up wg0

# 如果出现错误提示 resolvconf: command not found
# 则说明 resolvconf 没有安装,直接apt安装即可
# 之后重新运行命令即可激活wireguard服务,成功运行提如下
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 192.168.9.1/24 dev wg0
[#] ip link set mtu 1420 dev wg0
[#] ip link set wg0 up
[#] resolvconf -a tun.wg0 -m 0 -x

# 使用 ifconfig 命令查看wireguard的wg0网卡状态,确认一切正常

ifconfig

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 192.168.9.1  netmask 255.255.255.0  destination 192.168.9.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 为避免由于服务器启动而造成wireguard终端,可以将wireguard添加为系统启动项
systemctl enable wg-quick@wg0

> Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

# 从系统控制台启动wireguard的命令为

systemctl start wg-quick@wg0

> wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
>   Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
>   Active: active (exited) since ......

# 客户端安装 #
# 我的环境是 Mac,其他环境请参照官方文档 #

brew install wireguard-tools

# 配置wireguard客户端 #

# 新建配置文件

sudo mkdir /etc/wireguard && cd /etc/wireguard
sudo touch wg-mac.conf
sudo vi wg-mac.conf

----------------------------------------------------------
[Interface]
# 客户端生成的私钥
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 客户端在VPN内网的地址
Address = 192.168.9.101/24
DNS = 8.8.8.8

[Peer]
# 服务端的公钥
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 服务端的域名:端口或是IP:端口
Endpoint = domain.com:10311
AllowedIPs = 0.0.0.0/0
----------------------------------------------------------

# 在Mac上启动wireguard客户端和运行服务端一样,同样使用wg-quick命令
# 其中 up 后面跟的参数就是刚刚的配置文件名去掉conf后缀
sudo wg-quick up wg-mac

> Warning: `/private/etc/wireguard/wg-mac.conf' is world accessible
> [#] wireguard-go utun
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> W                                                     G
> W   This is alpha software. It will very likely not   G
> W   do what it is supposed to do, and things may go   G
> W   horribly wrong. You have been warned. Proceed     G
> W   at your own risk.                                 G
> W                                                     G
> WARNING WARNING WARNING WARNING WARNING WARNING WARNING
> INFO: (utun0) 2018/09/05 17:02:36 Starting wireguard-go version 0.0.20180613
> [+] Interface for wg-mac is utun0
> [#] wg setconf utun0 /dev/fd/63
> [#] ifconfig utun0 inet 192.168.9.101/24 192.168.9.101 alias
> [#] ifconfig utun0 up
> [#] route -q -n add -inet 0.0.0.0/1 -interface utun0
> [#] route -q -n add -inet 128.0.0.0/1 -interface utun0
> [#] route -q -n add -inet xxx.xxx.xxx.xxx -gateway 192.168.1.1
> [#] networksetup -getdnsservers Bluetooth PAN
> [#] networksetup -getdnsservers Wi-Fi
> [#] networksetup -getdnsservers Thunderbolt Bridge
> [#] networksetup -setdnsservers Thunderbolt Bridge 8.8.8.8
> [#] networksetup -setdnsservers Wi-Fi 8.8.8.8
> [#] networksetup -setdnsservers Bluetooth PAN 8.8.8.8
> [+] Backgrounding route monitor

# 关闭Wireguard
sudo wg-quick down wg-mac

# 测试链接是否正常可以使用ping
ping 192.168.9.1

# 或是通过监控流量方式来测试
 ifstat -i utun0

 > utun0
 > KB/s in  KB/s out
 >   0.00      0.14
 >   0.44      0.13
 >   0.00      0.04
 >   0.00      0.05
 >   0.00      0.04
 >   0.00      0.04
 >   0.04      0.00
 >   0.00      0.00
 >   0.00      6.70
 >   5.73      0.61
 >   5.24      0.74
 >   0.89      1.38

免费的wireguard线路

mosh因为G/F/W被封之后的 ssh 连接服务器的解决办法


ssh -o ProxyCommand='nc -x 127.0.0.1:7081 %h %p' user@domain.com

# 本地shell客户端的˙配置

# keepalive or autossh? 需要进一步测试

# 客户端针对不同主机的设置

# 针对断线的问题

# 每30秒向服务器发送在线状态提示
ServerAliveInterval 30
# 一次连续的在线状态提示发送次数,240次X30秒=7200秒=2小时
ServerAliveCountMax 240

关于netcat配合socks proxy连ssh的相关信息可以(参照链接)[https://ieevee.com/tech/2017/10/19/ssh-over-socks5.html]

关于发现rpcbind运行在底层并监听大量端口的情况

了解到当用户使用NFS系统来共享文件时,Debian发行版会默认的运行rpcbind和rpc.statd两个服务。而这不是我们所需要的,而开启的端口会降低服务器的安全性,因此需要将rpcbind服务关闭。

这里需要注意的是,rpcbind由systemctl来管理,而不是我们常用的service命令。

systemctl stop rpcbind.service
systemctl disable rpcbind.service

Chrome和Firefox针对特定的DOM对象,同样的JQ代码,执行的结果可能不一样。

例如: 针对img元素,获取元素的width、height,结果其实是不一样的。

// 获取img元素的宽度
$('img').width();

/*
 * 在chrome中获取的width是图片的可视宽度,而非图片的netural宽度(真实宽度)
 * 在firefox中获取的width是图片的真实宽度而是可视宽度
 * 以上行为的差距就使得在通过获取width来给特定dom元素定位是,
 * 不同的浏览器显示的效果就会不一致
 * 针对以上这种情况需要是用JS的原生方法来获取元素的宽度
 */

//使用querySelectAll获取dom元素,绝大部分的主流浏览器已经支持该方法
Img = document.querySelectorAll('img')[0];
//获取Img对象的可视宽度
visualWidth = Img.clientWidth;
//获取Img的真实宽度
neturalWidth = Img.naturalHeight;

/*
 * 除了以上的问题之外,firefox对js代码的执行会非常快,例如针对img图片元素绑定事件,
 * 如果不检查图片是否完全载入而直接执行代码的话,代码是无法正常运行的,
 * 这一点chrome似乎没有这个问题。
 */

//JQ监听判断图片是否完全载入

$(img).load(function(){
    // Do something.
})

Drupal Node View Mode

Drupal针对node和entity设置有不同的view mode,不同的view mode可以有不同的展示方式。

Node和entity可以根据需要添加不同的字段,而每个字段可以在manage display选项卡下进行相关的设置。

当在manage display中将字段下拉到hidden中时,前台的模板tpl文件则获取不到相关的字段信息,即被设置为hidden的字段是没有被core process的。

针对多级产品分类与产品展示的相关问题的解决办法

假如网站的层级分类如下

term1
|----term a
|----term b
term2
|----term c
term3
|----term d
|--------term (1)
|--------term (2)
|--------term (3)
|--------term (4)

由于drupal默认的分类系统采用,如果该分类下无 taged node, 则该分类taxonomy term会被显示为 no content,和实际的业务需求脱节。正常的,一个网站会有多级分类系统,分类下如果有子分类,则在上一级的父分类页面应该显示属于该分类下的子分类。比如term 3页面应该显示其下的子分类 term d, term (1), term (2), term(3), term (4)。最好的情况是term d的页面需要显示被其下子分类 taged node。

要实现这样的功能,就不得不利用到view mode和views 模块。

drupal 默认的分类展示页面是将term下的taged node依次用node.tpl.php在view mode -> teaser 下渲染出来。这种显示方式缺乏灵活性,我们将会使用views -> block来替换装这种处理方式。

具体的处理办法是:

  1. 修改node.tpl.php模板文件,删除 view mode -> teaser 下模板打印的所有内容
  2. 回到node field管理页面,在manage dispaly 选项中将 teaser 模式下的所有字段设置为hidden。
  3. 新建views - nodes list block, 标的为node field, context filter 中添加字段 has taxonomy term with depth, depth可以根据需要设置为2-5,如果分类层级比较多,则可以将depth设置的大一些。
  4. 使用hook_page_build覆写taxonomy term页面的renderable array, 使用views_embed_view将新建的views - nodes list block添加到 $page中。剩下的就是将block交给drupal的主题层渲染了。

这里需要注意的是:

  1. $page['content']['system_main']['term_heading']有些多余,应该unset
  2. 如果有的分类下没有taged node,则需要在hook_page_build中将$page['content']['system_main']['no_content'])进行unset

正版key拿走不谢,windows和mac版都可以正常激活,9.0及以上版本

Username License Key
G.N.R.S.U 327B0AA4F8-1554383598-2CFFC4975F
SoleWe.com F257BC47D3-1554383604-CC36A5946F
SoulCourier.com 2C7A3D0B2C-1554383610-5598CFD6A8
YaWego.com 5CC5DAFBCA-1554383615-89B2F1629C