0%

使用 Docker 安装了 Redmine 之后,已经过了很久了,这几天在维护服务器时,发现 Redmine 的版本也升级了。
就想着也升级一下容器吧。

先说下大体思路:

  • 升级 Docker Image
  • 关闭就容器,并删除之
  • 重新开启新的容器,这样才能使用新的代码
  • 升级数据库

升级 Docker Image

升级Image很简单,只要从服务器拉下来最新的数据就行了

docker pull quay.io/sameersbn/redmine:latest

关闭就容器,并删除之

到工作目录 /data, 使用 docker-compose 来关闭级容器

cd /data
docker-compose stop
docker rm data_redmine_1

重新开启新的容器,这样才能使用新的代码

因为代码升级,新增加了些环境参数的配置

REDMINE_SECRET_TOKEN
DB_NAME

这两个一个是log提示我的,另一个发现服务升级完后,旧用户登录不了了,查了原因才知道是因为数据库名称的默认值变了。
可能受影响的还有其他不少参数,需要在详情页仔细看看。

docker-compose start

升级数据库

docker exec -it data_redmine_1 bash
cd $WORKDIR
RAILS_ENV=production bundle exec rake db:migrate

深度学习笔记。

公式

h(x) = XW + b

方阵尺寸
X = (100,784), batch size: 100, 特征尺寸: 784
W = (784,10), 特征尺寸,输出个数
b = (10,1), 输出个数,1
h = (100,10) batch size, 输出个数

分类方法

softmax,确定图像是属于10个数字中的哪一个

激活函数

tanh, sigmoid, relu,深度神经网络中推荐使用 relu

输出值范围

  • tanh
    -1 ~ 1
  • sigmoid
    0 ~ 1, 1 / (1 + e^-x)
  • relu
    0 ~ 正无穷, max(0, x)

Loss function

交叉熵 Cross entropy:

- reduce\_sum(Y\_ * log(Y))

训练算法

SGD

梯度下降算法: SGD
步长: 0.01, 太大速度快但可能取不到最精确值,太小则速度慢

缺点: 步长选择比较困难

Momentum

下降初期能够很好的加速

Adagrad

前期放大梯度,后期约束梯度
依赖人工设置全局学习率

Adadelta

Adagrad的优化,不需要人工设置全局学习率

训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动

RMSprop

Adadelta 的一个特例

  • 依赖全局学习率
  • 趋于 Adagrad 和 Adadelta 之间
  • 对于 RNN 效果和好

adam

本质上是带有动量项的RMSprop

  • 自适应学习率

最大池化

max pooling, 比如 5x5 的池中取最大一个值作为输出值

strides 步长

步长的意义在于缩小特征尺寸。比如输入 28x28 的方阵如果使用 2x2 的步长,则输出的方阵缩小为 14x14

输入通道,输出通道

在建立深度学习的层中,一般是缩小特征尺寸,增大通道大小。整个特征个数是呈现变小的趋势。

No.     方阵              kernel 和通道       步长
1       28x28x1           5x5,1,4             1x1                                             
2       28x28x4           4x4,4,8             2x2                                             
3       14x14x8           4x4,8,12            2x2                                             
4       7x7x12            全连接                                                              
5       200               softmax                                                             
6       10                用于10个数字                                                        

如何确定通道大小

比如手写的数字 4 个通道是比较小的,需要增加到6个,是个经验值

No.     方阵              kernel 和通道       步长
1       28x28x1           5x5,1,6             1x1                                             
2       28x28x6           4x4,6,12            2x2                                             
3       14x14x12          4x4,12,24           2x2                                             
4       7x7x24            全连接                                                              
5       200               softmax                                                             
6       10                用于10个数字                                                        

后续阅读

https://zhuanlan.zhihu.com/p/22252270
http://ycszen.github.io/2016/08/24/SGD%EF%BC%8CAdagrad%EF%BC%8CAdadelta%EF%BC%8CAdam%E7%AD%89%E4%BC%98%E5%8C%96%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93%E5%92%8C%E6%AF%94%E8%BE%83/
https://yq.aliyun.com/articles/250639

例子

https://www.tuicool.com/articles/vieuIbi
https://www.tuicool.com/articles/bayI7ne

最近在写一个发邮件的小程序,经常会碰到邮箱系统报错,但是看了日志也没看出的头绪来。
因为出错信息不详细,或者是信息与真正的错误没啥关联,会被带到沟里去。

其实用 SMTP 服务器的话,都是用 smtp 协议来发邮件,都是文本形式的协议,协议其实挺简单的。

总的来说3个大步骤

  1. 建立连接
  2. 验证
  3. 上传邮件内容

详细来说一下这个过程:

  1. HELO , qq邮箱域名是必须的。

    helo qq.com
    250 smtp.qq.com
    
  2. AUTH base64编码的用户名,密码,每个单独一行

    auth login
    
    334 VXNlcm5hbWU6
    aW5mb0BqaWFveHVlYmFuZy5jb20=
    
    334 UGFzc3dvcmQ6
    xxxxxxxxxxxxxxxxxxxxxxxxxxx
    
    235 Authentication successful
    
  3. MAIL FROM: 发件人邮箱

    mail from: info@jiaoxuebang.com
    250 Ok
    
  4. RCPT TO: 收件人邮箱

    rcpt to: ryan@jiaoxuebang.com
    250 Ok
    
  5. DATA 邮件数据,包括邮件头部,正文, 以 换行.换行 结束

    data
    354 End data with <CR><LF>.<CR><LF>
    subject: test
    
    test
    
    .
    
    250 Ok: queued as
    

