利他才能利己


  • 首页

  • 标签

  • 归档

  • 搜索

Ruby on Rails: RubyGems

发表于 2022-03-16 | 分类于 Ruby-on-Rails |

简介

RubyGems is a package management framework for Ruby,RubyGems 是 Ruby 程序包管理器(工具)。很多编程语言或者平台都有自己的包管理工具,如 Rust 的 cargo、RedHat 的 RPM,Ubuntu 的 apt-get 等等。RubyGems 简称 gems,使用它可以方便地下载安装 Ruby 的软件包到自己的系统或者 Ruby 工程中,一个软件包称之为 gem。

为了更好的使用各种轮子(gem),在 rubygems 可以找到很多已经用 ruby 写好的框架(或者称之为 lib),我们直接复用即可,另外自己也可以开发一些 ruby 库放到 gems 中供其他人享用。

文中提到的 gems 和 RubyGems 都表示是同一个意思。

安装 RubyGems

如果你使用的是 macOS,系统已经自带来 ruby 和 对应的 RubyGems,不需要单独安装。详细情况可以参考 Ruby 开发环境搭建 这篇文章。

如果你想独立安装 RubyGems,可以去 RubyGems 官网 下载安装即可。

安装完成之后,可以通过 gem 命令查看 gems 版本。

1
2
3
gem --version

3.1.4

RubyGems 源

使用 gems 下载每个 gem,默认使用的下载地址是 https://rubygems.org/,即对应的包地址在国外,速度较慢甚至会出现下载失败的情况。为了解决这个问题,Ruby 中国 提供了国内下载 gem 的通道,速度较快,源更新也比较及时。

1
2
# 查看 gems 源
gem sources -l

可以通过 gem 命令更改 gems 源。

1
2
3
gem sources -remove https://rubygems.org/

gem sources --add https://gems.ruby-china.com/

上面两条命令等同于下面。

1
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/

我们也可以查看本地的文件确定是否已经更新源

1
2
3
4
5
6
7
8
9
10
cat ~/.gemrc 

---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://gems.ruby-china.com/
:update_sources: true
:verbose: true
:concurrent_downloads: 8

更新源缓存

1
gem sources -u

更多关于 gem sources 的命令,可以查看帮助

1
gem help sources

也可以使用清华大学提供的源:https://mirrors.tuna.tsinghua.edu.cn/rubygems/,好人一生平安。

常用的 gem 命令

下面主要以 rails 这个 gem 来举例

search

根据 RubyGem的指南,使用search 可以搜索任何 gem。

1
gem search rails --all

确切的搜索使用:

1
gem search '^rails$' --all

包括预发布版本使用 --pre

1
gem search '^rails$' --pre

从本地和远程服务器上查找含有rails字符串的包

1
gem search rails --both 

只从远程服务器上查找含有log字符串的包

1
gem search rails --remoter 

只从远程服务器上查找含有log字符串的包

1
gem search -r rails 

(un)install

安装最新版 rails

1
gem install rails

安装指定版本 rails

1
gem install rails --version 6.1.5

卸载 rails

1
gem uninstall rails

卸载指定版本的 rails

1
gem uninstall rails -v 6.1.5

list

查看本地安装了哪些 gem

1
gem list -l

查看本地安装了哪些版本的 rails

1
gem list '^rails$' -l

update

1
2
3
4
5
6
7
8
#更新所有包
gem update

#更新指定包
gem update rails

#更新RubyGems软件自身
gem update --system

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查找本地含有数字的包
gem query -n ''[0-9]'' --local

#把rake.gemspec编译成rake.gem
gem build rake.gemspec

#检测rake是否有效
gem check -v pkg/rake-0.4.0.gem

#清除所有包旧版本,保留最新版本
gem cleanup

#显示rake包中所包含的文件
gem contents rails

#列出与rails相互依赖的包
gem dependency rails -v 6.1.5

#查看gem的环境
gem environment

参考文档

  • rubygems 学习手册:https://guides.rubygems.org/rubygems-basics/
  • ruby-china:https://gems.ruby-china.com/

任何小事都不能忽视,否则可能就会出大事

Ruby on Rails: 常用的开发工具

发表于 2022-03-15 | 分类于 Ruby-on-Rails |

简介

好的工具能让开发效率事半功倍,我把自己常用的工具介绍给大家,后续会持续更新。

如果你想使用 ruby 可以参考 Ruby 开发环境搭建。

常用网站

  • Ruby 手册:ruby-doc,可以查询不同 ruby 版本的文档
  • Ruby API 手册: rubyapi
  • Gem 国内镜像:gems.ruby-china
  • Ruby on Rails 官网:https://rubyonrails.org/
  • 查看 Rails 所有版本:rail release
  • Ruby on Rails5.1 指南
  • Ruby on Rails7 指南
  • Rails API

常用工具

静态分析

  • rubocop

gem install rubocop

