tmux

Narzędzie do multiplikowania i zapisywania stanu sesji. Możemy wygodnie przełączać się pomiędzy kilkoma sesjami oraz nadawać im nazwy dla
wygodniejszej pracy. Po zamknięciu konsoli możemy wygodnie powrócić do ostatniej konfiguracji.

sudo apt-get install tmux
tmux a

Skróty i komendy

SkrótOpis
Ctrl + b; sWidok wszystkich sesji z możliwością przełączania
Ctrl + b; wWidok wszystkich sesji i okien z możliwością przełączania
Ctrl + b; $Zmiana nazwy aktywnej sesji
SkrótOpis
Ctrl + b; cOtwarcie nowego okna w aktywnej sesji
Ctrl + b; $Zmiana nazwy aktywnej sesji
Ctrl + b; ,Zmiana nazwy aktywnego okna
Ctrl + dZamknięcie otwartego okna
Ctrl + b; nPrzełączenie do kolejnego okna w sesji
Ctrl + b; pPrzełączenie do poprzedniego okna w sesji
Ctrl + b; fZnajdź okno
SkrótOpis
Ctrl + b; %Podziel widok horyzontalnie
Ctrl + b; "Podziel widok wertykalnie
Ctrl + b; oPrzełączenia pomiędzy oknami w danym widoku
SkrótOpis
Ctrl + b; ?Wyświetlenie pomocy
Ctrl + b; :Konsola komend tmux, pozwala na bardziej zaawansowane operacja
KomendaOpis
:swap-pane -UPrzenieś okno w górę (na liście okien)
:swap-pane -DPrzenieś okno w dół (na liście okien)

Linki


CPP insights [link]

Kompilator c++ wyświetlający kod pośredni. Jeśli kiedykolwiek zastanawiałeś się, jak kompilator zoptymalizuje dane wyrażenie, to dzięki
temu narzędziu możesz sprawdzić:

  • jak closure są przekazywane do lambdy
  • jak kompilator optymalizuje wartość zwracaną z funkcji
  • jakie iteratory są używane przy for eatch
cppinsights

Przykłady

#include <cstdio>
#include <vector>

int main()
{
    std::vector<int> vec = {1,2,3,4};
	const int value_1 = 33;
  
  	auto cb = [&](auto a) {
      return value_1 * a;
    };
  
 	for(auto item : vec) {
      printf("%d", cb(item));
    }
}

Otrzymujemy poniższy wynik. Możemy łatwo zaobserwować:

  • vector jako template jest instancjowany nie tylko typem elementu, ale też domyślnym alokatorem
  • lambda jest osobną klasą
  • domknięcia używane przez lambdę to pola prywatne klasy ustawiane w konstruktorze
  • pętla for korzysta z iteratorów w tym przypadku nie const
#include <cstdio>
#include <vector>

int main()
{
  std::vector<int, std::allocator<int> > vec = std::vector<int, std::allocator<int> >{std::initializer_list<int>{1, 2, 3, 4}, std::allocator<int>()};
  const int value_1 = 33;

  class __lambda_9_14
  {
    public:
    template<class type_parameter_0_0>
    inline /*constexpr */ auto operator()(type_parameter_0_0 a) const
    {
      return value_1 * a;
    }

    #ifdef INSIGHTS_USE_TEMPLATE
    template<>
    inline /*constexpr */ int operator()<int>(int a) const
    {
      return value_1 * a;
    }
    #endif

    private:
    const int & value_1;

    public:
    __lambda_9_14(const int & _value_1)
    : value_1{_value_1}
    {}

  };

  __lambda_9_14 cb = __lambda_9_14{value_1};
  {
    std::vector<int, std::allocator<int> > & __range1 = vec;
    __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __begin1 = __range1.begin();
    __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __end1 = __range1.end();
    for(; __gnu_cxx::operator!=(__begin1, __end1); __begin1.operator++()) {
      int item = __begin1.operator*();
      printf("%d", cb.operator()(item));
    }

  }
  return 0;
}