Author Archives: Mark

About Mark

Ten years into my journey towards becoming a pro systems programmer, sharing what I learn along the way. Also on Twitter: @offlinemark.

If you're reading this, I'd love to meet you. Please email mark@offlinemark.com and introduce yourself!

3 Key Habits I Used to Learn Chinese

After failing three times, on my third try learning Chinese I actually became conversational. Hereโ€™s what I did, which is generally applicable to any language:

  1. I used Duolingo for 30 minutes every day for over a year.
  2. I went to Chinese language exchanges twice a month, for a year and a half.
  3. I used Hellotalk to find a great language partner to chat and do video calls with. I also used it to crowd source corrections for my bad Chinese.

Thatโ€™s it! The key is consistent effort over a long time (2 years), mixing solo practice and real conversation.

Other tips:

Continue reading

Don’t confuse std::move and std::forward

This was a pretty interesting buggy scenario I found while reading the clang-tidy checks. If you’re writing a function that takes a forwarding reference (what looks like an rvalue reference, but whose type is a template argument), you need to be careful to not call std::move on it. You need to make sure to call std::forward instead. Otherwise, you might accidentally trigger a move on an object passed by a caller! This would be confusing, since their object would be moved from, and they never explicitly called std::move on it.

Continue reading

Getting bit by unique_ptr

I got bit by unique_ptr when implementing a linked list today. You need to be careful to manually release() the unique_ptr before resetting or you might accidentally free the entire list. This comes up when doing insertions and stuff like that.

You can use /proc/*/mem to bypass memory protections

Filmed some screencasts today explaining some interesting behavior with /proc/self/mem — you can use it to write to unwritable memory (including the text of libc!).

Read bits are not enforced for memory mappings

Filmed a screencast exploring some neat mmap behavior — read bits are not enforced for memory mappings. This is because the underlying x86 page table entries have a single bit to toggle between “Read” and “Read/Write”.

macOS has a native memory leak checker