Google Cloud Summit 2018 Sydney

Google Cloud Summit 2018 Sydney

Get basename of url by Golang

targetURL := ""
u, err := url.Parse(targetURL)
if err != nil {
// 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];


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'.

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 ------|                                                        


|------ 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_ 


Ruby on Rails datepicker

Ruby on Rails datepicker

Use bootstrap datepicker gem


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


Partition the disks

$ fdisk /dev/sda


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


> 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


> 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 /


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.


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


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


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


$ 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