While working on my audio based random password generator (you view the source in github), I wanted to do some conditional compilation: Compiling certain parts of the program only in case some option is passed to the configure script. As it usually happens with GNU’s autotools, it kind of hell to do it. Documentation is spread across dozens of sources, each provides only a specific part of what to do. I’m writing it here in the blog, in hope I’ll never have to search how to do so again.
For years OmniCppComplete has been the de facto standard for C++ completion in Vim. But as time progressed, I got more and more annoyed by it’s shortcomings. OmniCppComplete is based on tokenizing provided by ctags. The ctags parsing of C++ code is problematic, you can’t even run it on libstdc++ headers (you need to download modified headers). You want to use an external library? You’ll need to run ctags seperatly on each library. Not to mention it’s inablity to deduce types of anything more than trivial. The core of the problem is that OmniCppComplete isn’t a compiler and you can’t expect something that isn’t a compiler to fully understand code. This what makes Visual Studio’s IntelliSense so great: it uses the Visual C++ compiler for parsing, it isn’t making wild guess at types and what is the current scope – it knows it.
This is a complete rewrite of my secure password generator. The new version uses my a true random number generator (and here).
The major change was using the new true random number generator in order to ensure strong passwords. Less significant changes include an easy way to specify password’s strips, and some calling convention changes.
$ ./spass -l 14
$ ./spass -s 0-9a-f -l 32
Download the tarball
spass-2.0.tar.bz2. The program depends on Boost‘s program_options (it was tested against version 1.37 and 1.42 and should work with other versions too).
In May I’ve written about a way to generate random number from audio noise. Basically it went like this:
- Get audio sample from the microphone.
- Push the least significant bit to a buffer.
- Repeat steps 1-2 until the buffer is full (buffer size == block size for the hash function).
- Apply the hash function on the buffer.
- Get random bits from the digest.
In order to continue developing this random number generator (RNG), I’ve written a C++ class that simplifies working with it.