1
2
3
4
5
6
cd ruby-work-dir

rubocop

# 检查指定的文件
rubocop xxx.rb

代码格式化

  • rufo

gem install rubocop

1
2
3
4
5
6
cd ruby-work-dir

rufo .

# 格式化指定的文件
rufo xxx.rb

此工具也会做一些语法检测的工作。

代码规范

  • ruby 代码规范:ruby-style-guide

  • rails 代码规范:rails-style-guide

开发 IDE

推荐使用 Visual Studio Code。

安装插件,在 VSCode 中搜索安装即可。

  • Ruby;

  • Rails on Rails;

  • Ruby Solargraph,功能比较强大。代码提示、方法文档提示等;

    需要电脑上安装 solargraph

1
gem install solargraph

image-20220316185104895

如果大家有足够的 Money,可以考虑购买 RubyMine,不过建议刚入门的同学还是先从 irb (ruby 自带的命令行交互工具,终端打开使用即可)或者 VSCode 开始。


本是后山人,偶做前堂客;醉舞经阁半卷书,坐井说天阔。

Ruby on Rails: 环境搭建

发表于 2022-03-14 | 分类于 Ruby-on-Rails |

简介

我的电脑以及自带 Ruby 环境如下。

1、系统版本:macOS Monterey 12.2.1

2、自带 ruby 版本:ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.x86_64-darwin21],其二进制文件在 /usr/bin/ruby 下。

3、自带 gem 版本:3.1.6

自带的 ruby 版本无法支持 rails 7.x 的版本(可以查看 Rails 要求的 Ruby 版本),我需要使用 rvm 对 ruby 版本进行控制,下面重点记录一下安装步骤和过程。

安装 Homebrew

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

可以参考 官网 最新的安装方式。

使用 brew 安装 git、curl 工具,安装过程中提示缺少就老老实实的安装啥就好了。

安装 RubyGems

简称为 gem 工具,macOS 会自带该工具不需要单独安装,如果没有可以使用 brew 安装。

1
2
3
> brew search gem
> If you meant "gem" specifically:
macOS provides gem as part of Ruby.

也可以去 官网 下载安装。

安装 rvm

参考:https://rvm.io/

如果是 Ubuntu,可以参考 https://github.com/rvm/ubuntu_rvm;

安装 gpg2

1
brew install gpg2 

如果安装不成功,可以安装 gpg

1
brew install gpg 

然后接着在终端执行

1
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

或者使用 gpg

1
gpg --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

最后执行

1
\curl -sSL https://get.rvm.io | bash -s stable

在 ~/.bash_profile 中添加环境变量,记得下面这个一定要添加在文件的最后,否则每次启动命令行都需要设置一下默认的 ruby 版本。

1
2
# rvm
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

保存后在终端执行

1
2
3
source ~/.bash_profile 

source ~/.zshrc

安装 bundler

1
sudo gem install bundler

安装 ruby

1
2
3
4
5
6
7
8
9
10
11
12
1、brew update

2、rvm get master

# 指定安装版本
3、rvm install 2.7.5

# 查看已经安装的ruby
4、rvm list

# 使用默认的版本
5、rvm use ruby-2.7.5 --default

安装 rails

1
2
# 默认安装最新版本
sudo gem install rails

安装成功后,可以查看一下安装的版本

1
2
3
rails -v
# 我安装后的 rails 版本是 7.0.2.3
Rails 7.0.2.3

创建项目

1
rails new weibo --skip-bundle

其中 weibo 是项目名称,参数 --skip-bundle 可以跳过依赖库的安装,这样创建工程很快。

打开工程 weibo 下面的 Gemfile 文件,修改源地址即使用 https://gems.ruby-china.com,注意原来的 taobao 源已经停止更新了,全部放到了 ruby-china 上了。

1
2
#source "https://rubygems.org"
source "https://gems.ruby-china.com"

你在使用 source 遇到了问题,可以在 https://gems.ruby-china.com/ 上面查找答案。

1
bundle install

执行完成后,启动服务

1
rails server

打开 http://127.0.0.1:3000 可以看到默认首页。


得先从自己身上找问题

Hexo+GithubPages 404

发表于 2022-03-06 | 分类于 Tools |

简介

继上次 2018,我又来了 中说 Hexo 数据丢失已有几个年头了,手中的那台笔记本见证了我头发稀疏的过程,它已经到了退休的年龄,运行速度已经无法匹配我的手速了。于是我省吃俭用换了一台电脑。我最先迁移的就是 Hexo,因为它太简单好用了实在是爱不释手。万万没想到一个 404 折腾了我几天几夜,几乎让我崩溃,还好最终解决了,不然我真的要去住院治疗了。

诸多方案

或许使用 Hexo 搭建个人网站的朋友见过下面这张图

出现这种 404 有如下几种情况,不知道你是哪一种,听我一一道来。

1、github 仓库名称不匹配

