本地和生产环境安装 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.

What is JSON?

Published on:

初学 JSON 的时候,我知道 JSON 的格式要求很严格

{
  "name": "john",
  "age": 18
}
  • 左右最外侧有大括号
  • 由一对对键值 key/value组成,key必须用英文,value可以使用任意字符,但不论如何,键值都必须用英文字符双引号括起来,不能使用单引号代替
  • 键值之间,用引文字符冒号隔开
  • 一对键值之间与另一对键值之间必须用英文字符都好隔开
  • 除了 value 值之外,所有字符必须使用英文字符

想知道一个 JSON 文件格式是否正确,可以使用这个网站来检测 :
JSON Formatter & Validator

其中,尤其要注意键值必须使用双引号,否则会出错,invalid

另外,字符串中间不能直接回车,如果要换行,可以使用转义符号\n

但有时候,我发现在 node.js的运行环境,JSON居然不是 JSON,而是 js obj,不仅仅如此,在浏览器的运行环境也是一样的情况。

为什么会这样?不是说好了,不要互相伤害吗?

实际上,这是因为我没有完全理解 JSON 的原因,mozilla 给出的定义是这样的:

JavaScript Object Notation (JSON) is a standard text-based format for representing structured data based on JavaScript object syntax, which is commonly used for representing and transmitting data on web sites.

根据上面的定义,JSON 是一个基于文本的数据格式,一般用于与服务器交换数据,当服务端需要交换数据的时候,倾向于使用字符串格式,因为字符串可以在所有语言中以相同的方式进行解释,为此,已经创建了将复杂数据结构描述为字符串的标准规则或语法。 JSON可以在字符串中描述obj,array,string,number,boolean和null,可以在 app 之间有效的传递数据,并根据需要进行解码。(JSON的语法跟 obj 的语法类似,事实上,前者是后者的一个子集。)

因此,只有在 string 格式的时候,JSON 才是 JSON,否则就会自动变成 obj,在 ruby 环境会变成 hash。

// This is a JSON String.
var foo = '{ "name": "john" }';
 
// This is an Object literal.
var bar = { "name": "john" };

JSON除了 类似obj的语法格式以外,还可以用任何包含 json 格式的数据类型,比如可以使用 array的格式,即多个 json 集合,例如:

[
  {
    "name": "Molecule Man",
    "age": 29,
    "secretIdentity": "Dan Jukes",
    "powers": [
      "Radiation resistance",
      "Turning tiny",
      "Radiation blast"
    ]
  },
  {
    "name": "Madame Uppercut",
    "age": 39,
    "secretIdentity": "Jane Wilson",
    "powers": [
      "Million tonne punch",
      "Damage resistance",
      "Superhuman reflexes"
    ]
  }
]

For more info, please refer to links below:

  1. there is no such thing as a “JSON” object
  2. JSON from mozilla
  3. JSON Quick Guide

使用Transcend存储卡来扩展mac

Published on:

最近 mac 总提示存储空间不够,于是开始考虑为 mac 扩展容量, Google 之后,总结了以下三种方案。

方案选择

1.更换 SSD 磁盘

  • 优点:速度快
  • 缺点:需要动手拆卸和安装

2.以旧换新

  • 优点:出钱解决所有问题
  • 缺点:费钱

3.外接移动硬盘

  • 优点:速度快
  • 缺点:不方便携带,本地搜索慢

4.外加扩展卡

  • 接入方便,速度快
  • 非 SSD,相当于即插即用的移动硬盘

本来想选第一种方案,买一个 SSD 磁盘回来动手拆卸,挺酷的,京东上一搜,Transcend 的货没有匹配2015年款的,最多支持2012款,OWC 的SSD 磁盘国内全网都没得卖,Google 了一下还只能去 OWC 官网买,一看价钱加上运费有点贵,最后选择了最后一种方案

体验和效果

这样的读写速度已经满足平时的使用了,日常开发也完全没有问题。

安装步骤

京东上买,只要了一天时间,好评。

盒子很小。

插入右侧卡槽之后,mac 会自动识别。

打开文件夹在Finder侧边栏会看到一个名为 Transcend 的设备。

格式化

Transcend的默认文件类型为ExFAT,使用起来并不是很方便,只用Mac自带的磁盘工具就可以格式化,点击抹掉(Erase)就成功格式化了,如下图。

隐藏卡片

这样其实就可以了,但还是有一个问题。

外置磁盘的图标一直显示在Finder侧边栏,有时候打开文件夹容易点到推出磁盘按钮,为了防止这个情况发生,墙裂推荐隐藏卡片。

  1. 为磁盘文件夹制作替身
  2. 把替身文件夹放在自带磁盘某处
  3. 推动替身放入左侧个人收藏边栏
  4. 隐藏磁盘文件夹

