⌨ Labor omnia vincit ☮

openSUSE :: adding static routes in NM

Posted in KDE, SuSE [ru] by anaumov on 12.07.2016

Новичков в openSUSE вводит в заблуждение настройка сети из-за того, что для её управления существует несколько независимых технологий. В openSUSE Tumbleweed сегодня используется NetworkManager и wicked. Первый используется по умолчанию. Если же вам, к примеру, понадобится добавить статический маршрут и вы спросите об этом гугл, скорее всего в первую очередь вы найтдете классический способ сделать это. Помние, этот способ не сработает, если вы используете NM, и наоборот. Также не стоит забывать, что настройки сети в разных дистрибутивах могут отличаться.

Добавить маршрут можно с помощью команды route. В данном примере для доступа в сеть я использую рутер Тут стоит помнить лишь о том, что эти настройки пропадут после перезагрузки.

# route add -net netmask gw

Чтобы настройки не пропали, нужно прописать их в конфиге NM. Для каждого соединения существуют свои настройки. Загляните в каталог /etc/NetworkManager/system-connections. Там находится список файлов, каждый из которых относиться к тому или иному соединению. Чтобы добавить route правило, о котором я говорил выше, просто добавьте такую строчку в секцию [ipv4]:


Если вы используете KDE Workspace, вы можете добавить эти настройки в KDE NM-апплете. Для этого просто правый клик на иконке, выбираем “Configure Network Connections…”
configure network connections...
Появляется список соедининий. Выбираем нужное нам, нажимаем “Edit”. В появившемся окне переходим во вкладку IPv4 и там нажимаем “Routes…”, где можно добавить новые или удалить старые маршруты.
KDE NM route


openSUSE Conference 2016

Posted in Events by anaumov on 26.06.2016

openSUSE Conference 2016

Richard Stallman at TEDxGeneva 2014

Posted in Hacker culture, License by anaumov on 17.04.2016

Just like it

OpenBSD SNMP check

Posted in OpenBSD, python by anaumov on 11.03.2016

It seems like there are no OpenBSD SNMP checks on exchange.nagios.org or exchange.icinga.org. I found few checks for this operating system, but NO scripts which use SNMPv2c. Nobody trusts SNMPv2c? Well, as we know, the most common alternative acronym for SNMP is “Security? Not My Problem!”, right? On the other hand, SNMP is the de facto standard for gathering information from network devices or servers.
Anyway, I have this free operating system at home and on this weekend I spent a bit time to play with SNMP. It makes fun to learn something new. SNMP servers on different systems support different OIDs/MIBs. OpenBSD includes an SNMP agent, snmpd(8), which supports all of the usual SNMP functions, and also offers visibility into OpenBSD-specific feautures such as packet filtering.

I concentrated on standard MIBs and wrote a small python script to monitor swap/memory usage, CPU load average and file system space usage. It looks like a common nagios plugin. In addition, it also shows information about network interfaces, file systems in tabular form and the list of running processes. Make it sense for people? 🙂
Keep reading…

Battleship – Sinclair ZX Spectrum

Posted in fun, myself, openSUSE by anaumov on 07.03.2016

The first computer, which was in my family, was ZX Spectrum. I think, I was about 6 when my father bought the first computer. This computer I used for gaming of course. I started programming later and on PC. I will never forget the sound of loaded games on Spectrum (software was distributed on audio cassette tapes and loading into memory was a sound (perceived by the human ear), interpreted as a sequence of bytes)…

Last weekend I played with my 5 years old son in Battleship. I showed him this game first time and we used pencil and paper. He teaches the alphabet and I think this could be a good experience for him. You know that feeling when you have something to show your children, do you remember your childhood. I don’t know why, but I remembered not a “paper version”, but our first computer and how I with my older brother played in Battleship on Spectrum against the computer.
I thought about this until evening and at the same evening found this game in net. I found a lot of different information about this game, the most important of which was the fact that this game can be installed on any PC running GNU/Linux. Yaaay… I can’t remember what I planed to do on this night, but until I went to sleep I installed spectrum’s Battleship on my x86_64 openSUSE and plunged into childhood for few hours 🙂
To install spectrum’s programs on UNIX/Linux you need to install emulator. In case of openSUSE, you need to add Emulators project first. After that install FUSE package. It just works. Just start fuse-binary with game-file-name as a parameter.
I would like to thank FUSE developers and openSUSE FUSE mainainers. I don’t play in “today’s” games, but time-to-time can spend a bit time for games of my childhood.

HP-UX SNMP check

Posted in python, UNIX by anaumov on 29.02.2016

A few days ago I upload my first nagios plugin to exchange.nagios.org. This is a small python script to monitor HP-UX servers using SNMPv2c. SNMP is the de facto standart for gathering information from network devices or servers. Many different devices from many different vendors support it as a management protocol.

SNMP manages information via a Management Information Base (MIB), which is a three-like structure that contains hierarchical information in ASN.1 format. MIBs can be referred to by name or numbers. I use following MIBs:

cpu 1 min
cpu 5min
cpu 15 min
memory total
memory free
FS mount point
FS usage size
FS total size
FS free space

