Pokazywanie postów oznaczonych etykietą Linux. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Linux. Pokaż wszystkie posty

2 lipca 2018

xterm - vector graphic display

Lata 70. zaowocowały pojawieniem się komputerów firmy Tektronix oferujących wyświetlanie grafiki wektorowej, co spopularyzowało ich użycie przez inżynierów i projektantów, szczególnie w środowiskach CAD.
Tektronics 4014 US map.jpg

By David Gesswein / GNUplot - http://www.pdp8.net/tek4010/tek4010.shtml, CC BY-SA 4.0, Link

Co ciekawe, xterm pozwala na emulowanie tego typu terminali (tek4014/tek4015/tek4012/tek4013/tek4010), umożliwiając wyświetlanie grafiki wektorowej bezpośrednio w konsoli. Dostępna jest emulacja tylko terminali monochromatycznych, a konsola nie pozwala na zamazywania znaku po wciśnięciu Backspace. Być może jest to kwestia, jakiś dodatkowych opcji konfiguracyjnych.
xterm -t
Jednym z programów, który korzysta z tych możliwości jest gnuplot. Wszystko co trzeba zrobić to ustawienie w skrypcie terminala jako xterm, vvtek lub tek40xx (zauważyłem też opcję tek410x, ale xterm nie radzi sobie z jej obsługą). Poniżej przerobiony przeze mnie przykład autorstwa Hagen Wierstorf: "Plotting the world revisited". Rożnica, którą ja dostrzegłem to to, że opcja xterm rysuje grafikę w osobnym oknie, vttek, w tym samym w którym uruchomiany jest gnuplot, a tek40xx jest zdecydowanie najszybsze w rysowaniu.
#!/usr/bin/gnuplot
#
# Plotting the world with the natural earth data set (3D)
#
# Original AUTHOR: Hagen Wierstorf
# Original source: http://www.gnuplotting.org/code/world3d_revisited.gnu
#
# http://www.gnuplotting.org/plotting-the-world-revisited/

reset

# set terminal vttek
# set terminal xterm
set terminal tek40xx

unset key; unset border
set tics scale 0
set lmargin screen 0
set bmargin screen 0
set rmargin screen 1
set tmargin screen 1
set format ''

set mapping spherical
set angles degrees
set hidden3d
# Set xy-plane to intersect z axis at -1 to avoid an offset between the lowest z
# value and the plane
set xyplane at -1
set view 56,81

set parametric
set isosamples 25
set urange[0:360]
set vrange[-90:90]

r = 0.99
splot r*cos(v)*cos(u),r*cos(v)*sin(u),r*sin(v) with lines, \
      'world_110m.txt' with lines
A prezentuje się to tak:

27 czerwca 2018

Debian w wersji netboot

Debian posiada dwa ciekawe obrazy, które instalują system w minimalnej konfiguracji: netboot i netinst. Zacząłem od netboot-a (obraz .iso o rozmiarze 45MB, instalacja pakietów z sieci):
Po instalacji system liczy sobie około 400 pakietów. Jest oczywiście apt-get i ssh, ale także perl, Python, które są najwyraźniej potrzebne do uruchomienia skryptów systemowych. Dla wygody musiał jednak doinstalować kilka rzeczy:
  • aptitude (jest apt-get, ale to jest wygodniejsze)
  • vim (jest nano i vi, ale ciężko mi się z nich korzysta)
  • net-tools (jest ip, ale wolę ifconfig)
  • gpm (mysz w konsoli, w sumie niepotrzebne, gdy skorzysta się z ssh)
  • gcc
  • make
  • linux-headers
Trzy ostatnie potrzebne dla VirtualBox Guest Additions, ale żeby uruchomić jego instalację konieczna była zmiana w /etc/fstab. Aby dało się uruchamiać z cdrom-a binary (VBoxLinuxAdditions.run) trzeba dodać opcję "exec":
$ sudo vim /etc/fstab
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto,exec     0       0
Ostatecznie system w takiej konfiguracji liczy sobie około 1.5 GB.
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  5.4M  390M   2% /run
/dev/sda1       3.9G  1.5G  2.3G  39% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sr0         56M   56M     0 100% /media/cdrom0
tmpfs           395M     0  395M   0% /run/user/1000
Pewnie można znaleźć coś mniejszego, ale tak wersja (Debian, którego można rozbudować o nowe pakiety), wydaje cię całkiem ciekawą piaskownicą do dalszego eksperymentowania.

15 października 2016

pdfunite - łączenie kilku dokumentów w jeden

Magiczny zlepek komend do połączenia kilku pdf-ów w jeden.
ls -v *.pdf | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x; pdfunite "${x[@]}" output.pdf'

