LINUX.ORG.RU

Избранные сообщения macumazan

Самый лучший язык для скриптов: Tcl?

 , , , ,

Кратко: Я немного сравнивал разные языки и выбрал Tcl, при дальнейшем изучении не разочаровался.

А какие языки вы используете для задач средней сложности — тех что не требуют эпохальных тяжеловесных программ, но и не решаются тривиально пайпом из трёх-пяти команд в баше? Средняя сложность — это что-то порядка от 3-5 до 3-5 тысяч строк кода (смотря какой язык). Такие где разбиение программы на отдельные модули, хранимые в разных файлах ещё не требуется.

Длинно. Почему я выбрал Tcl.

Долгое время я писал на bash. Это неплохой язык, к тому же он достаточно выразительный, чтоб делать что угодно без вызова внешних программ и в таком случае производительность получается вполне на уровне.

Но у bash есть проблемы. Основная из которых — многие выражения (в частности пайпы) выполняются в субшелле, а из субшелла почти невозможно передать информацию в материнский иначе через stdout. Ещё одной проблемой является постоянная сериализация-десериализация объектов. Это уже не настолько важно, но всё-таки хотелось бы от этого по возможности избавиться.

То же самое касается других стандартных языков UNIX: dc, bc, sed, m4, awk, ... На последнем, впрочем, наверное, можно писать и нормальные программы, но синтаксис у него не очень красивый и возможностей не так уж много. Это хорошие языки, очень хорошие в своей области, но имеют ограниченную область применения.

Я уже знаю C и несколько других императивных языков, но если нужно что-то быстро посчитать или сделать, эти языки малопригодны — в том же C даже сравнить строки просто так нельзя, нужна специальная функция, кроме того нужно вручную рулить памятью. Pascal крайне беден в экспрессивном плане, а begin / end — это уродливо, так что лучше уж C. Basic уже мёртвый, да к тому же ещё более убог чем паскаль. C++ крайне сложен для изучения, а профита по сравнению с C почти никакого.

Таким образом, стало ясно, что мне нужно изучить какой-то другой язык. Так как язык требуется для того, чтоб быстро решить какую-то задачу, а не писать оптимизированное решение на века, стало ясно, что нужен один из динамических языков общего назначения: Perl, Python, PHP, Ruby, Tcl, Lua или какой-то другой.

Я выбрал Tcl.

1. PHP не подходит сразу, на нём только веб-странички хорошо писать, а всё остальное лучше в Perl (да и про страницы можно поспорить, если нужно чёткое разделение контента, стилей и логики).

1. На Perl, Python и Ruby множество сложных синтаксических конструкций, которые без поллитра не разберёшь, например (python):

_='_=%r;print _%%_';print _%_

2. Lua: простой язык, код на нём быстрый, изучить тоже можно довольно быстро. Но однако на каждый чих нужна либа. Даже работы с юникодом изкоробки нет (в смысле строку можно прочитать и вывести, но нельзя посчитать кол-во символ или заменить подстроку и тд).

3. Tcl: крайне простой синтаксис: 12 правил и man-ы по всем используемым командам достаточно для для понимания любого кода. При этом богатая стандартная библиотека, хорошая интеграция с Tk и кроссплатформенность.

То есть на Tcl можно решить любую задачу почти так же просто как на баше (да в крайнем случае даже пайпы есть), но при этом синтаксис гораздо более предсказуем.

Плюс на Tcl можно писать графические приложения так же легко как и консольные, например вот такой код в 10 строк — это уже целая работающая игра! Правда автор явно экономил строки, и читаемость кода из-за этого несколько страдает. Кроме того, Tcl поддерживает (особенно с 8.6) функциональное программирование и длинные числа изкоробки. Так что переход с bc, который только их и использует будет проще. Ещё мне очень нравится, что ключевых слов в этом языке нет. Вообще. Те же for / if и другие — это просто такие команды, которые берут условие и фрагмент и его исполняют. Можно запросто объявить процедуру for, которая будет использовать другой синтаксис итератора и далее использовать её, если так удобней. Язык динамически типизированный, как и другие скриптовые, но проблем из за этого не возникает. Если переменная используется внутри expr, то она интерпретируется как число. Если в команде string ... на месте строки — строка и тд. Никаких сомнительных x=«10»+10 Работа с переменными похожа на такую в bash, что тоже плюс: при присваивании переменной знак $ не ставится, а при извлечении из неё значения ставится:

set i 10 # i:=10
puts $i ;# будет выведено 10
incr i ;# i теперь 11
puts [expr [set i]+3] ;# set можно использовать вместо $i или ${i}\
так как при отсутствии третьего аргумента он просто возвращает значение.\
Ещё это один из немногих способов двойной подстановки.

