selfjungle Just another WordPress weblog


git checkout pull requests

Edit .git/config :

[remote "origin"]
        url = ...
#       fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pull/*
Tagged as: No Comments

binding c++ class members as c signal handlers

#include <signal.h>
#include <functional>

std::function<void(int)> callback_wrapper;
void callback_function(int value)

class Foo {
  void catch_signal(int) {}

int main(int argc, char** argv)
    Foo foo;

    // deprecated since C++-11
    callback_wrapper = std::bind1st(std::mem_fun(&Foo::catch_signal),
    // or
    callback_wrapper = std::bind(&Foo::catch_signal,

    struct sigaction sigIntHandler;
    sigIntHandler.sa_handler = callback_function;
    sigIntHandler.sa_flags = 0;
    sigaction(SIGTERM, &sigIntHandler, NULL);
Tagged as: , No Comments

git word diff

git diff --word-diff=color

shows changes in place.

Tagged as: No Comments

c, c++ measure elapsed time

Elapsed time of function, for performance measurement

C style

#include <sys/time.h>

struct timeval begin_v, end_v;
gettimeofday(&begin_v, NULL);
// the function
gettimeofday(&end_v, NULL);

const double s = end_v.tv_sec + end_v.tv_usec / 1e6 - begin_v.tv_sec - begin_v.tv_usec / 1e6;
printf ("Elasped time: %f s\n", s );

C++ style

#include <chrono>

std::chrono::time_point<std::chrono::steady_clock> start, end;
start = std::chrono::steady_clock::now();
// the function
end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed_seconds = end-start;

std::cout << "Elapsed time: " << elapsed_seconds.count() << " s" << std::endl;

edit: instead of user-adjustable system_clock, the monotonic steady_clock can be a better choice.

Tagged as: , No Comments

set mouse sensitivity – with xset

# get current stat:
xset q | grep -A 1 Pointer
# set new:
# xset m acceleration threshold
xset m 3/2 4

Filed under: Uncategorized No Comments

openwrt post-flash

# set root password

# install web UI
ssh root@
  opkg update
# if you'll get 404 errors, edit /etc/opkg.conf and change the package paths:
  opkg install luci-ssl
# if you have default_postinst: not found, script returned status 127 errors, check if the package version is ok: maybe?
# remove & try again:
opkg remove --force-remove luci-ssl px5g libustream-polarssl libpolarssl luci luci-proto-ppp luci-mod-admin-full luci-base luci-lib-nixio  uhttpd-mod-ubus  uhttpd lua luci-app-firewall  luci-theme-bootstrap libiwinfo-lua liblua libuci-lua rpcd luci-lib-ip libubus-lua

# start web server
/etc/init.d/uhttpd start
/etc/init.d/uhttpd enable

# enable wifi
uci set wireless.@wifi-device[0].disabled=0; uci commit wireless; wifi
uci show wireless | grep disabled

login to and do the rest...

Tagged as: No Comments

zfs and portage’s var directories

While /var is usually for non-crucial content, caches[3], pid files, etc, portage has a different idea [1]:

/var/db/pkg Portage stores the state of your system
/var/lib/portage The versions for the applications you have explicitly installed

These directories store the current tree state, there is no way recreating them if they are deleted.[2]

So if you plan to use ZFS with separate / and /var to take a snapshot of /, install some packages and then rollback the snapshot as you changed your mind, your / and /var will be out of sync!

/var/db/pkg and /var/lib/portage has to be on /.

mkdir /usr/var_db_pkg /usr/var_lib_portage
cp -r /var/lib/portage /usr/var_lib_portage
cp -r /var/db/pkg /usr/var_db_pkg
rm -rf /var/lib/portage /var/db/pkg
ln -s /usr/var_lib_portage /var/lib/portage
ln -s /usr/var_db_pkg /var/db/pkg

[2] Or at least it is painfull. To avoid the initial circular-dependency hell, issue:

emerge --nodeps dev-lang/perl dev-lang/python dev-libs/libxml2 dev-util/cmake dev-util/pkgconfig sys-apps/acl ys-apps/systemd sys-devel/automake sys-libs/glibc sys-libs/ncurses sys-libs/zlib virtual/libudev

[3] what you'd have to recreate: powertop's calibration measurements, gentoolkit's busybox and initramfs

Tagged as: , No Comments

zfs set ditto blocks after file system creation

"The copies property works for all new writes, so I recommend that you set that policy when you create the file system or immediately after you create a zpool." [1]

So how can you force a complete reread-rewrite?
With (non-incremental) backup and restore:

# settings properties won't work:
zfs set copies=2 POOL/FS
zfs snapshot SNAPSHOT
zfs send SNAPSHOT | xz --threads=12 --verbose > FILE.img.xz
zfs destoy POOL/FS
xz --threads=12 --decompress --verbose  FILE.img.xz -c | zfs receive POOL/FS

# so you have to create & override a new FS with copies=2
zfs snapshot SNAPSHOT
zfs send SNAPSHOT | xz --threads=12 --verbose > FILE.img.xz
zfs destoy POOL/FS
zfs create ... -o copies=2  POOL/FS
xz --threads=12 --decompress --verbose  FILE.img.xz -c | zfs receive POOL/FS -F


Tagged as: No Comments


add -dpi 276 to /etc/X11/xinit/xserverrc

at firefox about:config set layout.css.devPixelsPerPx to 2

to be continued...

Filed under: Uncategorized No Comments

c++ for_each on multiple ranges

‚Ä©template<typename InputIter1, typename InputIter2, typename BinaryFunction>
BinaryFunction for_each_on_two_ranges(InputIter1 first1, InputIter1 last1, InputIter2 first2, BinaryFunction f) {
  for (; first1 != last1; ++first1, ++first2) {
    f(*first1, *first2);
  return f;

or with variadic templates:

void increment_iterator() {}
template<typename Arg1, typename... Args>
void increment_iterator(Arg1& arg1, Args&... args)

template<typename InputIter1, typename Function, typename... InputIters>
Function for_each_N(InputIter1 first1, InputIter1 last1, Function f, InputIters... iters) {
  for (; first1 != last1; ++first1) {
    f(*first1, *iters...);
  return f;

the following functor can take any parameter:

template<typename T>
struct Add {
  Add() : value() {}

  void operator()() {}
  template<typename U=T, typename... Args>
  void operator()(const U& arg1, const Args&... args) {
    value+= arg1;
  T value;

std::vector<int> a = { 1, 2, 3, 4, 5 };
std::vector<int> b = { 1, 2, 3, 4, 5 };
std::vector<int> c = { 1, 2, 3, 4, 5 };
std::vector<int> d = { 1, 2, 3, 4, 5 };

Add<int> sum2 = for_each_N(a.begin(), a.end(), Add<int>(), b.begin());
Add<int> sum4 = for_each_N(a.begin(), a.end(), Add<int>(), b.begin(), c.begin(), d.begin());
Tagged as: No Comments