This plugin checks the file system space usage, the CPU load average and the memory usage. Very simple, but maybe somebody will find it usefull. To get information via SNMP I use snmpwalk. I was not sure about python SNMP library and I think to install snmpwalk should be no problem for everybody.

Unfortunately HP-UX doesn’t support hrStorageTable, i.e. we can’t get storage information in tabular form. So, I implement it himself. It looks a bit like “df -h”:

> ./check_snmp_hpux.py public file-systems

    SIZE                USED                AVALIABLE           FILE SYSTEM
    2.0 Gb        765.3 Mb (37.37 %)        1.3 Gb (62.63 %)    /                             
    6.0 Gb         22.9 Mb (0.37 %)         6.0 Gb (99.63 %)    /home                         
   32.0 Gb         11.0 Gb (34.31 %)       21.0 Gb (65.69 %)    /opt                          
    8.0 Gb        444.4 Mb (5.42 %)         7.6 Gb (94.58 %)    /tmp                          
    8.0 Gb          3.1 Gb (38.15 %)        4.9 Gb (61.85 %)    /usr                          
   54.8 Gb         39.5 Gb (72.05 %)       15.3 Gb (27.95 %)    /var                          
   15.0 Gb         11.6 Gb (77.63 %)        3.4 Gb (22.37 %)    /oracle                       
  300.0 Mb        228.6 Mb (76.19 %)       71.4 Mb (23.81 %)    /oracle/origlog               
  300.0 Mb        228.6 Mb (76.19 %)       71.4 Mb (23.81 %)    /oracle/mirrlog               
    1.7 Tb          1.0 Tb (61.17 %)      667.9 Gb (38.83 %)    /oracle/oradata               
  100.0 Gb        129.6 Mb (0.13 %)        99.9 Gb (99.87 %)    /oracle/archives              
   64.0 Gb          3.6 Gb (5.69 %)        60.4 Gb (94.31 %)    /oracle/flash_area        
   15.0 Gb         10.0 Gb (66.96 %)        5.0 Gb (33.04 %)    /oraclog                      
  300.0 Mb        199.7 Mb (66.57 %)      100.3 Mb (33.43 %)    /oraclog/oraclog              
  300.0 Mb        199.7 Mb (66.57 %)      100.3 Mb (33.43 %)    /oraclog/mirrlog              
   12.0 Gb          5.8 Gb (48.63 %)        6.2 Gb (51.37 %)    /oraclog/oradata              
   20.0 Gb         79.7 Mb (0.39 %)        19.9 Gb (99.61 %)    /oraclog/archives             
    2.4 Gb         17.7 Mb (0.72 %)         2.4 Gb (99.28 %)    /oraclog/flash_area

> ./check_snmp_hpux.py public fs:/ 80 90
OK: FS usage 37.37 % [ 765.4 Mb / 2.0 Gb ]|usage=37;80;90;0;100
> echo $?

> ./check_snmp_hpux.py public mem 80 90
OK: Memory usage 77.89 % [99.6 Gb / 127.8 Gb]|usage=77;80;90;0;100
> echo $?

> ./check_snmp_hpux.py public cpu 1 2
OK: CPU load average 0.18, 0.19, 0.21 |'1 min'=0.18;1.0;2.0;0;0 \
'5 min'=0.19;1.0;2.0;0;0 '15 min'=0.21;1.0;2.0;0;0

As you can see, the output of all checks includes performance data to be able to create graphs in Nagios, Icinga, Centreon or another monitoring tools. In case of CPU check we will get 3 graphs: for 1 min, 5 min and 15 min CPU load average.

If plugin gets no SNMP answer, it returns UNKNOWN status (return code 3).

> ./check_snmp_hpux.py public file-systems
Sorry, no SNMP (hrStorage) answer from
> echo $?

> ./check_snmp_hpux.py public fs:/ 80 90
UNKNOWN: No SNMP answer from
> echo $?

> ./check_snmp_hpux.py public mem 80 90
UNKNOWN: No SNMP answer from
> echo $?

Tested on the HP-UX 11i v3 running on Itanium:

> ./check_snmp_hpux.py public os
HP-UX rasr0177 B.11.31 U ia64 0826591079

This plugin is free software. I use github as a hosting service and development platform. Feel free to ask me about details, report bugs or just give a feedback. Have fun 😉

openSUSE :: MySQL & Ruby

Posted in Ruby, SuSE [ru] by anaumov on 16.01.2016

Наконец-таки нашел немного времени для знакомства с Ruby. Присматривался к нему уже наверное лет 5. Сначала SUSE стала создавать свои web сервисы на Ruby, потом вышел WebYaST… Что связанно с SUSE, Ruby исползуется повсеместно. Наконец и YaST был переписан на Ruby, а это значит, что openSUSE стал первым дистрибутивом, где установщик полностью написан на этом языке. Сегодня его просто нельзя уже игнорировать. Итак, я собираюсь начать восхождение как можно быстрее. Вы со мной? 🙂

Я покажу, что Leap 42.1 прекрасно подходит для изучения Ruby. В качестве примера рассмотрим работу с MySQL (на работе мне постоянно приходится писать автономные программы, поведение которых зависит от данных в БД); что-нибудь самое простое.