4. Что-то другое. А что собственно? Пока только идёт в голову что-то лиспоподобное (например: clisp (scheme (или racket guile))), APL-подобное: J, K (есть свободная Kona), APL и тд или конкатенативное (dc-подобное): forth, factor...

Из 2, 3, 4 выбрал всё-таки Tcl, потому что синтаксис у него хоть и не стандартный для императивных языков, но похож на привычный шелловский и он есть в GNU/Linux изкоробки или в репозитории, так что не придётся заморачиваться ручной сборкой.

Уже начал изучать, почти всё нравится, кроме необходимости писать всё время expr и set, всё-таки такие частые операции можно было бы и сделать частью синтаксиса, хоть и немного в ущерб единообразию.

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

Учить его действительно легко, так как базовый синтаксис простой, а команды можно изучать по мере надобности, к тому же man к командам Tcl снабжен сносками на команды с похожим назначением, так что поняв, что команда — это не то, что надо, можно посмотреть все остальные и найти наиболее подходящую.

Таким образом, язык сочетает достоинства лиспа — гибкость, функциональщину и простоту базового синтаксиса и достоинства других скриптовых языков — более привычную инфиксную нотацию для арифметики и читаемый код.

Xenius
()

управление cgroups в release notify agent

 ,

Здравствуйте у меня вопрос, при использовании cgroups возможно добавлять свой release notify agent (простой баш скрипт), вопрос, существуют ли ограничения на возможности этого скрипта. Т.к. я заметил, что я не могу перенести процесс (и прочие процессы отфоркивающиеся от него) в не root цгруппу в любом контроллере. При этом не ясно почему, поскольку данный процесс в ps выглядит как обычный, у него не realtime scheduler (т.к. у меня в ядре нет поддержки cgroups для realtime процессов). Сам же lock на цгруппы снимается при запуске скрипта, и потом выставляется назад.

Есть ли у кого-нибудь идеи как отлаживать данную ситуацию.

Я конечно могу обойти этот вопрос, но это портебует наличия userspace демона, что хотелось бы обойти.

qnikst
()

Поймать все подшаблоны

 ,

Допустим есть у меня некоторое неизвестное заранее регулярное выражение и строка, в которую надо подставить все совпадения из этой регулярки по индексам. К примеру:

set str "l:12:a41:low-roze"
set rgxp "^l:([0-9]+):([0-9a-z]+):low-([a-z]+)"
set result "nui=$1 an_dg=$2 run=$3"

...

# тут result должен быть таким "nui=12 an_dg=a41 run=roze"
Как? Имеется ввиду как это сделать красиво и быстро, а не вообще как. Всякие разборы в циклах городить не хочется. Ограничивать $rgxp в количестве подшаблонов тоже нельзя. Можно конечно написать что-то типа:
set str "l:12:a41:low-roze"
set rgxp "^l:([0-9]+):([0-9a-z]+):low-([a-z]+)"
set result "nui=$1 an_dg=$2 run=$3"

regexp -- $rgxp $str result result1 result2 ... result1000

# тут result должен быть таким "nui=12 an_dg=a41 run=roze"
Тем самым покрыв любое разумное количество подшаблонов в $rgxp, но сие совсем уж уродливо.