16 marca 2016

Klient OpenVPN - pierwsze kroki

Postawienie dobrze zabezpieczonego połączenia VPN, jest jak się okazuje czynnością dość pracochłonną. Szczególnie warty uwagi jest pierwszy link, który opowiada o dobrym zabezpieczeniu całej usługi:
Moje pierwsze kroki, sprowadziły się do rozwiązania kilku problemów, związanych z systemem operacyjnym (Ubuntu) jak i usługodawcą VPN. Pierwsza próba odpalenia zakończyła się błędem:
Wed Mar 16 10:10:10 2016 ERROR: Cannot ioctl TUNSETIFF tap: Operation not permitted (errno=1)
Wed Mar 16 10:10:10 2016 Exiting due to fatal error
A więc klient, musi w jakiś sposób uzyskać prawa super użytkownika, aby działać na urządzeniu tun/tab, na co jest kilka rozwiązań:
Najprościej jest oczywiście, gdy posiadamy prawa root-a. Możemy wtedy wykonać komendę (gdzie w pliku secret.txt, w kolejnych linijkach zapisany jest login i hasło):
openvpn --config vpn_provider/conf.ovpn --ca vpn_provider/ca.crt \
        --auth-nocache --auth-user-pass secret.txt
Kolejny problem, z którym się spotkałem to niedziałające DNS-y. Czasami usługodawca VPN nie oferuje takiej usługi ze swojej strony, a ISP nie zgadza się na łączenie ze swoimi serwerami DNS, dla osób spoza sieci. DNS-owe zapytania, można przerzucić na router (192.168.1.1), co może nie być najlepszym pomysłem ze względów bezpieczeństwa, można też skorzystać z publicznych serwerów DNS (np. google). Nie wiem jak dokładnie wybierane są serwery DNS-owe z pliku /etc/resolve.conf, przez aplikacje, ale to co zaobserwowałem (przynajmniej w stosunku do komendy ping), warto wpisy o nowych serwerach podać jako pierwsze.
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.8.8
namseerver 8.8.4.4

28 lutego 2016

Android USB tethering

Android tethering i magiczny zestaw komend. Ale najpierw linki:
Należy rozpocząć od zainstalowania klienta DHCP jeżeli go nie ma, np.:
$ sudo apt-get install isc-dhcp-client
# Albo
$ sudo apt-get install dhcpcd5
Po podłączeniu telefonu do komputera i włączenie opcji tetheringu (Udostępnianie internetu | Router USB).
# Należy odnaleźć interfejs sieciowy podłączonego telefonu, będzie to np. enx01234
$ ifconfig -a

$ sudo dhclient enx01234
# Albo
$ sudo dhcpcd enx01234

# Test
$ route
$ wget -c example.com
Problem, który napotkałem to nie działające DNS-y, trzeba więc było dodać do /etc/resolv.conf publiczne DNS-y google:
$ cat /etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
nameserver 8.8.8.8
nameserver 8.8.4.4
Wszystko co pozostało to zautomatyzowanie całego procesu. Prawie ...

W przypadku mojego domyślnego ISP, pojawił się problem "powrotu". Najwyraźniej stara sesja DHCP, została utracona, a serwer nie chciał utworzyć nowej. Pomogły dwie komendy, które usunęły i zażądały nowej sesji.
$ sudo dhclient -r -v eth0
$ sudo dhclient -v eth0

27 lutego 2016

Reinstalacja VirtualBox-a wraz z extension pack-iem

Reinstalacja VirtualBox wraz z extension pack-iem. Najpierw należy ściągnąć pakiet (.deb) oraz extension pack (.vbox-extpack) w odpowiedniej wersji:
VirtualBox zaprotestuje, jeżeli mamy zainstalowaną starszą wersję, trzeba ja odinstalować:
$ sudo apt-get remove virtualbox-4.3
Proces instalacji:
$ sudo dpkg -i virtualbox-5.0_5.0.14-105127-Ubuntu-wily_amd64.deb

$ sudo VBoxManage list extpacks
Extension Packs: 1

$ sudo VBoxManage extpack uninstall "Oracle VM VirtualBox Extension Pack"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully uninstalled "Oracle VM VirtualBox Extension Pack".

$ sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-5.0.14-105127.vbox-extpack 
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Successfully installed "Oracle VM VirtualBox Extension Pack".

$ sudo VBoxManage list extpacks
Extension Packs: 1
Pack no. 0:   Oracle VM VirtualBox Extension Pack
Version:      5.0.14
Revision:     105127
Edition:      
Description:  USB 2.0 and USB 3.0 Host Controller, Host Webcam, VirtualBox RDP, PXE ROM, Disk Encryption.
VRDE Module:  VBoxVRDP
Usable:       true 
Why unusable: 

