2018

qwding

1 minute read

事件 之前看一篇监控文章,但是内容很少,了解不多,今天来个人介绍,却不知道如何提问到好问题 看某大牛提问,正向学习下 提问 日志及metric如何收集, tcp还是udp传输,深入下协议传输问题 存储形式 (很老的技术,分trunk再分block) 索引 涉及到取时候的索引加在的内存分配, 带search功能的都需要考虑这点 怎么聚合 (小时聚合,取数据在内存将在算) 类似看书 其实看书也是一样,带着核心问题看书才能看进去 重点 其实具体技术问题没有深入探讨,但是看到些核心问题点,以后思考类似问题时候有个方向。 索引可能是之前没有考虑到过的点,值得思考

qwding

1 minute read

前缘 15年在某云公司,搞k8s,很基础,各种调api,公司6号员工,本想一直坚持干下去,可惜我这小暴脾气,后来走了。 那时k8s还没有1.0,使用各种不稳定,各种杂七杂八问题 现在 突然间给我分到现在组,要弄k8s,在看他的时候,还是以前的样子 点点理解 k8s 自己搞了个大网 所有信息放到了etcd 其他组件访问etcd,做该做的事 我感觉这三点概括了k8s整体工作流程,至于其他组件干了什么,google现在一大堆了

解决python 的ycm跳转不好使

resolve python ycm not work

qwding

3 minute read

年前折腾很久,终于把golang vim折腾好了,结果发现python ycm不好使了,很头痛 今天解决了,记录下过程 查阅日志,进入到vim进行跳转操作,输入命令YcmDebugInfo,打印出来信息,及日志存储位置 查阅日志,发现报了Max retries exceeded with url: /ready ,并且发现1的日志的server端口和这个访问的端口不同 查阅issue,发现有人在linux下编译是不支持anaconda版本python的,是不是我mac 的 python版本选择有问题? 再次查阅日志,发现server和vim用的不是一个python版本,于是在vimrc里同时配置了 let g:ycm_python_binary_path = ‘/usr/local/bin/python2.7’ let g:ycm_server_python_interpreter = ‘/usr/local/bin/python2.7’ 编译后发现好使了,很开心,但是出现另一个问题,系统经常报python崩溃了… 我也快崩溃了 改用python3编译,虽然编译时候还是报了一个require 3.3我用的是3.6,但是编译完后发现好使了,也没有报python崩溃 贴下现在配置 if &compatible set nocompatible "去掉有关vi一致性模式,避免以前版本的bug和局限 end set rtp+=~/.vim/bundle/Vundle.vim call vundle#rc() Bundle ‘VundleVim/Vundle.vim’ Bundle ‘Valloric/YouCompleteMe’ Bundle ‘dyng/ctrlsf.vim’ Bundle ‘kien/ctrlp.vim’ Bundle ‘scrooloose/nerdtree’ Bundle ‘scrooloose/syntastic’ Bundle ‘altercation/vim-colors-solarized’ Bundle ‘majutsushi/Tagbar’ Bundle ‘vim-airline/vim-airline’ Bundle ‘vim-airline/vim-airline-themes’ " 括号成对跳转 % 跳转 Bundle ‘tmhedberg/matchit’ " 多光标操作 Bundle ‘terryma/vim-multiple-cursors’ " , = 对齐 Bundle ‘godlygeek/tabular’ " 自动补全括号 Bundle ‘jiangmiao/auto-pairs’ " 多层括号变色 Bundle ‘luochen1990/rainbow’ " 保存vim编辑信息,比如最后的位置 Bundle ‘vim-scripts/restore_view.

用vim写golang踩坑

write golang in vim

qwding

1 minute read