我们都知道,想要部署自己的 github.io,需要在 github 上面创建仓库。

在 github 上面创建的仓库名称没有使用自己的 github 账号名称,例如你的 github 账号名称是 zhanghao,而你创建的仓库名称是 suibian.github.io,这样你确实是无法访问你的博客网站的。

2、配置文件错误

在你的本地博客目录下(我创建的名称是 hexo,注意不是 themes 主题目录下的那个配置文件),有个配置文件 _config.yml,里面内容是这样的:

1
2
3
4
# Deployment
## Docs: https://hexo.io/docs/deployment.html
#deploy: git@github.com:zhanghao/zhanghao.github.io.git
#type: git

需要修改一下

1
2
3
4
5
deploy:
type: git
repo: git@github.com:zhanghao/zhanghao.github.io.git
#branch: [master]
#message: [message]

特别要注意 repo 和 git 后面要有空格。

3、分支错误

现在在 github 上面创建 repo,默认分支名称是 main 而不是 master。

所以,你本地 Hexo 提交(hexo d 命令)的默认是去了 master 分支,这样访问也是没有内容的。可以在 github 上面把你的 zhanghao.github.io 仓库默认分支改为 master,当然还可以修改 Hexo 的配置来改变分支为 main,我没有试过就不误人子弟了。

4、hexo 依赖不全

我在 hexo 目录下,检查了一下,发现该安装的插件已经很齐全了,毕竟我是把 package.json 复制过来的,一个 npm install 妥妥完事。

检查依赖安装是否有不全的情况,可以使用 npm list 命令

1
npm list --depth 0

如果检查有问题,会在控制台提示类似 npm ERR! missing xxxxx。

5、域名解析错误

或许你配置了自己的域名,在阿里云或者腾讯云上面购买了自己的域名也配置了对应的 DNS 解析,但就是 404,你说气人不?!

关于在云上配置 CNAME,我就不多讲了,这里一定要在配置的时候检查一下你的 zhanghao.github.io IP,然后再去配置 A 记录。

1
2
3
4
5
ping zhanghao.github.io

PING veryitman.github.io (185.199.108.153): 56 data bytes
64 bytes from 185.199.108.153: icmp_seq=0 ttl=43 time=78.002 ms
64 bytes from 185.199.108.153: icmp_seq=1 ttl=43 time=119.590 ms

其中,185.199.108.153 就是 github.io 的 IP。

6、仓库中 CNAME 为空

这种错误,可以在 source 目录下创建一个 CNAME 文件,填写你的域名即可。

1
2
3
4
5
cd hexo/source 

touch CNAME

vim CNAME

例如我的 CNAME 文件内容是

1
zhanghao.com

保存完成后,执行

1
2
3
hexo clean
hexo g
hexo d

我的问题

很遗憾的告诉你,我遇到的问题上面 6 种情况都不是。

而是我的 node 版本太高了(17.x),我用的 hexo 版本是 4.2.1。

官方给出了对应的兼容版本要求,如下表所示:

Hexo 版本 最低兼容 Node.js 版本
6.0+ 12.13.0
5.0+ 10.13.0
4.1 - 4.2 8.10
4.0 8.6
3.3 - 3.9 6.9
3.2 - 3.3 0.12
3.0 - 3.1 0.10 or iojs
0.0.1 - 2.8 0.10

后面我卸载了 node,重新安装了 node 12,一顿操作。

1
2
3
4
5
6
7
brew install node@12

hexo clean

hexo g

hexo d

再次打开自己的网站,一切都正常了,喜出望外。

当你痴迷一件事情的时候,连做梦都会帮你思考解决方案。


老天的事儿管不了,把自己的事情做好就好。

SSH问题汇集笔记

发表于 2022-03-05 | 分类于 Tools |

简介

最近换了电脑并且升级了 macOS,发现在使用 SSH 遇到了一些问题,在此记录希望能帮到更多的朋友。

无法连接远程服务器

执行远程连接,如下

1
ssh root@ip.ip.ip.ip 

控制台提示如下错误:

1
2
Unable to negotiate with legacyhost: no matching key exchange method found.
Their offer: diffie-hellman-group1-sha1

解决方案

1、创建 ~/.ssh 目录

2、在~/.ssh 目录下新建 config 文件

1
2
3
4
5
mkdir ~/.ssh

cd ~/.ssh

touch config

3、编辑 config 文件,写入如下内容

1
2
Host *
KexAlgorithms +diffie-hellman-group1-sha1

无法提交代码到 Github

当提交自己的代码到自己的 git 仓库时,发生了尴尬的一幕,提示的错误信息大致如下

1
Please make sure you have the correct access rights and the repository exists.

后面发现需要设置本地的公钥,该公钥相当于本地和远程 github 的链接桥梁,撸起袖子开搞。完整教程可以参考官方文档,戳我即可。

假设你的 github 账号名称是 zhanghao,邮箱是 zhanghao@126.com