这里要特意说明的是,直接给磁盘文件夹Transcend制作替身,比如右键或者快捷键 cmd + L 不会起作用,解决方法是在终端使用 ln 命令来制作替身:

$ ln -s /Volumes/Transcend /Users/Yammy 
# ln -s 磁盘文件夹 替身文件夹

隐藏的指令是:
$ chflags hidden /Volumes/Transcend # 隐藏

最后重启 Finder ,指令:
killall Finder # 重启finder

l当然,如果想重新显示该扩展卡,可以执行下面两个命令:

$ chflags nohidden /Volumes/Transcend ## 不隐藏
$ killall Finder # 重启finder

最后的结果见下图:

好了,现在可以把一些大文件放进这里了,也可以使用 Timemachine 作为备份。

最后,如果这篇文章帮助了你,欢迎打赏:

参考链接:使用Transcend JetDrive Lite扩展Mac - 简书

MacOS Sierra下编译Bitcoin源代码

Published on:

前言:

最近在复习《mastering Bitcoin》这本书,原文电子书戳这里:
http://zhibimo.com/read/wang-miao/mastering-bitcoin/Chapter03.html


对于开发者,可以选择下载包含完整源代码的ZIP包,也可以从Github上克隆权威的源码仓库,以下我会示范使用 git clone 代码。

1. clone code and find the latest stable version

$ git clone https://github.com/bitcoin/bitcoin
$ cd bitcoin
$ git tag

默认情况下,本地clone 的代码将与最新的代码同步,这有可能是bitcoin的一个不稳定或是 beta 版本。在编译这些代码之前,签出发布标签(realease tag)以选择某一特定版本(a specific version)。 这将通过一个关键的标签标记,让本地拷贝与代码仓库的特定快照同步。开发者用标签来标记代码的特定发行版本号(version numBTCer)。

执行完git tag后,列出的标签是bitcoin的所有发行版本,按照约定,带有rc后缀的是预发行版本,可以用来测试。没有后缀的稳定版本可以直接在产品环境上运行。目前最新的稳定版本是v0.14.1,因此我要在这里切换到该版本下:

$ git checkout v0.14.1   # choose a recent stable version

2. check the latest doc and install dependencies

这时候,打开编辑器,查看并阅读编译bitcoind命令行客户端的说明。

我用的是 mac,直接找到说明文件 doc/build-osx.md。

仔细阅读build文档第一部分中build的必备条件。这些是在你编译之前你的系统上必须具备的库文件。如果缺少这些必备条件,构建过程将会出现错误并导致失败。

按照说明文档,需要安装 xcode 和 homebrew,略过。

其次,需要按照好几个套件:

$ brew install automake berkeley-db4 libtool boost --c++11 miniupnpc openssl pkg-config protobuf --c++11 qt5 libevent

安装过程中,如果遇到红色 error,可以在执行完成后,重新尝试安装安装 error 的套件。

比如,像下图这样:

berkeley-db4安装失败,需要重新安装:
$ brew install berkeley-db4,当然提示升级的也可以按照提示升级,比如上图的 opensslautomake

$ brew upgrade openssl
$ brew upgrade automake

3. Build Bitcoin Core

好了,准备过程做好了,就可以开始构建过程,通过authgen.sh脚本,生成一组构建脚本,autogen.sh脚本创建了一系列的自动配置脚本,会询问你的系统以发现正确的设置,确保你已安装必要的库来编译源码。这里面最重要的是configure脚本,它会提供许多不同的选项来定制构建过程。

$ ./autogen.sh

其次,是运行configure脚本就可以自动发现所有必要的库,然后为我们的系统创建一个定制的构建脚本。如果一切顺利,configure命令将会以创建可定制的构建脚本结束。这些构建脚本允许我们编译bitcoind。如果有缺失的库或是错误,configur命令将会以错误信息终止。如果出现了错误,可能是因为缺少库或是有不兼容的库。重新检查构建文档,确认你已经安装缺失的必备条件。然后运行configure,看看错误是否消失了。下一步,你将编译源代码,这个过程可能需要1个小时完成。在编译的过程中,你应该过几秒或是几分钟看一下输出结果。如果出现了问题,你会看到错误。如果中断了,编译的过程可以在任何时候恢复。

$ ./configure

如果没有问题,输入make命令就可以开始编译了

$ make
$ make check   # run tests

如果一切顺利,bitcoind现在已经编译完成。最后一步就是通过make命令,安装 bitcoind 可执行文件到你的系统路径下:

$ make install

4. final check

可以通过询问系统下面2个可执行文件的路径,来确认bitcoin是否安装成功。

$ which bitcoind
=> /usr/local/bin/bitcoind

