手头有个乐视的路由器,想着刷个openwrt玩玩插件,参考地址http://www.right.com.cn/forum/thread-172877-1-1.html 还有一些其他资料就准备开刷。

第1步资料已经变动,http://downloads.openwrt.org/attitude_adjustment/12.09-rc1/ar71xx/generic/packages/Packages.gz.
这个地址已经变为http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/Packages.gz. 在安装页面有个配置选项,直接在里面修改就行[不过我后面刷了另一个包,不确认这个是否必须]

继续阅读

php偏移量16个0

openssl_encrypt($xml,’AES-128-CBC’,$key, false, hex2bin(‘00000000000000000000000000000000’));

//java代码是服务提供方写的,目前知道这样写的对方能解出来,不懂java就不写代码了.

golang

package main

import (
“bytes”
“crypto/aes”
“crypto/cipher”
“encoding/base64”
“fmt”
“io”
“log”
“os”
)

var iv = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
//必须这样写,如果写成[]byte(“16个0”)会丢失前面16个字节

func main() {
TestCBCAES()
}

func TestCBCAES() {
key := []byte(“IHqnFXMNhpzYNLOU”)
data := “xmlssssss”
result, err := AesEncrypt([]byte(data), key)
if err != nil {
panic(err)
}
origData, err := AesDecrypt(result, key)
if err != nil {
panic(err)
}
fmt.Println(string(origData))
}

func AesEncrypt(origData, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockSize := block.BlockSize()
origData = PKCS5Padding(origData, blockSize)
blockMode := cipher.NewCBCEncrypter(block, iv)
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
return crypted, nil
}

func AesDecrypt(crypted, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
//blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, iv)
origData := make([]byte, len(crypted))
// origData := crypted
blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData)
return origData, nil
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize – len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext…)
}

func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
// remove the last byte
unpadding := int(origData[length-1])
return origData[:(length – unpadding)]

}

golang代码参考,修改了偏移量的方式,可能跟服务端实现的方式有关系

如何讓 AES 在 Golang 與 Android(Java) 得到一致的加解密結果

GO项目跑整个项目的覆盖率

gitlab-ci.sh 内容如下

set -e echo “mode: atomic” > coverage.txt

for d in $(go list ./… | grep -v vendor | grep -v doc); do
go test -race -coverprofile=profile.out $d
if [ -f profile.out ]; then
cat profile.out | grep -v statements | grep -v atomic >> coverage.txt
rm profile.out
fi done

go tool cover -func=coverage.txt

ELK是elasticsearch、kibana、logstas组合的简称,是一套强大的日志处理系统, grafana是一款golang开发的数据显示软件,支持多种数据源,UI漂亮,支持报警

软件下载&安装

es下载地址 https://www.elastic.co/downloads/elasticsearch

kibana https://www.elastic.co/downloads/kibana

logstash https://www.elastic.co/downloads/logstash

filebeat https://www.elastic.co/downloads/beats

grafana https://grafana.com/grafana/download

安装比较简单,直接安装官方说明装就可以了。

继续阅读

刚开始使用gitlab的单元测试覆盖率,测试的代码是golang的,经过摸索如下

total:\s+\(statements\)\s+(\d+.\d+)%

.gitlab-ci.yml 配置文件如下

script:
- go test -coverprofile=coverage.out && go tool cover -func=coverage.out

就是从输出的内容里面用正则匹配,能成功就OK了

服务端

processor := enameepp.NewEppContactProcessor(&EppStruct{})
domainProcessor := enameepp.NewEppDomainProcessor(&EppStructDomain{})
TMultiplexedProcessor := thrift.NewTMultiplexedProcessor()
TMultiplexedProcessor.RegisterProcessor("contact", processor)
TMultiplexedProcessor.RegisterProcessor("domain", domainProcessor)

server := thrift.NewTSimpleServer4(TMultiplexedProcessor, transport, transportFactory, protocolFactory)

fmt.Println("Starting the simple server... on ", addr)
return server.Serve()

客户端

