跟随,学习,进步

邹超

zouchao | 热爱PHP,RUBY,专注于web开发. 撸起袖子加油干!

https://zouchao.me/

邹超的博客,沉醉于php与ruby的海洋,专注于web开发.一个记录轻度间隙整理控,轻度代码洁癖的程序猿生活和学习的地方.

转到作者网站

记录一次mysql升级之后rails遇到的问题

mysql升级之后数据文件夹共用, 但是无法使用db:migrate 错误信息大致如下: E, [2019-02-14T11:06:23.650106 #68912] ERROR -- : Mysql2::Error: Table 'performance_schema.session_variables' doesn't exist: SHOW VARIABLES LIKE 'character_set_database' rake aborted! ActiveRecord::StatementInvalid: Mysql2::Error: Table 'performance_schema.session_variables' doesn't exist: SHOW VARIABLES LIKE 'character_set_database' 解决方式: mysql_upgrade -u 用户名 -p --force 然后一定记得重启mysql服务


给终端设置代理

如下是初级工程师Bob和老程序员Bill的又一个故事。 Bob:我这golang装个包太困难了。动不动就time out Bill:开代理啊 Bob:开了,我有shadowsocks, 而且我开了全局代理. Bill: 那你一定是没有给你的终端设置http代理。ss设置的系统代理是socks5代理, 给你一个教程吧! 教程 首先找到ss里面的HTTP Proxy Preference, 如下图: 然后查看你的端口: 在~/.bashrc或者~/.zshrc中加入如下代码: # alias for proxy alias proxy="export http_proxy=http://127.0.0.1:1087 && export https_proxy=http://127.0.0.1:1087" alias unproxy="unset http_proxy && unset https_proxy" alias ip="curl https://ip.cn" 检查是否使用代理


Go语言如何实现单例模式

单例模式是常见的设计模式,被广泛用于创建数据库,redis等单实例。作用在于可以控制实例个数节省系统资源 特点: 保证调用多次,只会产生单个实例 全局访问 单例的分类 单例模式大致分为2大类: 懒汉式: 指全局的单例实例在第一次被使用时构建。 饿汉式: 指全局的单例实例在类装载时构建。 sync.Once 这里我们不做一步一步的演进,哪种好,哪种不好见仁见智。我们来看看golang中如何实现单例模式: type singleton struct{} var ins *singleton var once sync.Once func GetIns() *singleton { once.Do(func(){ ins = &singleton{} }) return ins } sync.Once源码解读 package sync type Once struct { m Mutex done uint32 } func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { // 保证原子性操作,加载标记,如果存在直接返回 return } // Slow-path. o.m.Lock() // 加锁进一步保证f()方法只能被执行一次 defer o.m.Unlock() if o.done == 0 { defer atomic.StoreUint32(&o.done, 1) // 设置标志 f() // 注意:如果f()内部报错,sync.Once仍然不会执行第二次 } }


Go语言学习笔记

Golang基础 一. 变量、常量 内置支持utf8编码 fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい\n") _下划线是个特殊的变量名,任何赋予它的值都会被丢弃。 _, b := 34, 35 在方法 func 内申明的变量必须使用,全局变量则不用,但是尽量不要定义不使用的变量 常量的定义最好都大写,虽然不做强制要求,但保持好的习惯 常量声明省略值时,默认和之前一个值的字面相同。 分组申明常量时iota,的值表示为const的行数的值,从0开始 const ( a = iota //a=0 b = "B" c = iota //c=2 d, e, f = iota, iota, iota //d=3,e=3,f=3 g = iota //g = 4 ) 二. 内置基础类型 整数类型有无符号uint和带符号int两种。 rune是int32的别称,byte是uint8的别称。 整数类型位数对应表 类型名称 有无符号 bit数 int8 Yes 8 int16 Yes 16 int32 Yes 32 int64 Yes 64 uint8 No 8 uint16 No 16 uint32 No 32 uint64 No 64 int Yes 等于cpu位数 uint No 等于cpu位数 rune Yes 与 int32 等价 byte No 与 uint8 等价 uintptr No - 不同类型的变量之间不允许互相赋值或操作 var a int8 var b int32 c:=a + b 另外,尽管int的长度是32 bit, 但int 与 int32并不可以互用。 字符串不允许使用单引号' 在Go中字符串是不可以直接修改的 var s string = "hello" s[0] = 'c' // 报错: cannot assign to s[0] // 如果硬要修改可如下方式: // 1. 将字符串 s 转换为 []byte 类型 c := []byte(s) c[0] = 'c' // 或者c[0] = 99, 单引号 == ASCII码值 s2 := string(c) // 再转换回 string 类型 fmt.Printf("%s\n", s2) // cello // 2. 通过+号连接2个字符串 s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作 fmt.Printf("%s\n", s) // cello ` 括起的字符串为Raw字符串,即字符串在代码中的形式就是打印时的形式,它没有字符转义,换行也将原样输出。 数组的长度是固定的,不可改变 a := [3]int{1, 2, 3} // 声明了一个长度为3的int数组 数组作为参数传递的时候是传递的副本,而不是它的指针, 而slice可以传递指针 array[i:j]的长度是j - i // 声明一个含有10个元素元素类型为byte的数组 var ar = [10]string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} // 声明两个含有byte的slice var a []string // a指向数组的第3个元素开始,并到第五个元素结束, a = ar[2:5] //现在a含有的元素: ar[2]、ar[3]和ar[4] fmt.Println(a) // output: [c d e] slice总是指向一个底层array map和其他基本型别不同,它不是thread-safe,在多个go-routine存取时,必须使用mutex lock机制 make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。 new返回指针 make返回初始化后的(非零)值


如何使用Visual Studio Code调试Golang程序

最近想玩玩golang,同事安利了一个编辑器Visual Studio Code, 是用nodejs开发的,用起来十分趁手,如何配置golang的环境就不表了,网上帖子一大把,自行查阅。 今天只说说如何用VSCode的debug模式调试Golang: 在VSCode中打开你的package main的文件 (Shift) ⇧ + (Command) ⌘ + D呼出debug侧边栏 点击绿色三角形符号的Start Debugging按钮 第一次使用VSCode会自动判断你的语言类型,生产如下的一个launch.josn文件 成功之后会在你所在的项目目录下生产如下2个文件 debug .vscode/launch.json git status也能看到他们,所以别忘了把他们加到.gitignore文件中去哦 当然你也有可能和我一样遇到如下问题: 2017/11/24 15:34:15 server.go:73: Using API v1 2017/11/24 15:34:15 debugger.go:96: launching process with args: [/Users/sean/Code/Go/src/go_bms_web/debug] could not launch process: exec: "lldb-server": executable file not found in $PATH Process exiting with code: 1 没关系,在terminal中执行如下语句,就可以了 xcode-select --install


after_save和after_commit使用的误区

Callbacks are methods that get called at certain moments of an object’s life cycle. With callbacks it is possible to write code that will run whenever an Active Record object is created, saved, updated, deleted, validated, or loaded from the database. 以上是RailsGuides对ActiveRecord的回调的解释,大致意思是: 回调是在对象生命周期的特定时刻执行的方法。回调方法可以在 Active Record 对象创建、保存、更新、删除、验证或从数据库中读出时执行。 我们有很多场景都会用到,但是某些情况你可能会发现其实他们也没有你想象中那么好用,比如说,你有一个问答网站,并希望所有的问题都能被搜索到,为了搜索的效率你又引入了ElasticSearch,es的数据需要索引,而为了构建索引的效率以及实时性,你又引入了sidekiq。听起来很复杂,其实这种比你想象中要常见的多。 而此时视乎是使用after_save的绝佳时机,因此,在你的模型中,你大概会这样写: app/models/question.rb class Question QuestionIndexerJob} 哎哟,什么情况?不是只换了一个回调方法嘛,而且作用都差不多。发生了什么? 默认情况下,rails的测试是每个测试用例使用 ** 一个事物 ** 包裹,这确实对测试效率提升很大。只需一个指令即可撤销在该测试用例中执行的所有数据库操作。因此你的数据在保存的时候并没有事物提交,so你的after_commit也根本不会执行。 其实这个问题也有一个比较简单的方式来解决,那就是引入一个叫test_after_commit的gem包: Gemfile group :test do gem "test_after_commit" end 这样有after_commit的回调就能在测试中再加一层事物, 得到我们想要的效果。但是也许你还是会觉得别扭,为毛我要为这事儿单独去加载一个gem?你是对的,这非常别扭。但是这事也不会持续太久了,因为rails5中已经修复了这个问题:https://github.com/rails/rails/pull/18458 本文译自: A Couple of Callback Gotchas (and a Rails 5 Fix) | Justin Weiss's blog


安装Laravel Homestead遇到的坑

一、安装条件 由于VMWare需要收费,本章只介绍安装Vagrant和VirtualBox所遇到的麻烦,首先请在如下 网站下载和自己系统匹配的安装包,并完成安装 VirtualBox: https://www.virtualbox.org/wiki/Downloads Vagrant: https://www.vagrantup.com/downloads.html 然后 vagrant box add laravel/Homestead 二、安装中断,没法继续? 兴高采烈安Homestead,网速太渣报错误: 无奈又来第二次,结果始终报如下错误: 解决办法: rm ~/.vagrant.d/tmp/* 三、更好的方式 更好的方式还是直接下载下来文件,但是用p2p工具的同学千万记住不要用离线下载, 也千万不要用高速通道,就是这么残忍,坑在这里: 没错 当你下载的文件名叫virtualbox.box那么你很可能已经陷入这个深坑了,正确的文件名大致是这样的hc-download,下载完毕了再修改文件名后缀 貌似还有一种方式: vagrant box add laravel/Homestead -c 加-c参数,作用是断点续传,但是我亲试之后还是有问题的,只怪我网络环境特别不好,一、两次可以,多几次之后并没有断点续传。不知道是不是我的问题。大家可以试试,成功的话,希望评论告知,感激 四、福利始终在最后 提供的版本homesteam0.3.0_virtualbox.box 百度云盘下载链接: http://pan.baidu.com/s/1jGfIahw 密码: 9xbp


苹果优惠及选购

思想针扎: 最近在公司猴群的怂恿和嘲笑下确实考虑入手一台mac book pro了,都说mac能给程序猿幸福感带来值的提升,加之朕的虚拟机惊吓了寡人。遂思虑再三决定把跟了自己三年的T430放进书包做为珍藏了。主要的针扎点还是穷……(┬_┬) 金牛座本质暴露: 去了官网看了下价格,品质要求(其实因为穷,想买了多用几年),因此决定选顶配。在15inch和13inch间纠结了良久15inch有显卡,13inch外观美观性价比高。据说金牛座是对价格和质量皆有要求的纠结奇葩星座。最后女朋友帮忙拿定了注意要13inch。也好,打消了玩游戏的念头再看13inch各种好。轻便,美观,而且带有新配Force Touch 触控板。。。嘎嘎,下单, 点了分期,阿西吧。。。免息呢?居然没有了。。。各种犹豫啊。。。 福利: 福利来了,在多番尝试,搜索下以及果粉群分享。得知Apple免息还是存在的并且得到了具体的链接,感谢google,感谢强大的果粉,感谢金牛座的视钱如命。接下来放出链接来和大家分享,有钱人请绕道。。。 默认进入商店是cn没有免息: http://store.apple.com/cn/buy-mac/macbook-pro cn-k12是教育优惠不免息: http://store.apple.com/cn-k12/buy-mac/macbook-pro cn_cmb是招行12期免息: http://store.apple.com/cn_cmb/buy-mac/macbook-pro cn_cmb_edu是招行教育优惠+12期免息: http://store.apple.com/cn_cmb_edu/buy-mac/macbook-pro cn_icbc是工行12期免息: http://store.apple.com/cn_icbc/buy-mac/macbook-pro cn_icbc_edu是工行教育优惠+12期免息: http://store.apple.com/cn_icbc_edu/buy-mac/macbook-pro 还有一个网站要推荐:http://buyersguide.macrumors.com,这个网站会根据苹果产品发布周期,以及确切新闻,和mac各产品新增配置给出一些建议现在是否合适购买各个产品,看完之后再次确定13inch是我的最佳选择啊。o(∩_∩)o 哈哈


VirtualBox无法启动报错

由于本屌穷且爱折腾,因此目前大多数时候的工作环境都是在linux虚拟机下面。虽然有备份但是一般也是几个月的周期才备份一次(原谅我是个懒人) 但是就在今天来公司我发现我的虚拟机居然神奇般的打不开了 不能为虚拟电脑 Centos 打开一个新任务. VM cannot start because the saved state file ‘F:\VirtualBox VMs\Centos\Snapshots\2015-06-03T02-43-10-456513000Z.sav’ is invalid (VERR_FILE_NOT_FOUND) Delete the saved state prior to starting the VM. 返回 代码:VBOX_E_FILE_ERROR (0x80BB0004) 组件:Console 界面:IConsole {db7ab4ca-2a3f-4183-9243-c1208da92392} 这个可给我吓出一身冷汗啊,今天还必须的完成一个重要的项目呢。 不过还好感谢万能的GOOGLE,查到了解决办法,因此留文存档,用以警示自己帮助他人。 解决办法(本方案只针对virtual box): 打开Oracle VM VirtualBox管理器主界面(GUI) - 控制 - 清除保存的状态(I)


Vundle管理vim插件

使用Vundle管理安装vim插件 $ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 再在vimrc加类似如下配置: set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'gmarik/vundle' Plugin 'tpope/vim-fugitive' Plugin 'Lokaltog/vim-easymotion' . # 此处放置你需要安装的插件 . call vundle#end() filetype plugin indent on " required! 然随意打开一个vim窗口 $ vim :PluginInstall 我的vimrc: if has('gui_running') " set background=light set background=dark else set background=dark endif let g:solarized_termcolors=256 set tabstop=2 set shiftwidth=2 set laststatus=2 " set dictionary+=$HOME/.mydict " set dictionary+=/usr/share/dict/words set isk+=- "把-分割的单词视为一个整体 " set mouse=nv set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 set autoindent set cindent set sw=2 set ts=2 set expandtab set number " 行号 syntax on " 语法高亮 syntax enable autocmd FileType php setlocal tabstop=4 shiftwidth=4 softtabstop=4 textwidth=79 nnoremap v vnoremap gv let mapleader = "," map :%s/\s*$//g:noh "移除行尾空格 nmap :NERDTreeToggle nmap ff :NERDTreeFind nmap gb :Gblame imap zsj =strftime("%F %T") "set cursorline "高亮光标所在行 let Tlist_Use_Right_Window=1 "方法列表放在屏幕的右侧 set list set listchars=tab:,.,trail:.,extends:#,nbsp:. let g:vim_markdown_folding_disabled=1 set guifont=Monaco:h15 set nocompatible " be iMproved filetype off " required! set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle " " required! Plugin 'gmarik/Vundle.vim' " My Plugins here: " " original repos on github Plugin 'tpope/vim-fugitive' Plugin 'Lokaltog/vim-easymotion' Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} Plugin 'tpope/vim-rails.git' Plugin 'L9' Plugin 'FuzzyFinder' Plugin 'kien/ctrlp.vim' " Plugin 'vim-scripts/snipMate' Plugin 'mattn/emmet-vim' Plugin 'scrooloose/nerdtree' Plugin 'groenewege/vim-less' Plugin 'kchmck/vim-coffee-script' Plugin 'slim-template/vim-slim' Plugin 'yaymukund/vim-rabl' Plugin 'godlygeek/tabular' Plugin 'plasticboy/vim-markdown' Plugin 'eikenberry/acp' Plugin 'airblade/vim-gitgutter' Plugin 'honza/vim-snippets' Plugin 'altercation/vim-colors-solarized' call vundle#end() filetype plugin indent on " required! colorscheme solarized " " Brief help " :PluginList - list configured bundles " :PluginInstall(!) - install(update) bundles " :PluginSearch(!) foo - search(or refresh cache first) for foo " :PluginClean(!) - confirm(or auto-approve) removal of unused bundles " " see :h vundle for more details or wiki for FAQ " NOTE: comments after Plugin command are not allowed..