$ which bitcoin-cli
=> /usr/local/bin/bitcoin-cli

bitcoind 默认的安装位置是/usr/local/bin。当你第一次运行bitcoind时,它会提醒你用一个安全密码给JSON-RPC接口创建一个配置文件。通过在终端输入bitcoind就可以运行bitcoind了:

$ bitcoind

使用pgadmin4 查看正式开发环境下的SQL数据

Published on:

前言

Rails 本地开发环境的默认数据库是sqlite3,正式环境如果部署到 heroku 默认的数据库是 postgresql,如果想在本地查看数据,只需要下载并安装 DB Browser for SQLite ,然后打开专案中的db/development.sqlite3文档就可以轻松的查看和操作数据,但正式开发环境,就没那么简单了,以下是简略介绍。

思路

1.从 heroku 中导出 db 文档
2.使用图形化工具 pgadmin 创建 server 并打开 db

具体操作

1. 从 heroku 中导出 db 文档

官网有说明,终端指令可参考这份说明

  • 备份 db 并下载
    $ heroku pg:backups:capture
    $ heroku pg:backups:download
    
  • 解压到本地专案 $ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump

注:myuser 是本地管理员的名字,mydb随便取一个名字,方便后面使用 pdadmin 打开 db 文档的时候,快速识别并找到这个 db。

除了指令,其实也可以通过 app 页面操作:Heroku
找到 resources 那一栏,然后点击 Heroku Postgres :: Database,点进去备份并下载就好了,最后按照上文解压就完了。

2. 使用图形化工具 pgadmin 创建 server 并打开 db

就像我们本地使用 DB Browser 打开 SQLite3 类型的本地db 文档一样,我们需要使用 pdadmin 才可以打开 postgresql 类型的db 文档 latest.dump

不同的是,postgresql 是一个数据库服务器,除了安装还必须要执行服务器,要连线也必须提供数据库的帐号密码。

1.下载pgAdmin ,按照提示来安装,然后运行
2.打开后,点击 Add New Server,会弹出这样的窗口

3.在 general 标签页面输入一个 server 的名字,然后点击 connection标签页面, Host name/address 里面填写 localhost, User name 这个栏位默认填的是 postgres, 这里的 User 指的是拥有管理员权限的电脑用户,当然可以重新设置一个拥有管理员权限的叫 postgres 的 user,如果不想麻烦,直接填你目前登录这台 mac 的用户名就行,比如我的mac 用户名叫 Yammy,如果不确定,可以打开 系统偏好设置 > 用户与群组 > 当前用户 就能查看。最后点击 save 保存。

4.在 pgAdmin 左侧导航栏点击 + 号展开 Servers ,继续展开你刚才创建的 Servers Name > Databases > your_rails_app_name_development > Schemas > public > Tables,在某个你已经创建过数据的 table 的名称上点击右键,选择 View Data > View First 100 Rows ,不出意外的话,你就能在右下方的窗口看到有很多数据列了出来。

5.也可以在 query 区域,直接输入 sql 指令 query。

参考链接:
如何使用 pgAdmin 查看 Rails 开发环境的 PostgreSQL 数据(附解题过程、思路、总结) « 全栈工程师成长记
Importing and Exporting Heroku Postgres Databases with PG Backups | Heroku Dev Center
简单介绍:Mac 上安装和使用PostgreSQL的方法 - 简书

打赏时刻:

如果这篇短文对你有帮助,欢迎扫码打赏😄

记录微信公众号开发遇到的几个问题

Published on:

昨天,看到 huazai 的 logdown 上面发布了一篇微信公众号开发的文章:http://www.waterblues.xyz/posts/2027522

感兴趣,就动手按照文章操作了一遍,结果失败了。。。

文章解释的已经很详细了,但我还是遇到了一些问题,今天终于解决了,特此记录一下。

问题主要是两个方面:

1.使用 natapp 穿透内网,通过域名访问不了本地的rails3000端口

这个问题,试了一个小时,结果通过域名访问的网址张这样:

但正确的画面应该是平时我们打开 local3000的画面:

解决不了这个问题,只好在 slack 上求助 @huazai

理清了思路后,最后我明白,看来用 natapp 是行不通了。

Anyway, Google is my friend.

通过 google,我找到国外一个类似的服务:ngrok

注册之后,会出现一个 authtoken,按照提示操作和安装就行。

具体可以参考官网的 docs:ngrok - secure introspectable tunnels to localhost

然后在Terminal 中执行指令:
$ ngrok http 3000

等待一会儿,然后会出现类似这样的画面,就表示穿透内网成功了。

这时候,我们在浏览器中输入上图中的 forwarding 后面的 url,就会出现像平时我们在本地打开 local3000的画面了:


