Org Wiki
Main Programming Platforms Projects Emacs Russian Quotes Old Lisa wiki
Table of Contents
1 Of Interest
- Dec64 - Better numeric type for new languages.
- GPU Accelerated Computing with C and C++ - CUDA NVIDIA
- Thrust Intro - CUDA NVIDIA
- An Interactive Tutorial on Numerical Optimization
- DNS tunnelling
- Web caching - http commands (perhaps fixes gabor update issues)
- gcov blog
- gcov issue, for reference
- nearly - Earley parser in python
- GNU GLOBAL source code tagging system
2 Issues
- glibc compatibility issues (on Ubuntu) - reduce dependency on GLIBC_2.15
2.1 malloc issue
Disable malloc caching with GLIBCPP_FORCE_NEW
(var for latest gcc different!)
3 vim
3.1 Stop vimdiff mode
Within vim
:
: windo diffoff
4 Shell/bash
- Profiling in shell -
perf
command - z script - 'jump around' in shell
- Arrays in bash
5 Bare Metal
- Circle - A C++ bare metal environment for Pi
- Low Level Devel - Code for bare metal coding tutorial
6 ARM Neon
6.1 Code examples
github: arm_neon_example
Tested with Pi4 32-bits
To compile, e.g.:
gcc matrix_add_number.c -mfpu=neon -o matrix_add_number
- You don't need
CMake
at all
7 C++
- Dynamic shared libraries on linux
- Strings in switch statements
- Initialization, Shutdown and
constexpr
- Notable for 'what should I do', 46:20 - Improving C++ Builds with Split DWARF - tried it; while it works, it screws up debug info, so reverted
- Class template variant - for parsers; Boost
- SWIG - Connects C/C++ programs with various high-level programming languages, including ruby
7.1 Snippets
7.1.1 Intersection of sets
#include <bits/stdc++.h> // set_intersection // Set intersection inline std::set<Reg> operator&(std::set<Reg> const &lhs, std::set<Reg> const &rhs) { std::set<Reg> ret; set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter(ret, ret.begin())); return ret; }
7.1.2 Capture stderr
to string
** * Captures stderr output from enclosed function and puts it * in a string. * * This could conceivably be expanded for more general use, but * I don't need that right now. * * Source: https://exceptionshub.com/c-redirecting-stdout.html */ std::string stderr_to_string(Seq<uint64_t> &instructions) { using std::streambuf; using std::ostringstream; using std::cerr; using std::cout; using std::endl; // Redirect stderr. streambuf *oldCoutStreamBuf = cerr.rdbuf(); ostringstream strCout; cerr.rdbuf(strCout.rdbuf()); // Do something here that writes to std err // Restore old cout. cerr.rdbuf(oldCoutStreamBuf); return strCout.str(); }
7.1.3 Convert string to lines in vector
/** * Split passed string into a vector on the newlines. * * Source: https://stackoverflow.com/a/13172579/1223531 */ std::vector<std::string> string_to_vector(std::string const &buf) { assert(buf.c_str() != nullptr); std::vector<std::string> ret; std::stringstream ss(buf.c_str()); std::string to; while(std::getline(ss, to, '\n')){ ret.push_back(to); } return ret; }
7.1.4 Get type id of class
Following as member of a given class:
std::string type_id() const override { return std::string(typeid(*this).name()); }
7.1.5 Usage of std::function
In class:
using ReserveJobCB = std::function<bool(ActionState &state)>; ... virtual bool reserve(ActionState &state, ReserveJobCB *cb) { assert(cb != nullptr); // callback MUST be defined here ... if (!(*cb)(state)) { ret = false; } ... }
- Note that this is passed as pointer; ref also OK of course
In call:
ITransportHandler::ReserveJobCB cb = [] (ActionState &state) -> bool { profiler_lock lck("scan.base.get.accept"); state.handle_incoming_job(); return true; // TODO do we need a return value at all here?? }; while (state.loop_condition()) { if (!reserve(state, &cb)) break; }
- No automatic conversion to
std::function
of lambda; need to init explicitly and then assign
7.1.6 Hex presentation of bitfields
int length = sizeof(YourType); unsigned char const *data = reinterpret_cast<unsigned char const *>(&your_bitfields); // barf puke std::stringstream ss; ss << std::hex << std::setfill('0'); for(int i= 0; i < length; ++i) { ss << std::setw(2) << (int) data[i]; }
7.2 string_view
Source: Talk “Enough string_view to Hang Ourselves” - for the most part
- It's a reference essentialy, but tries to behave as a value type (borrow type)
- Perfectly safe as a function parameter; also for-loop control variables ok
- All other cases, avoid (even if it is possible)
- Don't store! Lifetime issues
string_view
does not extend the lifetime of temporaries! e.g.std::string_view v = str();
- Don't assign
string_view
toauto
; returningauto
may work string_view(nullptr)
is undefined behaviour! Thus, compiles (shit)
- Proper way to assign to
std::string
:- Avoid! Better to pass in whole string view
- Special
std::string
ctor, c++17 only - In practice hoop jumping required (too complicated to want to learn)
// TODO void func(std::string_view v) { // ! pass by value std::string buf = std::string(v.data(), v.size()); // Size MUST be passed }
8 gdb
8.1 Show entire string in debug session:
(gdb) call(void) puts(stmtStack().dump().c_str()) (gdb) call(void) puts(instrs.dump(true).c_str()) (gdb) call(void) puts(result.dump().c_str())
Also works:
(gdb) call puts(stmtStack().dump().c_str())
9 CATCH2
9.1 Specifying which tests to run
Combinations possible of following:
> runTests [a][a] # AND > runTests [a],[a] # OR > runTests ~[a] # NOT > runTests [a] [b] # run [a] EXCEPT [b]
10 Ruby
10.1 Examine
10.3 Of interest
- shallow attributes - ruby member var's with type checking
- Steep - Gradual typing for Ruby. Static type checking only
10.5 Refactor
10.6 Snippets
10.6.1 Read last line of file
tmp = IO.readlines(error_filename)[-1]
10.7 Seeing is Believing
This is an emacs mode to run ruby in an emacs buffer
Remember to install gem first
Usage in emacs:
M-x seeing_is_believing | - toggle minor mode |
C-c ? s | - run current buffer |
C-c ? c | - clear current buffer |
Additions to emacs
:
(package-install-file (expand-file-name "~/installs/emacs/seeing-is-believing.el")) ... (require 'seeing-is-believing) (add-hook 'ruby-mode-hook 'seeing-is-believing)
Change package file:
; WRI CHANGE ;; seeing-is-believing-mode.el ends here ;;; seeing-is-believing.el ends here
10.8 Type checking in Ruby
Got all excited by this video, but the code hasn't been made public so vapourware.
Further:
- Dry-Types - gem, classes with strict type checking, runtime.
- Adding Type Checking to Ruby - runtime, prefix methods with 'typesig'
- Gradual Type Checking for Ruby - dynamic, Rtc, typesig with string declarations
- LiveAST - Runtime AST from code
- RDL - Lightweight system for adding types, type checking, and contracts to Ruby.
- See also
Contracts.ruby
under 'Contracts…'
10.9 Contracts and aspect-oriented programming
- Contracts.ruby Tutorial - It's actually only type checking on method prototypes
- EasyHook - Easily add before and after callbacks to ruby methods with blocks.
- Before_methods and After_method callbacks in Ruby
- Ruby: automatically wrapping methods in event triggers
- Observable in standard lib
10.10 Ruby VM
10.11 Names of constants
Get a constant reference by string name:
dd_def = Object.const_get(dd_name) # Joyous hack! Convert string to constant reference
Perhaps useful also, check if constant present using string name:
Object.constants.include? dd_name.to_sym
Constant name as symbol:
sym = Object.constants.find { |c| Object.const_get(c).equal? MyConst }
Yes, crazy inefficient, but if the goal is to use it for code generation, it's fine with me.
11 Javascript
- Online javascript prettifier
- Creating a File Uploader Using JavaScript and HTML 5
- Using HTML5/Javascript to generate and save a file
- JSLint - code linting
- JSHint - static code analysis
- select2 - improved combo
- HOCON specs - adjust json better suited for config files
12 Git
12.1 Links
- Submodules - i.e. projects within projects:
git clone --recurse-submodules
- Online git book
- git-p4 documentation
- Git-P4: Working with Git and Perforce
12.2 Use vim
as editor for commits
> git config --global core.editor "vim"
12.3 Permanently authenticating with Git repositories
Avoid username/password on every push/pull to/from github
.
Source
> git config credential.helper store
12.4 Minimal repo clone
Used this to get only a part of the linux repo (which is huge)
Sources:
> git clone --depth 1 --no-checkout --filter=blob:none https://github.com/torvalds/linux.git > cd linux/
Also did following, prob not necessary, does nothing (root prefix likely wrong!):
> git config core.sparseCheckout true > echo "root/drivers/gpu/drm/vc4" >> .git/info/sparse-checkout > echo "root/drivers/gpu/drm/v3d" >> .git/info/sparse-checkout
Continuing first (this fetches per file):
> git checkout master -- drivers/gpu/drm/vc4/ > git checkout master -- drivers/gpu/drm/v3d/
12.5 Folder relocation
Or, extract folder from git repository and put it in a separate repo.
Base command:
> git filter-branch --subdirectory-filter <folder> -- -- all
This removes everything that is not `<folder>` and moves it up to base path in repo (exactly what I needed).
The rest to make a new repo is common sense.
12.5.1 Remove file from staging
> git reset <file>
12.5.2 Update branch list, local and remote
> git remote update –prune origin
- Appears to fetch the whole shebang !??
12.5.3 checkout remote branch
- Do regular checkout on repo
- > git fetch origin remote_branch:local_branch_name
- > git checkout local_branch_name
Also '–depth=1' works with fetch
12.5.4 calculate revision number from logs
This is an idea from online, not used but worth considering
revisioncount=`git log --oneline | wc -l`
13 Doxygen
13.1 Indicate code sections
#+BEGIN_SRC C++
/**
- @name My Code Section
- @{
*/
// Methods with header comments here
///@}
#+END_SRC C++
14 MariaDB
14.1 Repair table
When error like this occurs:
#145 - Table './DB_NAME/wp_posts' is marked as crashed and should be repaired
- Run query:
REPAIR TABLE `<table name>`;
15 Parsing
- Compiler Construction - Niklaus Wirth, online PDF
15.1 Parsing with derivates
- Parsing for Free - Futumara projections
- Parsing with Derivatives - A Functional Pearl - paper, updated version of 'Yacc is Dead'.
- Blog yacc is dead
- Blog overview Parsing with derivatives - working out java example
- Java-Parser-Derivatives - Code of previous blog
16 Scientific Maths
17 Other
17.1 Distributed
- Vector Clock
- Ray - distributed computing platform.
Related:
- SPMD - Intel, 'Single Program, Multiple Data'; abstraction language for SIMD
17.2 IEEE 745 float
Following for 32-bit floats.
- bit 31: sign; if 1, negative
- bits 23-30: exponent; 127 offset, e.g. 2^127 -> 1.0
- bits 0-22 (23 bits): mantissa, top bit implicit
- +0 and -0 both exist; +0 has bitwise representation 0x0
- Special values: inf (+/-), NaN (s-, q-)
- All have exponent set to max (0b11111111)
- Inf: mantissa zero
- NaN: mantissa non-zero, sNaN has top bit of mantissa set (not sure, may be reverse)
- Denormalized: if exponent == 0, implicit leading 1 is dropped
17.3 TLA+
- Learn TLA+ - Bookmark for current position
- TLA Home Page - Learn TLA
- Practical TLA+ - eBook, perhaps of interest if I become serious
- Leslie Lamport - Writings
- Experimenting with TLA+ and PlusCal 2: Throttling - As example of TLA+ usage
17.4 Python
17.4.1 CTypes
17.4.1.1 Demo usage
Python:
>>> from ctypes import * >>> bellend = CDLL("./libBellend.so") # in Bellend/Debug >>> bellend.convert_image(123) ...123
17.4.2 Use gdb to debug python
> gdb python > (gdb) run /path/to/script.py
wait for segfault
> (gdb) backtrace
stack trace of the c code
Using python debugger module:
> python -m pdb myscript.py
17.4.3 Boost python
History:
32 sudo zypper in boost-devel # Cancelled, bloody huge 41 sudo zypper in python-devel # For patchlevel.h
Zip from: https://github.com/boostorg/python
Example code from: http://www.shocksolution.com/python-basics-tutorials-and-examples/linking-python-and-c-with-boostpython/
17.5 Typescript
When taking the leap, consider following:
17.6 Linters and Checkers
17.6.1 clang-tidy
17.6.1.1 Install
- Download and unpack
LLVM source list
- Download
Clang source code
, unpack in previous at subdirllvm/tools/clang
- Download
clang-tools-extra
, unpack in previous at subdirllvm/tools/clang/extra
- Make build dir
build-llvm
next to top-level dir ofllvm
- In build dir:
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS\=ON ../llvm-7.0.0=
(takes a looong time)
17.6.1.2 To use
- In the build dir of the project to analyze:
> make clean > bear make all
- To run
clint-tidy
(One source file at a time! Can't do dir's):
> <path-to>/clang-tidy <path-to-sourrce-file-in-project> -p <project-build-dir>
To get config data for .clan-tidy
: append to previous cmd: --dump-config