vim 写golang碰到的爽点 自从转到了vim写golang, 越用越觉得舒服,几个爽点IDE媲美不了 返回上次动作地方,无论是跳文件还是跳操作行,都可以直接返回上次操作的地方,极舒服 根本不需要鼠标,不用写代码还感觉食指高度使用的难受了 可以装逼了 不爽 每摄入一门语言配环境是最折腾的,就像我的python环境还没配好,还用pycharm写呢 写golang时候居然有的不能跳转pkg 自动补全时候居然每次会卡1~2秒左右,不能忍啊! 不能跳转到pkg 开始以为是ctags的问题,但是发现有些pkg我并没有生成tags文件,但是还是能跳转过去,感觉ctags并不是我跳转的方式 仔细阅读vim-go,发现是gocode配合YCM跳转的,那就去读gocode文档,发现不得了的事情 gocode居然跳转是需要pkg生成相应的 .a 文件,深坑! 由于公司依赖很多都是Cgo写的,mac本地根本不可能编译一些pkg,自然就没有 .a 文件,而且查看issue说这个是一直诟病的问题 解决答案就是:我还解决不了!还好,就几个pkg,可以忍忍 自动补全卡1~2秒 之前以为是YCM的锅,后来发现写python 自动补全流畅的一逼,这锅YCM不接 那肯定出再了golang插件 运行一些神奇的命令调试 :profile start profile.log :profile func * :profile file * " At this point do slow actions :profile pause :noautocmd qall! 结果如下 FUNCTIONS SORTED ON TOTAL TIME 1264 count total (s) self (s) function 1265 21 4.449469 0.009312 <SNR>81_OnTextChangedInsertMode() 1266 18 4.

转战vim

my vim config

qwding

3 minute read

转战vim 环境改变人,周围有些用vim,并且感觉编码爽的飞起,于是决定转战vim 之前已经铺垫了几个月了,特意温习些快捷键,并且工作中联系使用,最近开始折腾IDE, 并且开始投入正式使用 折腾过程 先选择了大神spf13的配置, 然而,使用并不是很顺利,装上以后加载插件过多,打开大文件,和YCM自动补全延迟高,拉低了效率。并且很多插件真的并不会用到,比如说里面还有rails插件等。 于是果断放弃了spf13的配置,自己搞自己需要的。 安装bundle管理 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 贴出配置 if &compatible set nocompatible "去掉有关vi一致性模式,避免以前版本的bug和局限 end filetype off set rtp+=~/.vim/bundle/Vundle.vim call vundle#rc() Plugin ‘fatih/vim-go’ Bundle ‘undx/vim-gocode’ Bundle ‘Valloric/YouCompleteMe’ Bundle ‘dyng/ctrlsf.vim’ Bundle ‘kien/ctrlp.vim’ Bundle ‘scrooloose/nerdtree’ Bundle ‘altercation/vim-colors-solarized’ Bundle ‘tpope/vim-fugitive’ " Bundle ‘Yggdroot/indentLine’ Bundle ‘tmhedberg/matchit’ Bundle ‘Lokaltog/vim-easymotion’ Bundle ‘scrooloose/syntastic’ Plugin ‘nvie/vim-flake8’ " ‘tpope/vim-fugitive’ git 插件 " ‘dyng/ctrlsf.vim’ 搜索插件 " ‘Yggdroot/indentLine’ python 缩进线, 会有一点点卡 " ‘tmhedberg/matchit’ 括号成对跳转 % 跳转 " ‘Lokaltog/vim-easymotion’ 光标记录跳转 let g:solarized_termcolors=256 syntax enable set background=dark colorscheme solarized set guifont=Monaco:h13 set mouse=a " 鼠标滚动 set nu " 行号 filetype on " 检测文件的类型 set autoindent " vim使用自动对齐,也就是把当前行的对齐格式应用到下一行(自动缩进) set tabstop=4 " tab 4空格 set showmatch " 设置匹配模式,类似当输入一个左括号时会匹配相应的右括号 set incsearch " 搜索时候定位 set ic " 搜索不区分大小写 set hlsearch " 搜索高亮 set cursorline " 突出显示当前行 " set clipboard=unnamed " 系统剪切板 set confirm " 没有保存或文件只读时弹出确认 set autoread " 文件自动检测外部更改 " NERDTree 配置 map <C-e> :NERDTree <CR> " YCM 配置 let g:ycm_min_num_of_chars_for_completion=1 " 补齐字符数 let g:ycm_complete_in_strings = 1 " 字符串中也开启补全 " inoremap <expr> <CR> pumvisible() ?