2.微信接口配置总提示配置不成功

微信的接口配置要满足两个要求:

  • 专案可以透过指令,发消息给关注测试号的用户
  • 其次,可以通过外部域名访问本地的端口,即上文我提到的穿透内网的问题

这两个问题,我都解决了,但提交微信接口配置信息,仍然提示不成功:

rails s 的 log 提示Cannot render console

OK, Google is my friend.

搜到 rubychina 上这篇文章:Rails 公众号开发碰到的一个小坑: 公众号对接失败 · Ruby China

大意是 单独用 puma 无法配置成功接口信息。

于是注销掉 puma,这时候再开 rails s

rails 就会默认使用WEBrick服务器

接下来,在微信公众号页面提交接口信息,就成功通过了,这时候看 rails s 的 log,会出现这样的画面:

最好用的 debug 神器

Published on:

刚开始学习 rails 的时候,常常遇到报错,常常遇到像酱紫的画面:

奇怪的是,每次报错下面都会出现一个黑框,每次我想都没想,就顺手 x 掉,居然从来也没想过为什么会出现这个东西。

直到有一天,留意到 YY 老师的一篇 logdown 中提到利用这个黑框来 debug,当时相当震惊,居然有一个神器常常出现在我面前,但我却根本没有任何察觉,我依然清楚的记得那时的感受,一小半的惊喜外加一大半的懊恼。但。。。

也就那样了,我根本没有仔细去研究这个神器,我只知道这个东西可以拿来这样用,其他的我一概不知,我甚至都没有 google。

直到前一段时间,我跟 caven 一起在 slack 上值班,帮学员 debug 的时候,我提到这种 debug 的方法,caven当即私信问我。。。

那一刻,我突然明白我只是会用而已,具体的我却说不出个所以然来,简单的解释回复之后,我立刻开始 google,一下子就找打了很多的资料,其中 guides 和 github 给出了详细的说明。

原来,这是一个 gem,叫 web-console,不仅可以在报错页面显示这个黑框,只需要在任何页面加上<% console %>,就可以在任何页面显示,以帮助我们debug,其他详情可以点击文后链接。

除了这个工具以外,guides 给出了多种 debug 的方法,包括 三个 helper:debug、to_yaml 和 inspect,以及 byebug gem等,对我来说,我最喜欢 web-console,因为可以直接在出错的页面调用,直观方便,除错效率高,至于buebug,我认为更适合在自动化测试的时候使用。

注意:
web-console这个 gem 默认装在 development 环境下,用于测试报错,不要把它装在 production,否则任何用户都可以调用这个 console 。

BTW,better_errors这个 gem 也是一个不错的 debug plugin,错误页面似乎更加好看了。

For more info, please refer to :
GitHub - rails/web-console: Rails Console on the Browser.
http://guides.rubyonrails.org/debugging_rails_applications.html

freeze 小技巧

Published on:

前言:
不小心翻到 ihower 老师的技术博客,其中一篇:如何真正讓 Ruby Constants 常數無法被修改,很有意思,我按照自己的思路整理,记录如下。

我们知道 ruby 中 freeze 这个 method 可以用来freeze 一个 object,但实际上并不完全奏效。

string和 number 不能直接被 freeze,拿 array 举例好了:

> a = ["a", "b", "c"]
 => ["a", "b", "c"]
> a.freeze
 => ["a", "b", "c"]
> a[0] = 3
RuntimeError: can't modify frozen Array
> a[0] << "x"
 => "ax"
> a
 => ["ax", "b", "c"]

那如何才能确保 array不被修改到呢?

答案是用一个 class把 array包起来, 然后在 class 内部 freeze。

class A
  B = ["a", "b", "c"].freeze
  
  def self.mutate
    B[0] << "x"
  end
    
end

A::B << "d"
# RuntimeError: can't modify frozen Array 丟出錯誤例外,不能修改!

A.mutate
A::B # 被修改成 ["ax", "b", "c"] 了,失敗 :(

Oops,居然还是失败了。

原来freeze 容器,只能防止新增和删除元素,却不能阻止个别元素被直接修改,为了到达目的,还需要对每一个元素都freeze一下:

class A
  B = ["a", "b", "c"].map!(&:freeze).freeze
  
  def self.mutate
    B[0] << "x"
  end
    
end

A::B << "d"
# RuntimeError: can't modify frozen Array 丟出錯誤例外,不能修改!

A.mutate
# RuntimeError: can't modify frozen String 丟出錯誤例外,不能修改!

另外,对于常数只需要用 module 包起来,然后对 module 进行 freeze 就好了。

module Y
  X = 1
end

Y.freeze

Y::X = 2

# RuntimeError: can't modify frozen Module 丟出錯誤例外,不能修改!