Hebi's Personal Wiki

Table of Contents

A human needs to learn so so many things through his life. He can master something at some period of time, but never think he can be expert after a month not touching it. What happen next is looking into various of manuals to get the memory back. The memory does help, but not that much if the manual is not written in a uniform format. That's the rational to create this page: a consistent format for all manuals.

Of course most of the material in this wiki are for programming related because I'm not aware of some area having more various of reference manuals than the area of computer science.

I'm talking about references, or manuals, not tutorials. At some point when you get more comfortable at programing, tutorial should be some easy-and-fun reading material rather than what you want to read in your morning time.

The structure of the wiki is basically one page per topic, except some large ones having sub-topics, like C family and the standard and non-standard libraries. The index of the pages is on this page only. It should contain entries to all the pages.

If you don't like my style of writing, and you like the idea, you are always encouraged to create your own wiki. Head to https://github.com/lihebi/wiki for the source files for this site if you are interested.

1 Get everything organized

Get a Linux distribution and enjoy the freedom and productivity after a deep learning curve. My distribution path come along Ubuntu, ArchLinux, gentoo, CentOS, Debian, then finally back to ArchLinux. I used debian for a long time and there's a page for setup of it. I installed linux for hundreds of times, if not thousands. Live USB. Some terms related: POSIX and samba. I use StumpWM as my X11 window manager. Tmux for session manage. conkeror used to be my default browser but I go back to chromium because the performance. docker is fantastic in that I can create a machine to play with very cheaply.

There're well-known discussion for what's the best editor to use. Vim is good, and I used it for roughly 4 years when I'm in undergraduate study. But I'll never recommand it after switching to Emacs. Yes, Emacs is a full-fledged opearting system. Emacs is a much better choice thanks a lot to the Emacs Lisp language. There're tons of Emacs Plugins out there, and it is very easy and comfortable to extend the editor by my own writing some lisp. The elisp is tightly bounded with emacs editor functionalities, so there's a dedicated page for th Emacs Part of Elisp. Although elisp is a good start point of lisp, it is not general purpose, and can only run inside emacs. Another lisp flavor, Common Lisp is more serious and practical lisp, the StumpWM is written in it. Clojure arise recently and the authors are advertising it a lot. Many big player reside inside emacs, like the new reader Gnus.

2 Programming

A project typically contains three parts: the main program and a bunch of scripts to automate things, as well as documentation. For a project, I use C family. C family is the most fundamental language. Almost all the new and fancy languages are written in C family. So, never think they can have better performance than C. The legacy C is small and elegent. It is a good start point if you want to learn serious compilers. C comes with C standard library. C is tightly related to Unix features, for example Signal Handling for C. C++ is the language that achieve a good balance between performance and morden features. It even continues to offer many fancy features. C++ has a lot of libraries. Standard Template Library(STL) defines containers and its algorithms. The most functionalities not specified in the standard librareis can often be found in Boost. Some 3rd-party C++ Libraries that is small enough to put into one page. Pugixml is Data processing libraries for xml. Use Google Test for unit testing. Debugging using GDB, of course. Here are some C debugging techniques. Unix Programming Interface. For system programming, a recent alternative to C is Rust.

The area of compiler is interesting and pretty hard. Some misc staff for real-world compiler implementation. make, cmake, autoconf makes the ecosystem of compilation. Profiling of you code by gcov, gprof. When building compiler tools for Program Analysis, LLVM and Clang toolchain can make it pretty easy.

Faminilar with Design Pattern when coding, and this can be learned best by doing refactoring.

Scripting. shell concept and all shell utilities is specified in POSIX standard. awk and sed can make really elegent scripts for simple tasks. Regular Expression is very important in almost all unix scripting tasks. Moving to some more modern ones, I found python now is pretty easy to use thanks to the pretty complete python standard libraries and it python 3rd party libraries, although I'm stronly against using the stupid indent as part of syntax. R is very good at processing data, runs natively inside emacs.

3 Writing

The 3rd part, Writing documentation, latex is fantastic. tikz provide the ultimate way to create academic figures. markdown is not recommanded from me. Instead I use Org Mode extensively. Doxygen generates good documents and UML figures using Graphviz/Dot.

4 Misc

I got some of the notes from computation theory class. NP, NP problems, NPC, Approximation, Linear Programming, Turing Machine, Decidability. And some from AI class too: Search algorithm, Name Algorithm, Machine Learning, Artificial Intelligence

I do some Leetcode ocationally to keep a sense of fast implementation of algorithm, but not much. Some related posts String algorithms, Palindrome, data structure, old data structure page, algorithm in practice.

Author: Hebi Li

Created: 2017-07-18 Tue 15:48