Поиск по этому блогу

вторник, 28 февраля 2012 г.

Perl: какие модули установлены?

Как узнать какие дополнительные модули для Perl установлены?
Для начала, если не установлен, ставим perl-modules:
sudo aptitude install perl-modules
Затем рисуем небольшой скрипт:
#!/usr/bin/perl -w
use strict;
use ExtUtils::Installed;

my $instmod = ExtUtils::Installed->new();
foreach my $module ($instmod->modules()) {
    my $version = $instmod->version($module) || "-"; print "$module --> $version \r\n";
}
запускаем его и получаем результат примерно такого вида:
CGI::FastTemplate --> 1.09 
Convert::ASN1 --> 0.22 
Convert::ASN1::asn1c --> 0.07 
Cope --> - 
Data::Dumper --> 2.128 
Env::Path --> 0.18 
ExtUtils::CBuilder --> 0.2703 
ExtUtils::ParseXS --> 2.2206 
File::Slurp --> 9999.19 
File::Which --> 1.09 
IO::Tty --> 1.10 
IPC::Run --> 0.90 
IPC::Run3 --> 0.044 
Lingua::RU::PhTranslit --> 0.4 
Net::CSTA --> 0.04 
Net::CSTAv3::Client --> 0.05 
Net::SMTP::Server --> 1.1 
Net::SNMP --> v6.0.0 
Perl --> 5.10.0 
Probe::Perl --> 0.01 
Test::Harness --> 3.22 
Test::Script --> 1.07 
Test::Simple --> 0.98 
Thread::Synchronized --> 0.03 
YAML --> 0.71 

среда, 8 февраля 2012 г.

Perl: как сменить позицию курсора в окне терминала?

Используем Term::Cap (описание) и POSIX (описаниеPOSIX::Termios).
#!/usr/bin/perl -w

use strict;
use Term::Cap;

my $ospeed = 9600;

eval {
    # Получиь скорость вывода на терминал
    require POSIX;
    my $termios = new POSIX::Termios;
    $termios->getattr;
    $ospeed = $termios->getospeed;
};

# Инициализация терминала
my $terminal = Term::Cap->Tgetent({ TERM => undef, OSPEED => $ospeed });
$terminal->Trequire(qw/cm cl rc sc/);

# Запомнить позицию курсора
print $terminal->Tputs('sc', 1);

# Очистить экран
print $terminal->Tputs('cl', 1);

foreach my $x (1..10) {
    foreach my $y (1..10) {
        # Переместить курсор в нужную позицию
        my $goto = $terminal->Tgoto('cm', $x * 5, $y);
        print $goto, $x * $y;
    }
}

# Вернуть позицию курсора
print $terminal->Tputs('rc', 1);

воскресенье, 5 февраля 2012 г.

Запуск windows-приложений под linux'ом.

Wine это хорошо, но c PlayOnLinux ещё лучше. Больше о проекте можно почитать тут, но вкратце:
PlayOnLinux - это программа, которая позволяет легко устанавливать и использовать большое количество игр и приложений, разработанных для Microsoft®'s Windows®.
На данный момент очень мало игр совместимо с GNU/Linux, что, конечно, сильно мешает переходу на эту систему. PlayOnLinux предоставляет доступное и эффективное решение этой проблемы, бесплатное и уважающее свободное ПО.
Не теряем времени зря и приступаем к установке.
$ sudo wget http://deb.playonlinux.com/playonlinux_squeeze.list -O /etc/apt/sources.list.d/playonlinux.list
$ wget http://deb.playonlinux.com/public.gpg -O -  | sudo apt-key add -
$ sudo aptitude update
$ sudo aptitude install playonlinux
все необходимые зависимости, как водится, подтянутся автоматически.
Запускаем:
$ /usr/bin/playonlinux
После этого программа попросит подтвердить установку шрифтов от MS и ещё каких-то компонентов - не мешаем ей работать. Это будет проделано один раз.

четверг, 2 февраля 2012 г.

geoip своими руками

Формируем текстовый файл:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
$ unzip GeoIPCountryCSV.zip
$ cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip.txt
Итоговый файл представляет из себя набор данных, разделённых запятыми, оформленных в три колонки:
  1. начальный ip-адрес диапазона, в десятичной нотации;
  2. конечный ip-адрес диапазона, в десятичной нотации;
  3. мнемонический код страны.
Перевод ip-адреса в десятичную нотацию и обратно:
my $in = "212.90.160.40";
my @a = split (/\./,$in);

my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
my $dotip = join ".",unpack("CCCC",pack("N",$decip));

print $decip," = ",$dotip,"\n";
Организовать простой поиск ip в организованной выше базе адресов можно, например, так:
#!/usr/bin/perl -w
use strict;

my $geoipdb = "./geoip.txt";
my $in = <>; chomp($in);

if ($in =~ m!\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b!) {
  my @a = split(/\./,$in);
  my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
  open FGEOIP, "<$geoipdb" || die "Can't open $geoipdb: $!\n";
  while (<FGEOIP>) {
    chomp;
    my ($bip,$eip,$c) = split(",");
    if ($decip>=$bip && $decip<=$eip) {
      print $in," is ",$c, "\n";
      last;
    }
  }
  close FGEOIP;
} else {
  print STDERR "Not IP on STDIN\n";
}
и использовать подобным образом:
$ echo 212.90.160.40 | fgeoip
212.90.160.40 is UA

среда, 1 февраля 2012 г.

GNOME3 - индикация раскладки клавиатуры флагами

Подготавливаем иконки флажков:
# mkdir -p /usr/share/pixmaps/flags
# cd /tmp
# wget http://www.famfamfam.com/lab/icons/flags/famfamfam_flag_icons.zip
# unzip famfamfam_flag_icons.zip
# cd png/
# cp us.png /usr/share/pixmaps/flags/us-symbolic.png
# cp ru.png /usr/share/pixmaps/flags/ru-symbolic.png
# cp ua.png /usr/share/pixmaps/flags/ua-symbolic.png
# chmod -x /usr/share/pixmaps/flags/*-symbolic.png

Из под пользователя устанавливаем ключ индикации раскладки флагом, а не надписью:
$ dconf write /org/gnome/libgnomekbd/indicator/show-flags true