2017

qwding

1 minute read

公司快黄了,开始找工作 在7月末,8月初,本来也并不是找工作的黄金时期来找工作,也是因为公司快黄了,该走了。 等出去面试后感觉,并不是很少人在跳槽,有的公司的资历老点的人整天都在面试,工作都要加班到后半夜,感觉也是不容易。 聊聊HR的坑 天真的我,以为实话实说并没有什么问题。于是在第一周的时候,hr会问,你为什么从前两家离职,我说上一家创业公司内部矛盾比较多,上下层有点脱节。 可谓是说了老东家的坏话,这TMD,只能说:我是傻逼! 说老东家坏话简直是一大禁忌,在周末的某个忧虑的晚上,突然深深感受到自己的傻逼,于是在接下来的面试,我都是说公司搬家,上班太远等等为借口了,效果还不错,感觉和hr应该没有聊的什么太大问题。 技术短板 其实面试的每家公司,基本都可以面到最后一面,但是给offer的寥寥,为什么?! 总结了一下无非几点 没有大公司经验,其实我并不认为去大公司怎么怎么好,相反可能了解的会更窄;但是这时候发现,却是必不可少的,很多公司更注重你之前的环境,大公司那种内涵吧,亦或许是 “这家伙已经过了大公司的面试,应该还是挺牛逼的”。 没有高并发和分布式经验。高并发指的啥,有几个公司可以说自己的量集很大是高并发,并且碰到很难解决的问题呢。即使是像抢购手机这样的高并发量,其实了解背后,也都是很简单粗暴的方式解决,并没有说你通过牛逼的代码就可以解决。但是人家就是要看你有没有这个经验。 数据库需求,有几个大厂,貌似对数据库要求比较高,像我这种可能没有真做过读写分离,数据库量级没有那么高,被问到一些mysql的尖酸问题,直接gg。 钱要的有点过,人家并不着急要人,这才是根本原因…. 这些年到底做了什么 看到上面几点,感觉这几年工作到底做了啥,是不是天天上班晃悠了 有点心酸,谁乐意晃悠到现在感觉找工作又很尴尬呢。找工作真的是一件很看运气的事,在现在公司我工做也是很认真,但是真正的工作内容可能并不适合我现在要找的方向,并不适合。 也许我在这里一直在擦屁股或者去擦屁股的路上(戴维营欢迎你 2333)。 说一说碰到的主要问题吧 golang gc实现,主要是三色标记过程 slice,map实现原理 golang的锁应用 chan的应用,sync.waitGroup,select 的timeout导致cpu激增。 var tmp interface{} = nil; tmp == nil 返回值(答案是false) 怎么优化gc停顿时间 pprof怎么调优 阅读过哪些golang写的源码: k8s,docker,beego等 其实遇到golang的问题,我一般还是都可以应对自如的,基本没啥问题 几个值得学习的问题 系统设计,比如说有个活动,设计一套系统:匹配对手,出石头剪子布,胜者可抽奖。设计这么套系统。 主要注意的点: 匹配对手,比赛出拳,抽奖,奖池。最主要考察的是,这是一个分布式高并发的系统。 算法,这个不用多说了,多刷题吧,一般不会太难,把递归搞通了可以处理大部分面试的难度。 linux 命令,一般awk,ss -s,sed等等吧,但是sed我是真用的不多,碰到gg。 弄得好不如白话的好 即使不是你做的,你可以白话成你做的 即使不牛逼,也可以白话的很牛逼 即使问题并不难,但是也可以白话好解决问题过程 其实面试还是一个心理挑战,你把面试官忽悠明白,让他认为你行就可以,而能力是其次的,你做事情的能力不如你白话的能力。

qwding

1 minute read