var transport thrift.TTransport
var err error
transport, err = thrift.NewTSocket(addr)
if err != nil {
	fmt.Println("Error opening socket:", err)
	return err
}
transport = transportFactory.GetTransport(transport)
defer transport.Close()
if err := transport.Open(); err != nil {
	return err
}

protocol := thrift.NewTBinaryProtocolTransport(transport)
mp := thrift.NewTMultiplexedProtocol(protocol, "domain")

//client := enameepp.NewEppContactClientProtocol(transport, protocol, mp)
client := enameepp.NewEppDomainClientProtocol(transport, protocol, mp)
return handleClient2(client)

从wordpress项目弄了一个.po文件直接生成.mo文件 如果是英文是正常的,为了减少一套语言包 打算直接用中文做msgid 结果发现怎么都不行

各种搜索

> http://stackoverflow.com/questions/31804791/gettext-not-translating-every-string
> https://www.gnu.org/software/gettext/manual/html_node/msgfmt-Invocation.html

按说是可以解决的,继续各种折腾

> 找到一个中文的文章 http://blog.csdn.net/williamwanglei/article/details/8568926
> 这个参数是关键 –from-code=utf-8

### 步骤

> xgettext –keyword=e –from-code=utf-8 app/controllers/IndexController.php –output=fool.pot 扫描源代码生成pot文件
> msginit –locale=zh_CN –output=zh_CN.po –input fool.pot 得到.po文件
> msgfmt zh_CN.po –no-hash –o=zh_CN.mo 得到.mo文件

“`
echo $this->e(‘中文’);//得到结果 chinese
“`
完整的po文件
“`
# Chinese translations for PACKAGE package
# PACKAGE 软件包的简体中文翻译.
# Copyright (C) 2016 THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Logiz , 2016.
#
msgid “”
msgstr “”
“Project-Id-Version: \n”
“Report-Msgid-Bugs-To: \n”
“POT-Creation-Date: 2016-03-25 17:55+0800\n”
“PO-Revision-Date: 2016-03-25 17:59+0800\n”
“Last-Translator: Logiz \n”
“Language-Team: Chinese (simplified)\n”
“Language: zh_CN\n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=UTF-8\n”
“Content-Transfer-Encoding: 8bit\n”
“X-Generator: Poedit 1.8.6\n”

#: app/controllers/IndexController.php:36
msgid “Hello”
msgstr “test”

#: app/controllers/IndexController.php:37
msgid “中文”
msgstr “chinese”
“`

### phlacon 新版有个BUG

setlocale(LC_ALL, ‘zh_CN’);

要自己设置下才行

原始代码

for {
	select {
	case poll := <-connPool:
		print("pool")
	case <-time.After(20 * time.Second):
		break //希望在这里退出循环
	}
}

结果是一直在循环,搜索了下发现这样写是不对的,改进代码

OK:
for {
	select {
	case poll := <-connPool:
		print("pool")
	case <-time.After(20 * time.Second):
		break OK //这样就可以退出了
	}
}

初步确认是phalcon框架在升级到2.0后没有向下兼容 出现的BUG

现象:

在ini里面配置了数组

[dn]

status.1 = “start”

status.2=”stop”

通过phalcon 2.0.4 的ini方法解析后得到一个数组var_dump的结果是

array(2) {
[“1”]=>
string(1) “start”
[“2”]=>
string(1) “stop”
}

自己写的数组和phalcon 1.3版本是这样的

array(2) {
[1]=>
string(5) “start”
[2]=>
string(4) “stop”
}

 

升级GITLAB折腾了几次备注下过程

1:清除缓存  gitlab-rake cache:clear RAILS_ENV=production

2:修改头像的URL成cn.gravatar.com

编辑这个文件 /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml   修改这个 plain_url: 默认是空值

3:升级前配置了邮件服务是手工加的 smtp_settings.rb 的文件,升级的时候会因为删除不了这个文件而失败,删除掉这个文件重新reconfigure就可以了。

4:不懂ror 折腾起来有点累