Get basename of url by Golang

targetURL := "http://www.example.com/one/two/three.json?output=four"
u, err := url.Parse(targetURL)
if err != nil {
  panic(err)
}
fmt.Println(path.Base(u.Path))
// three.json

Download a file from url in Golang

Example to download a file from url and save on local

io.Copy() read 32kb (maximum) from input and write to output reapeatly, so dont need worry about memory.

func DownloadFile(filepath string, url string) error {
    // Create the file
    out, err := os.Create(filepath)
    if err != nil {
        return err
    }
    defer out.Close()

    // Get the data
    resp, err := http.Get(url)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    // Write the body to file
    _, err = io.Copy(out, resp.Body)
    if err != nil {
        return err
    }

    return nil
}

reference: Code Example

Table driven tests in Golang

var fibTests = []struct {
  n        int // input
  expected int // expected result
}{
  {1, 1},
  {2, 1},
  {3, 2},
  {4, 3},
  {5, 5},
  {6, 8},
  {7, 13},
}

source: 5 simple tips and tricks for writing unit tests in #golang

Poker StraightFlush

First of all, PHP Code Example. (PHP ≥ 7)

function isStriaghtFlush($d) {
    $b = $f = 0;
    $m = ['a'=>1,1=>10,'j'=>11,'q'=>12,'k'=>13];
    foreach ($d as $a) {
        $p = substr($a,-1);
        $b |= 1<<(($m[$a[0]])??$a[0]);
        $f = ($f===0||$f===$p) ? $p : 1;
    }
    $b = ($b << 3) | ($b >> 10);
    foreach (range(0,13) as $i) {
        if ((($b >> $i) & 31) == 31){
            return [true, $f!=1];
        }
    }
    return [false, false];
}

Explain:

A can be straight of A, 2, 3, 4, 5 and 10, J, Q, K A

There are total 14 ranks, when getting rank n from the $d, we set 1 of the n element in bitwise map.

If we could find any 5 continuously 1 in the bitwise map, then it’s straight. also if all faces are same, then it’s straight flush.

Example, cards: 10, J, Q, K, A

read 10, bitwise map: 0,0,0,1,0,0,0,0,0,0,0,0,0,0

read J, bitwise map: 0,0,1,1,0,0,0,0,0,0,0,0,0,0

read Q, bitwise map: 0,1,1,1,0,0,0,0,0,0,0,0,0,0

read K, bitwise map: 1,1,1,1,0,0,0,0,0,0,0,0,0,0

read A, bitwise map: 1,1,1,1,0,0,0,0,0,0,0,0,1,0

shift left 3 of bitwise map to 1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0

shift right 10 of bitwise map to 1,1,1,1

OR this two bitwise maps and get a new map 1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1

then we have 5 continuously 1, it’s straight.

MariaDB failed to start

Using Homebrew to install MariaDB, and got this eror when starting the server

$ mysql.server start
Starting MySQL
.161227 19:05:10 mysqld_safe Logging to '/usr/local/var/mysql/xxx.err'.
ERROR!

Mostly it is caused by previous installation of MySQL.

Manually remove /usr/local/var/mysql and reinstall MariaDB, it will start normally.

Homebrew Services Operation not permitted

You will get this kind of error message when you run brew services in tmux

/usr/local/Cellar/something/homebrew.mxcl.something.plist: Operation not permitted

How to fix it, just need install reattach-to-user-namespace

brew install reattach-to-user-namespace

Date Range Overlap

Date Range Overlap

Only 2 conditions that overlap does not exist

                                |------ Date Range A ------|
|------ Date Range B ------|                                                        

or

|------ Date Range A ------|                                        
                                |------ Date Range B ------|

That means start date A is later than end date B, or end data A is early than start date B.

Overlap exists if neither of them is true.

In rails we can create a scope to find all overlaps

scope :overlaps, -\>(start_date_, end_date_) do
  where “((start_date \<= ?) and (end_date \>= ?))", end_date_, start_date_ 
end

reference:

http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap

http://baodad.blogspot.com.au/2014/06/date-range-overlap.html

Ruby on Rails datepicker

Ruby on Rails datepicker

Use bootstrap datepicker gem

Gemfile:

gem 'bootstrap-datepicker-rails'

Add this line to app/assets/stylesheets/application.scss

 *= require bootstrap-datepicker3

Add this line to app/assets/javascripts/application.js

//= require bootstrap-datepicker

Add this line to template

<%= f.text_field :publish_at, "data-provide" => 'datepicker', "data-date-format" => "yyyy-mm-dd" %>

Archlinux in Virtualbox

