google-cloud 探索

google-cloud: https://cloud.google.com

docs: https://cloud.google.com/docs/

gcloud工具: https://cloud.google.com/sdk/gcloud/

What is the difference between Google App Engine and Google Compute Engine? http://stackoverflow.com/questions/22697049/what-is-the-difference-between-google-app-engine-and-google-compute-engine

 

GCE- faq: https://cloud.google.com/compute/docs/faq

 

开发者控制台帮助文档: https://developers.google.com/console/help/new   (先看看这个会为后续使用节省不少时间)

可能遇到的问题

  1. 无法访问: 请设置代理; 当执行: gcloud auth login 时,不设置代理可能会不行
  2. 执行完  GoogleCloudSDKInstaller.exe 后,似乎还是没有gcloud命令,需要手动执行 Google\Cloud SDK\google-cloud-sdk\install.bat

 

学习进度:

  1. 2015-02-03 : 部署了一个gitlab到 git.phpor.net
  2. 查看运行的实例:
  3. 修改默认的project,这样的话后续就不总需要使用 –project 选项了
  4. 添加ssh-key 为了方便ssh; 注意: 这里的登录名和google账户没有关系
    可以通过web页面直接添加: https://cloud.google.com/compute/docs/console#sshkeys
  5. 关于: C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\goapp.bat
  6. appengine 文档中的application 其实就是 project,曾经叫 application,现在叫 project
  7. 配置app.yaml 时写的是project id,如:
  8. 上传完通过: https://appengine.google.com/ 来访问部署好的project显得更加直观和方便,新的console中一定也能方便使用,只是还不太熟悉:
  9. C:\Program Files\Google\Cloud SDK\google-cloud-sdk\bin\appcfg.py 在windows上访问起来总不那么方便,于是在旁边添加了一个 appcfg.cmd , 从goapp.cmd 修改过来的,如下(注意: CLOUDSDK_ROOT_DIR 我给写死了):

     
  10. go的开发、部署和php差别有些多,需要看文档哦
  11. go开发、部署:
    goapp serve dir_of_app
    goapp deploy dir_of_app
  12. php开发、部署:
    appcfg update dir_of_app
    下载曾经部署过的代码: appcfg.py download_app -A root-micron-847 myphp    (注意: -A 后面的project id 不能写成title哦)

为Google-cloud-sdk设置http代理

 缘起

在使用google的hg和Google-cloud-sdk时都会遇到需要设置http代理的问题;

方式1: export http_proxy=10.xx.xx.xx:8888      // 无效

方式2: export http_proxy=http://10.xx.xx.xx:8888     // 无效

方式3: export https_proxy=http://10.xx.xx.xx:8888   // 无效

为什么?

分析

通过下面对使用的python的httplib2的代码分析发现:

  1.  http_proxy 或https_proxy  大小写不敏感,也可以写作: HTTP_PROXY   HTTPS_PROXY  (当然,别大小写同时存在)
  2. 代理的形式必须是url形式,如: http://host:port
  3. 对于http请求只参考 HTTP_PROXY , 对于 https 请求只参考 HTTPS_PROXY
  4. 可以通过 no_proxy (大小写不敏感)环境变量使得部分指定的域名不走代理,多个域名用“逗号”分隔,“*”代表所有

 

其他:

对于Go写的程序来讲,对于https请求来讲,优先参考 https_proxy,然后参考http_proxy; 参考: net/http/transport.go

所以,如果有类似错误如下:

Get https://code.google.com/p/snappy-go/source/checkout?repo=: x509: certificate has expired or is not yet valid

请检查是否需要设置 http_proxy

 

关于 no_proxy 的进一步说明:

在玩docker的时候,由于docker是不欢迎 http_proxy https_proxy 这些环境变量的,于是添加 no_proxy 环境变量绕过,如下:

看起来似乎没啥问题,但是问题还是出现了,由于no_proxy 原本是 空的,于是现在的no_proxy 就成了:

似乎也没啥问题呀,但是cloud sdk的httplib2 不小心把 空 匹配了所有域名了,代码如下: (坑爹不?)

 

 

 

各种代理

缘起

万里长城坚不可摧,GFW坚也得摧

ssh + polipo 配置http代理

步骤

首先,你得有一个国外的sshd服务

  1. 用ssh搭建一个socks代理
    ssh -qTNf -D 127.0.0.1:9050 username@sshd.server
  2. 安装 polipo : http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/
  3. 配置polipo: /etc/polipo/polipo.conf

     
  4. 启动polipo
    polipo -c /etc/polipo/polipo.conf

其他

tinyproxy也是支持上游的socks代理设置的,但是,没有配成(可能是我用的tinyproxy版本不够新): https://banu.com/tinyproxy/

 

更多参考: http://library.zenlogic.com/ss/2014/05/10/shadowsocks-polipo-squid/

golang 中接口类型的参数

缘起

有些时候为了避免参数的copy,会尽可能将参数定义为指针类型;如果参数是一个接口,那么是不是要定义为接口的指针呢?如果不定一为指针是不是会导致“值传递”呢?

测试

 

http://play.golang.org/p/sw7ejPVV1t

结论

永远不要把接口参数前面添加一个星号

vim 插件机制

VIM中有一个rtp变量,可以通过set rtp 来查看,这个变量写的可能是多个目录,如果要加载一个filetype=go 的文件,则vim会搜索rtp中指定的路径,在这些路径(权且用xxx标识)下,搜索xxx/syntax/go.vim 来加载语法文件,搜索 xxx/indent/go.vim 来查找缩进方式文件,等等

outlook 如何更新密码

如果你使用的是outlook,如果邮箱密码变更了,一般情况下outlook会提示你重新输入密码,但是有时候不会(可能已转为脱机工作模式),这时候,想找到那个修改邮箱密码的地方是很难的,下面是我发现的一种方法,点击下图中的“脱机工作”图标,就会染出重新输入密码的对话框,输入新密码就OK了

go debug

 

点点滴滴

  1. 官方下载的二进制的GO是在 /usr/local/go 下编译出来的,所以调试的时候runtime的一些源代码会去这下面找,如果你把下载到的go放到了 ~/go 下面则会找不到,影响调试,可以做一个软连接,如: ln -s ~/go /usr/local/go

Memcached协议

缘起

Memcache 协议我们经常见到和用到的基本是基于tcp的文本协议了,如:

但是该文本协议无法直接套用到udp上,如:

 

但是,我们可以通过如下方式使用udp协议:(参考资料: http://www.cnblogs.com/kevintian/articles/1197681.html

首先,从数据上来看,既有二进制的数据,也有文本的数据; 从协议上来看,是UDP的,这应该算是文本协议for udp;

官方资料: https://github.com/memcached/memcached/blob/master/doc/protocol.txt   (页面中搜udp)

tcp不支持该写法:

 

二进制协议

对于memcached的二进制协议: https://code.google.com/p/memcached/wiki/BinaryProtocolRevamped

但是,对于UDP而言,目前Memcached还不支持多个数据包的UDP请求的

 


总结

文本协议: https://github.com/memcached/memcached/blob/master/doc/protocol.txt

二进制协议:  https://code.google.com/p/memcached/wiki/BinaryProtocolRevamped

阅读memcached的源代码得知: 文本协议和二进制协议都可以用于tcp或udp

对于UDP而言,在上述协议的基础上 添加了8字节的udp header,文本协议和二进制协议都如此; 于是导致了文本协议在udp传输时携带了部分非文本的数据

参看: memcached.c 中的 drive_machine() ; 对于udp而言,是在 try_read_udp(conn *c) 时处理完了 8字节的udp头后返回协议数据的,然后 try_read_command(conn *c) 中判断是否二进制协议时,已经是去掉了udp的8字节header了的