gitlab docker 部署记

https://stackoverflow.com/questions/44056807/gitlab-docker-smtp
https://developer.ibm.com/code/2017/07/13/step-step-guide-running-gitlab-ce-docker/
https://docs.gitlab.com/omnibus/docker/

#!/bin/bash

sudo docker run --detach \
      --hostname 192.168.88.244 \
      --publish 80:80 --publish 10022:22 \
      --env "GITLAB_SHELL_SSH_PORT=10022" \
      --name gitlab \
      --restart always \
      --volume /srv/gitlab/config:/etc/gitlab \
      --volume /srv/gitlab/logs:/var/log/gitlab \
      --volume /srv/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce:latest
   
2018/10/9 posted in  DevOps

树莓派 x86 系统安装记

2018/10/6

lede软路由安装

下载地址

http://firmware.koolshare.cn/LEDE_X64_fw867/

mac或者linux直接用dd写入磁盘就行

sudo dd if=./openwrt-koolshare-mod-v2.23-r8972-e25927a06f-x86-64-uefi-gpt-squashfs.img.gz  of=/dev/disk2 bs=1m
2018/10/6

chef-solo knife 使用 tips

  • 初始化项目 knife solo init .
  • 生成cookbook模板chef generate cookbook helloworld
  • 在服务器上执行 knife solo cook lidashuang@10.211.55.6
  • code stype 检查 foodcritic ./site-cookbooks/helloworld/
2018/9/27 posted in  DevOps

2-6 通过explain查询和分析SQL的执行计划

https://www.imooc.com/video/3710

explain 分析执行计划

说明

关于 type 为 index_merge

之前项目一个sql示例

mysql> mysql> explain SELECT COUNT(id) FROM `orders`  WHERE `orders`.`types` = 2 AND `orders`.`status` = 2 AND  `orders`.`pay_type` IN (1, 2);
+----+-------------+--------+------------+-------------+-----------------------------------------------------------------------+----------------------------------------------+---------+------+-------+----------+----------------------------------------------------------------------------+
| id | select_type | table  | partitions | type        | possible_keys                                                         | key                                          | key_len | ref  | rows  | filtered | Extra                                                                      |
+----+-------------+--------+------------+-------------+-----------------------------------------------------------------------+----------------------------------------------+---------+------+-------+----------+----------------------------------------------------------------------------+
|  1 | SIMPLE      | orders | NULL       | index_merge | index_orders_on_types,index_orders_on_status,index_orders_on_pay_type | index_orders_on_types,index_orders_on_status | 5,5     | NULL | 97112 |    14.71 | Using intersect(index_orders_on_types,index_orders_on_status); Using where |
+----+-------------+--------+------------+-------------+-----------------------------------------------------------------------+----------------------------------------------+---------+------+-------+----------+----------------------------------------------------------------------------+

type 为 index_merge

对多个索引分别进行条件扫描,然后将它们各自的结果进行合并(intersect/union)。

links

2018/9/26

3-2 索引优化SQL的方法 笔记

https://www.imooc.com/video/3998

工具

pt-duplicate-key-checke Percona Toolkit 的一部分

sudo apt-get install percona-toolkit

pt-duplicate-key-checke 使用方法简单

$ pt-duplicate-key-checker -h  host -u root -p  password ########################################################################
# shiji_development.daily_shop_statistics
# ########################################################################

# index_daily_shop_statistics_on_date_id is a left-prefix of index_daily_shop_statistics_on_date_id_and_shop_id
# Key definitions:
#   KEY `index_daily_shop_statistics_on_date_id` (`date_id`),
#   UNIQUE KEY `index_daily_shop_statistics_on_date_id_and_shop_id` (`date_id`,`shop_id`),
# Column types:
#     `date_id` int(11) not null
#     `shop_id` int(11) not null
# To remove this duplicate index, execute:
ALTER TABLE `shiji_development`.`daily_shop_statistics` DROP INDEX `index_daily_shop_statistics_on_date_id`;

# ########################################################################
# shiji_migrate_test.daily_shop_statistics
# ########################################################################

