Thursday, 22 September 2016

Luật bất thành văn của sysadmin

Vì không thành văn nên mỗi ông viết một kiểu 🙄
Kể ra thì nhiều nhưng list ra đây vài cái cơ bản, về cơ bản là cho bớt đau thương, chứ không phải là vì mình thích thì mình làm thôi.

Luật sysadmin
- Không deploy (vietsub: thay đổi hệ thống/ cài đặt phiên bản mới) vào thứ 6. Với các sysadmin thì ngày thứ 6 thường được coi là ngày "reading" hay "research". Lý do rất dễ hiểu, nếu có gì không thuận buồm xuôi gió là mất toi "Friday night", thậm chí mất luôn cả cuối tuần. (Tất nhiên luật này không áp dụng nếu sysadmin ấy định làm việc vào cuối tuần) 


- Luật trên áp dụng tương tự cho 2 tiếng trước khi hết giờ làm việc - cũng trừ luôn trường hợp nếu định làm quá giờ.

Thursday, 15 September 2016

[CLI] tail -F, F hoa F***

Là *NIX user, hẳn phải biết dùng lệnh tail để theo dõi một file (thường là file log). Mỗi khi có dòng mới ghi vào file, ta sẽ thấy được dòng đó:
tail -f /var/log/syslog
(Trên Ubuntu, có thể gõ "logger FAMILUG" để ghi một dòng vào syslog).

Log ghi ra file mãi liệu có chán mà dừng lại?
Chán thì không chán, nhưng các nhà viết phần mềm sẽ không ghi hàng GB log vào 1 file rồi để nó dùng hết ổ cứng trên máy rồi làm chương trình chết vì hết ổ cứng. Từ đó khai niệm "log rotate" ra đời.
Mỗi file log cũ sẽ được đi chuyển, đổi tên mới (thường là thêm đuôi .1 .2 .3 ... vd: /var/log/syslog.1  và sau đó nếu cũ quá thì được nén lại bằng gzip cho tiết kiệm ổ cứng), chuyện này thường được làm hàng ngày hay hàng tuần. File log mới được tạo ra, cùng tên với file log cũ, nhưng giờ trống trơn. Xem thêm chương trình logrotate để biết thêm chi tiết.
Nếu ai đã thử dùng -f để theo dõi file log, rồi may mắn hơn nữa, file log đó được rotate, từ ấy trờ đi, không thấy lệnh tail output gì ra nữa. Lúc đó phải dùng F to.

Có một sự khác biệt tinh vi ở đây, khi dùng tail -F FILENAME thì tail sẽ theo dõi file này kể cả khi nó bị thay thế bởi file khác cùng tên (theo dõi bằng tên). Trong khi đó tail -f FILENAME lại theo dõi file descriptor, tức nếu file này có bị đổi tên thì lệnh tail vẫn tiếp tục theo dõi.

Vậy, nếu đang theo dõi file log, hãy dùng -F.

Trích man tail
       -f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

       -F     same as --follow=name --retry

       --retry
              keep trying to open a file even when it is or becomes inaccessible; useful when following  by
              name, i.e., with --follow=name

Wednesday, 14 September 2016

[Python] Happy programmer day!

Hôm qua (13/9) là ngày thứ 256 của năm, với các lập trình viên, 256 là một con số rất đặc biệt.
Từ thời xa xưa, khi những chiếc máy tính chỉ lắp RAM 256, USB chỉ có 256 MB...
ngày ấy đã xa, nhưng 256 luôn ở đó vì nó đặt biệt: 256 = 2 ^ 8

Chúc mừng ngày lập trình viên, những người đẻ ra bug 🕷🐞

🍺🍻🍻🍺

In [12]: import datetime

In [13]: (datetime.datetime.now() - datetime.datetime(2016, 1, 1)).days - 1 == 2 ** 8
Out[13]: True

Friday, 2 September 2016

[Golang] fix Go 1.7 panic

Nếu như mới build lại Go bản 1.7 và chạy một lệnh chuẩn nào đó mà bị panic (như go vet chẳng hạn):
 go vet ./...
panic: inconsistent import:
    var os.Stderr *os.File
previously imported as:
    var Stderr *os.File
 [recovered]
    panic: inconsistent import:
    var os.Stderr *os.File
previously imported as:
    var Stderr *os.File


goroutine 1 [running]:
panic(0x2734a0, 0xc42028a540)
    /Users/hvn/FOSS/golang/src/runtime/panic.go:500 +0x1a1
go/types.(*Checker).handleBailout(0xc4200d21c0, 0xc42004d8d8)
    /Users/hvn/FOSS/golang/src/go/types/check.go:213 +0xae
panic(0x2734a0, 0xc42028a540)
    /Users/hvn/FOSS/golang/src/runtime/panic.go:458 +0x243

Đừng khóc, vì lúc khóc trông rất ngu 😭


hãy build lại Go lần nữa để sửa vấn đề này.
Nhưng trước khi build, nhớ rm -r pkg trong go source đi.