13 lipca 2015

Boost.Python - Pisanie rozszerzeń dla python-a w C++

Boost.Python pozwala na wykorzystanie klas i metod zaimplementowanych w C++ w Pythonie i odwrotnie. Skupiłem się na pierwszej części. Garść przydatnych linków:
Takie mieszanie technologi, niestety sprawia, że szukanie błędów staje się trochę denerwujące, ale już po dwóch godzinach udało mi się uzyskać działający przykład, który mniej więcej jest tym co chciałem uzyskać. Co ciekawe (jak mówi dokumentacji), kod napisany w C++, rzadko będzie wymagał zmian dostosowujących go do współpracy z Boost.Python-em, co uważam jest dużym plusem.
W pierwszej kolejności należy stworzyć plik źródłowy (tutaj SimplePrinter.cpp), z deklaracją wrappera - gdzie mówimy jakie interfejsy będą widoczny w Pythonie. Boost.Python posiada abstrakcję na std::vector, z której tutaj skorzystałem. Później korzystając z takiego modułu, należy stworzyć specjalny obiekt, dzięki któremu można skonwertować np. listę pythonową i skorzystać z danych w niej zawartych w kodzie C++ (przykład na końcu). Kilka ważnych uwag.
  • Należy pamiętać aby nazwa modułu (w BOOST_PYTHON_MODULE) była identyczna z nazwą pliku biblioteki dynamicznej, inaczej podczas importowanie takiego modułu można natknąć się niewiele mówiący błąd.
  • Nazywanie metody "print" sprawiła, że uzyskiwałem błąd, gdy próbowałem z takiej metody skorzystać. Najpewniej jest to związane z jakimś konfliktem, gdyż print (Python 2) jest słowem kluczowym.
#include <iostream>
#include <string>
#include <vector>

struct SimplePrinter
{
    void setWords(std::vector<std::string> words) {
        _words = words;
    }

    size_t count() const {
        return _words.size();
    }

    void show() {
        std::cout << "All: ";
        for (const auto& w : _words) {
            std::cout << w << " ";
        }
        std::cout << std::endl;
    }

private:
    std::vector<std::string> _words;
};

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(simple_printer)
{
    class_<std::vector<std::string>>("VectorOfStrings")
        .def(vector_indexing_suite<std::vector<std::string>>());

    class_<SimplePrinter>("SimplePrinter")
        .def("setWords", &SimplePrinter::setWords)
        .def("count", &SimplePrinter::count)
        .def("show", &SimplePrinter::show);
}
W celu skompilowania przykładu skorzystałem z Pythonowego distutils, które umożliwia budowanie modułów (nie miałem z tym narzędziem wcześniej do czynienia, ale wydaje się bardzo schludnym rozwiązaniem). W pierwszej kolejności należy stworzyć plik setup.py (w moim przypadku w tym samym katalogu, gdzie znajdowały się źródła). Tutaj ponownie, trzeba sprawdzić, czy nazwa modułu zgadza się z tą, która została zadeklarowana w wraperze C++. Co ważne, moja klasa korzysta z nowego standardu C++14, stąd dodatkowa flaga: extra_compile_args.
#!/usr/bin/env python

from distutils.core import setup
from distutils.extension import Extension

setup(name="PackageName",
    ext_modules=[
        Extension(name="simple_printer",
            sources=["SimplePrinter.cpp"],
            libraries=["boost_python"],
            extra_compile_args=["-std=c++14"])
    ])
Budowanie:
$ cd cpp_boost_python
$ ls
setup.py  SimplePrinter.cpp

$ python setup.py build

running build
running build_ext
building 'simple_printer' extension
creating build
creating build/temp.linux-x86_64-2.7
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/include/python2.7 -c SimplePrinter.cpp -o build/temp.linux-x86_64-2.7/SimplePrinter.o -std=c++14
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
creating build/lib.linux-x86_64-2.7
c++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z,relro -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/SimplePrinter.o -lboost_python -o build/lib.linux-x86_64-2.7/simple_printer.so
Po zbudowaniu biblioteka będzie znajdować się w podkatalogu build (build/lib.linux-x86_64-2.7/simple_printer.so).
Na sam koniec test działania.
$ cd build/lib.linux-x86_64-2.7
$ ls 
simple_printer.so

$ python
>>> import simple_printer
>>> s = simple_printer.SimplePrinter()
>>> words = simple_printer.VectorOfStrings()
>>> words.extend(w for w in ["first", "second"])
>>> s.setWords(words)
>>> s.count()
2
>>> s.show()
All: first second

17 grudnia 2014