1、全局配置账号和邮箱

1
2
3
git config --global  user.name "zhanghao"

git config --global user.email "zhanghao@126.com"

2、生成公私钥

1
ssh-keygen -t rsa -C "zhanghao@126.com"

在接下来提示的过程中,最好不要设置密码即直接回车。

完成之后,不出意外会在 ~/.ssh 目录下生成 id_rsa.pub 公钥文件和 id_rsa 私钥文件。

3、配置 github

登入 github,分别点击 Settings / SSH and GPG keys / New SSH key,复制 id_rsa.pub 公钥文件里面的内容粘贴保存即可。

在控制台测试一下是否成功

1
ssh -T git@github.com

提示如下信息即可表示成功

1
Hi zhanghao! You've successfully authenticated, but GitHub does not provide shell access

4、生成访问令牌(可选)

如果直接使用账号密码在控制台登入 github 是一件比较危险的事情,所以 github 采用了令牌的访问方式,一旦发生泄漏可以即可删除该令牌。

登入 github,分别点击 Settings / Developer settings / Personal access tokens / Generate new token

生成之后,需要你自己保存下来,在需要使用密码的地方使用该令牌即可。

清除本地公钥

我看自己的云主机 CPU 使用率一直很高,怀疑是中毒了,就给云主机重新安装了系统。

系统安装完成后,发现 ssh 连不上云主机了,并且在终端提示如下信息:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.

清除本地公钥命令如下,清除完成后重新使用 ssh 登录即可。

1
2
# 换成自己的云服务器外网IP
ssh-keygen -R ip-addr

命令 ssh-keygen -R ip 本质是清空 ~/.ssh/known_hosts文件内容,并给你做个备份重命名为 ~/.ssh/known_hosts.old,又学到一招。


勿以善小而不为

心流

发表于 2022-02-13 | 分类于 随笔 |

冬季的阳光透过窗帘洒到沙发上,虽没有夏季那般的生猛但依旧那么耀眼。清晨如约而至,马路上急促的喇叭声暗示上班时间已经到了,我戴上耳机骑上小黄奔赴办公室。一天的工作在自我安排中悄然有序的开始了,每天工作的内容不一样但节奏基本一致,我已经习惯并享受着这份忙碌的快乐,日复一日年复一年。或许在朋友眼中我就是个工作狂而且不会感觉到累的人,其实他们不知道,哪有工作不累的,我只是能在工作中找到让自己快乐的“灵丹妙药”而已,我喜欢让自己忙一点去让周围的人更快乐一些,围绕着目标和一群有工作激情的人在一起工作是一件很幸福的事情。工作中我会产生心流,它也一直让我成长着。

说到心流,不得不推荐米哈里·契克森米哈赖大师的《心流:最优体验心理学》这本书。书中提到了三个核心关键词即幸福、最优体验(他称之为心流)和精神熵。个人从中获益良多,结合自己工作中的体验讲讲如何获得心流😄。

我们先看看什么是 “熵”。

各种熵

在微信中搜索 “熵”,各种各样的文章层出不穷。

熵(shāng),英文是 Entropy ,属于物理学中的热力学概念。热力学中表征物质状态的参量之一,用符号 S 表示,其物理意义是 体系混乱程度的度量。热力学第一定律是能量守恒原理,热力学第二定律是熵原理,这两个定律是最基础的理论。有序趋于无序,无序的量度被称作“熵”。

听起来云里雾里的,第一次在高中物理课堂上听到熵这个东西,老师讲的吐沫横飞,我听的是摇摇欲坠,还好老师当时说:“大家先不理解没关系,先记住这个东西,它只是一个单位,后面慢慢就会理解的”。老师当时的安慰已经让我们内心不安的世界开始熵减了。

举个栗子🌰~

你刚搬进一个新家,整齐划一干净整洁的环境让你耳目一新,家具餐具摆放的有条不紊,透着阳光的照耀,地板显得格外光鲜亮丽。随着时间的推移和个人购物需求的增长,你家里叠放的东西越来越多,有限的空间会变得越发混乱,这就是一个熵增的过程。很多人会收拾旧东西并且把它扔掉或者捐赠给别人会觉得心旷神怡,原来他们这样做可以让整个家变得越来越有秩序,懂得取舍很关键。

工作之后,陆陆续续看到很多文章在讲熵形态相关的内容,例如信息熵、反熵、共享熵、心灵之熵和分布式之熵诸如此类。看到这些文章的感受,就好比无法理解心理学家丹尼尔·卡尼曼为什么能获得诺贝尔经济学奖一样费解。直到自己认真看完米哈里·契克森米哈赖的《心流:最优体验心理学》这本书之后,感觉确实可以用熵的物理学概念解释很多工作、生活、婚姻方面的事情,倍感收益,其实很多知识是相通的。

《心流:最优体验心理学》提出了精神熵的概念。米哈里说精神熵是指各种资讯信息会给人们意识中的目标和结构带来威胁(比如 焦虑),将导致内心失去秩序,就是精神熵。

