关注携程技术沙龙已经很长时间了,之前不少讲座针对机器学习的,不是特别理解。本期的互联网基础架构是我很感兴趣的topic,四个专题讲座收获颇多,有携程统一配置管理平台Apollo,去哪儿Qtrace全链路监控组件,新美大DBA的数据库分级分库分表介绍,唯品会的消息网关实践,距离上次活动已经两周了,今天抽时间整理下:-)

事实是携程官方整理的更好,真的是干货,在此贴下链接:

1. Qunar全链路跟踪及Debug
https://mp.weixin.qq.com/s/atger7wX2nmc2hVGMiDzSw

2、高吞吐消息网关的探索与思考
https://mp.weixin.qq.com/s/EIa4a3VPX9Onj1bt24hWjA

3、携程开源配置中心Apollo的设计与实现
https://mp.weixin.qq.com/s/HUmH_5n98CeV43Yfz51iHg

Python中的字符串编码是一个很让初学者费解头疼的问题,特别是遇到中文时相关处理经常抛出Exception。字符串到底以什么编码在Python内部进行处理,Python2.x中文编码如何安全的转换,Python 2.x与Python 3.x在编码方面的区别?本文接下来会一一进行讲解。

logo-python.png

1、字符串在Python内部的编码
在Python内部字符串都是以unicode编码进行处理,即源码文件中的字符串首先都会被decode成unicode编码的字符串,之后Python内部再进行处理,用代码显示表示如下:

unicode_str = input_str.decode('utf8')

以上是将uft8编码的字符串input_str转换为unicode,decode成功的前提是你得知道input_str的原始编码,比如这里是utf8,否则会抛出UnicodeDecodeError的异常。

2、Python源码字符串的编码
Python 2.x的默认编码格式是ascii,字符串在转换前均会decode成unicode。初学Python大家可能会编写如下的代码:

#!/usr/bin/python
s = '你好'
print s

会出现下面的异常:

SyntaxError: Non-ASCII character '\xe4'

这个是因为错误的将utf8编码的中文当成ascii解码。解决方法也很常规:在Python源码文件中声明编码格式,最常见的声明方式如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

- 阅读剩余部分 -

学习Golang过程中的笔记,涉及编译、包依赖管理、并发等高级特性,同时也会记录一些底层GC实现,项目持续集成(CI),生产环境运维等,以上不限于此!

1、编译成二进制

  • 单文件

go build test.go

  • 多文件

go build -o test*.go

2、直接执行
go run test.go

3、协程冲突检测
go race test.go
运行编译后的二进制文件遇到数据冲突时会输出日志

4、包依赖管理
Golang1.5之后会首先自动加载vendor目录下的库

  • 初始化

govendor init

  • 添加依赖

govendor add +external

Protobuf全称Google Protocol Buffers,Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

一、什么是序列化?
序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易。不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同,序列化为的是解决跨语言、跨平台的通讯问题。序列化后的数据当然不能是某种语言的特殊数据类型,常用的序列化协议有XML、JSON、Protobuf等。

  • 序列化: 将数据结构或对象转换成二进制串的过程。
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

- 阅读剩余部分 -

编程语言的类型可分为强类型和弱类型两种,强类型变量声明时已确定变量类型,运行过程中不能随便将其他类型变量赋值于它(涉及到类型强制转换等除外),C/C++/Java属于强类型语言;而PHP/Python/JS属于弱类型语言,变量可以表示任意类型。本文介绍PHP变量的内部实现数据结构,如何表示各种数据类型。

1、PHP变量类型及存储结构
PHP虽然是弱类型语言,我们在使用时也会指明它的类型,比如bool/array/object/resource/null等。PHP底层使用C语言实现,变量的值存储到以下所示zval结构体中:

typedef struct _zval_struct zval;
struct _zval_struct {
    zvalue_value value;         /* 存储变量的值 */
    zend_uint refcount__gc;     /* 表示引用计数 */
    zend_uchar type;            /* 变量具体的类型 */
    zend_uchar is_ref__gc;      /* 表示是否为引用 */ 
};

变量类型type: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。

前面提到变量的值存储在zvalue_value联合体中,结构体定义如下:

typedef union _zvalue_value {
    long lval;                  /* long */
    double dval;                /* double */
    struct { 
        char *val;
        int len;
    } str;                      /* string*/
    HashTable *ht;              /* hash table */
    zend_object_value obj;      /* object */
} zvalue_value;

PHP的弱变量容器的实现方式是兼容并包的形式体现,针对每种类型的变量都有其对应的标记和存储空间。 使用强类型的语言在效率上通常会比弱类型高,因为很多信息能在运行之前就能确定,这也能帮助排除程序错误。 而这带来的问题是编写代码相对会受制约。

- 阅读剩余部分 -