Хотеть какой-нибудь параметр типа -aslist чтобы что-то вроде regexp -aslist — $rgxp $str result resultL сгружало все подшаблоны в resultL как в список, но нет же (((

Suntechnic
()

OpenLDAP + openssh

 , , openssh-lpk

В общем есть задача: надо настроить openldap, чтобы можно было через него шла авторизация по ssh, и в его базе хранились бы ssh-ключи. Дистр Scientific Linux 6.4, сам openldap поставил, настроил, поставил пакет openssh-lpk. Только вот дальше не пойду как теперь добавить схему с openssh-lpk через ldapadd, может есть у кого опыт? поделитесь, если не сложно.

reddaemon
()

postfix не-sasl аутентификация

Добрый вечер.
Задался целью настроить postfix так, чтобы он сам аутентифицировал пользователей. Однако во всех мануалах показано как делать аутентификацию через sasl (cyrus или dovecot).
Возможно ли обойтись без sasl? Курю документацию, но пока толку мало. Киньте, пожалуйста, в меня параметрами конфига, чтобы уже по ним найти конкретику.

Stage1
()

HTB -> SFQ -> flow classify

В течение нескольких дней пытался завести эту шнягу. Поскольку поставил на запасной сервак xubuntu, а для нового ядра ESFQ не делают. Слышал, что есть каике-то переделанные, но я считаю, что это неправильно, поскольку разработчик сам сказал, что в новых ядрах сделали flow, и надо юзать его.
Ну так вот. Инфы по всему инету нашел я крупицы. Поэтому пришлось самому догонять. В принципе, решение было на поверхности, но мне видимо опыта и мозгов не хватило, чтобы сразу понять, как оно все делается.
Кароче, я надеюсь, что полученная мной информация кому-нибудь типа меня в будущем сэкономит время. Ну плюс еще м.б. я где-то накосячил и не до конца разобрался, так что надеюсь на критику.
Кароче, как я понял, эта вешается непосредственно на очередь SFQ(вырезка из моего скрипта):

$TC class add dev $LAN parent 1:20 classid 1:22 htb rate $((SPEED_IN/20))Kbit ceil $((SPEED_IN*4/5))Kbit prio 10
$TC qdisc add dev $LAN parent 1:22 handle 22: sfq perturb 10
$TC filter add dev $LAN parent 1:0 protocol all prio 15 handle 3 fw classid 1:22
$TC filter add dev $LAN parent 22: protocol all handle 22 flow map key dst and 0xff
С обычным фильтром не конфликтует - все нормально выбирается и делится.Единственное что я не понял, так это зачем ему handle, но без него ядро не принимает.
dst and 0xff означает, что в качестве идентификатора класса используется последний байт IP-адреса назначения.
Полученные классы прилепляются в качестве дочерних к классу, на котором висит очередь (либо к самой очереди, я хз. :) ) Т.е. имеют вид 22:12, 22:af, 22:f3 и т.д.
tc class show их периодически показывает. Они время от времени исчезают и появляются. До введения классификатора, SFQ их тоже генерил, но числа были какие попало.
С другими классами они не конфликтуют. Т.е. у меня в скрипте есть класс 1:12 и периодически генерится 28:12.
Далее. Некоторые говорят, что у них при включении flow перестают идти пакеты через интерфейс. Не знаю у всех ли так, но у себя я нашел причину в том, что нельзя вешать классификатор на дефолтный класс. Уж не знаю с чем это связано, но когда вешаю - интерфейс действительно блокируется. Поэтому на нем пришлось оставить обычный SFQ. Но учитывая, что класс этот с самым низким приоритетом и порезан по самое не балуйся, проблем быть не должно.
По ходу дела возникли непонятки с prio у фильтров. Как я понял, у вышестоящих классов prio обязательно должен отличаться от нижестоящих, иначе опять ругается ядро. Логично, что он должен быть больше, а не меньше, что я и сделал.
Ну вот вроде и все. С остальным проблем не возникло.

Svolo
()

sfq qdisc + flows classifier

Как я понял, с не таких уж давних пор (февраль 2008) sfq через flows теперь может выполнять ту же работу, что и esfq. А именно: равномерно отдавать пакеты основываясь на конфигурируемых критериях (конкретно мне нужен conntrack-dst). Кто-нибудь пробовал? Меня конкретно интересует применимость этого всего хозяйства для справедливого дележа канала\очереди на группу лиц. Я не хочу перекрывать людям торренты, я хочу, чтобы торрент в 100 потоков на одной машине не мешал закачке файла в один поток на другой машине. Получится ли?

azure
()

sys-apps/iproute2 - какой командой создать таблицу?

 

Есть такая штука как «Policy routing»

Там можно создавать таблицы, для этого они прописываются в файле /etc/iproute2/rt_tables

А как создать таблицу из командной строки? Как очистить из неё все правила? Как удалить таблицу? Как посмотреть список таблиц?

StrongDollar
()

ISCSI target , нет прироста скорости с двумя сетевухами

Система Ubuntu 12.04 Установил эту новую штуку:

apt-get install lio-utils
/etc/init.d/target restart
/etc/init.d/target status
tcm_node --block iblock_0/hdd_sdb /dev/sdb
lio_node --addtpg iqn.2012-09.local.dim:ubuntulio 1
lio_node --addlun iqn.2012-09.local.dim:ubuntulio 1 0 lun_my_sdb iblock_0/hdd_sdb
lio_node --addnp iqn.2012-09.local.dim:ubuntulio 1 192.168.153.130:3260
lio_node --demomode iqn.2012-09.local.dim:ubuntulio 1
lio_node --disableauth iqn.2012-09.local.dim:ubuntulio 1
echo 0 > /sys/kernel/config/target/iscsi/iqn.2012-09.local.dim:ubuntulio/tpgt_1/attrib/demo_mode_write_protect
lio_node --enabletpg iqn.2012-09.local.dim:ubuntulio 1
echo yes |tcm_dump --o
/etc/init.d/target restart
Подключаюсь , проверяю скорость работает.

Добавляю вторую сетевуху

lio_node --addnp iqn.2012-09.local.dim:ubuntulio 1 192.168.153.131:3260

Устанавливаю мультипатч с таким конфигом

defaults
{
      path_selector       "round-robin 0"
      path_grouping_policy multibus
      rr_min_io           200
      no_path_retry       5
   failback            immediate
   user_friendly_names yes
}
blacklist
{
            devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
            devnode "^hd[a-z][[0-9]*]"
            devnode "^sda$"
            devnode "^sdb$"
}

multipaths
{
   multipath
   {
      wwid 1IET_00010001
   }
}
подключаю появившийся /dev/mapper/mpath6 Проверяю, скорость как была, так и есть.

Фиг с этим мультипатчем думаю, проверю обычный бондинг

auto eth1
  iface eth1 inet manual
  bond-master bond0

auto eth2
  iface eth2 inet manual
  bond-master bond0

auto bond0
  iface bond0 inet static
  address 192.168.153.130
  netmask 255.255.255.0
  bond-mode 0
  bond-miimon 100
  bond-slaves none
  mtu 7000

Протестил скорость сети, все ок, скорость возрасла, потестил скорость таргета, никакого проироста нет.

Ладно думаю поменяю таргет устанавливаю

aptitude install tgt
Настраиваю проверяю, прирост скорости от двух сетевух есть с бондингом. Проверяю с мультипатчем тоже прирост есть.

Итак вопрос почему этот lio-utils , который как бы самый новый и встроен в ядро так себя ведет. PS Тести скорости проводит утилитой FIO и DD разными способами, итог с tgt прирост скорости есть, а lio-utils нету ...

mag_box2
()

монтирование хомяка через NFS при логине

 ,

в университете в некоторых аудиториях с компьютерами под линуксом была сабжевая вещь - можно было залогиниться под своим юзером на любом компьютере, домашняя директория при этом монтировалась с сервера.

Вот недавно задумался, как и в каком месте это реализуется? Программа mount, насколько я понимаю, выполняется от имени юзера, в /etc/fstab её прописать нельзя было, т.к. заранее неизвестно, что монтировать. Откуда и в какой момент дергается mount?

Harald
()

Интерактивное добавление дополнений при создании сертификатов x509

 ,

Hi, folks.

Существует необходимость добавлять к сертификатам дополнение subjectAltName, в котором каждый раз указывать разные dnsName, ipAddress и пр. При этом для решения этой задачи предлагается определять в openssl.cnf дополнительную секцию, например так:

[req]
req_extensions = v3_req

[v3_req] 
subjectAltName = @alt_names

[alt_names]
DNS.1   = www.foo.com
DNS.2   = www.bar.org
IP.1    = 192.168.1.1
IP.2    = 192.168.69.144
Переписывать каждый раз секцию alt_names в openssl.cnf — явно не самое удобное решение. Вопрос в следующем, можно ли заставить openssl запрашивать значения дополнений с терминала или считывать их из файла отличного от своего конфига? Если это возможно как такое поведение можно задать?

Спасибо.

trancefer
()

Производительность VPN-канала: ipsec vs openvpn vs pptp

Тут кто-то умный как-то обмолвился про то, что нельзя использовать ssh как впн в промышленных масштабах из-за оверхеда, а также из-за того, что он работает в userspace. Тезис состоял в том, что производительность впн-решения, работающего в userspace, будет очень сильно проигрывать «ядерным» решениям, так как то ли вызовы из юзерспейса долго идут, то ли что-то в этом роде. Я подумал, подумал, и полез в гугл искать темы про сравнение вышеперечисленных решений в контексте производительности. А там - раз! - и говорят, что openvpn лучше, чем pptp, что, на мой взгляд, противоречит тезису, так как openvpn юзерспейсный, а pptp юзает модули ядра.

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

А ещё некоторые говорили, что openvpn лучше, чем ipsec, потому что ipsec чаще спотыкается о файрволы. Неужели производительность настолько слабо различается, что из-за проблем с файрволами уходят на openvpn? Кстати, openvpn использует дополнительные драйверы (для tap- и tun-устройств), значит, тоже в ядре работает, хотя бы частично..

В общем, просветите на эту тему, извиняюсь за поток сознания.

pianolender
()

Вопрос по IPSEC

Настраиваю IPSEC на основе strongswan , собственно возник вопрос что такое l2tp и для чего оно используется ?

drac753
()

{gentoo} Каким образом выполнять скрипт при поднятии/опускании интерфейса?

 , ,

Скажем, у меня есть wlan0, который опускается/поднимается при переподключении к AP.
Необходимо выполнять два разных скрипта выполнении up/down. Google молчит (точнее советует, это во всяких убунтах и дебианах делается).

Нашел только http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=4&chap=5 , но что-то мне подсказывает, что это выполняется только в случае, если используется обычный рестарт сети через /etc/init.d/...

В любом случае, хотелось бы знать, что (udev?) является бекендом для определения изменений состояний интерфейса с последующей реакцией.

ktulhu666
()