技术文章

  • Go 语言中使用 defer 的几个场景

    2018-05-20 15:04:16 31230 0 技术文章

    简化资源回收,相当于析构函数

    在 Go 语言中,没有析构函数,如果需要在实例完成后进行资源回收的情况,可以使用 defer 语句。 defer 是先进后出,这样做很合理,后面的语句会依赖前面的资源,如果先前面的资源先释放了,那后面的语句就没法执行了。 当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的。 使用示例:

    func set(mu *sync.Mutex, i int) {
        mu.Lock()
        mu.Unlock()
    }
    

    panic 异常捕获,recover 只能在 defer 语句中使用

    使用方法如下:

    func main() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println(r)
            }
        }()
        panic("Error")
    }
    

    修改返回值,适用于特定场景

    func doubleSum(a, b int) (sum int) {
        defer func() {
            sum *= 2
        }()
        sum = a + b
    }
    

    安全回收资源,即使 panic 抛出异常,recover 也可捕获

    不使用 defer 的情况,前面的语句出现异常,后面的语句就没有机会执行。

    func set(mu *sync.Mutex, i, v int) {
        mu.Lock()
        i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行
        mu.Unlock()
    }
    

    使用 defer 的情况,即使前面出现异常,后面的语句照样可以执行。

    func set(mu *sync.Mutex, i, v int) {
        mu.Lock()
        i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行
        mu.Unlock()
    }
    
  • SVN 仓库完美迁移到 Git 的方法

    2018-04-29 14:42:43 24060 0 技术文章

    使用 git svn clone 命令拷贝 svn 仓库

    cd ~
    mkdir temp
    git svn clone url/to/svn/repo/ -T trunk -b branches -t tags
    

    svn 的 url 不要加 trunk ,否则不能迁移 branches 和 tags

    新建 git 的裸仓库

    cd ~
    mkdir temp.git
    cd temp.git
    git init --bare
    

    将 git 的 master 和 svn 的 trunk 分支对应

    git symbolic-ref HEAD refs/heads/trunk
    
  • 阿里云服务器添加 Swap 分区

    2018-03-30 22:04:34 23732 0 技术文章

    Linux 中 Swap(即:交换分区),类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

    由于我的 MySQL 总是报错 InnoDB: Fatal error: cannot allocate memory for the buffer pool 分配内存不足,使用 Swap 分区可以缓解内存不够的情况。

    • Tengine 配置优化小结

      2018-03-22 12:03:58 25378 0 技术文章

      Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

      从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。

    • 阿里云登录报错 Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

      2018-01-23 15:49:17 25844 0 技术文章
      vim /etc/ssh/sshd_config
      
      PasswordAuthentication yes
      

      重启服务器

      • Mac OSX 升级系统后 Git 出现 Error Running Git

        2017-11-16 17:55:28 23432 0 技术文章

        Mac 更新系统后 Git 不能用,提示信息如下:

        errors while executing git -- version. exitCode=1 
        errors: xcrun: error : invalid active developer path(/Library/Developer/CommandLineTools),missing xcrun at:
        /Library/Developer/CommandLineTools/usr/bin/xcrun
        

        解决办法:

        xcode-select --install
        
        • 使用 go 命令升级至 go1.9beta2

          2017-08-14 09:55:50 25500 0 技术文章

          从 go1.9beta2 运行 go 命令。

          若要安装 go1.9beta2,请运行:

          $ go get golang.org/x/build/version/go1.9beta2
          $ go1.9beta2 download
          
        • 升级 Windown 10 内置 Ubuntu 子系统

          2017-07-15 08:30:24 24285 0 技术文章

          查看当前版本

          打开命令提示符,输入 bash,然后输入

          lsb_release -a
          

          更换阿里云源

          vim /etc/apt/sources.list
          

          内容替换为

          deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
          deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
          deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
          deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
          deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
          deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
          deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
          deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
          deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
          deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
          
          $ aptitude update
          $ aptitude safe-upgrade -y
          # 注1:升级过程中会提示你重启服务(restart services),选yes
          # 注2:还会出现文件冲突,保留当前版本(current version)即可,输入N
          

          把所有包升级至 16.04 (xenial) 的最新版,并重装丢失的aptitude包,最后清理无用包

          $ apt-get dist-upgrade
          $ apt-get install aptitude
          $ apt-get autoremove
          

          lxrun 使用方法

          对 LX 子系统执行管理操作
          
          用法:
              /install - 安装子系统
                  可选参数:
                      /y - 不提示用户接受
              /uninstall - 卸载子系统
                  可选参数:
                      /full - 执行完全卸载
                      /y - 不提示用户接受
              /setdefaultuser - 配置将用于启动 bash 的子系统用户。如果该用户不存在,则会创建该用户。
                  可选参数:
                      username - 提供用户名
                      /y - 如果提供了用户名,则不提示创建密码
              /update - 更新子系统的包索引
          

          卸载旧版本

          打开命令提示符

          C:\WINDOWS\system32>lxrun /uninstall /full /y
          这将在 Windows 中卸载 Ubuntu。
          这将删除 Ubuntu 环境以及任何修改、新应用程序和用户数据。
          正在卸载...
          

          安装新版本

          打开命令提示符

          C:\WINDOWS\system32>lxrun /install
          -- Beta 版功能 --
          这将在 Windows 上安装由 Canonical 分发的 Ubuntu,
          根据其条款的授权参见此链接:
          https://aka.ms/uowterms
          
          键入“y”继续: y
          正在从 Windows 应用商店下载... 100%
          正在提取文件系统,这将需要几分钟的时间...
          请创建默认的 UNIX 用户帐户。该用户名不需要与 Windows 用户名匹配。
          有关详细信息,请访问: https://aka.ms/wslusers
          请输入新的 UNIX 用户名:
          root
          找到 UNIX 用户: root
          安装成功!
          

          不卸载直接升级Ubuntu 14.04:

          sudo do-release-upgrade
          

          微软和Canonical官方均不推荐使用该方法,如果你要使用请参考:Ubuntu 16.04 安装指南。

        • CentOS 安装 PHP7

          2016-11-24 18:23:38 30520 1 技术文章
          yum --enablerepo=remi-php70 install php-opcache php-mbstring php-mysql php-gd php-xml php-json php-devel php-pear ImageMagick-devel
          
        • Windows 10 Linux 子系统安装 php 环境

          2016-10-12 20:46:47 46544 0 技术文章

          准备必要的源

          sudo add-apt-repository ppa:ondrej/php
          sudo add-apt-repository ppa:jonathonf/vim
          sudo apt update
          sudo apt upgrade
          

          安装必备软件

          apt-get install zsh
          
          apt-get install php5 php5-mysql php5-gd php5-curl php5-cli mysql-server apache2 silversearcher-ag make
          

          安装 vim

          sudo apt install vim
          
          // 卸载方法
          apt remove vim
          add-apt-repository --remove ppa:jonathonf/vim
          

          安装 tmux

          apt-get install libevent-dev
          apt-get install ncurses-dev
          wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz
          tar xzvf tmux-2.3.tar.gz
          ./configure && make
          mv tmux /usr/bin/
          

          修改 ~/.minttyrc

          Locale=zh_CN
          Charset=UTF-8
          Font=DejaVu Sans Mono for Powerline
          Term=xterm-256color
          RightClickAction=paste
          CursorType=block
          ClicksTargetApp=no
          BoldAsFont=no
          BoldAsColour=no
          CopyAsRTF=no
          Scrollbar=none
          
          ForegroundColour=131,148,150
          BackgroundColour=0,43,54
          CursorColour=220,50,47
          
          Black=7,54,66
          BoldBlack=0,43,54
          Red=220,50,47
          BoldRed=203,75,22
          Green=133,153,0
          BoldGreen=88,110,117
          Yellow=181,137,0
          BoldYellow=101,123,131
          Blue=38,139,210
          BoldBlue=131,148,150
          Magenta=211,54,130
          BoldMagenta=108,113,196
          Cyan=42,161,152
          BoldCyan=147,161,161
          White=238,232,213
          BoldWhite=253,246,227
          FontWeight=400
          

          .tmux.conf

          # 设置默认shell和terminal
          set -g default-shell /usr/bin/zsh
          set -g default-terminal "screen-256color"
          
          # 支持自动更新标题
          setw -g automatic-rename on
          set -g set-titles on
          set -g set-titles-string 'Tmux - #S:#W'
          
          # 滚动时使用vi模式
          setw -g mode-keys vi
          
          # 设置窗口和面板索引
          set -g base-index 1
          set -g pane-base-index 1
          
          # 打开鼠标模式
          set -g mouse on
          
          # 选择 pane
          bind-key k select-pane -U
          bind-key j select-pane -D
          bind-key h select-pane -L
          bind-key l select-pane -R
          
          # 扩展 pane
          bind H resize-pane -L 10
          bind L resize-pane -R 10
          bind K resize-pane -U 5
          bind J resize-pane -D 5
          
          # 复制模式
          bind-key -t vi-copy 'v' begin-selection
          bind-key -t vi-copy 'C-v' rectangle-toggle
          bind-key -t vi-copy 'y' copy-selection
          
          # 状态条定制
          set -g status-left-length 30
          set -g status-right-length 100
          set -g status-fg white
          set -g status-bg colour234
          set -g window-status-activity-attr bold
          set -g pane-border-fg colour245
          set -g pane-active-border-fg colour39
          set -g message-fg colour16
          set -g message-bg colour221
          set -g message-attr bold
          set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S #[fg=colour252,bg=colour238,nobold]#[fg=colour245,bg=colour238,bold] #(whoami) #[fg=colour238,bg=colour234,nobold]'
          set -g window-status-format "#[fg=colour234,bg=colour238]#[fg=colour245,bg=colour238,bold] #I  #W#F #[fg=colour238,bg=colour234,nobold]"
          set -g window-status-current-format "#[fg=colour234,bg=colour39]#[fg=colour25,bg=colour39,noreverse,bold] #I  #W#F #[fg=colour39,bg=colour234,nobold]"
          set -g status-right '#T %F %A %H:%M '
          set -g window-status-separator ''
          
        • 使用 unoconv 将 PPT 转换成 PDF

          2016-08-13 20:25:36 43273 0 技术文章
        • Composer 安装时报错 "Internal Error [ERR_INVALID], exit code 0"

          2016-07-05 13:25:56 39663 0 技术文章

          修改 php.ini

          extension_dir = "\xampp\php\ext"
          

          改为

          extension_dir = "D:\xampp\php\ext"
          
          browscap = "\xampp\php\extras\browscap.ini"
          

          改为

          browscap = "D:\xampp\php\extras\browscap.ini"
          
        • CentOS 7 搭建 IPSec/IKEv2 VPN 服务器

          2015-10-08 09:25:00 28068 0 技术文章

          GitHub 地址

          https://github.com/jiangxi14520/one-key-ikev2-vpn

          wget --no-check-certificate https://raw.githubusercontent.com/quericy/one-key-ikev2-vpn/master/one-key-ikev2.sh
          
          chmod +x one-key-ikev2.sh
          bash one-key-ikev2.sh
          

          如果使用 firewalld

          vim /etc/firewalld/zones/public.xml
          

          执行以下命令

          firewall-cmd --zone=dmz --permanent --add-rich-rule='rule protocol value="esp" accept' # ESP (the encrypted data packets)
          firewall-cmd --zone=dmz --permanent --add-rich-rule='rule protocol value="ah" accept' # AH (authenticated headers)
          firewall-cmd --zone=dmz --permanent --add-port=500/udp #IKE  (security associations)
          firewall-cmd --zone=dmz --permanent --add-port=4500/udp # IKE NAT Traversal (IPsec between natted devices)
          firewall-cmd --permanent --add-service="ipsec"
          firewall-cmd --zone=dmz --permanent --add-masquerade
          firewall-cmd --permanent --set-default-zone=dmz
          firewall-cmd --reload
          firewall-cmd --list-all
          
          vim /etc/sysctl.conf
          

          添加以下内容:

          # VPN
          net.ipv4.ip_forward = 1
          net.ipv4.conf.all.accept_redirects = 0
          net.ipv4.conf.all.send_redirects = 0
          

          使之生效:

          sysctl -p
          
          <?xml version="1.0" encoding="utf-8"?>
          <zone>
            <short>Public</short>
            <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
            <service name="dhcpv6-client"/>
            <service name="ssh"/>
            <port protocol="tcp" port="80"/>
            <port protocol="udp" port="500"/>
            <port protocol="tcp" port="500"/>
            <port protocol="udp" port="4500"/>
            <port protocol="udp" port="1701"/>
            <port protocol="tcp" port="1723"/>
            <masquerade/>
          </zone>
          

          Mac 上配置

          进入钥匙串管理,选择登录,然后将证书拖进去。

          不被信任解决方法,右键->属性,选择总是被信任

        • iTerm2 安装 oh-my-zsh 和 power-line

          2015-09-10 20:50:40 21503 0 技术文章
          pip install powerline-status --user -U
          

          隐藏用户名和主机名 加到

          ZSH_THEME="agnoster"
          DEFAULT_USER="$USER"
          
          • HTTP 协议常见错误代码

            2015-04-02 10:20:00 25548 0 技术文章
            • 乐观锁和悲观锁

              2014-10-06 11:34:00 24881 0 技术文章

              乐观锁和悲观锁是两种并发控制策略,用于解决多线程或多进程访问同一资源时的数据一致性问题。

              乐观锁

              • 概念:假设数据很少被修改,因此不会在数据访问前加锁。
              • 机制:读取数据时不加锁,更新时检查数据是否被修改(通常通过版本号或时间戳)。如果数据没有变化,则提交修改;否则,操作失败,需要重试。
              • 适用场景:适合读多写少的场景,避免因频繁加锁导致的性能问题。

              悲观锁

              • 概念:假设数据会被频繁修改,因此在访问前加锁。
              • 机制:读取或修改数据时加锁,确保同一时间只有一个事务可以操作数据。其他尝试获取锁的事务会被阻塞,直到锁被释放。
              • 适用场景:适合写多读少的场景,需要严格控制数据一致性。

              例子

              • 乐观锁:电商网站的库存管理系统,用户读取商品信息时不加锁,提交订单时检查库存是否改变。
              • 悲观锁:银行转账系统,在进行账户余额更新时加锁,以确保数据一致性。

              选择使用哪种锁策略取决于系统的读写比例和对并发的要求。

              • 共享锁和排它锁

                2014-10-01 10:23:40 24944 0 技术文章

                两种锁的概念

                共享锁(Shared Lock,S锁)

                • 允许多个事务同时读取数据,但不允许修改数据。
                • 其他事务可以获取共享锁,但不能获取排它锁。

                排它锁(Exclusive Lock,X锁):

                • 独占数据的访问权,禁止其他事务读取或修改。
                • 在事务持有排它锁期间,其他事务不能获取共享锁或排它锁。

                这两种锁机制确保了数据的一致性和完整性。

                两种锁的使用场景

                共享锁(Shared Lock, S锁)

                假设有两个用户,用户A和用户B,他们都想读取同一条记录。用户A获取了该记录的共享锁,因此可以读取数据。同时,用户B也可以获取共享锁来读取相同的数据,因为共享锁允许多个读操作并发进行。

                排它锁(Exclusive Lock, X锁)

                现在,用户A想要修改这条记录,他需要获取排它锁。此时,用户B不能获取任何锁(包括共享锁和排它锁)来访问该记录,直到用户A完成修改并释放排它锁。这样保证了数据的一致性和防止并发写入冲突。

                • Ubuntu 下快速启用 Apache2 的 rewrite 方法

                  2014-09-02 10:14:50 22824 0 技术文章
                  a2enmod rewrite
                  service apache2 restart
                  

                  sudo vim /etc/apache2/sites-enabled/000-default

                  AllowOverride None
                  

                  全部改成

                  AllowOverride All
                  
                  • 解决 GitHub 无法更新的问题

                    2014-08-23 15:26:00 24516 0 技术文章

                    前提是安装了 shadowsocks

                    git config --global https.proxy 'socks5://127.0.0.1:1080'
                    
                    • MySQL 5.7.9 报错 “this is incompatible with sql_mode=only_full_group_by”

                      2014-08-15 12:59:00 27285 0 技术文章
                      mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
                      mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';