# index_daily_shop_statistics_on_date_id is a left-prefix of index_daily_shop_statistics_on_date_id_and_shop_id
# Key definitions:
#   KEY `index_daily_shop_statistics_on_date_id` (`date_id`),
#   UNIQUE KEY `index_daily_shop_statistics_on_date_id_and_shop_id` (`date_id`,`shop_id`),
# Column types:
#     `date_id` int(11) not null
#     `shop_id` int(11) not null
# To remove this duplicate index, execute:
ALTER TABLE `shiji_migrate_test`.`daily_shop_statistics` DROP INDEX `index_daily_shop_statistics_on_date_id`;

# ########################################################################
# Summary of indexes
# ########################################################################

# Size Duplicate Indexes   65360
# Total Duplicate Indexes  2
# Total Indexes            478

查询表的索引状态 SHOW INDEX FROM orders;

Cardinality 表示离散度

links

2018/9/26 posted in  MySQL

HOW TO BUILD A HOME CLIMBING WALL

原文
https://www.rei.com/blog/climb/build-home-climbing-wall

抱石墙的构造方式与木框架房屋的构造方式大致相同:

2018/9/26

Annotation Summary of deploying_rails_applications-cn.pdf.

Ruby (rbenv)

Highlight [5]: 在生产服务器上, 我喜欢用 rbenv 安装、管理不同的 Ruby 版本, 主要是因为我觉得 rbenv 操作简 单、易于理解(因此容易解决出现的问题),而 rvm 太复杂

自动操作

Highlight [7]: 一般来说,在部署和管理服务器的过程中, 如果一年要重复超过一到两次的耗时操作,我都会将其自动化

Highlight [7]: 便于创建“交付准备环境”(staging environment),

Highlight [7]: Chef 用来自动配置,Capistrano 用来自动执行部署过程以及 其他与生产环境和交付准备环境之间的交互。

自动配置所用的工具

Highlight [8]: Chef 是一个自动化工具,由 Opscode 开发,使用 Ruby DSL(Domain Specific Language,领域特定语 言)以一种可重复使用的格式表示配置服务器所需的命令

Highlight [8]: Chef 中,把各个步骤称为“角色”(role)

Highlight [8]: 单机模式下使用 Chef(Chef Solo)。在这种模式下,我们在本地开发平台上定义服 务器的各种角色和设置,然后根据需要手动应用这些设置

Highlight [8]: Knife 是一个命令行工具,为本地开发环境中的 Chef 仓库和远程服务器之间提供交互接口

Highlight [8]: 一般情况下,远程服务器必须是“主”(master)Chef 服务器。不过 Knife Solo 允许在单机模式下使 用 Chef,可以直接和需要配置的服务器交互

Highlight [8]: 。例如,可能有一个配方用来安装 Ruby, 另一个配方用来安装 Rails 程序常用的 gem。相关功能所需的不同配方往往放在一起,组成一个“食 谱”(cookbook)。

Highlight [8]: 安装各组件所需的命令称为“配方”(recipe)

Highlight [8]: Berkshelf 就像是配方的 Bundler。我们先定义好配置需要哪些配方,

创建项目

Highlight [11]: 安装 Chef、Knife Solo 和 Berkshelf

Highlight [11]: 配方(recipe) 定义安装单个组件(例如 Ruby,mysql-server,Monit 等)所需的命令。

Highlight [11]: 食谱(cookbook) 相关的配方集合,例如,“mysql”食谱中包含 MySQL 服务器配方和 MySQL 客户端配方。

Highlight [12]: 节点(node) 要配置的远程服务器。

Highlight [12]: 角色(role) 一系列配方的组合,应用到节点上时,就称为一个角色。

Highlight [12]: ,“Postgres Server”角色可能会包含安装 postgres-server 的配方,安装、设置防火墙的操作,以 及安装合适的服务器监控工具的操作

Highlight [12]: 数据包(data bag) 配方所用的元数据,保存为 JSON 格式文件。例如,要创建的用户列表,以及相应的公钥。

Highlight [12]: Chef 仓库(chef repository) 一系列节点和角色定义

Note [12]: .
├── Gemfile
├── Gemfile.lock
└── my_first_chef_repo
├── Berksfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks

7 directories, 3 files

Highlight [13]: Knife 是个命令行工具,可以和远程服务器上的 Chef 交互。

Highlight [13]: Knife Solo 添加了额外的命令, 可以在本地开发设备上直接和要配置的服务器交互(而不用通过 Chef 中央服务器中转)。

Highlight [13]: cookbooks 文件夹用来存放使用 Berkshelf 安装的他人编写的食谱

Highlight [13]: site_cookbooks 文件夹用来存放自己编写的食谱

Redis 配方的结构

Highlight [14]: metadata.rb 元数据文件中详细说明了这个食谱的作用,编写人,依赖件以及版本号。

Highlight [14]: supports 这行指定这个食谱支持的操作系统

Highlight [15]: version 和 recipe 这两行指定配方的名称和版本号。

Highlight [15]: 使用 Berkshelf 时, 这两行是关键的设置, Berkshelf 会查看 metadata.rb 文件,确认要使用的食谱中是否有名称匹配的配方,以及相应的版本。

Highlight [15]: 。depends 指定食谱要依赖的其他食谱。

Highlight [15]: Chef 食谱必须包含一个名为“default”的配方。如果在节点或角色定义中用到了某个食谱,而没有 指定要用哪个配方

Highlight [16]: templates 文件夹中的子文件夹对应的是服务器上所安装的操作系统

概览

Highlight [18]: 节点表示单台服务器

Redis 节点

Highlight [18]: 在 Chef 中,run_list 对应的是一个数组,其中的元素是要应用或安装到节点上的角色或配方。Chef 会按照顺序依次执行列出的配方和角色。

下载额外的食谱

Highlight [23]: 一般都使用 Berkshelf 管理食谱

概览

Highlight [27]: Berkshelf 对 Chef 食谱的作用也是这样。在 Berksfile 中定义 Chef 仓库要使用的食谱,以及各自的 版本。然后执行 berks install 命令安装这些食谱。如果食谱在 metadata.rb 文件的 depends 中定义 了依赖食谱,Berkshelf 会负责安装这些依赖食谱。

Highlight [27]: 和 Bundler 一样,Berkshelf 也会生成一个 .lock 文件(Berksfile.lock),写入食谱及相应的版本号。

2018/9/14 posted in  读书笔记

Annotation Summary of TCP Sockets编程.pdf.

1.3 什么是端点

Highlight [page 20]: 。 INET 是 internet的缩写,特别用于指代IPv4版本的套接字

Highlight [page 20]: STREAM表示将使用数据流进行通信,该功能由TCP提供。如果你指定 的是DGRAM(datagram的缩写,数据报),则表示UDP套接字。套接字 的类型用来告诉内核需要创建什么样的套接字。

1.5 IPv6

Highlight [page 21]: 多数系统都定义了环回接口(loopback interface)。和网卡接口不同, 这是一个和硬件无关、完全虚拟的接口。发送到环回接口上的数据立 即会在同一个接口上被接收。

Highlight [page 21]: 环 回 接 口 对 应 的 主 机 名 是 localhost , 对 应 的 IP 地 址 通 常 是 127.0.0.1。

1.6 端口

Highlight [page 22]: 在同一个侦听端口上可以有两个套接字,一个使用IPv4地址,另一 个 使 用 IPv6 地 址 , 但 是 这 两 个 套 接 字 不 能 都 使 用 同 一 个 IPv4 地址。

3.1.1 该绑定到哪个端口

Highlight [page 29]: 规 则 1 : 不 要 使 用 0~1024 之 间 的 端 口 。 这 些 端 口 是 作 为 熟 知 (well-known)端口并保留给系统使用的。例

Highlight [page 29]: 规则2:不要使用49 000~65 535之间的端口。 这些都是临时 (ephemeral )端口 。通常是由那些不需要运行在预定义端口,而只是 需要一些端口作为临时之需的服务使用。

Highlight [page 29]: ,1025~48 999之间端口的使用是一视同仁的

3.2.1 侦听队列

Highlight [page 31]: listen方法传递了一个整数类型的参数。这个 数字表示服务器套接字能够容纳的待处理(pending)的最大连接数。 待处理的连接列表被称作侦听队列

