May 10, 2016
mysql 数据表读锁机制详解
"为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。 **一、概述 ** MySQL有三种锁的级别:页级、表级、行级。 MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。\n从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并 …"
May 9, 2016
修改gitlab的项目部署url地址
"\u0026lt;刚在centos7上部署了最新版本的gitlab 8.7.3,发现在创建的git项目地址为http://localhost/username/www.git ,外网无法访问,这时我们只需要修改一个配置文件即可。我安装的时候全部使用的默认配置,路径为 /var/opt/gitlab/gitlab-rails/etc/,配置文件为 gitlab.yml ,文件顶部配置如下:\nhost: localhost port: 80 https: false 修改host值为你想使用的外网域名或服务器IP地址即可,保存退出。\ngitlab-ctl restart 注意这里的命令是restart不是 reconfigure(根据配置文件/etc/gitlab/gitlab.rb 重新生成配置) ,否则还会恢复原来的配置。\n用ps -ef | grep nginx命令看了下,发现运行的nginx的路径是/opt/gitlab/embedded/sbin/nginx,而配置文件路径是/var/opt/gitlab/nginx,怪不得我打开/etc/nginx/nginx.conf没看到gitlab …"
April 18, 2016
Mac上使用Brew 进行PHP多版本管理
"http://yansu.org/2014/09/26/use-old-version-of-brew-php.html\n版本切换方式 通过brew安装的php可以通过 brew link 和 brew unlink 来切换不同版本。\n例如\nbrew list brew unlink php56 brew link php55 大版本可以用 brew list 来查,如果是小版本的话只能去 /usr/local/Cellar/php55 看了。这个时候使用 php-version 可以更方便一点。\n我测试的此方法不行,只能使用php-verson 进行切换。\n安装 php-version php-version 是一个帮助管理从brew安装的php版本切换的工具。\n安装非常简单\nbrew install php-version 然后执行\n\u0026lt;span class=\u0026#34;nb\u0026#34;\u0026gt;source\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;k\u0026#34;\u0026gt;$(\u0026lt;/span\u0026gt;brew --prefix …"
April 18, 2016
HomeBrew中国镜像源
"Mac 终端跑入即可\ncd /usr/local/ git remote set-url origin http://mirrors.ustc.edu.cn/homebrew.git #或者这个: git remote set-url origin git://mirrors.tuna.tsinghua.edu.cn/homebrew.git brew update 如果还是感觉慢,看看这个: https://mirrors.tuna.tsinghua.edu.cn/help/homebrew/\ncd ~/tmp git clone git://mirrors.tuna.tsinghua.edu.cn/homebrew.git rm -rf /usr/local/.git rm -rf /usr/local/Library cp -R homebrew/.git /usr/local/ cp -R homebrew/Library /usr/local/ 然后重试update。\n使用homebrew-science或者homebrew-python cd …"
April 13, 2016
JWT介绍
"JWT是什么\nJWT全称是JSON Web Tokens,是RFC 7519标准,用于安全校验两方可信性的安全措施。\nJWT解决了哪些问题?\nJWT本身设计是用于解决Session机制不能够很好的在SPA/API类型(restful)应用中处理身份认证问题。通常API的调用是无状态(stateless)的,使用Session等形式会有上下文要求。如当用户登录完成后,可以通过下发JWT的形式进行无状态的API调用。在此之前通常是使用的方式包括不限于如Basic Auth、Oauth2或Token形式进行。\nJWT相比是额外添加了签名校验方式,本质上来说对抗如暴力碰撞等形式有一些作用。但是由于本身长度的限制,存储的信息量有限。\nJWT处理方式\nJWT内容主要分为三段,分别对应头部信息,存储数据和签名信息三部分,中间使用『.』符号连接,三段信息均进行Base64编码。\n具体实现方式可参考如下伪代码实现:\nencodeBase64(header) + ‘.’ + encodeBase64(payload) + ‘.’ + Sign(key + encodeBase64(header) + …"
April 3, 2016
[翻译]理解 GO 语言的内存使用
"许多人在刚开始接触 Go 语言时,经常会有的疑惑就是“为什么一个 Hello world 会占用如此之多的内存?”。 Understanding Go Lang Memory Usage 很好的解释了这个问题。不过“简介”就是“简介”,更加深入的内容恐怕要读者自己去探索了。另外,文章写到最后,作者飘了,估计引起了一些公愤,于是又自己给自己补刀,左一刀,右一刀……\n————翻译分隔线————\n理解 Go 语言的内存使用 2014年12月22日,星期一\n温馨提示:这仅是关于 Go 语言内存的简介,俗话说不入虎穴、焉得虎子,读者可以进行更加深入的探索。\n大多数 Go 开发者都会尝试像这样简单的 hello world 程序:\npackage main import ( \u0026#34;fmt\u0026#34; \u0026#34;time\u0026#34; ) func main() { fmt.Println(\u0026#34;hi\u0026#34;) time.Sleep(30 * time.Second) } 然后他们就完全崩溃了。\n这个笔记本也只有 16 G 内存!\n虚拟内存 vs 常驻内存 Go 管理内存的方式可能与你以前使用的 …"
March 25, 2016
Profiling Go Programs
"转自: http://blog.golang.org/profiling-go-programs (需翻墙)\nThe Go Blog Profiling Go Programs 24 June 2011\nAt Scala Days 2011, Robert Hundt presented a paper titled Loop Recognition in C++/Java/Go/Scala. The paper implemented a specific loop finding algorithm, such as you might use in a flow analysis pass of a compiler, in C++, Go, Java, Scala, and then used those programs to draw conclusions about typical performance concerns in these languages. The Go program presented in that paper runs quite …"
March 24, 2016
golang中并发实例
"package main import ( \u0026#34;fmt\u0026#34; //\u0026#34;runtime\u0026#34; \u0026#34;os\u0026#34; \u0026#34;runtime/pprof\u0026#34; // 引用pprof package \u0026#34;time\u0026#34; ) func main() { f, _ := os.Create(\u0026#34;profile_file\u0026#34;) pprof.StartCPUProfile(f) // 开始cpu profile,结果写到文件f中 defer pprof.StopCPUProfile() // 结束profile startTime := time.Now().Second() //runtime.GOMAXPROCS(runtime.NumCPU()) // 注意这里的缓存大小 ch := make(chan int, 100) quit := make(chan bool) // 注意这里把读取chan操作放在了写入chan之前了(为了安全建议对chan的goroutines读取放在前面,写入放在后面) // 如果把这行放在了for逻辑后面,则上 …"
March 24, 2016
在Golang中使用json
"由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章。\n包引用 import ( \u0026ldquo;encoding/json\u0026rdquo; \u0026ldquo;github.com/bitly/go-simplejson\u0026rdquo; // for json get )\n用于存放数据的结构体 type MyData struct { Name string json:\u0026quot;item\u0026quot; Other float32 json:\u0026quot;amount\u0026quot; }\n这里需要注意的就是后面单引号中的内容。\njson:\u0026quot;item\u0026quot;\n这个的作用,就是Name字段在从结构体实例编码到JSON数据格式的时候,使用item作为名字。算是一种重命名的方式吧。\n编码JSON var detail MyData\ndetail.Name = \u0026ldquo;1\u0026rdquo; detail.Other = \u0026ldquo;2\u0026rdquo;\nbody, err := json.Marshal(detail) if err != nil { …"
March 24, 2016
golang的json操作
"package main import ( \u0026#34;encoding/json\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;os\u0026#34; ) type ConfigStruct struct { Host string `json:\u0026#34;host\u0026#34;` Port int `json:\u0026#34;port\u0026#34;` AnalyticsFile string `json:\u0026#34;analytics_file\u0026#34;` StaticFileVersion int `json:\u0026#34;static_file_version\u0026#34;` StaticDir string `json:\u0026#34;static_dir\u0026#34;` TemplatesDir string `json:\u0026#34;templates_dir\u0026#34;` SerTcpSocketHost string `json:\u0026#34;serTcpSocketHost\u0026#34;` SerTcpSocketPort int `json:\u0026#34;serTcpSocketPort\u0026#34;` Fruits …"