米哈里所说的心流指的是心理上可获得的最优体验,能给你带来无法言语的心灵感受,最重要的是心流会带给你成长。米哈里说“精神熵是常态”,在他看来精神熵的反面就是最优体验,他称之为“心流”。今天你给自己定了一个小目标比如修复一个很难复现的产品缺陷,通过自己的专注力和专业能力在下班前搞定了,你那个时刻甚至接下来的很长一段日子里都是满足的,内心是幸福的,至少你向自己证明了自己的能力。

获得心流

每个人对幸福的理解不一样,我们也很难用一句话解释或者说明到底什么是幸福。幸福发生的时刻可能是听到朋友或者家人的一句话,也可能是一个微笑,也可能是你正在阅读、写作或者工作的状态。

幸福是不容易得到的,大自然并不是为人类所服务的。换句话说,宇宙其实是不在乎我们的,人类从诞生到现在仍然要面对各种自然灾害以及生老病死。人的欲望也是无止境的,好的想更好。想获得幸福你需要有个平常心。

能够用自己的能力完成跳一跳够得着的事情才会让你有成就感,可以造就心流的活动中需要有动态的挑战,即当挑战与你的技能匹配时,就会有心流。当挑战的目标大大高过你的技能时,将产生焦虑,此时应降低挑战目标。当你的技能高过设定的目标,继续持续这种活动将产生厌倦,便要提升目标,以求挑战和心流的持续。正是在技巧提高、目标上调的过程中,当事者感受到了成长的乐趣。此为幸福之真谛。正如下面这张图所示:

那我们如何才能获得心流呢?

个人拙见,最重要的一点就是做自己喜欢的事情,否则很难达到心灵上的最优体验,即使有心流的感觉也是昙花一现,长期来看也很难有所成长。这也是米哈里所说的,想获得心流,需要有一个能为之付出的目标,并且能够集中注意力,专注的去完成。因全神贯注于此,日常恼人的琐事被忘却和屏蔽,这样一来你的精神熵就会减少,获得心流的感受就会越强。

那我们聊聊自律,我始终相信自律的人生是幸福的。

所谓的自律,其实也是一种心流的感觉,真正的自律是不存在的或者说是骗人的。只有在某件事情上你尝到了甜头,你才愿意一直坚持下去,这才形成了所谓的自律。《少有人走的路》这本书里解释了自律的含义。所谓自律,就是以积极主动的态度,去解决人生痛苦的重要原则,主要包括四个方面:推迟满足感、承担责任、尊重事实、保持平衡。自律不等于被逼迫。如果一个人拼得满头大汗,却仍然强迫自己去完成某件事,那么结果往往会不尽如人意。所以,真正自律的人往往都是因为做某件事的成就感而变得自律。有成就感才是他们坚持下去的原因。

总之,想获得心流,你至少需要:

  • 有确定且合适的目标,并且愿意为之付出;

  • 能集中精力,全身心投入并实现目标;


不断的拼搏、奋斗,从而让自己产生心流,人生才有意义

怀念 Ubuntu:查看 CPU 信息

发表于 2021-12-19 | 分类于 Tools |

初中时期结识了一位挚友,在初中生涯我俩算是焦不离孟的友情,有一次我们聊天。

我说:“看到自己之前写的字,实在太丑了。。。”

他说:“说明你进步了。每当你审视之前做的东西不够完美,说明你是有追求的人。”

现在想想,这位朋友当时的解释算是哲学界的泰斗解说了。

今天在翻阅之前写的技术文章,发现了 linux 常用命令: 查看 CPU 信息 这篇文章,那是我在 2012 年写的。当时自己使用 Linux 已经有两年多的时间了,很多命令还是记不住,我就在 CSDN 上面写下来当作备忘了。几年过去了,今天翻翻自己之前写的东西突然看到了它,文笔确实很糟糕(今天还顺便修改了几个错别字🤦‍),截至到今天阅读量只有 1.3万+但最近7天查看较多就想着发出来给大家共享一下,希望能帮到正在努力的你。

记得在大四的时候,我就开始折腾 Ubuntu,觉得这个东西挺好玩的,它最吸引我的地方就是可以在上面为所欲为的敲打命令,整个系统能被自己敲打出来的命令所操控,那种感觉不仅爽而且还很酷。毕业之后购买的第一台笔记本是联想的,我还特意要求老板给装上了 Ubuntu 的系统。工作了这么多年用过 macOS、Windows,但 Linux 给我的那种纯粹的感觉至今让人难以忘却,我的台式机里面一直给 Ubuntu 留着位置,时不时的要拿出来爽一把。


在 Windows 下面可以很方便快捷的看出当前 CPU 的信息,那么在 Linux 下面如何很快的知道呢?

也很简单,不信你可以试一试下面这个命令:

lscpu