Если вы уже работали с БД, к примеру, в Python или Lisp, то приведенный ниже код поймете сразу. Require подключает модуль mysql. Мы создаем mysql-объект con. С помошью его метода query создаем SQL-запрос. Пробегаемся по выводу при помощи each do, при этом каждой строке из вывода присваиваем имя row. Я использую puts для вывода информации на экран. В Ruby есть и всем известный print. Разница в том, что puts добавляет символ новой строки в конец вывода, а вот print этого не делает. 14-16 строки обрабатывают ошибку (показывают ее вывод, но программа продолжает работу), если такая возникнет при попытке соединиться и получить данные. В конце мы вызываем close, который закрывает соединине.

require 'mysql'

    con = Mysql::new('',

    con.query('SHOW columns FROM nagios_server').each do |row|
         puts "#{row[0]} #{row[1]} #{row[2]} #{row[3]}"

    rescue Mysql::Error => e
        puts e.errno
        puts e.error
        con.close if con

При первом запуске (используем свежую Leap 42.1 x86_64) получаем ошибку:

> ./mysql-test.rb
/usr/lib64/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55: \
                   in `require': cannot load such file -- mysql (LoadError)
        from /usr/lib64/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from ./mysql-test.rb:2:in `'

Тут все понятно: require не может найти mysql. Для установки воспользуемся gem. Это аналог Lisp’овского QuickLisp или Python’овского pip.

> gem --help
RubyGems is a sophisticated package manager for Ruby.  This is a
basic help message containing pointers to more information.

    gem -h/--help
    gem -v/--version
    gem command [arguments...] [options...]

    gem install rake
    gem list --local
    gem build package.gemspec
    gem help install

  Further help:
    gem help commands            list all 'gem' commands
    gem help examples            show some examples of usage
    gem help platforms           show information about platforms
    gem help                     show help on COMMAND
                                   (e.g. 'gem help install')
    gem server                   present a web page at
                                 with info about installed gems
  Further information:

> gem list --local mysql

*** LOCAL GEMS ***


Нет ни одной установленной в системе mysql gem.
Обратите внимание на вывод gem’овской help – для команды list сказано только по поводу –local аргумента. Там есть еще –remote. Последний покажет доступные для установки gem’ы. Я не привожу тут вывод, потому что список слишком большой.
Для установки воспользуемся командой install:

# gem install mysql
Fetching: mysql-2.9.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
ERROR: Failed to build gem native extension.
/usr/bin/ruby.ruby2.1 extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib64/ruby/include/ruby.h
extconf failed, exit code 1 

Gem files will remain installed in
/usr/lib64/ruby/gems/2.1.0/gems/mysql-2.9.1 for inspection.
Results logged to

И я вам скажу честно – так происходит со многоими gem’ами 🙂

Но на самом деле ничего страшного не случилось. Дело в том, что gem’у нужен файл из RPM-пакета. Какого-то RPM пакета… Вызывать zypper нам придется самим. Какой пакет устанавливать? Мне повезло, я вспомнил, что один RPM-пакет нужно было доустановить и в случае с Common Lisp. В том случае это был libmysqlclient, для Ruby же нужен libmysqlclient-devel. Очень рекомендую еще поставить пакет ruby-devel и весь pattern devel_basis. Там много библиотек, необходимых интерпретору.

> sudo zypper in -t pattern devel_basis
> sudo zypper in ruby-devel libmysqlclient-devel

После этого попытаемся установить mysql gem снова:

> gem install mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.9.1
Parsing documentation for mysql-2.9.1
Installing ri documentation for mysql-2.9.1
Done installing documentation for mysql after 0 seconds
1 gem installed

> echo $?

> gem list --local mysql

*** LOCAL GEMS ***

mysql (2.9.1)

Выглядит лучше, правда? Теперь вернемся к коду выше. Придумайте для теста какой-нибудь простой SQL запрос. Что-нибудь типа show tables, к примеру. Вывод скрипта, приведенного выше, выглядит так:

id int(11) NO PRI
name varchar(40) YES 
localhost enum('0','1') YES 
is_default int(11) YES 
last_restart int(11) YES 
ns_ip_address varchar(255) YES 
ns_activate enum('1','0') YES 
ns_status enum('0','1','2','3','4') YES 
init_script varchar(255) YES 
monitoring_engine varchar(20) YES 
nagios_bin varchar(255) YES 
nagiostats_bin varchar(255) YES 
nagios_perfdata varchar(255) YES 
centreonbroker_cfg_path varchar(255) YES 
centreonbroker_module_path varchar(255) YES 
centreonconnector_path varchar(255) YES 
ssh_port int(11) YES 
ssh_private_key varchar(255) YES 
init_script_snmptt varchar(255) YES 

Для сравнения, вот так выглядит вывод нашего SQL запроса в mysql(1):

> SHOW columns FROM nagios_server;
| Field                      | Type                      | Null | Key | Default |
| id                         | int(11)                   | NO   | PRI | NULL    |
| name                       | varchar(40)               | YES  |     | NULL    |
| localhost                  | enum('0','1')             | YES  |     | NULL    |
| is_default                 | int(11)                   | YES  |     | 0       |
| last_restart               | int(11)                   | YES  |     | NULL    |
| ns_ip_address              | varchar(255)              | YES  |     | NULL    |
| ns_activate                | enum('1','0')             | YES  |     | 1       |
| ns_status                  | enum('0','1','2','3','4') | YES  |     | 0       |                         
| init_script                | varchar(255)              | YES  |     | NULL    |                              
| monitoring_engine          | varchar(20)               | YES  |     | NULL    |                
| nagios_bin                 | varchar(255)              | YES  |     | NULL    |                    
| nagiostats_bin             | varchar(255)              | YES  |     | NULL    |                                 
| nagios_perfdata            | varchar(255)              | YES  |     | NULL    |                                  
| centreonbroker_cfg_path    | varchar(255)              | YES  |     | NULL    |                                          
| centreonbroker_module_path | varchar(255)              | YES  |     | NULL    |                                  
| centreonconnector_path     | varchar(255)              | YES  |     | NULL    |                                   
| ssh_port                   | int(11)                   | YES  |     | NULL    |                                           
| ssh_private_key            | varchar(255)              | YES  |     | NULL    |                              
| init_script_snmptt         | varchar(255)              | YES  |     | NULL    |                                              
19 rows in set (0.00 sec)

Вот так выглядит мой первый шаг изучения Ruby. После опробывания парочки других библиотек (например SNMP, threading или SMTP), нужно браться за изучения типов данных. Это основа языка. Если приницип работы библиотек практически 1:1 как и в Python, то к отличиям типов данных стоит отнестись серьезнее. Еще меня интересует стиль языка, а именно функциональная парадигма. Ходят слухи, что на нем легче писать функциональный код, чем на python. В этом мне еще только придется убедиться.

На последок скажу, что открытой документации по Ruby очень много. Все больше и больше документации появляется сейчас и на русском. Удачи в изучении. Счастливо 😉

Linux Presentation Day + Leap 42.1 release party in Munich

Posted in Events, openSUSE by anaumov on 16.11.2015

On Saturday we had the openSUSE Leap 42.1 release party in Munich, which I announced a couple of days ago. We had around 20 participants there: about 10 openSUSE users and also about 10 GNU/Linux users from the Linux Presentation Day – people that just started using Free Software and wanted to know more about openSUSE, GNU project, Open Source in general and of course celebrate with us the new release 🙂

But at the beginning I had no idea where we can meet in Munich. On Wednesday I asked in our German ML about location and Marcus advised Linux Presentation Day. Two minutes later I sent email to Linux Presentation Day event’s organizers and asked about separate room with beamer and power sockets. We got everything what we asked about. Thanks a lot for collaboration!

After that, on Friday (when I was sure about location and room was reserved for us) I come to Nuremberg to take openSUSE promotion material like USB flash sticks, DVDs, stickers, green “Leap” T-shirts and openSUSE beer. It’s not so far away from Munich. I think, about half of eighth I was at SUSE Office and Richard gave all “release party stuff” (last time, when I organized openSUSE 12.1 release party in Göttingen, I got all these stuff via post, with the exception of beer of course).

I had a talk about openSUSE project in general: the talk was targeted primarily for those who never heard about OBS, Leap or openQA. I tried emphasized the role of the community in openSUSE project.
I got many questions about systemd, SUSE impact on the openSUSE and quality of the “Enterprise Core” part which will be used in the Leap. I enjoyed talking with many that showed up and received as main feedback from many of those that I talked with.
If you’re going to invite “everybody” to your release party, you don’t need to talk so much about infrastructure or development model of openSUSE, I guess. That’s important and interesting for developers and Free Software evangelists maybe, but not for users, who are still not sure about contributing. For such users it’s more important how good this version as a desktop system than how easy to use submit request in OBS or which programming language should they use for implementation of tests for openQA or something like this.

By the way, at Linux Presentation Day we met one journalist from linux-user.de. So, I think my post will not be the only one about this event 🙂

I want to thank Richard and Doug for openSUSE stuff, Linux Presentation Day organizers for hosting us in the VHS building and… thanks to all who joined us! See you next time and have a lot of fun 🙂

more photos.

openSUSE 42.1 Leap :: Release Party in Munich

Posted in openSUSE by anaumov on 12.11.2015

openSUSE 42.1 Leap was released about week ago and it is looking good. Now we have community enterprise system. I would like to thank everyone who contribute to openSUSE project and help to make it better.

Of course, we should have openSUSE release party! openSUSE community haven’t had release parties in Munich for a while (since I live in Munich I think we never had it here).

So, what is release party about? Well… like usual: Linux geeks meet together, speak about features in new openSUSE version, news in Free Software world, drink beer and… of course have a lot of fun 😉

A few days ago I started discussion about release party with Linux Presentation Day organizers and it seems that problem with location is solved now. We will get small meeting room with power sockets and beamer there. That is exactly what we need. I also asked Doug and Robert about some “promotional material”, openSUSE beer and TShirts. Tomorrow (Friday) I’m going to go to SUSE office in Nuremberg to take it (beer can not be trusted to anybody).

Do you want be a part of it?
* November 14, Saturday
* I start my presentation at 12:00 AM. I’m going to talk (presentation) about OBS, Leap and openSUSE project in general.
* vhs-Zentrum, Münchner Str. 72, Eingang rechts, 85774 Unterföhring
* Don’t forget to bring your good mood and friends 😉

Everybody are very welcome! If you have any questions about openSUSE, GNU project or Free Software, feel free to come and ask.

Paradigms of Artificial Intelligence Programming

Posted in books, Lisp by anaumov on 05.10.2015

Paradigms_of_ArtificialIntelligence_ProgrammingНаконец-то получил заказанную накануне книгу Paradigms of Artificial Intelligence Programming Питера Норвига. До того как купить её, я получил в рунете немало негативных отзывов о ней. Связанны они были главным образом с тем фактом, что книга эта очень старая, т.е. матерал безнадежно устарел, а методики программирования, описанные в ней, уже давно не используются. Должен сразу сказать, что подобные заявления по поводу Lisp, лично у меня всегда вызывали только улыбку 🙂

This book can lead to a deep appreciation of the unique strengths of Lisp and help the reader understand why Lisp is still in active use nearly 40 years after it was first developed

Серьезно. Я не поленился написать этот пост, поделиться с вами, потому что в действительности это и сегодня очень ценный труд по программированию искуственного интеллекта. Книга всего на 3 года старше “ANSI Common Lisp” Пола Грэма, перевод которой так тепло был принят в сети всего 2 года назад.

Материал в PAIP подробнее описывает не только сам Common Lisp, но и переплетается с идеями и методами, используемыми в программировании ИИ, что делает чтение ещё интереснее. Книга является богатым источником интересный идей и примеров. На протяжении почти 1000 страниц, автор (кстати, знакомый нам также своей статей “Научитесь программировать за десять лет”) приводит 10000 строчек исходного кода (доступного в интернете). В сети также можно найти немало обсуждений приведенного в книге кода.

Книга использовалась на протяжении многих лет как учебник в лучщих computer science универстетах США. Каждая из её 25 глав включает в себя около 10 упражнений разной сложности. Более подробное описание книги можно найти тут.

Цена за книгу на амазоне варьируется, но в общем она меньше, чем цена за ее доставку 😉

(format t “more than 80 characters per line”)

Posted in Lisp by anaumov on 29.08.2015

csvСтолкнулся сегодня с интересной особенностью функции format в Common Lisp. По умолчанию она выводит только по 80 символов на строку, а остальную часть переносит на следующую. Причина такого поведения, как вы уже догадались, историческая, и заключается в том, что раньше большинство UNIX терминалов использовало только 80-символьные строки на экране (наследие перфокарт IBM?).

До этого мне никогда не нужны были строки длинее, но сегодня я решил переписать один из своих скриптов, а именно: в качестве вывода использовать CSV– вместо XLS-файла. Так как скрипт просто генерировал таблицу, то я не стал для этого подключать целую библиотеку для работы с CSV, а решил самому написать функцию для создания файлов этого формата.

CSV означает Comma-Separated Values, т.е. это простейший формат таблиц, где существует только два правила: каждая новая строка в нашем файле будет новой строкой в таблице; для сток должен указывается так называемый разделитель (по умолчанию это запятая), который будет делить строку на ячейки (или столбцы). Другими словами, если в нашем выводе встречается символ новой строки, CVS перенесет весь остальной вывод на новую строку и продолжит заполнять ячейки уже на ней.
читать дальше…

openSUSE first steps

Posted in SuSE [ru] by anaumov on 22.07.2015

В блоге моего знакомого Александра Толстого есть достаточно интересная заметка о некоторых действиях, которые он советует проделать после установки openSUSE. И хотя речь там идет о openSUSE 13.2, я думаю большинство из советов (если не все), должны без проблем заработать и в Tumbleweed.
В этой же заметке я постараюсь дополнить Александа, т.е. дать несколько похожих советов, с той лишь разницей, что они, я думаю, понадобятся более узкому кругу пользователей 😉

Устанавливаем Minimal Server Selection (Text Mode)

minimal installЕсть лишь один способ получить быструю и чистую, т.е. без мусора, систему – начать с минимального набора компонентов и доустановить только то, что вам действительно необходимо.
Да, для этого надо знать, что необходимо, а что есть лишее. Набор “необходимого” складывается из задач, для решения которых будет предназначена система.
Помните, что установщик openSUSE спрашивает не только о предлагаемых к установке DE (комплектах ПО), но и предоставляет выбор из списка всех возможных rpm-пакетов. Так что получить минимальную систему вы можете даже если сначала выбрали, к прмеру, KDE, а потом убрали из списка часть предлагаемых компонентов.
Руководство по установке fluxbox.
Руководство по установке stumpWM.

Настраиваем vim

Только не говорите мне, что вы пользуетесь nano 🙂 Vim незаменим. Это классика, это простота, это элегантность. Говоря это я ни в коем случае не хочу обидеть пользователей emacs. С вами, ребята, я всегда охотно пропущу по бутылочке темного, но признайте, что vim должна быть установленна на каждой UNIX/GNU-системе (хоть GNU is Not UNIX) 🙂

Конфигурационным файлом vim по-прежднему является .vimrc. Добавим туда пару строк.

set smartindent
set tabstop=4
set shiftwidth=4
set paste

Да, 4 отступа вместо 8, при нажатии tab. Автоопределение необходимости отступов с текущей строки при добавлении новой. И paste тоже необходима, дабы код не уходил лесенкой вправо при добавлении скопированного текста. Что-то забыл? Напомните мне в комментариях.

Отключение графики в GRUB2

Наверное это дело привычки, но когда я только начинал пользоваться GNU/Linux этот режим был режимом по умолчанию. Потом для пререключения во время загрузки приходилось нажимать esc. Теперь даже возможность переключения убрали… Как вы поняли, речь идет о splash-режиме GRUB. Этот режим отключает графику во время загрузки OC, последовательно показывая загружаемые компоненты системы. Для его отключения просто уберите “quiet” из параметров, которые GRUB2 передает ядру. Сделать это можно например через файл /etc/default/grub, либо через YaST2 (который перезапишет этот файл за вас). Не забудьте после этого обновить загрузчик при помощи grub-install(8).
Текущую конфигурацию можно посмотреть в /proc/cmdline.

Установка man-страниц на русском

Man-страницы или страницы руководств это наше все. По привычке заглядывать в man по той или ной команде или системной функции можно сказать как минимум о возврасте (а значит и опыте) пользователя. Когда я только начинал изучение этой ОС будучи студентом, у меня не было безлимитного интернета. Выходил в сеть я в основном лишь для того, чтобы проверить свои email. Скорость соединения тоже не шла ни в какое сравнение с сегодняшней. Слово “погуглить” пришло уже позже. Поэтому изучение man-страниц, открытыех в консоли, было тогда чем-то само собой разумеемщимся. Они до сих пор имеют одно важное преимущество – страницы руководств 100% совместимы с используемой вами системой, в отличие от половины мануалов, которые найдет поисковик в web.
Материал в страницах на английском более актуален (они уже установленны в системе), но я считаю неплохой идеей иметь под рукой коллекцию страниц на русском. Устанавливаем пакет man-pages-ru и вызываем man, передав в качестве параметра нужный язык (в нашем случае -L ru).

> sudo zypper in man-pages-ru

> man cal
Man: find all matching manual pages (set MAN_POSIXLY_CORRECT to avoid this)
 * cal (1)
   cal (1p)
Man: What manual page do you want?

> man -Lru cal
Man: поиск всех подходящих справочных страниц (set MAN_POSIXLY_CORRECT to avoid this)
 * cal (1)
   cal (1p)
Man: Какая справочная страница вам нужна?

Проблем с кодировкой возникнуть не должно.

Установка колекции RFC-документов

Раз уж речь зашла о мануалах в текстовом формате, то возможно кого-то заинтересует пакет rfc. Он содержит коллекцию The RFCs (Request For Comments). Большинство пользователей найдут материал из этих документов слишком сухим и техническим. Сам я стал туда заглядывать только после того, как стал увлекаться сетевым программированием.
В поиске по документам нам поможет zgrep, который умеет заглядывать в gz-файлы. Вот пример поиска документов, в которых встречается имя Theo de Raadt. Спорим, что если такой документ и есть, он будет о сетевых атаках 🙂

> sudo zypper in rfc
> zgrep -le "Theo de Raadt" /usr/share/doc/rfc/*
> less /usr/share/doc/rfc/rfc5927.txt.gz

Internet Engineering Task Force (IETF)                           F. Gont
Request for Comments: 5927                                       UTN/FRH
Category: Informational                                        July 2010
ISSN: 2070-1721

                        ICMP Attacks against TCP


   This document discusses the use of the Internet Control Message
   Protocol (ICMP) to perform a variety of attacks against the
   Transmission Control Protocol (TCP).  Additionally, this document
   describes a number of widely implemented modifications to TCP's
   handling of ICMP error messages that help to mitigate these issues.

Status of This Memo

   This document is not an Internet Standards Track specification; it is
   published for informational purposes.

   This document is a product of the Internet Engineering Task Force
   (IETF).  It represents the consensus of the IETF community.  It has
   received public review and has been approved for publication by the
   Internet Engineering Steering Group (IESG).  Not all documents
   approved by the IESG are a candidate for any level of Internet
   Standard; see Section 2 of RFC 5741.

   Information about the current status of this document, any errata,
   and how to provide feedback on it may be obtained at

Gont                          Informational                     [Page 1]
/usr/share/doc/rfc/rfc5927.txt.gz lines 1-58/2019 2%

Все они доступны online, а многие из них даже переведенны на русский. Устанавливать их или нет, каждый решит для себя сам. Лично я, когда куда-то отправляюсь и беру с собой свой лептоп, люблю пролистать парочку документов. Их не пишут без необходимости, и там действительно есть много интересной информации.

Отключаем postfix

Но вернемся к openSUSE. По умолчанию, каждый раз при включении в ней запускается postfix. Дело в том, что cron(1) сообщает пользователям о процессе выполненных заданий при помощи email. Только для этого в системе должна быть запущенна какая-нибудь MTA. В нашем случае это postfix. Я не так часто пользуюсь cron(1), поэтому отключение postfix нахожу вполне логичным, экономя драгоценную память, процессорное время и закрывая еще один tcp-порт.

> pstree -p | grep master
> sudo systemctl stop postfix.service
> sudo systemctl disable postfix.service

Если вы хотите посмотреть все запущенные службы: systemctl list-units -t service

Если вы до сих пор неуверенно себя чувствуете с systemd (именно он управляет системными службами), то я советую заглянуть на страницу Алексея Федорчука Шпаргалки по systemd. Написано просто и понятно.

Что-то забыл?

Конечно! Например пересборка ядра, установка необходимых библиотек и просто инструментов для программирования, поиск и скачивание нужных книг или, наконец, поиск красивых обоев. Но так как перечисленное относится уже к индивидуальным пристрастям и особенностям системы, то на этом “first steps” подходит к концу.

Напоследок напомню, что после устновки в системе добавлены только стандарные rpm-репозитории. Это далеко не все, что предлагает проект openSUSE. Есть дополтительные репозитории, которые могут быть добавлены, а так же существует целый список так называемых third-party репозторий, которые официально не поддерживаются проектом, но которые каждый из нас может использовать.

Удачи 😉

Common Lisp: more Libraries, more Frameworks, more fixes…

Posted in Lisp by anaumov on 17.07.2015

Пожалуй позволю себе еще один пост о Lisp, а именно – о его использовании “в продакшин”. Буквально на этой неделе на хабре снова был очередной пост-перевод на эту тему, к тому же я сейчас практически все свободное время на работе посвещаю переписыванию некоторых скриптов с Python на Common Lisp, что является причиной интереса коллег к этой теме.

Но мой пост все же будет отличаться от большинства других. Дело в том, что я считаю неправильным саму постановку вопроса. Когда я читаю комментарии обоих сторон, я замечаю, что говорят они о разных вещах. Сам Lisp, как таковой, т.е. ядро этого языка, на много мощнее Python (давайте будем сравнивать его с Python, раз уж последний уже вытесняет Perl, а Ruby пока составляет ему конкуренцию только в Web). Обратите внимание на книги по Python (или другим языкам программирования), они как правило начинаются с описания типов данных. Я помню как не знал с какой стороны подойти к Lisp, когда так привык к python’новским dictonary. Этот тип данных является ядром самого Python. Но даже начального знакомства с Lisp (это было уже на первой неделе работы с Lisp) мне хватило, чтобы реализовать свой тип данных, который позволял мне делать тоже самое в Lisp, что и dictonary в Python (в процессе написания я нашел в сети информацию о Lisp-хеш-таблицах, но все же решил довести дело до конца). Я до сих пор под впечатлением, что в моем арсенале теперь есть язык, который позволяет создавать абстрации, ограниченные по возможностям лишь моей фантазией и представлением о том, что и как “можно”.

crazy lisp programmerНо правы и те, кто забрасывают риторические, как им кажется, вопросы о столь низкой популярности Lisp. Правы они в том, что он действительно совсем не популярен. Но вовсе не потому, что сам язык в чем-то уступает. Дело тут в библиотеках, а точнее – в поддержке этих библиотек сообществом. На домашней странице проекта Quicklisp гордо значится число поддерживаемых библиотек:

Quicklisp is a library manager for Common Lisp. It works with your existing Common Lisp implementation to download, install, and load any of over 1,200 libraries with a few simple commands.

Да, более 1200 библиотек поддерживается этим library manager’ом, но это значит лишь, что я могу без проблем найти их, установить и использовать в моем Lisp-проекте. Это совсем не значит, что все эти библиотеки хорошо документированны, и существуют примеры в сети как ими пользоваться. Вовсе нет. Есть сообщество пользователей, да. Кто-то из них наверняка использует, к примеру, SMTP или SQL, поэтому вы, я думаю, без проблем найдете в сети пару примеров, а может быть даже блог-посты, а может быть даже страницу, посвященную этой библиотеке, с подробным описанием функций. Но есть в их числе и те, которые написал какой-нибудь прыщавый студент-очкарик несколько лет назад, и теперь, возможно, после того как нашел работу или завел семью, не занимается поддержкой своей библиотеки. Я не буду приводить пример. Библиотекой пользоваться очень не просто, т.к. она устарела, нет документации, нет примеров… а альтернативы, т.е. другой библиотеки для тех же целей, в Quicklisp нет. Если вы использовали GNU/Linux или BSD-системы в 90х или даже начале 2000х, то вы можете себе предствить о чем идет речь.
В Python такой проблемы нет, ну или почти нет. Этот язык окружил себя сегодня просто огромным сообществом, которое само-собой является поддержкой этого языка. То там то здесь появляются все новые и новые библиотеки, framework’и. Наконец, у Python есть Pyton Foundation.
Да, полка книг о Python есть и у меня, так что на ближайшие 5-10 лет по поводу трудоустройства, я думаю, мне можно не переживать. Кстати, если вы интересовались поиском работы в Европе, то наверняка слышали про stepstone.de. Посмотрите сколько мест она вам выдаст по запросу “Java” или “.NET”, а теперь скажите: вы находите стиль Java столь элегантным, выразительным, а сам язык мощным или просто продуманным? 🙂 Ее популярность обусловлена совсем другими причинами. Java, как и .NET, это два единственных в мире Enterprise языка программирования. А это, к сожалению, не имеет совсем никакого отношения ни к удобству использования, ни к продуманным типам данных, ни к простоте и стилю языка, а также не самым лучшим образом отражается на ее лицензии 😉

Я хожу по тонкому льду, позволяя себе такую роскошь как специализацию только на Free Software технологиях и системах, а так же программирование на тех языках, которые действительно приятно использовать, а не тех, которые так популярны по той или иной причине (хотя причина, как мы знаем, как правило всегда одна и та же).

Как Java и .NET обходят по популярности (на рынке труда) Python, так же и Python обходит Common Lisp. Но все же что-то приводит Java-программитов к Python, Perl или Ruby, а те, кто знаком с последними, рано или поздно хотя бы поверхностно знакомятся с Lisp. Ко второй группе отношусь и я, и я должен сказать, что код на Python лучше (в функциональном стиле?) пишет тот, кто знаком с Python и Lisp, чем тот¸ кто пишет только на Python. Возможно не все поймут последнее предложение, а Python-only программисты c ним, т.е. со мной, не согласятся 😉

Да, наша команда использует Common Lisp “в продакшин”, и я рад, что есть те, кто поддерживают необходимые для нас библиотеки. Я благодарен им. Программирование на Common Lisp интересней. Возможности обработки данных намного мощнее. Если получится доработать/починить некоторые библиотеки, которые нам нужны, я не против переписать весь python код на Common Lisp. Если это действительно получится, я обещаю выложить фиксы в отрытый доступ и посвятить пару блог-постов примерам и просто описанию этих библиотек.

GNU Screen 4.3.0

Posted in hacking, SuSE [ru] by anaumov on 14.06.2015

Мы рады сообщить о релизе GNU screen 4.3.0

Предыдущий стабильный релиз был более года назад (это была версия 4.2.1). Поэтому я решил наконец-то официально сделать “срез”, т.е. выпустить следующую стабильную версию. У нас нет фиксированного release-цикла, но в будущем мы планирую выпускать новые версии почаще. Скажем, 2 или даже 3 раза в год.

Что касается основых изменений:

  • X и x escape последовательности теперь будут показывать команду, которую пользователь передал в качестве параметра, при запуске screen.
  • Немного улучшена работа с зомби-окнами, хотя остается еще несколько спорных моментов.
  • Команда sort теперь упорядочит окна в алфавитном порядке.
  • Окна теперь можно перемещать вручную.
  • Команда windows позволяет работать с агрументами screen.
  • Много bugfixes (в том числе и не для GNU-систем).

Было добавленно несколько патчей из build-систем конкретных дистрибутивов (так как они теперь в git, из пакетов их естественно можно будет удалить). Во-первых, это сэкономит время/силы/нервы мантейнеров, во-вторых, разница между работой screen (одной и той же версии) в разных дистрибутивах теперь будет меньше.

У нас по-прежнему очень много открытых bugreports. Сейчас их более 200 (проект долгое время находился в состоянии летаргического сна). С моей стороны для следующей версии скорее всего будут только bugfixes этих репортов.

Я благодарен всем пользователям, которые уже помогли протестировать/воспроизвести некоторые баги (по моей просьбе) и просто принимали участие в обсуждениях.

Если меня не опередят, до конца следующей недели я постараюсь пересобрать пакеты для openSUSE и послать запросы (submit request) в соответствующие репозитории (c Tumbleweed у нас их получается уже 3).

Если кто-то захочет отравить patch, я напомню – авторство сохраняется и в самом git-комментарии и в git-заголовке author. Особо активные участники сообщества в качестве бонуса заносятся в man page, в раздел CONTRIBUTORS.

Скачать исходники 4.3.0 можно с ftp-сервера GNU.

SUSE Linux Enterprise 12 source packages

Posted in SuSE [ru] by anaumov on 15.05.2015

Новость неофициальная, поэтому ссылок на источник я не привожу.

В начале этого года (на FOSDEM) стало изветсно, что SUSE собирается опубликовать исходники пакетов для SUSE Linux Enterprise 12. Сами исходники действительно через пару месяцев были опубликованы. Об этом стало известно во время открытия openSUSE Conference, в начале этого месяца.

Открыты только исходники, а сам процесс сборки, т.е. создание репозиториев, ложится на плечи сообщества. SUSE не отвечает за собранные сообществом пакеты (как и RedHat не отвечает за пакеты в репозиториях CentOS).

Итак, чтобы получить репозиторий с необходимыми пакетами, достаточно в своем домашнем проекте создать subproject, который нужно слинковать с одним из двух опубликованных SUSE: SUSE:SLE-12:GA или SUSE:SLE-12:Update.

Пару дней назад я создал новый SLE12-проект, который слинковал с SUSE:SLE-12:GA. OBS до сих пор пересобирает в нем пакеты (их там почти 3000), но почти 2000 уже готовы. Только что я создал еще один проект для SLE-12:Update (их там почти 1000), так что к началу следующей неделе я, возможно, не только смогу удивить коллег, но и использовать SLE у себя дома как и openSUSE 😉