macOS 删除云梯微屁恩的网络配置

Published on:

自从云梯挂了之后,就没法使用了,只好卸载,不过我发现即使卸载完毕,在系统偏好设置 > 网络 中仍然能看到旧的设置,更糟糕的是,配置呈现灰色,根本没法手动删除,而且一长串都是,看着相当难过。

Google 一番之后,找到了两个可能的解决方案:

  1. 终端使用系统指令$ profiles带参数,删除相关配置
  2. 编辑系统文件 /Library/Preferences/SystemConfiguration/preferences.plist,手动删除相关的配置标签

尝试过第一种方案,运行 $ profiles -L,理应出现configuration profiles,但结果是
There are no configuration profiles installed for user 'XXX'

还好,第二种方案是可行的,用编辑器打开,搜索云梯 vpn,然后删除所有跟下面的类似的内容即可。

<key>UserDefinedName</key>
            <string>云梯 美国3号 L2TP</string>
            <key>__INACTIVE__</key>
            <true/>
            <key>com.apple.payload</key>
            <dict>
                <key>PayloadOrganization</key>
                <string>云梯 VPN</string>
                <key>PayloadRoot</key>
                <dict>
                    <key>PayloadIdentifier</key>
                    <string>com.vpncloud.profile</string>
                    <key>PayloadUUID</key>
                    <string>E6D2E815-874F-5D77-8408-1B1A9C7BA4D8</string>
                </dict>
                <key>PayloadUUID</key>
                <string>CE6F23A6-AA18-5997-B611-4DD0ACD834E9</string>
            </dict>

最后,重启一下,搞定,网络中再也看不到那些灰色的配置了。


For more info, please refer to the links below:

Mac OSX 如何删除云梯VPN的配置 - CSDN博客
Mac osx 删除云梯VPN 配置文件(remove profiles) - CSDN博客

把旧 mac 上的内容迁移到新 mac 上

Published on:

最近换了一台 mac pro,旧的 Air 上的内容很多,我想完全拷贝一份到 pro 上,这样就可以无缝切换到 pro 上工作和学习,完全不用做多余设置。

macOS 提供了一个 app 叫 迁移助手,可以很方便的帮我们完成这个工作。

大概有这么几种方案:

  1. 用 wifi 或者有线网络直接连接两台设备,然后从旧设备上迁移到新设备上
  2. 使用网线连接两台设备,然后从旧设备上迁移到新设备上
  3. 使用Thunderbolt 线缆将两台 Mac 连接起来
  4. 把旧设备通过 Time Machine 在移动硬盘上备份一下,然后把硬盘连接新设备,然后再迁移过去

第三种方案速度最快,但手头暂时没有Thunderbolt 线缆,第一种方案最慢,刚好我前两天用 Time Machine 在移动硬盘上备份过一次,于是选了最后一个方案。

操作起来也很简单,只需要把设备脸上备份过的移动硬盘,然后打开迁移助手,按照提示操作就好了。

选择第一个「从 Mac、Time Machine 备份或启动磁盘」

选择备份好的移动硬盘(点一下硬盘,下方点继续)

选取要使用的备份

选择要传过去的信息,耐心等待迁移过程

迁移成功


图片来自官网:https://support.apple.com/zh-cn/HT204350

使用ncdu指令检测大文件

Published on:
  1. 安装 homebrew
  2. 通过 homebrew 安装 ncdu:$ brew install ncdu
  3. 进入文件夹,执行 ncdu:$ sudo ncdu

处理完,释放了46.8个 G 的容量

link_to 这样带参数

Published on:

先贴上 link_to 的 api:
link_to (ActionView::Helpers::UrlHelper) - APIdock

link_to 除了可以给文字添加超链接,还可以借此在里面,添加参数。

比如,如果想在点击 link_to 的超链接到达一个新页面之后判断来自于哪个页面,那么可以像这样添加一个参数:

<%= link_to "group", group_path(@group, :from_page => admin_group_index) %>

点击链接,到达 show 页面后,链接后面就会多加一个参数,像下面这样:

http://localhost:3000/admin/group/1?from_page=admin_group_index

有时候,我们不同页面,可能要加同一个功能的按钮,然后点击链接就会跳转到同一个画面的页面,如果这里面需要一个返回的功能按钮,就需要判断到底来自于哪个页面的点击,通过 link_to 这样加参数,我们只需要一个判断就可以区分。

git rebase 妙用

Published on:

平时,我们通过 git 协作,在 push 到远程分支之前,一般会在本地实作多个功能,其中,可能会有多个 commit,有时候,我们 实作完才发现这些 commit 有必要好好整理一下再 push。

这时候,git rebase 几乎可以满足我们所有的需要,无论是修改,分拆或者是增加 commit。

选择 commit 进行 rebase

首先,我们需要根据情况选择适当的节点,假如我们需要对前三个 commit 进行整理,可以执行:
$ git rebase -i HEAD~3

也可以找到某个特定的 commit_id,执行:
$ git rebase commit_id -i

关于commit_id,执行 $ gitk,如下图,可以查看每个 commit 的 commit_id,其实就是 commit 的digest(消息摘要),commit 只要稍有改变,commit_id 都会不同。

然后,就会进入一个vi编辑界面:

根据需要选择指令

其中,下方注释有一下描述:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
# Note that empty commits are commented out

说的很清楚:(以下指令可以使用缩写,首字母

  • pick 就是保留这个 commit,如果不需要这个 commit,删掉那一整行就好了
  • reword 可以修改 commit message
  • edit 会停下来,修改特定 commit 的内容,可以分拆也可以添加或者修改内容
  • squash 会把特定的某条 commit 合并进上一条 commit
  • fixup 跟 squash 类似,但会丢弃 log message
  • exec 使用 shell 执行指令

假如目前我们要整理前三个 commit:

pick add A
pick add B
pick add C

修改 commit 的顺序

每一行 commit 是从上到下按顺序执行的,最下面的 commit 是最近的一次 commit,如果想修改两个 commit 的顺序,只需要互换两行的位置就行。

互换位置后,是这样:

pick add A
pick add C
pick add B

确定了之后,执行:wq保存后退出,如果没有异常,就成功修改了 commit 的顺序,不过要小心使用,如果两个 commit 里的够远,由于 commit 之间有依赖关系,调换顺序可能会造成混乱,甚至💥爆炸。

修改 commit message

pick add A
pick add B
reword add C

保存后,会跳转到 add C这个 commit 下,修改 message 保存之后就行。

分拆 commit

pick add A
edit add B
pick add C

保存后,会停在add B 那个 message 下

执行 $ git reset HEAD^,会取消这个 commit,然后留下修改的文件。

接着做修改,add 部分 file,commit 一次,再 add file,做另一次 commit,可以多次,修改完毕

执行$ git rebase --continue,如果有提示有冲突,需要解决冲突,然后再 continue,最后如果没有问题,就 ok 了。

修改 commit 内容

跟上面分拆 commit一样,只是修改 file 不同,不过大同小异。

合并两个 commit

pick add A
pick add B
squash add C

保存后,会跳转到合并两次commit 的新页面,如果需要修改 commit message 就修改,如果不需要就执行保存,就完美合并了两次 commit。


For more info, pl refer to the link below:

Git rebase 和 merge 合併操作示範 - YouTube

mac 下管理 NTFS 文件系统的磁盘

Published on:

目前使用的 mac 电脑是一年前买的,在这之前,我使用的的 win 系统,后来解脱之后,有一些数据放在移动硬盘里面,准备拿过来,转移部分文件到 mac 电脑上。

这一转,才知道,原来 win 系统的文件系统 NTFS(New Technology File System) 跟 macOS 系统下的 HFS+(又称 OS X Extended)文件系统(10.13 版本升级为 APFS 文件系统),两种系统不能相互写入文件,即不能自由的相互传文件。

这样就尴尬了,这样原来使用 NTFS 文件系统移动硬盘就不能自由的在 mac 下传文件了。

Google 了一下,才发现目前市场上,有两款软件可以解决这个问题。

  • Paragon NTFS
  • Tuxera NTFS

Paragon NTFS

提供15天试用,到期后需要买 license ,美元价$ 19.95,折合人民币132.5元,人民币价格¥144.4。
如果有支持美元的信用卡,当然选美元价要划算一点。

价格链接:
PARAGON Software Group - Online shop 2011

Tuxera NTFS

同样15天的试用期,价格相对来说,要贵一点,美元$31,人民币¥205.6。

价格链接:
https://secure.avangate.com/order/checkout.php?CART_ID=5548ef88feeaf7c86eb56060832c879b


我买了 Paragon,购买之后,会向你提供的邮箱发送 license key,说明以及收据,很规范,按照说明,下载软件,输入 license key 就可以愉快使用了。

PostgreSQL sequence

Published on:

PostgreSQL是非常流行的开源关系型数据库,在灵活的BSD License下发行。

其序列 sequence 是一个数据库对象,我们在 rails app 的数据库中新增 table 的时候,会默认生成一个对应的序列 table,并以其自增的数值作为 table 的主键(primary key)。

上图,除了 ar_internal_metadataschema_migration 这两张表以外,每一个 table 都会默认对应一个序列 table。

说道ar_internal_metadata,其是Rails 5默认添加的一个新的表来存储迁移数据库时使用的环境版本。
schema_migratio,是 Rails 用来记录数据库迁移版本的 table。

说回序列表,其就像其他 table一样,拥有自己的结构,只不过它的结构是固定的:

psql=# \d shipments_ship_id_seq
 Sequence "public.shipments_ship_id_seq"
Column     |  Type   |         Value
---------------+---------+-----------------------
 sequence_name | name    | shipments_ship_id_seq
 last_value    | bigint  | 0                
 start_value   | bigint  | 0
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 0
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | f    

table 每增加一笔记录,序列表的当前值就会自增1作为 table 新记录的主键,正常情况下,按照这种正常的逻辑,最后一笔记录的 id 值应该跟序列表的当前值是相等的。

不过,也有异常的时候,如果数据库紊乱或者被操作过,就有可能出现两者值不相等的情况,这时候,如果继续新增记录,就会出现报错,新纪录仍然会继续按照序列当前值递增作为主键 id 的值,而之前最后一笔记录的主键值却比这个值大,这时候,数据库就不知道该如何插入记录了,只好报错:key id already exists.

怎么解决呢?没错,最简单的办法就是把序列当前值设置为最后一笔记录的 id 值,让两者保持一致,就好了。

这就涉及到序列的函数使用:

nextval('sequence_name'): 将当前值设置成递增后的值,并返回
currval('sequence_name'): 返回当前值
setval('sequence_name', n, b=true): 设置当前值;b 默认设置 true,下一次调用 nextval() 时,直接返回 n,如果设置 false,则返回 n+increment:

其中,setval 函数可以拿来设置当前值。

psql=# SELECT setval('shipments_ship_id_seq', 1010);
 setval
--------
   1010
(1 row)

psql=# SELECT nextval('shipments_ship_id_seq');
 nextval
---------
    1011
(1 row)

假如当前最后一笔 users 记录的 id 为 29250

而我们数据库table 的序列表的当前值为 22530

那么我们只需要进入数据库,执行setval 函数,把当前值改成 29250就好了。


For more info, pl refer to link below:
PostgreSQL之序列(Sequence) - 码源-专注开源技术分享 - SegmentFault

本地和生产环境安装 MySQL 和启动服务

Published on:

本地和生产环境安装 MySQL和启动服务

本地环境

  1. 下载 MySQL 如果像我一样,是最新的 macOS High Sierra系统,可以安装目前的最新版本MySQL 5.7.19。 下载链接:https://dev.mysql.com/downloads/mysql/

不用登陆或注册,直接点击下方圈出来的文字链接下载

  1. 安装 MySQL 下载完毕,直接安装,安装完毕,会弹出一个窗口,提供一个临时密码。

  1. 修改 MySQL root 密码 这条指令,先关闭MySQ server $ sudo /usr/local/mysql/support-files/mysql.server stop

如果出现下面这样的错误:

... ERROR! The server quit without updating PID file (/usr/local/mysql/data/Yammys-mac.local.pid).

原因是没有权限,需要使用 chmod 来修改权限。
$ sudo chmod -R 777 /usr/local/mysql/data

有了权限,再执行一次就能正常开启 server 了。

用安全模式开启 server:
$ sudo mysqld_safe --skip-grant-tables

这个模式会一直开启,除非你关掉终端。

再开一个终端,接下来修改 root 密码

$ mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

记得把密码换成你的密码。

修改完毕,输入\q结束 mysql。

除了命令行开启 server,也可以打开设置点击左下角的 mysql 来开启或者关闭。

除此之外,如果用 homebrew 安装 mysql,$ brew install mysql

也可以通过 brew 来开启关闭 server
brew start service

brew services start mysql
brew services stop mysql
brew services restart mysql
  1. 建立数据库 接着我们进入 mysql console 建立新的数据库:

执行 $ mysql -u root -p ,输入密码进入 mysql console后,执行建立数据库指令。

CREATE DATABASE rails_app CHARACTER SET utf8mb4;

这会建立一个叫做 rails_app 的数据库(注意,数据库名称不要包括横线-),等会你的Rails就用这个数据库。执行完,输入 exit 离开 mysql console。

生产环境

  1. 下载 mysql
    如果使用 Ubuntu 主机,可以通过 apt-get 来下载,并设置密码
    $ sudo apt-get install mysql-common mysql-client libmysqlclient-dev mysql-server
    过程中请配置一个数据库的 root 密码 (如果开发 rails 专案, database.yml 会用到)

  2. 建立数据库
    接着我们进入 mysql console 建立新的数据库:

执行 $ mysql -u root -p ,输入密码进入 mysql console 后,执行建立数据库指令:

CREATE DATABASE rails_app CHARACTER SET utf8mb4;

最后输入 exit 离开 mysql console。

设置 database

default: &default
  adapter: mysql2
  encoding: utf8mb4
  database: rails_app
  host: localhost
  username: root
  password: xxxxxxxx

development:
  <<: *default
  database: rails_app

test:
  <<: *default
  database: rails_app

production:
  adapter: mysql2
  encoding: utf8mb4
  database: rails_app
  host: localhost
  username: root
  password: xxxxxxxxxx

more links please refer:
Install Apache, MySQL, PHP & phpMyAdmin on macOS High Sierra 10.13

这样理解 ruby 的匿名函数更容易

Published on:

起初,看 ruby 的匿名函数会一头雾水,被 ->、lambda、block以及 Proc 搞得晕头转向。

后来,学了一点 javascript后,再来看 ruby 的匿名函数就要容易理解的多。

js的函数,有两种表达形式:

  • 函数语法定义式
  • 函数表达式定义方式
// 这是函数语法定义方式

function print(content) {
  console.log(content);
}
print("hello, js")

// 这是表达式定义方式

var print = function (content) {
  console.log(content);
}
print("hello, js")

函数表达式的定义方式,解释了在 js 中,函数也是一种数据类型,可以像其他数据类型一样被赋值给任何变量。

回到 ruby,一样的道理,函数也是一种数据类型, ->符号相当于 js 中的 function。

print = -> (content) { puts content }
print.call "hello, ruby" # 这里带了参数,.call 可以省略,如果不带参数,则不能省略,即 print.call

# 之所以有 call 是因为 ruby 调用函数的时候,惯例可以省略括号,为了区分这两种情况,加了一个 call 的方法,调用匿名函数

其次,在 js 函数表达式定义方式中,函数可以被当做参数被其他函数接收。

var foo = function() { console.log("foo") }
function bar(x) {
    console.log("bar")
    x()
}
bar(foo)

在 ruby 中,类似的实现方式是:

foo =  -> { puts "foo" }
def bar(x)
    puts "bar"
    x.call
end
bar(foo)

不过,在实际使用过程中,ruby 偏向于用 yield。

def bar
    puts "bar"
    yield if block_given?
end
bar { puts "foo" }

至于 lambda、block以及 Proc 之间的区别,下面这篇文章说的比较详细。
聊聊 Ruby 中的 block, proc 和 lambda · Ruby China

difference between blank? present? empty?nil?in rails

Published on:

difference between blank? present? empty?nil?in rails

先来看 empty?这个instance method,

 [].empty?
 # => true.

 "".empty?
 # => true.

 "  ".empty?
 # => false

 nil.empty?
 # => Undefined method.

很明显,空值的实例变量会判定为 true,但如果有空格,会被判定为 false。

但在实际使用的过程中,我们常常需要判断一个字符串是否无内容,为了解决ruby 的这个问题, rails为 ruby 添加了一个 blank?方法。

[]. blank?
 # => true.

 "".blank?
 # => true.

 "    ".blank?
 # => true.

 false.blank?
 # => true

 nil.blank?
 # => true.

酱紫,就可以使用blank?来判断一个字符串或者数组是否内容为空。

[].present?
 # => false.

 nil.present?
 # => false.

 "".present?
 # => false.

 "  ".present?
 # => false.

 false.present?
 # => false.

除此之外,rails 还内置了一个present?方法,the opposite of blank?

# @return [true, false]

  def blank?
    respond_to?(:empty?) ? !!empty? : !self
  end

  # An object is present if it's not blank.

  #

  # @return [true, false]

  def present?
    !blank?
  end

还有一个方法跟以上三个方法有点像,叫 nil?

 nil. nil?
 # => true.

 [].nil?
 # => false.

 "".nil?
 # => false.

 "  ".nil?
 # => false.