Upgrade do Ubuntu 14.10 bez Unity

Aktualizacja z konsoli, bez wykorzystania narządzie dostępnych w Unity.
Konfiguracja proxy, jest niestety skomplikowana, brak jest centralnego punktu, który mógłby propagować zmiany dla wszystkich programów w systemie. Dla większości programów wystarczy wyedytować plik /etc/environment. Dla apt-get należy stworzyć specjalny plik /etc/apt/apt.conf.d/95proxies.
$ sudo vim /etc/environment

http_proxy="http://example.com:8080/"
https_proxy="https://example.com:8080/"
ftp_proxy="ftp://example.com:8080/"
no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
HTTP_PROXY="http://example.com:8080/"
HTTPS_PROXY="https://example.com:8080/"
FTP_PROXY="ftp://example.com:8080/"
NO_PROXY="localhost,127.0.0.1,localaddress,.localdomain.com"

# Dla apt-get
$ sudo touch /etc/apt/apt.conf.d/95proxies
$ sudo vim /etc/apt/apt.conf.d/95proxies

Acquire::http::proxy "http://example.com:8080/";
Acquire::ftp::proxy "ftp://example.com:8080/";
Acquire::https::proxy "https://example.com:8080/";
Upgrade do nowej wersji:
# Ustawienie Prompt=normal, jeżeli jest taka potrzeba
sudo vim /etc/update-manager/release-upgrades

# Instalacja narzędzia update-manager-core jeżeli jest to potrzebne
sudo apt-get install update-manager-core

# Właściwy upgrade
do-release-upgrade
Instalacja brakujących sterowników z płyty:
sudo mount /dev/cdrom /media/mydrivers/
sudo /media/mydrivers/run.sh

4 lipca 2014

[Notki] Praca w terminalu z tmux-em.

Bardzo fajny artykuł Łukasza Wróbla na temat pracy z tmux-em. Fajne narzędzie do podziału terminala na kilka paneli. Nie jest to wciąż coś czego poszukuje, ale na razie wystarcza:
Po wciśnięciu Ctrl+b program przechodzi do trybu kontroli. Notki:
  • Ctrl+b " - split horyzontalnie
  • Ctrl+b % - split wertykalnie
  • Ctrl+b strzałka - przełączenie między panelami
  • Ctrl+b+strzałka - zmiana rozmiaru panelu
  • Ctrl+b PgUp/PgDn - skrolowanie w panelu (aby wyłączyć ten tryb "q")

7 grudnia 2013

Ubuntu 13.10 - konfiguracja

Kolejna przesiadka tym razem na Ubuntu 13.10.

Układ klawiatury

Niestety w tej wersji wyparowała opcja zmiany układu klawiatury, co w moim przypadku powoduje uciążliwy problem w korzystaniu z klawiszy Shift+Home i Shift+End, które mam na klawiaturze numerycznej. Można skorzystać z rozwiązania jakim jest gnome-tweak-tool.
Znalazłem jeszcze jedno rozwiązanie, które nadaje się do wykorzystanie z fluxbox-em.
Przez wpisanie do .bashrc
# Set numeric keypad behavour so that shift <numeric key> works the same
# as shift <cursor key> when numlock is off.
setxkbmap -option numpad:microsoft

Wyłączenie konta gościa

Trzeba dopisać na koniec pliku /etc/lightdm/lightdm.conf.d/50-unity-greeter.conf
allow-guest=false

Zwalnianie miejsca na dysku

Doszło do tego, że zaczęło mi brakować miejsca, na partycji. Pomocne okazało się kilka opcji dla apt-get
# Czyści lokalne repozytorium, ze ściągniętymi paczkami. Usuwa paczki, 
# których już nie można ściągnąć i są w zasadzie bezużyteczne.
sudo apt-get autoclean

# Usuwa pliki które są cache-owane, kiedy program jest instalowany 
# albo uaktualniany.
sudo apt-get clean

# Usuwa paczki, które zostały zainstalowane w celu nasycenia 
# zależności dla innych  paczek i nie są już potrzebne.
sudo apt-get autoremove

2 czerwca 2013

Ubuntu 13.04 - powolna praca na VirtualBox-ie

Nowy system, nowe problemy, tym razem z Unity, które od wersji 12.10 występuje jedynie w wersji 3D. Cały system zaraz po uruchomieniu wydaj się działać niezwykle wolno. Oznacza to tyle, że na VirtualBoz-ie potrzebne są dodatkowe zabiegi, aby dało się "płynnie" pracować. Poniżej link, który opisuje całą procedurę:

http://askubuntu.com/questions/207813/why-does-an-ubuntu-12-10-guest-in-virtualbox-run-very-very-slowly