过程是这样的 因需求,写了一个小小的golang项目,但是在打包docker封装时候遇到了很奇怪的问题。 首先是我在linux编译好的程序,想打进alpine镜像(在我本地mac电脑做),发现打进去之后运行不了程序,报/bin/bash : binary not found . google一下,有说版本的,也有说别的的,但是关键是,这个镜像当时打包其他golang binary都没有问题。 然后我在我编译那台机尝试打包镜像,pull一个alpine镜像。bug… 跟docker启动device map有关…. 为了不影响其他应用,忍了把,我不用这个机器了行吧 返回用mac,无意间发现。。。我用mac交叉编译的程序,打到镜像里,居然可以跑,差异加惊喜。不管原因了,能跑就行。 我写的项目里用到了golang1.8的新功能plugin。跑那个模块时候居然报错,plugin:not implement. 懵逼ing… 之前跑都没有问题,为啥交叉编译以后再容器里那个模块就失效了!还报这个错。 到目前为止,感觉是两种环境,两个错误。日了狗一样… 最起码交叉编译那种有错误可查,翻了google没有人报这个错误啊!是没有这个错误。懵逼。。。 查源码吧。。。进到plugin目录,很开心看到只有3个文件,很开心看到文件都很短。什么? 很短?阅读以下。 这TM就结束了?逻辑呢? google一下。原来plugin因为bug这个版本取消了。用1.8beta可以用…. 好吧。下1.8吧。 官网… 没有… 没有beta版本。。。去golangtc.com下载吧。 我去… 超级慢,慢可以忍,最重要的是,下到一半,用chrome下载会挺掉,直接结束了有木有。好的,那我们就找个服务器curl吧,也跟拉便便一样慢,放那里慢慢下去吧。 然后非常不爽的我还换了几个alpine版本,均失败。后来我妥协了,下了一个ubuntu。麻蛋,一下就好使了,我好无语… 仅以此文吐槽下,居然忙了一下午

qwding

1 minute read

事情起因 最近接了个C++项目,结果编译完放到服务器上会报动态库版本不对,之后又是一个系统库不对,我粗暴的将CentOS 7(之前不知道系统是7…不然打死也不这么干啊) 的/lib64/libc.so.6 直接拷贝到了CentOS 6.5系统上,灾难发生了…. 所有命令用不了,傻逼了… 恰好那个服务器正跑着一个pv 几百万的项目,顿时压力山大 绝大部分命令都用不了,ls 命令都用不了了,本想将软链换回去,ln 不好使,怎么办! 后来查阅到命令ldconfig,专门管理动态库的,发现这个命令可以运行诶(哭笑脸)。 在查阅其参数,发现只有一个-l貌似可以用到,可是大部分博客都是这么写的: -l Manually link individual libraries. 并没有看到列子(哭笑脸) 抱着死马当活马医的心态试用如下 ldconfig -l /lib64/libc.so.6 /lib64/libc-2.12.so 居然好使了,福大命大! 后来检查发现,貌似这个命令只是临时更改软链,想永久改还是需要修改文件的。 ldconfig 写的感觉不错的链接:http://blog.csdn.net/unix21/article/details/12119861 主要还是管理linux的动态链接库的,安装动态链接库以后,需要将库目录放到 /etc/ld.so.conf 里面,再执行ldconfig,这时候会将库的信息放到 /etc/ld.so.cache(高速缓存机制)。 系统在使用库时候先去 /etc/ld.so.cache 目录下找,找到了再去 /etc/ld.so.conf 目录下找。所以如果 /etc/ld.so.cache 没有,那就找不到。到这里也就明白了,新加库,就要执行ldconfig,但是更新的话就不需要了 linux博大精深 不搞不知道,最近新接的别人的项目,发现写C的还是对底层能更是了解很多啊!linux很多东西用C写起来更能发挥效果啊。

使用root用户时候出现权限不够

permission denied when use user root.

qwding

1 minute read