Highlight [page 31]: 假设服务器正忙于处理某个客户端连接,如果这时其他新的客户端连 接到达,将会被置于侦听队列。如果新的客户端连接到达且侦听队列 已满,那么客户端将会产生Errno::ECONNREFUSED。

Highlight [page 31]: Errno::ECONNREFUSED

3.2.2 侦听队列的长度

Highlight [page 32]: 通过在运行时查看 Socket::SOMAXCONN可以获知当前所允许的最大的侦听队列长度。 在我的Mac上这个数字是128。

3.3 接受连接

Highlight [page 32]: 可 以 使 用 server.listen (Socket::SOMAXCONN)将侦听队列长度设置为允许的最大值

第5 章 交换数据

Highlight [page 52]: ,TCP 在网络上发送的是分组

Highlight [page 52]: ,TCP 连接 提供了一个不间断的、有序的通信流。只有流,别无其他

Highlight [page 53]: :流并没有消息边界的概念。即便是客户端分别 发送了 3 份数据,服务器在读取时,也是将其作为一份数据来接收。 它并不知道客户端是分批发送的数据。

10.2 SO_REUSE_ADDR

Highlight [page 73]: TIME_WAIT状态 当你关闭(close)了某个缓冲区,但其中仍有未处理数据的套 接字之时就会出现TIME_WAIT状态。前面曾说过,调用write只 是保证数据已经进入了缓冲层。当你关闭一个套接字时,它未处 理的数据并不会被丢弃。

第17 章 SSL 套接字

Highlight [page 105]: SSL套接字并没有取代TCP套接字,而是将不安全的套接字“升级” 到安全的SSL套接字。

Highlight [page 105]: 要注意的是,一个套接字可以升级成SSL,但是一个套接字不能同时 进行SSL和非SSL通信。当使用SSL时,端到端的通信必须全部都使用 SSL完成,否则无法保证安全。

Highlight [page 105]: 对于那些既需要在SSL上又需要在不安全的TCP上运行的服务,需要 使用两个端口(两个套接字)。HTTP就是一个常见的例子:不安全的 HTTP默认使用端口80,而HTTPS(运行在SSL之上的HTTP)通信默 认是在端口443上。

Highlight [page 108]: 很 多 Ruby 代 码 库 默 认 将 该 值 设 置 为 OpenSSL::SSL::VERIFY_NONE。这是一个比较宽松的设置,它允许 未经验证的SSL证书, 放弃了很多由证书提供的安全性。

第18 章 紧急数据

Highlight [page 110]: 之前我强调过TCP套接字提供了一种有序的数据流。换句话说,你可 以将TCP数据流想象成一个队列。套接字连接的一端向连接中写入数 据,就相当于将数据入列。这些数据经过若干个阶段(本地缓冲、网 络传输、远程缓冲),然后在接收端的套接字处出列

Highlight [page 110]: TCP紧急数据,更多的 时候被称作“带外数据”(out-of-band data),支持将数据推到队列的 前端,绕过其他已在传送途中的数据,以便于连接的另一端尽快接收 到这些数据。

18.1 发送紧急数据

Highlight [page 111]: Socket#send可以接受第二个参数:标志(flag)。我们可以为 send指定一个标志,表明某些数据为紧急数据

18.2 接受紧急数据

Highlight [page 111]: send并将Socket::MSG_OOB常 量作为标志。这里的OOB指的就是带外数据

Highlight [page 112]: 要接收紧急数据,需要使用Socket#recv以及在发送紧急数据时用过 的那个标志。同

Highlight [page 112]: Socket#send一样,Socket#revc专由套接字用于数 据读取

18.3 局限

Highlight [page 112]: 。要注意的是,必须明 确地接受紧急数据。如果不调用recv,服务器就不会注意到紧急数据

Highlight [page 112]: TCP实现对于紧急数据仅提供了有限的支持,一次 只能发送一个字节的紧急数据。如果你要发送多个字节,那么只有最 后一个字节会被视为紧急数据。

2018/9/12 posted in  读书笔记

Rails update_column, update_attribute, update与update_all

2018/9/9 posted in  Rails