可以看出,CPU 的信息出来了,红色部分是 CPU 的位数和 CPU 的核数。

也可以用 cat -n /proc/cpuinfo 命令查看更加详细的信息,但查出来的内容太多,看起来挺费劲。

下面给出几个常用的命令。wc 主要用于统计,uniq 主要用于除去重复行,只显示其中相同的某条数据。大家可以自行去搜索和学习这两个命令。

1、查看物理 CPU 的个数

1
cat  /proc/cpuinfo | grep "physical id" | sort  | uniq | wc -l

注意:物理 CPU 就是实实在在的硬件。

2、查看逻辑 CPU 的个数

1
cat  /proc/cpuinfo | grep "processor" | wc -l

3、查看 CPU 是几核

1
cat  /proc/cpuinfo | grep "cores" | uniq

4、查看 CPU 的主频

1
cat  /proc/cpuinfo | grep MHz | uniq

查询结果如下图,所示:

当然不同的 CPU 显示结果会不一样,上图是 2012 年购买的机器安装的 Ubuntu,下图是现在虚拟机安装的 Ubuntu 系统。


做自己喜欢做的事情,这个很重要!

行动起来才能解决焦虑

发表于 2021-11-28 | 分类于 随笔 |

最近遇到很多朋友或者同事,多多少少都有在说自己比较焦虑,恰好自己正在看《底层逻辑》和《结构思考力》,今天我也来凑个热闹,聊聊焦虑。

焦虑是对亲人或自己生命安全、前途命运等的过度担心而产生的一种烦躁情绪。其中含有着急、挂念、忧愁、紧张、恐慌、不安等成分。

我有过一次记忆犹新的焦虑,来自于童年。

那时我已经7岁了,岁末年初。春节对于孩子们来说是让人期待和兴奋的,大雪在空中高兴的飞舞着,胖胖的雪人给院子增添了一份温馨,用树枝做的鼻子让它显得格外卓别林。父母在厨房里准备着年夜饭,我独自在房间里黯然神伤。我突然觉得哪一天父母要是离开了我们,眼前这一切都会随之消失,那种可怕的想法让我潸然泪下。说起来也奇怪,那个时候的我为什么会有这样的焦虑,现在想想还挺傻的。

人有悲欢离合。珍惜当下,珍惜和亲人或者同事在一起的日子,记住和他们在一起努力奋斗和生活的岁月,比什么都重要。

有个做互联网开发的朋友,工作了大概两年的时间,他说自己当初为了找工作就学习了比较热门的技术,但最近他觉得这门技术会凉凉,开始担心自己将来会被淘汰。

我问他,“你用现在的技术做的项目前景如何?”

“项目还可以并且很有前景,也有很多技术大牛一起工作,能学到不少知识”。

“那你应该提升自己的能力让项目变得更好,在项目中夯实基础,我相信你再学习其他的专业编程知识会更加与鱼得水”。

“那我应该在项目中不断磨练自己的基本功,用最好的状态为项目贡献力量”。

“是的,调整好心态,行动起来”。

我相信每个人都有自己的焦虑。

  • 孩子成绩总是差强人意;
  • 总觉得老公的工资杯水车薪;
  • 等着买房而房价总是居高不下;
  • 项目交付质量层次不齐;
  • 工作中大小事务层出不穷;
  • 身体情不自禁地发了福,减肥屡屡失败;
  • 等等。。。

心理学研究表明,焦虑都是源自于对事件的“不确定性”。对于不太确定的事情,我们会在脑海不停地猜想可能发生的后果,从而感到焦虑、不安,难以专心做好眼前的事。

心理学家河森堡说,如果你觉得某件事让你特别焦虑,压得你喘不过气来,那么最好的排解方法就是直接去做这件事,什么都别管,就是使劲做,努力去推动进度。你每往前推进一点这件棘手的事情,你的焦虑就会减少一分。同时,你的焦虑越少,推进工作的速度也就越快。只要咬紧牙关,不停地推进,总会有解脱的那一天。而且你每完成一个棘手的任务,或多或少都会比之前强大一点,这件苦差事总会改变你一点。

如果你不采取任何行动,焦虑慢慢的会将你吞噬,让你变得消极甚至抑郁。

从某种角度来看,焦虑并不是绝对的坏事,人无远虑必有近忧。当焦虑来临后,你更应该具有忧患意识,客观的评价当前情况,让焦虑变成自己前进的动力。付出更多的努力改变现状,争取取得更好的成绩。

面对焦虑,我们应该持有更开放的心态,学会释放压力。无论如何,你要行动起来不能只是焦虑!生而为人,要能欢喜。


努力向前一步,离梦想就更进一步

技术人,也应具备项目管理能力

发表于 2021-11-07 | 分类于 项目管理 |

你即将要看到的内容在我脑海里翻滚了很久~

自己写过不少技术博客,写的虽然不好但是总能拼凑出来。一旦开始写管理类的文章,就显得有些局促,但内心还是告诉我要坚持写下去。

