golang中的rune

rune这个概念困扰我好久了。。。中文直译字面量给我的感觉就是犇猋骉麤

今天在看The way to go的时候,看到类型判断,然后尝试了下

fmt.Println(1,"a",'a')
//output:1 a 97

看到97的时候就开心了一下,a的unicode编码就是97字面量果然就是字面量...,stackoverflow有个解释很棒:字面量就是它所代表的unicode编码值,a就代表整数97

参考:unicode码表 //16进制

小屋终于有了小绿锁!!!

哈哈哈,好开心!今天太晚了,开坑明天写!

昨天在逛v站的时候,看到有人在搞推广,送ssl证书。。按照网站的提示,很快的就拿到了证书。但是,在配置Nginx的时候碰到了麻烦,reload的时候不停的报错:Nginx : SSL_CTX_use_PrivateKey_file (..) failed。网上找了很久,在serverfault 找到了ssl key和证书的验证方式。

openssl x509 -noout -modulus -in subdomain_domain_com.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5

然后,发现了很蛋疼的事情:我把二级证书和自己的证书搞混了!!!简直不能更难过。。。

修改配置之后,重启Nginx,顺利通过。满怀欣喜的打开小站,结果没有看到小绿锁。说好的小绿锁呢?呢?呢???打开调试,发现是七牛的图片都是http的,想要七牛https,还是得充钱嘛~~

15块。。。估计够用挺久了吧 =.= 后面有时间要把所有都替换为https

PHP 中的单双引号

php 果然很有趣

<?php
    $a1 = null;
    $a2 = 'null';
    $a3 = "null";
    $a4 = 0;
    $a5 = '0';
    $a6 = "0";
    $a7 = array();
    $a8 = array(array());
    echo empty($a1) ? 'true' : 'false';
    echo empty($a2) ? 'true' : 'false';
    echo empty($a3) ? 'true' : 'false';
    echo empty($a4) ? 'true' : 'false';
    echo empty($a5) ? 'true' : 'false';
    echo empty($a6) ? 'true' : 'false';
    echo empty($a7) ? 'true' : 'false';
    echo empty($a8) ? 'true' : 'false';
?>

得到以下奇怪的结果

文件 是以 php -f test.php执行
cli 是以php -r '$a=null;echo empty($a) ? 'true' : 'false';'执行
参数 | 文件执行 | cli执行

nulltrue1
'null'false1
"null"falsenull(这里只是占位,php什么都没有输出)
0true1
'0'true1
"0"true1
array()true1
array(array())falsenull(这里只是占位,php什么都没有输出)

看起来是cli 将 ‘null’ ‘true’ ‘false’ 都当作了参数,没有按照字符串来处理。但是文件模式中却按照字符串处理

Walle,我可能的救星

Walle 一个web部署系统工具,配置简单、功能完善、界面流畅、开箱即用!支持git、svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布、回滚,可以通过web来一键完成。

3月中旬换工作到现在的公司。进来之后简直被震惊到了!!!代码写的各种乱,到处都是漏洞,MySQL玩出了 NoSQL 的感觉。非常庞大的PHP项目,测试和DEV是同一个环境!!!上线居然还是FTP手动上传!!!

记得某次上线一些新功能。之前测试已经在测试环境测试通过了,但是当我们开始ftp上传的时候,噩梦开始了。

首先是上线的文件不明确,根本记不住自己一周之前到底改过那些文件,也不知到那些别人修改的文件会影响到项目,然后最严重的问题就是:根本不知道线上环境和测试环境到底差多少个版本!

文件上传之后各种BUG不断,要么就是文件漏传,要么就是某些修改过的文件影响线上环境。我们不得不在线上直接DEBUG,测试同事不得不一遍又一遍的验证线上环境。那天晚上从晚上七点折腾到凌晨两点多。

这种上线方式,除了带来许多毫无意义的重复劳动和不明确的风险之外,对大家的士气和工作积极性也是不小的打击。现在每次提上线,我都有一种要去上刑的感觉。其实这种局面只要作出一些简单的改变即可扭转:部署工具。之前有推荐过现在比较流行的jenkins来做持续集成和部署(我司也有JAVA团队),但是不知道为什么后来没下文了。。。

最近在V2EX上看到Walle,然后到他们的官网了解一下。觉得非常适合我们的团队:结构简洁、使用简单、所用技术栈我司也能hold住(Yii,Composer,Bash,Git...)。

周六抽空尝试了一下,简直High的不行,我仿佛看到了将来的光明!But!我得先在我司推广Git...

路漫漫其修远兮 吾将上下而求索

Golang 中的slice

PHP写久了,对各种数据类型就不太在意了。一开始对Golang中slice类型的理解就是一个简单的array,今天在刷leetcode的时候碰到一个很有意思的题目Remove Duplicates from Sorted Array 题目描述如下:

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array nums = [1,1,2],

Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the new length.

有意思的是 :Do not allocate extra space for another array, you must do this in place with constant memory.

大体的想法是写一个删除slice中元素的方法,然后再循环找到重复的值,删除之。

实现删除方法的时候碰到了很有意思的问题:Golang 中并没有append()的对应方法,没有减少slice长度的内建方法。想要减小slice的长度,只有对slice重新切片:s = s[x:y]。问题就是,重新切片有没有使用新的空间?

带着疑问查找了一些资料,其中Go博客中有一篇 Go 切片:用法和本质 讲解的非常透彻。其中提到了:

一个切片是一个数组片段的描述。它包含了指向数组的指针,片段的长度, 和容量(片段的最大长度)。
go-slices-usage-and-internals_slice-struct
长度是切片引用的元素数目。容量是底层数组的元素数目(从切片指针开始)。

s=s[2:4] 对切片重新切片
go-slices-usage-and-internals_slice-2
切片操作并不复制切片指向的元素。它创建一个新的切片并复用原来切片的底层数组。 这使得切片操作和数组索引一样高效。因此,通过一个新切片修改元素会影响到原始切片的对应元素。

d := []byte{'r', 'o', 'a', 'd'}
e := d[2:]
// e []byte{'a', 'd'}
e[1] = 'm'
// e
[]byte{'a', 'm'}
// d == []byte{'r', 'o', 'a', 'm'}

既然是一个指针,那就放心大胆的用了

func deleteNode(nums []int,index int) []int{
    nums=append(nums[:index],nums[index+1]...)
    return nums
}

搞定!