0%

动态语言VS静态语言

区别这两种语言最本质的地方,我个人觉得是类型系统。

静态语言,最典型的代表应该就是java,在你的程序运行之前,编译器就可以检查你的类型有没有错误,所以java是静态语言。

而动态语言,则只有当程序运行起来了之后,才知道具体的类型。

从上可知,java是一门静态语言,但是反射的存在,就让java有了一定的动态性。

阅读全文 »

前言

不论是调试程序,还是了解一个框架,我个人觉得最好的方法就是直接上手debug,而idea强大的debug功能就为我们提供了便利,但是平时我就只会用那么几个step into这些的功能,这篇博文打算花点时间好好了解一下它的debug功能。

阅读全文 »

前言

Homebrew,作为一款Mac下非官方(但是市面上没有比它更好的工具)的包管理工具,打算专门花点时间了解一下它。

简介

官方自己给自己的定义是:

The Missing Package Manager for macOS (or Linux).

目前除了Mac,Linux上也可以通过它安装管理软件包。

优点

相信用过Linux的同学,或多或少都有这样子的经历:

  • 我忘了我当时把软件下载到哪个地方了……
  • 我想彻底删除某个软件,但是我不确定这个软件具体都安装到哪些目录下面了
  • 依赖怎么解决

当然Linux下一般都会有对应的包管理程序,比如apt之类,而macOS没有默认的包管理器,homebrew就是这么一款包管理器。

名词

homebrew使用了一些比较特别名词,导致了有一些概念反而不太好理解,但是理解了之后你会发现,其实就是一个酿酒的过程,还是很形象的。

  • brew:酿造。所以homebrew如果直译的话可以翻译成家庭自制,我个人觉得作者的意思就是自己写的一个包管理器的意思吧
  • cask:木桶。用木桶来指代Mac的桌面程序。
  • cellar:地窖。地窖当然是用来保存安装的程序的地方喽。
  • keg:桶。这里的keg应该是那种比较小的桶
  • bottle:小瓶子。预先编译好的包,直接下载使用即可,无需编译,目前大部分都是这类
  • tap:水龙头。酿酒自然是需要水源的,而水龙头就象征着“源”
  • formula:配方。安装包的描述文件

简单使用

以mysql为例,一般需要用brew进行软件管理的话,我个人是会首先进行搜索,brew search mysql,看看结果:

image-20210124192037886

可以看到,有两大类结果,分别是Formulae和Casks(对应了homebrew/core和homebrew/cask),简单来说一个是命令行工具,另外一个是图形化工具;然后brew还贴心帮你把已经安装好的打上了勾。

然后就是根据自己的需要进行安装了:brew install mysql@5.7,如果是图形化工具,则我一般还会到这个网站上去看一看,进行确认。

还有一些比较常用的功能,这里稍微总结下:

  • 安装:brew install xxx

  • 卸载:brew uninstall xxx

  • 重新安装:brew reinstall xxx

  • 显示可以升级的包:brew outdated

  • 升级某个包:brew upgrade xxx

  • 列出所有的包:brew list

  • 列出某个包的信息:brew info xxx

基本上上述的命令就可以覆盖80%的日常使用了,如果希望了解更多,可以查阅官方文档或者是brew commands

前言

作为一名java后端开发者,有一些自己常用的软件、一些小配置脚本啥的,在这里记录分享一下。

具体配置

硬件部分

开发机还是选择了Mac book pro 2018乞丐版。

屏幕由于比较贫穷,选择了创维的一款能够给Mac反向充电的显示器,当时买来900多一点,27英寸的2K屏幕,感觉还可以。有条件的话还是上4K会更加清晰。

键盘原来用的是ikbc c104的键盘,但是发现和Mac冲突严重,最明显的表现在按住某个按键之后并不像别的设备那样能够一直有输出,而是慢慢悠悠地输出,这样让人比较不爽。推荐稍微有条件的话还是使用官方的妙控键盘,狗东上面600出头可以搞定,试了下手感也还可以。

鼠标没什么好说的,自己下单买了罗技的G304无线鼠标,感觉很不错。

软件部分

首先安装新软件,我基本都是使用homebrew进行管理的,真的是macOS上不可或缺的包管理程序。

编程语言部分

java

我个人是java后端程序员,首先JDK必然是需要安装的,目前主流的JDK我安装了两个版本,分别是8和11。

由于Oracle的限制,导致了brew并不能安装对应的oracle8和11的版本,只能自己手动安装,如果要卸载的话,只需要把对应的文件删掉就可以了。与此同时,我自己使用brew安装了open jdk15的版本。

image-20210211201630630

图中还有一个1.8.281.09是我的Mac升级了big sur版本之后苹果安装了,看样子是为了Safari支持applet安装的,不去管它就行。

