Mac操作系统下一些开发经验分享

目录

  • 前言
  • 在本地环境中使用Nginx
  • 添加信任HTTPS证书
  • 查看本地开启的tcp端口
  • 测试远程端口是否正常提供服务
  • 查看NetBIOS注册信息
  • 加速你的代码编辑速度
  • 显示文件的详细修改时间
  • node.js安装
    • npm安装全局包总是失败
  • 使用多个SSH密钥
  • IntelliJ IDEA启动Java时的告警
  • IntelliJ打开properties文件中文显示为\uXXXX的unicode编码问题
  • IntelliJ打开Javadoc自动显示
  • 一些好用的IntelliJ插件
    • .ignore
    • Maven Helper
    • iBatis/MyBatis mini-plugin
    • Alibaba Java Coding Guidelines
    • GenerateSerialVersionUID
    • IDEA Mind Map
    • Mac系统下完整卸载Jetbrains产品的方法

本文出处: http://blog.csdn.net/chaijunkun/article/details/89521012,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

前言

mac是生产力工具!
由于保密需要,一些涉及到敏感信息的内容进行了脱敏处理。

在本地环境中使用Nginx

长期开发web项目就会发现,无论是tomcat还是jetty插件,默认使用的端口都是8080,本地测试的时候,如果不加以配置,在域名后需要经常挂上端口号(例如:http://test.foo.com:8080),在Windows下可以直接使用80端口,然而在类unix系统中,80端口需要root权限启动。为了方便调试,我们可以在本地启动一个Nginx,不指定域名,将所有80、443端口都upstream到本地的8080端口。这样只需要在开发工具中直接启动8080,就可以开始调试了,非常方便。

下面是Nginx的常用编译命令(使用普通账户运行即可):

./configure --prefix=/usr/local/nginx --with-pcre=/Users/chaijunkun/Downloads/pcre-8.40 --with-openssl=/Users/chaijunkun/Downloads/openssl-1.1.0f --with-http_ssl_module --with-http_v2_module

在编译Nginx之前需要下载pcre(官网:http://www.pcre.org/)和openssl(官网:https://www.openssl.org/),解压之后不需要分别对它们编译,只需要在上面的命令中指定源码路径即可。

2019年6月12日补充:如果你像我一样,是全栈重度开发者(不仅限于页面和后端业务开发),例如还需要开发一些基于OpenResty的功能(限流、API网关等),我也建议您使用OpenResty中自带的Nginx组件来代替原生的Nginx。下面是一个OpenResty的编译配置命令示例:

./configure --prefix=/usr/local/openresty --with-pcre=/Users/chaijunkun/Downloads/pcre-8.43 --with-pcre-jit --with-openssl=/Users/chaijunkun/Downloads/openssl-1.1.1c --with-http_ssl_module --with-http_v2_module --with-ipv6 --with-http_iconv_module --with-http_stub_status_module -j8

生成编译配置文件之后运行:

make

然后将编译好的Nginx进行安装:

sudo make install

修改配置文件nginx.conf

#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
 
events {
    worker_connections 1024;
}
 
http {
    include mime.types;
    default_type application/octet-stream;
     
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
     
    #access_log logs/access.log main;
     
    sendfile on;
    #tcp_nopush on;
     
    #keepalive_timeout 0;
    keepalive_timeout65;
     
    #gzip on;
     
    include vhost/upstream/*.conf;
    include vhost/*.conf;
}

然后相关的各种本地虚拟主机都可以放到conf目录下的vhost目录中,并且文件名以conf为扩展名。例如在调试管理后台时:
反向代理负载定义文件:upstream/local_admin_test.conf 的配置内容为:

upstream local_admin_test {
        server 127.0.0.1:8080;
}

反向代理服务定义文件:test.foo.com.conf 的配置内容为:

server {
        listen       80;
        server_name test.foo.com;
        charset utf-8;
        access_log  logs/host.access.log  main;

        location ^~ / {
                proxy_pass http://local_admin_test;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }
        location ^~ /review {
                proxy_pass http://test_upstream;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }

        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   html;
        }
}

在大型系统中,往往不同的模块采用不同的工程。而该系统可能共用一个测试域名(可能是非公网域名,通过配host访问,例如:http://test.foo.com/moduleA和http://test.foo.com/moduleB),如果不使用上述方式,将域名test.foo.com配置了本地(127.0.0.1),本地开发moduleB时,其他模块本地没有启动,则无法同时使用。通过Nginx,可以将不关注的模块请求转发到已有的测试环境中。

另外,如果有https的访问需求,本地还可以将所有的SSL请求进行监听,转发到本地的80,达到一劳永逸:
文件:default_ssl.conf 的配置内容为:

# HTTPS server
# 
server {
        listen       443 ssl;
        ssl_certificate      /usr/local/nginx/conf/tls/mysite.crt;
        ssl_certificate_key  /usr/local/nginx/conf/tls/mysite.key;

        #ssl_session_cache    shared:SSL:1m;
        #ssl_session_timeout  5m;

        #ssl_ciphers  HIGH:!aNULL:!MD5;
        #ssl_prefer_server_ciphers  on;

        location ^~ / {
                proxy_pass http://127.0.0.1:80;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
        }
}

这里的SSL配置没有指定server_name,作为默认,将请求直接反向代理到80,由具体的虚拟主机配置来进行具体解析。

添加信任HTTPS证书

有一些测试服务器使用的是赛门铁克证书。Chrome浏览器从V70开始认为该公司颁发的部分证书不安全(原因是因为该公司曾经丢失过根证书),导致HTTPS页面提示安全警告,无法打开。另外各种自签名的证书也会出现该问题。将这些不受信任的证书(前提是自己已确认安全)添加为信任即可解决该问题。

用浏览器打开目标HTTPS的页面(例如:https://test.foo.com)。网址左侧会提示不安全警告。点击该警告,弹出菜单,点击“证书”按钮,如下图所示:
Mac操作系统下一些开发经验分享_第1张图片
弹出证书详情:
Mac操作系统下一些开发经验分享_第2张图片
如果此时你的浏览器处于全屏模式,请退出全屏,并打开Finder到一个目录。然后用鼠标拖动上图中的“证书”大图标到Finder中的目录。即可生成一个名为:证书名称+".crt"的证书文件。

打开macOS的Launchpad,找到钥匙串访问(Keychain Access)工具,向其中导入项目,选择刚刚的证书文件。注意导入后双击钥匙串工具中的此密钥,然后在详情第一段“信任”左侧的三角符号展开,然后选择“总是信任”。

Mac操作系统下一些开发经验分享_第3张图片
关闭窗口后会提示输入管理员用户或指纹。此时重新打开浏览器即可正常访问该网站。

2019年5月7日补充:关于如何生成多域名自签名证书的方法请参见:https://www.rpkamp.com/2014/08/25/setting-up-a-multi-domain-self-signed-ssl-certificate/

查看本地开启的tcp端口

在某些时候需要通过端口号查找进程,也可能需要通过进程查找开放了哪些端口,MacOS在使用netstat命令时和Linux不太一样,可以使用下面的命令列出:

netstat -anv -ptcp

以下是返回内容的示例:

Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)     rhiwat shiwat    pid   epid
tcp4       0      0  10.169.45.132.54640    64.233.189.100.443     SYN_SENT    131072 131072  32432      0
tcp4       0      0  10.169.45.132.54639    64.233.189.100.443     SYN_SENT    131072 131072  32432      0
tcp4       0      0  10.169.45.132.54489    64.233.188.188.5228    SYN_SENT    131072 131072  32432      0
tcp4       0      0  10.169.45.132.54484    64.233.188.188.5228    SYN_SENT    131072 131072  32432      0
tcp4       0      0  10.169.45.132.54160    198.252.206.25.443     ESTABLISHED 131072 131904  32432      0
tcp4       0      0  10.169.45.132.54156    104.76.18.12.443       ESTABLISHED 131475 131904  32432      0
tcp4       0      0  10.169.45.132.54154    104.16.112.18.443      ESTABLISHED 262144 131670  32432      0
tcp4       0      0  10.169.45.132.54152    104.76.12.30.443       ESTABLISHED 131072 131072  32432      0
tcp4       0      0  10.169.45.132.54150    192.0.73.2.443         ESTABLISHED 262144 131670  32432      0
tcp4       0      0  10.169.45.132.54145    151.101.193.69.443     ESTABLISHED 131072 131904  32432      0
tcp4       0      0  10.169.45.132.54140    216.58.200.234.443     ESTABLISHED 131072 132104  32432      0
tcp4       0      0  10.169.45.132.53977    54.225.153.141.443     ESTABLISHED 131072 131072  13725      0
tcp4       0      0  10.169.45.132.53796    123.126.122.40.80      ESTABLISHED 262144 131670  37326      0
tcp4       0      0  10.169.45.132.53795    111.161.111.112.80     ESTABLISHED 131072 131904  37326      0
tcp4       0      0  10.169.45.132.53064    10.168.0.182.80        ESTABLISHED 262144 131670  32432      0
tcp4       0      0  10.169.45.132.52647    52.207.13.219.443      ESTABLISHED 131072 131904  13722      0
tcp4       0      0  10.169.45.132.49753    10.20.3.137.443        ESTABLISHED 262144 131670  29429      0
tcp4       0      0  10.169.45.132.63907    220.249.243.161.443    ESTABLISHED 131072 131904  32432      0
tcp4       0      0  *.443                  *.*                    LISTEN      131072 131072  78596      0
tcp4       0      0  *.80                   *.*                    LISTEN      131072 131072  78596      0
tcp4       0      0  10.169.45.132.60843    10.168.66.177.20880    ESTABLISHED 131072 131904  45451      0

再结合grep命令和ps -ef命令来筛选相关进程和端口即可

测试远程端口是否正常提供服务

本身该功能可以通过telnet命令来实现,但是在macOS High Sierra(10.13.1及其以后版本)将telnet命令删除了(@see https://forums.developer.apple.com/thread/79056),在不下载安装telnet命令的前提下,可以使用nc命令。

假如查看baidu.com对应主机的80端口是否打开(当然是肯定打开的),执行

nc -v -w 10 -z [host] [port]

例如:

nc -v -w 10 -z baidu.com 80

如果看到以下返回的内容,则表示端口正常打开并对外提供服务:

found 0 associations
found 1 connections:
     1:	flags=82
	outif en0
	src 10.168.136.103 port 52927
	dst 220.181.57.216 port 80
	rank info not available
	TCP aux info available

Connection to baidu.com port 80 [tcp/http] succeeded!

如果看到明确的驳回信息,或者连接之后没反应,可以输入任何字符,则表示有可能端口无法访问:

localhost:~ chaijunkun$ nc -v -w 10 -z 119.188.2.119 8888
nc: connectx to 119.188.2.119 port 8888 (tcp) failed: Connection refused
 
 
localhost:~ chaijunkun$ nc -v -w 10 -z 47.104.143.44 6379
 
 
 
^C

查看NetBIOS注册信息

在开发过程中,可能会遇到Dubbo接口开启冲突的情况(测试环境实例A和别人的调试实例B使用的group都一样,导致接口调用请求被分配到了B实例),此时可能需要找到相关的人,把实例关掉。但是怎么通过IP知道是谁的机器呢?

以前,公司配发的PC机主机名都是对应员工的OA前缀,后来杀毒软件部署之后都是公司“办公地点缩写+员工工号”。MacOS的机器虽然有主机名规范,但大都没执行。不过还是能通过主机名查找到蛛丝马迹。

Windos系统中可以执行如下命令:

nbtstat -a [IP]

例如:

C:\Users\Administrator>nbtstat -a 10.169.2.59
本地连接:
节点 IP 址址: [10.169.2.59] 范围 ID: []
           NetBIOS 远程计算机名称表
       名称               类型         状态
    ---------------------------------------------
    TT9527         <00>  唯一        已注册
    WORKGROUP      <00>  组          已注册
    MAC 地址 = B0-83-FE-AD-4D-6C

从中可以看出,IP:10.169.2.59对应的主机名为TT9527

Mac系统中对应的命令为:

smbutil status [IP]

例如:

my-macbook-pro:~ chaijunkun$ smbutil status 10.169.2.59
Using IP address of 10.169.2.59: 10.169.2.59
Workgroup: WORKGROUP
Server: TT9527

加速你的代码编辑速度

很多时候我们编辑代码时需要选中一个单词,或者将光标快速移动到行首或行尾,使用一下快捷键即可:

移动到行首:command + 光标左移

移动到行尾:command + 光标右移

选中一行:command +光标左移,定位到行首之后,shift + command + 光标右移。其实是上面两个快捷键的组合,只不过shift起到标记选择的作用

移动到词首:option + command + 光标左移

移动到词尾:option + command + 光标右移

选中一个单词:与选中一行道理一样,先option + command + 光标左移,然后再按住shift之后option + command + 光标右移

显示文件的详细修改时间

一般情况下,执行ls命令显示的文件创建和修改时间是精确到分钟的,执行如下命令即可精确到秒:

ls -lT

结果如下:

drwx------@  4 chaijunkun  staff     136  5 18 17:20:02 2017 Applications
drwx------@  4 chaijunkun  staff     136  6  7 10:18:56 2017 Desktop
drwx------@ 22 chaijunkun  staff     748  6 19 17:37:48 2017 Documents
drwx------+ 17 chaijunkun  staff     578  6 19 19:27:55 2017 Downloads
drwx------@ 67 chaijunkun  staff    2278  5 26 10:43:32 2017 Library
drwxr-xr-x   2 chaijunkun  staff      68  5 27 11:40:27 2017 MacKeeper Backups
drwx------+  3 chaijunkun  staff     102  5 18 16:21:50 2017 Movies
drwx------+  5 chaijunkun  staff     170  6  6 14:12:55 2017 Music
drwx------+  3 chaijunkun  staff     102  5 18 16:21:50 2017 Pictures

node.js安装

官方提供了Mac版的pkg installer,如果希望系统保持清洁,可以下载压缩包自己安装:https://nodejs.org/en/download/ ,可以直接解压到类似这样的目录下:/usr/local/node-v6.11.0-darwin-x64,用vi或者vim打开/etc/profile文件,设置环境变量:

export NODE_PATH=/usr/local/node-v6.11.0-darwin-x64

然后将$NODE_PATH/bin目录添加到PATH中即可。

为了加速依赖包安装,请使用淘宝镜像仓库:

npm config set registry https://registry.npm.taobao.org

npm安装全局包总是失败

如果你在安装其他包时总是提示:unable to verify the first certificate,请将严格ssl验证关闭:

npm config set strict-ssl false

如果全局包在安装时总是提示如下信息:

Unhandled rejection Error: EISDIR: illegal operation on a directory, open '/var/root/.npm/_cacache/tmp'

其中,后面的目录也有可能是你当前登录的用户所在的home目录。那么这个问题其实是权限问题导致的。原因是曾经使用过sudo来安装全局包,然后超级用户在写入缓存文件时就把目录的访问权限改了,后续再用普通用户访问时就会没有权限,造成无法打开。

解决办法是分别切换到到超级用户和当前登录用户,分别执行如下命令即可:

sudo chown -R $(whoami) ~/.npm

使用多个SSH密钥

SSH登录的原理是使用非对称密钥来代替密码验证。密钥分为公钥和私钥(利用私钥文件可以提取出对应的公钥文件:ssh-keygen -y -f [privateKeyFile])

假设自己的机器A需要免密码登录到机器B,从而操作机器B,那么私钥文件需要存储在机器A中,公钥文件需要放入机器B中。

往往自己的机器只使用自己的账户,但是需要连接多台服务器,并希望连接的时候都不用密码。那么如何操作呢:

首先假设有如下密钥对已经存在于自己的~/.ssh目录中:

my-macbook-pro:.ssh chaijunkun$ ls -l
total 64
-rw-------  1 chaijunkun  staff  1679  7 13 08:29 csdn.rsa
-rw-r--r--  1 chaijunkun  staff   403  7 13 08:29 csdn.rsa.pub
-rw-------  1 chaijunkun  staff  1675  7 13 08:29 git_key.rsa
-rw-r--r--  1 chaijunkun  staff   408  7 13 08:29 git_key.rsa.pub
-rw-------  1 chaijunkun  staff  1675  7 13 08:29 github.rsa
-rw-r--r--  1 chaijunkun  staff   404  7 13 08:29 github.rsa.pub

上述文件中以.pub结尾的都是公钥文件,首先需要让ssh知道登录一个具体的远程服务器时应该使用什么账户以及该使用哪个私钥,因此需要在~/.ssh目录中增加一个名为:config(文件权限代码:600)的文件:

Host csdn_git
        HostName code.csdn.net
        User bob
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/csdn.rsa
Host github_git
        HostName github.com
        User bob
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/github.rsa
Host company_git
        HostName git.mycompany.com
        User bob
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/git_key.rsa

对于每一台服务器都需要做如下的配置:

Host:这个可以随意起名字,只是为了便于理解而已;

HostName:真正的远程服务器的域名或IP地址;

User:指登录远程服务器时使用的用户名;

PreferredAuthentication:优先使用的鉴权方式,这里填写固定的public(即:使用公钥鉴权);

IdentityFile:既然选择了公钥方式鉴权,则需要指定本地连接到远程时使用的对应私钥文件,所以在这里设置对应的私钥文件完整文件名即可。

注意:在上面的配置文件中Host对应下面的配置项有缩进,这个缩进使用tab或者空格都可以,没有具体要求。

配置好之后保存。然后需要将这些私钥文件加入到ssh-agent的高速缓存中(如果不添加很有可能仍然连不上远程服务器):

my-macbook-pro:.ssh chaijunkun$ ssh-add csdn.rsa
Identity added: github.rsa (csdn.rsa)
my-macbook-pro:.ssh chaijunkun$ ssh-add github.rsa
Identity added: github.rsa (github.rsa)
my-macbook-pro:.ssh chaijunkun$ ssh-add git_key.rsa
Identity added: github.rsa (git_key.rsa)

注意:在macOS 10.12.2之后,好像ssh-agent的运行机制改了,每次重启之后必须再次执行ssh-add将每一个私钥加入到高速缓存中才能继续免密钥登录,这个问题一直没有找到很好的解决办法,目前解决办法是将这些命令加入到~/.bash_profile中:

#add all known private keys to ssh-agent
ssh-add ~/.ssh/csdn.rsa &> /dev/null
ssh-add ~/.ssh/git_key.rsa &> /dev/null
ssh-add ~/.ssh/github.rsa &> /dev/null

如果你在执行ssh-add命令时发现提示如下错误:

Could not open a connection to your authentication agent.

则先需要执行如下命令,来指定SSH代理:

ssh-agent bash

IntelliJ IDEA启动Java时的告警

在Mac中运行IntelliJ Idea启动Java项目,无论调试还是直接运行,可能都在第一行显示出这样一个告警信息:

objc[27458]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/bin/java (0x1038284c0) and /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1038ae4e0). One of the two will be used. Which one is undefined.

虽然不影响使用,但还是可以关闭这样一个告警的。在主菜单中找到Help->Edit Custom Properties选项。增加如下配置,重新启动IntelliJ Idea即可:

idea.no.launcher=true

后来升级到新版IntelliJ IDEA的时候,发现这个方法不管用了。查阅资料,说这个问题在1.7后续Update 210版本(也可能是再早一点点的更新版本)解决了。不过有1.7的免费更新截止到Update 80,只有付费账号才能下载后续更新,因此,解决该问题的办法就是最好升级到1.8。虽然1.8早期的版本也有该问题,但目前的版本已经将此问题解决。其实这个问题也不用纠结,反正也不影响使用,习惯就好。

IntelliJ打开properties文件中文显示为\uXXXX的unicode编码问题

properties文件在配置时经常会在备注里使用中文进行说明,在eclipse中如果装过properties editor会自动将中文转换成unicode方式写入文件。此时如果IntelliJ直接打开该文件则会显示为\uXXXX这样的字符,此时需要修改预置信息:

Editor --> File Encodings,在右侧下方有个区域,专门设置Properties Files(*.properties)的区域,此时需要将”Transparent native-to-ascii conversion“选项勾选,如下图所示:
Mac操作系统下一些开发经验分享_第4张图片

IntelliJ打开Javadoc自动显示

和Eclipse不同,IntelliJ默认是没有打开Javadoc自动显示的。在IntelliJ的Settings中,找到“Editor > General”,在界面右侧拖动到最后,“Other”区域中勾选“show quick documentation on mouse move”。“Tooltip delay”默认为500毫秒,鼠标悬停时间大于该值后显示Javadoc。可以根据个人习惯把这个值改小一点。

一些好用的IntelliJ插件

.ignore

该插件是为了配合git生成忽略配置文件的。其中有一些模板可供选择。大大简化.gitignore文件配置的过程。

Maven Helper

IDE中针对Maven的pom.xml配置文件依赖关系分析功能比较弱。此插件可以增强依赖关系分析,具有显示包依赖版本,冲突位置,快速转到定义位置等功能。

iBatis/MyBatis mini-plugin

在项目中如果使用了iBatis或MyBatis框架,会经常需要通过DAO层找相应的Mapper定义,或者通过Mapper来找对应的DAO定义,如果通过手工查找费时费力,该插件可以自动解析,像点击链接一样快速定位。

Alibaba Java Coding Guidelines

该插件能够帮助开发者检查代码规范性。当代码不满足《阿里巴巴Java开发手册》中所描述的规范时,插件会在IDE中以多种方式进行提示,开发者可根据提示中的描述进行合规修改,从而维护代码的简洁高效性。

GenerateSerialVersionUID

这个插件可以很方便地为实现Serializable接口的类生成servialVerionUID常量定义代码。

IDEA Mind Map

生成思维导图的免费插件,可以支持插入图片,导入其他格式的现有导图。适用于所有基于IntelliJ的IDE产品。

Mac系统下完整卸载Jetbrains产品的方法

有时当新版本的IDE发布后,需要将旧版本删除。这样安装会比较干净。然而Mac系统中的App不仅仅存放在/Application目录中,还会在其他地方创建预置、缓存和日志。需要清理的目录详情请参阅:
https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs

你可能感兴趣的:(开发技巧,杂谈,研究成果)