自从写完 走上项管之路,迟迟没有动手去写关于项目管理的文章。倒不是因为自己想偷赖,而是确实不知道如何下手。这种感觉,就好比你在岸上看到一条肥嘟嘟的大鱼想据为己有而又无计可施一般让人难受。

与其临渊羡鱼,不如退而结网。

我想把自己在做项目经理这个职业中遇到的一些关于项目管理的问题、感悟和经验分享给大家,尽量通俗易懂的和盘托出。

关于项目管理方面的文章都会归纳在 项目管理 合集中,今天只分享的主题是在项目管理中常见问题的解答和分析。作为一名技术人,除了掌握专业的技能和解决问题的能力,还应该具备一定的项目管理能力,争取将来能做一名带兵打仗的将军实现自我更大的价值。


爬过一座高山之后,除了累,还有山顶的风光却和沿途的景色。做项目管理的经理人也是如此。


证书在手,天下我有

问:”考 PMP 证书到底有没有用“?

再问:”考过 PMP,月薪是不是可以翻一番“?

又问:”拿到 PMP 证书,是不是就可以当项目经理了“?

之前有不少人问过我相同的问题,包括我自己在刚做项目经理的初期也有过类似的疑问。

这些问题都是好问题,但每个问题又不可以随便说 可以 或者 不可以。

PMP,全称是 Project Management Professional,指的是项目管理专业人士资格认证。它是由美国项目管理协会 PMI(Project Management Institute)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证考试。通过该考试可以拿到 PMP 证书。

从我个人经历和感悟来逐一回答上面三个问题。

1、考 PMP 证书到底有没有用?

如果你有时间或者精力,考 PMP 证书对绝大多数人来说肯定是有用的,这个毋庸置疑。

考 PMP 证书花费大概在 5000 - 6000 左右,准备大概 2-3个月就可以了,也算是对自己的一种投资,说不定哪天能够派上用场,无心插柳柳成荫。

PMP 考试过程中你需要看相关的专业书籍,至少要看 2 遍,在书中学到的一些理论知识不仅可以运用到工作当中,还可以运用到生活、家庭和教育以及人际关系当中去。

一切皆项目,利用考证的机会可以学到一些项目管理知识,既拿到了 PMP 证书又学到了新知识,一举两得。

2、考过 PMP,月薪是不是可以翻一番?

很多企业招聘项目经理会写:有 PMP 证书的优先。但是没有写:有 PMP 证书的薪资比没有 PMP 证书的薪资高 N 倍。

如果你之前有项目管理的工作经验,并且担任过几年的项目经理,做过的项目业绩也不错,但因为各种原因没有考 PMP 证书,突然有一天你心血来潮一脚油门考过了 PMP 考试。此时,你已不再是那个懵懂的少年,俨然是个项目管理老司机了,便可以理直气壮地跟公司领导谈谈升职加薪的事了。如果你对谈判结果不满意,大不了跳个槽,说不定薪资真能翻一番。此处不留爷,自有留爷处嘛。

考过了 PMP,拿到了证书,只能说明你对项目管理的专业知识技能掌握的还不错。至于能不能升职加薪,还是要看你的个人工作能力以及你所带的项目对公司的贡献度。

在我的职业生涯中,有很多项目经理并没有考 PMP但一样做的风生水起,他们确实比较优秀,能够用自己的方式和方法帮团队和组织实现目标。

3、拿到 PMP 证书,是不是就可以当项目经理了?

可以这么说,没有 PMP 证书,也一样可以做项目经理。

“如果你恨一个人,就让他去当项目经理,因为十有八九他会被失败的项目毁了。“

这是网上比较流行的一个段子,只有做过项目经理的人才能领悟这句话的含义。

大多数的公司或者企业,一般会从内部提拔人员担任项目经理的岗位,而不会从外部招聘(但有可能会从外部招聘一名项目管理专家)。

能从其他岗位做到项目经理这个位置的人,一般都是业绩比较突出,在团队里有较高的威望,一言九鼎,做人做事都能拿捏的恰到好处。

给想从事项目经理的同学们一句劝,最好先做好自己的业务再来做项目经理,在自己的业务中不断的实践项目管理知识,待时机成熟后再来考虑是否要坐上项目经理的宝座吧,且不要操之过急。

专业我有,恪尽职守

项目管理是一门学问和艺术,任何人都可以具备项目管理的能力,项目管理强调的是技能和专业;项目经理是一个岗位名称,项目经理要能够使用项目管理的方法、技巧和手段完成组织目标,强调的是职位和职能。

你可以不是项目经理,但你可能需要项目管理的能力。

一般有项目经理的团队,组织结构大致如下图所示。

还有一种情况是团队中没有专职的项目经理,需要有人能够履行项目经理的职能,一般都是由组长担任项目管理的职责。