非常费解的问题 写了一个logrotate的脚本,用crontab定时跑,非常费解的问题出现了,我单独跑logrotate怎么跑都没问题,但是放到crontab里就会出现权限不够的问题。其中就有使用curl权限不够,百思不得其姐! 有没有搞错,我是root用户啊,还出现权限不够的问题。 试过了将curl权限提到最高,赋给s权限,均失败。 google查阅curl permission denied / crontab permission denied / logrotate permission denied 均无果。 吐血。。。 过程 查阅系统日志(centos) cat /var/log/messages |grep curl Feb 21 14:52:01 client kernel: type=1400 audit(1487659921.234:2409): avc: denied { name_connect } for pid=26860 comm="curl" dest=2727 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket 什么鬼,看不懂,仔细查阅一下,查到SELinux。 我去,这不是之前搞mysql常遇到的问题么 修改 /etc/selinux/config SELINUX=disabled # 设置为disabled 测试crontab好使了! SELinux 这个是什么美国国家安全局,增加安全控制的东西 这个设置了enforcing时候,你的root用户其实也没毛多大用了,也是受限制的。 总之就是不让你动你运行程序以外的文件 纠错过程 很曲折,一直以为是crontab运行时候用户的问题,或者文件的权限问题,在root下还是报错,所以一直卡在那里。 最后能找到问题也是花费好多时间…… 好烦

2016

golang 几大主流框架对比

contrast of golang framworks

qwding

1 minute read