Install Arch Linux in Virtualbox

https://wiki.archlinux.org/index.php/Installation_guide

Pre-installation

Partition the disks

$ fdisk /dev/sda

boot

> n
> return (default primary)
> return (default partition 1)
> return (default first sector)
> +250M

swap

> n
> return (default primary)
> return (default partition 2)
> return (default first sector)
> +2G

/

> n
> return (default primary)
> return (default partition 3)
> return (default first sector)
> +2G
> return

/home

> n
> p (make primary)
> return (default first sector)
> return (default last sector)

make /dev/sda1 bootable

> a
> 1

make /dev/sda1 to swap type partition

> t
> 2
> 82

write table to disk and exit fdisk

> w

Format the partitions

format partitions

$ mkfs.ext4 /dev/sda1
$ mkfs.ext4 /dev/sda3
$ mkfs.ext4 /dev/sda4

make swap

$ mkswap /dev/sda2

mount swap

$ swapon /dev/sda2

Mount the partitions

$ mount /dev/sda3 /mnt
$ cd /mnt
$ mkdir boot home
$ mount /dev/sda1 boot
$ mount /dev/sda4 home
$ cd /

Installation

Select the mirrors

rankmirrors to make this faster (though it takes a while)

mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig
rankmirrors -n 6 /etc/pacman.d/mirrorlist.orig \>/etc/pacman.d/mirrorlist
pacman -Syy

Install the base packages

# install base packages (take a coffee break if you have slow internet)
pacstrap /mnt base base-devel

Configure the system

Generate an fstab file

$ genfstab -p /mnt >> /mnt/etc/fstab

Change root into the new system

$ arch-chroot /mnt

Set the hostname

$ echo [archlinux] > /etc/hostname

Set the time zone

$ ln -sf /usr/share/zoneinfo/Australia/Sydney /etc/localtime

uncomment the needed locales in /etc/locale.gen, then generate them with

$ locale-gen

Set locale preferences in /etc/locale.conf and possibly $HOME/.config/locale.conf

$ echo LANG=en_US.UTF-8 > /etc/locale.conf

Set the root password (root account ,not your account, we will create that later)

$ passwd

Install a bootloader

$ pacman -S grub-bios
$ grub-install /dev/sda

Create a new initial RAM disk

$ mkinitcpio -p linux
$ grub-mkconfig -o /boot/grub/grub.cfg
$ exit

Unmount the partitions

$ umount /mnt/home
$ umount /mnt/boot
$ umout /mnt
$ reboot

Until not, we finish installing archlinux, then we are going to setup the system.

Post-installation

After reboot, you might not be able to connect to innternet, run command to get ip address

$ dhcpcd

run it automatically when system starts

$ systemctl enable dhcpcd

turn on multi lib to install 32bit applications

$ vi /etc/pacman.conf

uncomment

[multilib](#)
Include = /etc/pacman.d/mirrorlist

update packages

$ pacman -Syy
$ pacman -Su

install x environment

$ pacman -S xorg-server xorg-xinit xorg-server-utils

intall mesa for 3d

$ pacman -S mesa

install virtualbox guest packages

$ pacman -S virtualbox-guest-utils
$ modprobe -a vboxguest vboxsf vboxvideo

create

$ vi /etc/modules-load.d/virtualbox.conf

add

vboxguest
vboxsf
vboxvideo
$ reboot
$ pacman -S xorg-twm xorg-xclock xterm
$ startx

create user to login

$ useradd -m -g users -G storage,power,wheel -s /bin/bash jma
$ passwd jma
$ visudo

allow user to run sudo command

find Uncomment to allow members of group wheel to execute any command and uncomment %wheel ALL=(ALL) ALL

Homestead provision

Laravel Homestead commands:

Available commands:
  destroy   Destroy the Homestead machine
  edit      Edit the Homestead.yaml file
  halt      Halt the Homestead machine
  help      Displays help for a command
  init      Create a stub Homestead.yaml file
  list      Lists commands
  resume    Resume the suspended Homestead machine
  run       Run commands through the Homestead machine via SSH
  ssh       Login to the Homestead machine via SSH
  status    Get the status of the Homestead machine
  suspend   Suspend the Homestead machine
  up        Start the Homestead machine
  update    Update the Homestead machine image

There is missing provision command

Solution is:

list all vagrant instance

$ vagrant global-status
id       name      provider   state    directory
-------------------------------------------------------------------------------------
6e1aa44  default   virtualbox poweroff /Users/[whoami]/.composer/vendor/laravel/homestead

then run provision with id

 $ vagrant provision 6e1aa4