常见的软件开发项目中,测试组长会带领测试成员负责项目的测试工作,前后端开发组长会安排开发成员的工作,负责项目开发周期以及开发质量。这样各个组的组长都是各组的”项目经理“。当项目发展到一定阶段(如团队人数增加了、产品线变多了等),产品经理会承担项目经理的角色组织和管理各个组长,向项目负责人(一般是部门负责人)汇报,产品经理要对用户和相关方负责,需要不断的提高产品用户体验,能够站在更高的层次管理项目。

从上面的介绍中,可以看出无论你是产品经理,还是开发或者测试组长,都需要一定的项目管理知识作为储备。

在很多互联网公司的职级晋升要求中,明文规定:”晋升到某个职级必须要具备项目管理的专业知识,否则不予通过“。就拿开发组长来说,可能 TA 编写代码的速度和代码质量在团队中出类拔萃,解决问题的思维和手段出其不意,大家都称 TA 为大神。只要跟 TA 讨论编程,TA 能够滔滔不绝的给你来上几段,但一到事情规划和人员管理上就显得手忙脚乱,措手不及。这种人需要公司或者企业给与一定的指导和培训,适当的让 TA 带领人员从小事做起,慢慢的培养项目管理的能力和自信,换句话说就是要能给予这样的人才赋能。

你要知道很多成功的企业家,他们都是从组长做起来的,他们通过不断的学习和实践具备了较强的项目管理能力,为后面自己的创业生涯添上了浓墨重彩的一笔。不积跬步无以至千里,点点滴滴才是基石。在做好本专业领域的同时,不妨”越俎代庖“地做一些管理项的工作,能让你事半功倍的完成目标。


你的使命是带领一批合适的人完成组织的特定目标

GCC: __attribute__((visibility()))

发表于 2021-08-08 | 分类于 C/C++ |

在 objc-api.h 里面有很多关于 __attribute__ 的定义。

例如下面的代码片段:

1
2
3
4
5
6
7
8
9
10
11
#if !defined(OBJC_VISIBLE)
# if TARGET_OS_WIN32
# if defined(BUILDING_OBJC)
# define OBJC_VISIBLE __declspec(dllexport)
# else
# define OBJC_VISIBLE __declspec(dllimport)
# endif
# else
# define OBJC_VISIBLE __attribute__((visibility("default")))
# endif
#endif

可以看到:OBJC_VISIBLE 的定义方式是 __attribute__((visibility("default")))。

那么究竟有什么作用呢?下面举例说明。


GCC 有个 visibility 属性,启用这个属性情况如下说明。

1、当编译时增加 -fvisibility=hidden

动态库中的函数默认是被隐藏的即 hidden,除非显示声明为 __attribute__((visibility("default")))

2、当编译时增加 -fvisibility=default

动态库中的函数默认是可见的。除非显示声明为 __attribute__((visibility("hidden")))

特别说明::这个特性是 GCC4.0 以后才有的。

基于 GCC系列: 加载静态链接库 的例子。谈谈 visibility。

Car.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>  
#include<stdlib.h>

__attribute ((visibility("default"))) int drive()
{
printf("Car driving...\n");

return 0;
}

void stop()
{
printf("Car stop.\n");
}

注意:attribute 的定义和使用方法。

使用 visibility 属性来编译动态链接库,如下:

1
g++-4.9 -shared -o libCar.so -fvisibility=hidden Car.c

这样一来,drive 方法是可见的,但是 stop 是不可见的。

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>  
#include<stdlib.h>

//
// 在 gcc 编译器下, 必须声明方法
// 在 clang 编译下, 只是给了警告
//

int drive();
void stop();

int main()
{
drive();
stop();

return 0;
}

编译

1
g++-4.9 -o app main.c -L ./ -lCar

提示信息

1
2
3
4
5
Undefined symbols for architecture x86_64:
"stop()", referenced from:
_main in ccZnwENu.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

这说明了上面提到的第一种情况。

重新编译 Car.c,换个方式:

1
g++-4.9 -shared -o libCar.so -fvisibility=default Car.c

注意: 这次使用了 default 属性。

编译 main.c

1
g++-4.9 -o app main.c -L ./ -lCar

编译成功,运行程序

1
2
3
./app 
Car driving...
Car stop.

那么修改一下 Car.c 的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>  
#include<stdlib.h>

__attribute ((visibility("default"))) int drive()
{
printf("Car driving...\n");

return 0;
}

__attribute ((visibility("hidden"))) void stop()
{
printf("Car stop.\n");
}

使用 visibility=default 和 visibility=hidden 分别编译 Car.c.

可以知道,stop 函数都是隐藏的,这个也很好的说明了上面两个问题。

另外,除了 default 和 hidden,还有 internal、 protected 等,大家可以根据自己的使用场景选择使用即可。


选择比努力更重要,将就可以一时但不能一世~

<123…20>

193 日志
16 分类
163 标签
© 2024 veryitman