先上表格 如下表格是2016-11-24 日调研结果,2~5列为github数据。 benchmark: beego VS revel VS martini 三大老框架 beego beego 很多人比较熟悉,国人写的,框架主要逻辑是经典MVC形式。 中间件:中间件可以写在beego内置的prepare方法里。 取参:取Query需要自己提取,url参数可以用内置方法。 返回:返回比较固定,想修改返回code比较麻烦。 缺点: 书写unit testing很恶心。 他的侵入式代码风格,还有源代码的多层嵌套,很多人都不太喜欢。 revel revel 也是MVC框架,他的的形式是你在一个配置文件配置路由,当用revel工具执行revel run时候,将在项目目录下生产两个文件/tmp/main.go 和 /routs/routs.go .作用分别为注册路由和绑定路由内参数。 中间件:中间件可以定义在/init.go 里面。 取参:内置提供方法,并且有自己内置的validation方法,方便。 返回:提供多种返回方法。 缺点: 也是侵入式代码。 其他的未实际使用,不予评论 martini 书写简单,写起来和之后要讲的echo,gin很像,但是他的性能较echo和gin差了很多。 从功能上说,并且martini并不像beego和revel那样框架全面,需要自己把架子搭起来。 所以直接就不考虑了。 总结 性能上beego和revel两者不分伯仲,两者的侵入式代码也是为了节省更多的时间,带来了不少便利。对比起来更倾向于用revel做简单的web框架,他的取参和返回值带来的便利性更高一点,并且也会生成路由的testing方法,综合来讲下一次如果写简单的管理界面可能考虑使用revel。 fasthttp vs httpRouter 两者都作为http的框架,可以替代原生的http,他们的优越都是因为速度快,0占用内存著称。可以考虑将他们作为其他框架的http引擎,会提升很大速度。 gorilla mux gorilla 最大好处是他出发点为组件化,各个模块单独成一体,你需要哪个模块,拿过来用就行,不需要可以换成其他写法。 mux是帮你对router更容易管理,其速度来说并不是非常突出。但是docker swarm用的是gorilla mux,足见其有一定可用性。 对于gorilla其他模块,如果缺少哪个模块组件,完全去任你挑选,安全稳定可靠,开发好帮手。 echo VS gin 最想说的两个 无论哪个benchmark,这两个框架的benchmark都已绝对优势排在前列,性能绝对认可。 代码书写上,两个框架写法也很相似,非常简洁,几行代码可勾勒一个http server,如下为gin一个ping serve,是不是超级简单。 package main import "github.com/gin-gonic/gin" func main() { r := gin.

mongo 备份

mongo backup

qwding

1 minute read

mongo 备份 秉承方便简单,易搭建原则,还是用docker来实现,镜像地址(https://hub.docker.com/r/carlding/mongobackup/) docker hub找到一个镜像,istepanov/mongodump可以实现本地monogo的备份,查阅其内部脚本,并没有开放传入远程数据库的接口,于是在此基础上改进 Dockerfile FROM istepanov/mongodump ​MAINTAINER qwding ADD backup.sh backup.sh ADD start.sh start.sh backup.sh #!/bin/bash set -e echo "Job started: $(date)" DATE=$(date +%Y%m%d_%H%M%S) FILE="/backup/backup-$DATE.tar.gz" echo "mongodump -h $MONGO_PORT_27017_TCP_ADDR -p $MONGO_PORT_27017_TCP_PORT -u $MONGO_USER -p $MONGO_PASSWORD -d $MONGO_DB" mongodump -h $MONGO_PORT_27017_TCP_ADDR -u $MONGO_USER -p $MONGO_PASSWORD -d $MONGO_DB tar -zcvf $FILE dump/ rm -rf dump/ echo "Job finished: $(date)" start.sh #!/bin/bash set -e CRON_SCHEDULE=${CRON_SCHEDULE:-0 1 * * *} if [[ "$1" == ‘no-cron’ ]]; then exec /backup.

beego 如何不同环境用不同的runmode

Use different runmode of beego.

qwding

1 minute read

beego runmode修改 除了配置文件设置runmode,想切换环境时候需要手动改,太麻烦,而且容易忘 想通过如下两种方法尝试,均无效: flag,但是beego本身并没有flag,简直行不通 官方文档里个的方法是 beego.Runmode = “dev”, 但其实这个方法很鸡肋,很蛋疼,因为读配置文件早在程序运行前执行了,而如果再程序里修改runmode,你在init里用的参数必然还是默认写的,用着基本蛋疼。 我在我本地beego 1.7的环境里又尝试了一下,发现已经没有这个方法了,可能作者也觉得确实蛋疼给删了吧。 环境变量改变 尝试将配置文件的runmode指定为环境变量,然后指定具体模式。发现居然成功了。不管怎么样,确实这个办法还是一个不错的解决方案了 加上docker更好用 因为本来用docker,这样直接在Dockerfile里设置ENV,部署线上的时候,直接用构建好的镜像启动就ok了,什么都不用改了。 懒人使人进步

How golang slice Semi - pointer.

golang slice怎么个半指针传递

2 minute read

起因 刷leetcode的77题时候,使用了递归方法,并且使用数组时候如下 result := make([][]int, 0, length+1) recursive([]int{}, 1, n, k, result) 第一次使用了cap声明slice,这样的好处是append时候在length后添加数据,并且保证长度够,append时候不会重新申请地址 但是跑的时候发现,recursive()后,在返回到此段代码,居然什么都没有!result值没变。 什么? slice不是传说的指针传递么? 先看下官方数组结构样子 当然,一直知道数组是半指针,就是将数组的地址的值传进去。在函数里是改变不了指针的值,但是可以操作指针指向的数据,详细的google有很多 我想象的是这样:函数收到的是数组的头地址(就是图最上面的指针),length和cap等数据,这样可以完全接管数组的操作了 但是上述起因里出现的问题却不是这样,到底是什么原因呢?于是写了测试代码 func main() { result := make([]int, 0, 10) addr := &result fmt.Println("result:", result, "addr:", unsafe.Pointer(addr)) for i := 0; i < 10; i++ { functions(result) result = append(result, i) //appendData(result,i) } fmt.Println("result:", result, "addr:", unsafe.Pointer(addr)) } func functions(arr []int) { addr := &arr if len(arr) > 0 { fmt.

Docker容器里获取宿主机用户

Get host user in docker container

qwding

1 minute read

尝试方法 映射宿主机文件到容器,试过几个文件,但是都效果并不好 启动容器前执行命令将用户写入文件,再启动容器 echo echo $USER > tmp.file && docker run -it alpine /bin/sh 但是遇到问题,就是我在容器的里的程序删除文件会遇到文件忙,没有深究原因 突然想到了我们启动容器的时候经常用 -v pwd:/folder。这样应该是执行了shell命令,那么能不能在冒号右侧执行呢。于是测试了一下发现可行。 将命令改为 docker run -it -e HOSTUSER=echo $USER apline /bin/sh //测试 $/ echo $HOSTUSER 结果正确 举一反三 既然可以这么获得用户名,那么其实也可以获得其他宿主机信息了,系统信息,能用shell获得的命令,都可以在启动容器时候传入环境变量

Evernote vs youdao

印象笔记和有道云笔记对比

qwding

1 minute read

Evernote 之前一直用evernote,也没发现什么优点,本人流量一直没有超过60M/月限制,所以基本来说只用云笔记部分 编辑功能,不得不吐槽,我除了会在文本前面加点或者用tab分级外,其他什么编辑功能都不会,甚至有时候被他的带格式粘贴搞迷糊好半天 编辑工具栏,默认的居然是黑色,字体已经是黑色了,你这个黑色有毛用啊。调个颜色半天都有次还调不出来。 前几天有出现了限制2台硬件绑定。纳尼???弃用弃用,没商量 有道云笔记 因为国内的好像也就是有道了,其他的有些偏向团队,有些偏向会议之类的 发现有道的分级比Evernote爽一万倍,虽然功能简单,但是从之前那么蛋疼转过来爽了真的不是一点半点 发现有道V2.1.0版本居然可以直接将pdf等直接传到目录下直接观看,保存文档,整理笔记更近一步啊! 有道居然可以用markdown,一些用markdown写的文档直接保存就ok了 有道有个缺点,就是一次我只圈中了一小部分文档复制,粘贴的时候居然带了整行的格式,日了狗了,恰恰粘贴的是密码,而且是那种特殊密码,以为是密码问题了,搞了好久 无意间发现点击链接直接在有道内部上网,内部内置了浏览器?吐槽一下,有毛用啊,我肯定是去浏览器查看链接啊 VS 查看两者之后是不是感觉有道云笔记完爆了Evernote,但是,还别急 用了一阵后,发现 有道居然超级吃内存,我8G的mac,刚开始用的时候,转移了部分笔记,已经吃到了800M,今天有略加了几个pdf,已经超过1.1G了,笔记容量加起来都不过几十M啊,简直可怕!!!相比之下,evernote一般都保持在200M左右,还是比较安静的,从来不会因为内存着急。 据他人说,有道想修改附件的话,必须下载下来,编辑后再传上去才行,但是evernote直接可以在线编辑 有道虽然有markdown,但是不能搜索,原因当然是显示的时候已经转成html,而html并不支持搜索。可是你也可以在md原文搜索啊!但是并没有,也就是说我写了md,就丧失了搜索功能。而我认为在云笔记这么庞大的东西面前,搜索才是最重要的,类似于mac的alfred,快速定位才行。相比evernote搜索用着还是可以接受的,当前目录和全局搜索两选项,而有道只能在当前目录下,如果想搜全局还有用鼠标在点下全局文件夹,恰恰我用的最多的是全局搜索。 总结 总的来说,两个都不想用 Evernote编辑功能不爽,还有设备限制(本人恰巧需要三台) 有道云笔记太吃内存,如果不吃这么多内存基本就用了,但是吃这么多内存搞得我8G都不够用了 基本想找一款更好的云笔记软件,也希望获得推荐 使用体验持续更新…

go map,slice,array 遍历性能测试

golang testing about iterating map,slice,array.

qwding

2 minute read

#就是随便试试 听说goalng的map和slice的遍历性能差的不是一点半点,于是没事写个benchmark来玩玩 代码 package testings import( "testing" "strconv" ) var length = 1000 var maps map[string]string var slices []string var arrays [1000]string func init(){ maps = make(map[string]string,length) slices = make([]string,length) for i:=0;i<length;i++{ maps[strconv.Itoa(i)] = "abc" slices[i] = "abc" arrays[i] = "abc" } } func BenchmarkIterateMap(b *testing.B){ for i:=0;i<b.N;i++{ for , = range maps{ } } } func BenchmarkIterateSlices(b *testing.B){ for i:=0;i<b.N;i++{ for , = range slices{ } } } func BenchmarkIterateArrays(b *testing.

shell execute mongo/mysql which start by docker.

在实例方法内修改实例地址

1 minute read

#问题初衷 打算一键部署带权限验证的mongo。但是docker hub官方镜像创建mongo步骤为: docker run –name mongodb -d -p 27017:27017 mongo:3.3 –auth docker exec -it mongodb mongo admin db.createUser({ user: ‘root’, pwd: ‘root’, roles: [ { role: "root", db: "admin" } ] }); 打算将其做成脚本 #用shell实现 经过查阅,发现shell的 <<EOF 可以实现,查阅资料 http://my.oschina.net/u/1032146/blog/146941 应该可以实现,于是写了脚本 #!/bin/bash mongo admin << EOF db.createUser({ user: ‘root’, pwd: ‘root’, roles: [ { role: "root", db: "admin" } ] }); exit; EOF 在mongo 启动的容器内执行脚本,成功! #直接写脚本启动容器(error) !/bin/bash docker run –name mongodb -d -p 27017:27017 dhub.

golang: change instance address in his method

在实例方法内修改实例地址

1 minute read

前提回顾 对于结构体中的指针应用,大部分可能知道的是如下两代码的区别 func (a *AA) funcA() func (a AA) funcB() 区别在于,我们在funcA内修改a的值,是可以成功的,但是在funcB修改a的值是失败的。 因为funcA中的a是指针传递,funcB中的a是值传递。这个大家都知道。 今天话题 先上代码 package main import ( "fmt" ) type AA struct { xyz string opq string } func (this *AA) Change() { b := &AA{xyz: "xyz1", opq: "opq1"} this = b fmt.Println("in this:", this, "addr:", &this) } func main() { a := &AA{xyz: "xyz0", opq: "opq0"} fmt.Println("before a:", a, "addr:", &a) a.Change() fmt.Println("after a:", a, "addr:", &a) } 那么问题来了,请回答一下程序执行过程的三个输出是什么。

2 minute read

一般形式 在官方文档,或者百度谷歌,搜到的portus一般都是compose形式搭建,这样好处是操作无脑 但是一般情况下我们肯定是自己要更灵活一些的,肯定用docker容器形式更舒服一点。可是去dockerhub一搜,各种版本的镜像,查看dockerfile很多人都自己加了一些内容,对于不会ruby的人来说,并不知道那些操作都说干啥的。 自己研究研究 github master分支上有dockerfile,如下 FROM library/rails:4.2.2 MAINTAINER Flavio Castelli <fcastelli@suse.com> ENV COMPOSE=1 EXPOSE 3000 WORKDIR /portus COPY Gemfile* ./ RUN bundle install –retry=3 # Install phantomjs, this is required for testing and development purposes # There are no official deb packages for it, hence we built it inside of the # open build service. RUN echo "deb http://download.opensuse.org/repositories/home:/flavio_castelli:/phantomjs/Debian_8.0/ ./" >> /etc/apt/sources.list RUN wget http://download.opensuse.org/repositories/home:/flavio_castelli:/phantomjs/Debian_8.0/Release.key && \ apt-key add Release.

hugo vs hexo

contrast hugo with hexo

1 minute read

hugo 和 hexo 对比 主要是查阅了一下很多人经验,并汇总了一下对比结果 hexo hugo 速度 快 特别快 主题 几大主题基础上延伸,总量更多 很多,良好主题生态圈 安装及更新 更新容易有坑,因为依赖包 一个binary,安装更新快 评论系统 支持disqus等 支持disqus等 应用方面 博客适应性更强 非博客适应性更强 文档 有中文文档 文档超详细,中文不全 功能 分类,tag,多语言,i18n 分类,tag,series,wight,多语言 因为本身更喜欢golang,所以选择了hugo 分享一下查阅的资料 十种静态页面生成工具 hexo 文档 hexo 中文文档 hexo 一篇比较好的使用文章 hugo 文档 hugo 中文文档 hugo 主题 gitlab pages gitlab 8.3以后也出了github pages的功能,但只限gitlab-ee版本,需要付费 gitlab-ee docker安装 gitlab pages使用