为了能够有效进行JDK版本切换,还顺手给搞了一个便捷地切换:

1
2
3
4
5
6
export JAVA_HOME_8=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
export JAVA_HOME_11=/Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home
export JAVA_HOME_15=/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
alias jdk8='export JAVA_HOME=$JAVA_HOME_8'
alias jdk11='export JAVA_HOME=$JAVA_HOME_11'
alias jdk15='export JAVA_HOME=$JAVA_HOME_15'
Python

Python作为现代程序员必不可少的一个脚本语言,当然也是必不可少的。

Mac上自带了Python2.7.16和Python3.7.3版本(Catalina版,如果是),其中的Python2.7现在已经过期了,当然并不推荐卸载(我自己就遇到了enum造成的pip的问题,解决方案见这里):

You should never modify or delete these, as they are Apple-controlled and are used by Apple- or third-party software.

所以我的开发机上也是同时安装了两个版本的Python,分别是Python2.7(默认)和Python3.7.3(默认),然后由于不少的东西需要依赖Python嘛,我就自己使用Homebrew还安装了对应的最新版的Python,所以一共是3个Python,当然平时基本只用最新的Python3.9

node

node我是使用brew进行安装并且进行版本管理的。

C

C语言这块很简单,Mac上面直接用xcode-select --install安装了Command Line Tools,包括了gcc,开心使用即可。

常用软件部分

几乎所有的软件都是用的Brew进行安装管理的,具体可以参考这个网站进行安装:

  • another-redis-desktop-manager:一款用来对Redis进行管理的程序
  • baidunetdisk:百度网盘
  • clashx:小猫咪能有什么坏心眼呢?
  • dropbox:文档同步
  • firefox:偶尔有时会需要第二个浏览器
  • foxmail:邮件管理程序
  • free-download-manager:下载工具
  • google-chrome:浏览器
  • hiddenbar:状态栏清理小工具
  • iina:最好用的播放器
  • iterm2:最好用的终端
  • itsycal:日历
  • mactex:专门为LaTeX准备
  • mos:单独翻转鼠标滚轮!
  • neteasemusic:网易云音乐
  • pdf-expert:浏览pdf必备神器
  • picgo:图床软件
  • qq:必备
  • qqlive:开京东会员送了一个,那就凑合用吧
  • qqmusic:也是因为有会员,那就凑合用吧
  • snipaste:好用的截图软件
  • telegram:电报必备
  • tencent-lemon:腾讯做的一款免费的清理软件,可以用来卸载啥的,方便
  • typora:唯一的Markdown编辑器
  • v2rayu:另一款翻墙软件
  • vlc:播放软件
  • xmind:思维导图软件
  • youdaonote:云笔记

下面的这些是由app store进行安装更新的:

  • 微信
  • text scaner:扫描文字,还行
  • Microsoft todo:微软官方出的一款todo软件,很好用

开发相关

  • IDE:我基本所有的IDE都是用的jetbrain家的,然后用的jet的toolbox进行管理升级
    • Java:idea
    • Python:pycharm
    • android:Android studio
    • C\C++:clion
    • database:datagrip
  • docker:必备
  • mysql@5.7:必备数据库
  • mycli:数据库终端
  • git:Mac自带
  • postman:后端调试api必备
  • sublime-text:小巧的编辑器
  • visual-studio-code:主力编辑器
  • dash:查找api
  • visualvm:调试对应jvm
  • wireshark:偶尔抓个包

Brewfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
tap "beeftornado/rmtree"
tap "homebrew/bundle"
tap "homebrew/cask"
tap "homebrew/cask-versions"
tap "homebrew/core"
tap "homebrew/services"
# Cryptography and SSL/TLS Toolkit
brew "openssl@1.1"
# Play, record, convert, and stream audio and video
brew "ffmpeg"
# User-friendly cURL replacement (command-line HTTP client)
brew "httpie"
# Mac App Store command-line interface
brew "mas"
# Java-based project management
brew "maven"
# CLI for MySQL with auto-completion and syntax highlighting
brew "mycli"
# Open source relational database management system
brew "mysql-client"
# Open source relational database management system
brew "mysql@5.7", restart_service: true
# HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server
brew "nginx"
# Port scanning utility for large networks
brew "nmap"
# Platform built on V8 to build network applications
brew "node@12"
# Learn vim commands via a game
brew "pacvim"
# Persistent key-value database, with built-in net interface
brew "redis"
# User interface to the TELNET protocol
brew "telnet"
# Terminal multiplexer
brew "tmux"
# Display directories as trees (with optional color/HTML output)
brew "tree"
# Internet file retriever
brew "wget"
# Download YouTube videos from the command-line
brew "youtube-dl"
# Fish shell like syntax highlighting for zsh
brew "zsh-syntax-highlighting"
brew "beeftornado/rmtree/brew-rmtree"
# Application launcher and productivity software
cask "alfred"
# Redis desktop manager
cask "another-redis-desktop-manager"
# Cloud storage service
cask "baidunetdisk"
# Rule-based custom proxy with GUI based on clash
cask "clashx"
# API documentation browser and code snippet manager
cask "dash"
# Teamwork app by Alibaba Group
cask "dingtalk"
# App to build and share containerized applications and microservices
cask "docker"
# Client for the Dropbox cloud storage service
cask "dropbox"
# Web browser
cask "firefox"
# Email client
cask "foxmail"
# Download accelerator and organizer
cask "free-download-manager"
# Web browser
cask "google-chrome"
# Utility to hide menu bar items
cask "hiddenbar"
# Free and open-source media player
cask "iina"
# Terminal emulator as alternative to Apple's Terminal app
cask "iterm2"
# Menu bar calendar
cask "itsycal"
# JetBrains tools manager
cask "jetbrains-toolbox"
cask "kite"
# Full TeX Live distribution with GUI applications
cask "mactex"
# Smooths scrolling and set mouse scroll directions independently
cask "mos"
# Music streaming platform
cask "neteasemusic"
# PDF reader, editor and annotator
cask "pdf-expert"
# Tool for uploading images
cask "picgo"
# Collaboration platform for API development
cask "postman"
# Peer to peer Bitorrent client
cask "qbittorrent"
# Instant messaging tool
cask "qq"
# Tencent video streaming and sharing platform
cask "qqlive"
# Chinese music streaming application
cask "qqmusic"
# Snip or pin screenshots
cask "snipaste"
# Video game digital distribution service
cask "steam"
# Text editor for code, markup and prose
cask "sublime-text"
# Messaging app with a focus on speed and security
cask "telegram"
cask "tencent-lemon"
# Cloud video conferencing
cask "tencent-meeting"
# Unpacks archive files
cask "the-unarchiver"
# VPN and WiFi proxy
cask "thunder"
# Time tracker
cask "toggl-track"
# Configurable document editor that supports Markdown
cask "typora"
# Collection of tools to build a dedicated basic communication network
cask "v2rayu"
# Open-source code editor
cask "visual-studio-code"
cask "visualvm"
# Multimedia player
cask "vlc"
# Network protocol analyzer
cask "wireshark"
# Mind mapping and brainstorming tool
cask "xmind"
# Multi-platform note application
cask "youdaonote"

多线程、高并发是现在后端开发人员绕不去的一个坎。这篇博客打算就线程池进行深入地探讨。

阅读全文 »

前言

作为java中的万类之源,很有必要了解一下这个类。Object作为万类之基,每个类都以Object作为基类,就连数组也实现了Object的所有方法。

构造器

Object类的构造器,有且仅有一个,就是一个无参构造器。

getClass

首先这个方法被声明成了final,它的作用是返回该Object的运行时的类。返回的类对象是被static synchronized方法修饰的。

真正的返回类型是Class<? extends |x|>,其中的|x|是对调用这个表达式的类型擦除的表达。

我的理解是,这个方法会返回对象的类对象,因为java一切都是对象,所以类也可以由对象来表示,这在java中就是java.lang.Class,而getClass就是用来获取Class对象的一种方法。

阅读全文 »

之前一直使用的时候我就有疑惑,尤其是where和which,既然这两个明明输出一模一样,那为什么需要两个呢?而且平时也记不住这三个到底谁是谁,基本都是一通操作之后,把三个都打一遍,然后看看有没有自己想要的输出。

首先先来用man来看看这三个命令的官方解释:

1
2
3
which - locate a command
whereis - locate the binary, source, and manual page files for a command
No manual entry for where

可以很明显看到,where它并不是一个命令,而which则是给出对应命令的所在位置,whereis还可以给出对应的源代码文件、帮助文档的所在地。

那么很显然可以想到它其实是zsh为我们提供的一个内建命令,那用type看看好了:

1
2
3
which is a shell builtin
whereis is /usr/bin/whereis
where is a shell builtin

emmmm,这似乎不太对啊,怎么连which也是一个builtin的命令了呢?切成bash再看看:

1
2
3
which is /usr/bin/which
whereis is /usr/bin/whereis
bash: type: where: not found

果然从bash的角度,确实很清楚没问题,就两个命令。而zsh则是把which变成了内置的命令。

那么,zsh为什么要这么做呢?这主要是因为如果使用了系统自带的这个which命令,那么就无法显示一些shell自带的命令了,但是如果把which设置成shell自带的命令,那么就有对应的权限来访问shell的一些东西了。

总结:

  • 如果只是希望知道命令的具体位置,请使用which
  • 如果还想知道命令的源文件的位置,使用whereis
  • zsh特意把which改成了内置的,因为它希望which能做到更多的事情。