250 显示已经进入队列等待发送了。

正好项目中要使用外部的 DLL 接口,如果用 C 来写固然是可以的。
但是也好多年没用了,觉得再拿起来也要些时间。就搜了下 Ruby 来怎么对接。

基本上网上推荐了2种方法:

  • fiddle
  • ffi

fiddleRuby 标准库自带的,用法比较简单,但是官方文档特别少。
ffi 是一个独立的 Gem,他是基于 libffi 的一个外部扩展来实现的,官网文档比较多。

感觉 fiddle 使用比较简单,我用的 DLL 也不是很复杂,就只试了 fiddle
首先推荐看下这篇基础教程 ,大体就知道怎么用了。

但是很快就遇到了一个问题,int[] 这种数组怎么传过去。
搜了下,看到了这篇文章,试了一下用 a.pack('i' * a.size) 方法的确可以。

遇到的第二个问题是如何传 UNICODE 字符串,搜了一下没有搜到。
于是我就想说不定 ffi 这边的文档会有些提示。
果然官方Wiki 里有一篇例子讲到了,使用需要encode('UTF-16LE')一下,
有一点我试的时候不在末尾加 \0 也是没问题的。

message_box.rbview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'fiddle'
require 'fiddle/import'
require 'fiddle/types'

module User32
extend Fiddle::Importer

dlload 'user32'

include Fiddle::Win32Types # 增加一些常用的typealias
typealias 'LPCTSTR', 'char*'

extern 'int MessageBoxW(HWND, LPCTSTR, LPCTSTR, UINT)'
end

msg = 'Hello 你好'.encode('UTF-16LE')
User32.MessageBoxW(0, msg, msg, 0)

是的,又换了一个博客引擎。

从 Octopress -> middleman-blog -> Hexo,博客没写几篇引擎倒是换的很勤,自嘲一下!

自从 2014 年切换到 middleman-blog, 已经有3年时间了,但是 middleman-blog 发展却停滞了。
究其原因,我想到了几点:

Read more »

ImageMagick 是强大的图片处理工具,
可以用来处理图转换,旋转,放大,缩小,模糊等很多处理。

本篇准备用一个案例来说明 ImageMagick 的用法。

需求描述

  • 给定一张底图图片,白色背景,黑色散列点小黑子,大小为6400x6400
  • 要求把这张图片8x8的切成64小块,打乱排序后重新得到一张图片。
  • 在每张小图片底部叠加一张中间有序号的图片,用于确认图片顺序。
Read more »

现在与主机交互的首选工具应该是 ssh 相关的工具了,比如 scp, rsync。因为他们都是建立在传输层基础上的安全协议。
而老牌的 ftp 则不然,因为他们访问主机时的登录交互容易被窃听,有泄密的可能性。
ftp 也有对应的安全版本 sftp, 但是用的就很少了,因为 sftp 也是基于 ssh 的,但是 ssh 自带传输特效,所有 sftp 就很少用的了。

本篇为什么要写 ftp,是因为对接老的系统的时候,是超出我们控制的。
最近的项目中就需要把本地的数据包传到服务器上,因此找了几个 ftp 工具来分析了下。

Read more »

当系统访问很频繁,服务器日志增多到一定量时,仅靠 tail -f 已经很难分析出有用信息了。
可能就只能进行一些简单的排除工作,比如根据日志内的时间信息,查找该时间附近有什么特殊访问之类。

即使这样用有时候也会比较麻烦,因为当你的应用服务器增多时,每个服务器都是单独写到本机日志文件内,造成了分析日志的难度。
这个时候就很需要一个工具来收集各个服务器日志来统一处理。

今天说的就是有关于这个问题的解法。

Read more »

上一篇介绍了 Docker 之后,仅仅过了3个月时间,Docker又增加了很多变化:
比如 Docker Machine, Docker Compose

最近项目里要把 Redmine 从盛大云到阿里云,正好可以发挥 Docker 的强项。这里分析一下需要实现的功能:

  • Redmine 服务
  • Postgres 数据库服务
  • gitolite Git repo 服务
  • 迁移老数据到新的服务里
  • Redmine 服务自启动
Read more »

最近 Docker 很火,好像只要是服务器端相关的东西都有要搬到 Docker 上的趋势,
似乎要把从开发,安装,部署,维护的问题全都要解决掉的那个意思。

按我的理解,Docker 架构在服务器之上,从服务器上多衍生出了一层,
所以可以跨平台运行在各个系统之上,达到一致的用户体验。
并且 Docker 可以快速导入一个定制好系统,
比如可以把开发人员的系统环境复制一份给测试人员使用,体验真的很好。

Docker 发展很快,但我觉得就目前的阶段还是不太适合商用环境,
毕竟真正商用时是多主机配合工作的,这点上 Docker 还有很大的空间需要完善。
作为一个开发,测试用环境或者小范围商用时是 Docker 的确带来了巨大的用户体验。

Read more »