суббота, 29 ноября 2014 г.

Печать массива в Perl.

Многое в языке Perl кажется новичку странным, неожиданным, необъяснимым. При внимательном рассмотрении так оно и оказывается. Попробуем произвести весьма простую операцию: распечатаем массив. Получим:

1 my @words = qw(awesome cats hunter);
2 print @words;      # -> "awesomecatshunter"
3 print "@words";    # -> "awesome cats hunter"
4 print "" . "@words";  # -> "awesome cats hunter"
5 print "" . @words;    # -> 3

Отчего же так происходит? На первый взгляд вывод должен быть одинаковым, как независимо от наличия кавычек произошло бы со скалярами:

1 $word = "supersonic";
2 print $word;
3 print "$word";
4 print "" . "$word";
5 print "" . $word;    # -> все будет "supersonic" без перевода каретки

Как обычно для Perl, вступают в действие темные силы контекстов. В первом варианте мы имеет дело со списочным контекстом. Т.е. просто передаем список аргументов функции print и она их печатает, разделяя строкой, содержащейся в магической переменной $, . Кроме того, переменная $\ печатается в конце списка. По умолчанию обе эти переменные не определены, что равносильно значению "" в строковом контексте. Так что print не только не переводит каретку, но и лепит содержащиеся в списке строки вплотную без пробелов. Впрочем, оба этих поведения лишь непривычны, например, питонисту, но весьма правильны и удобны для обрабоки текста. Попробуем теперь поменять значения магических переменных:

1 $, = "--";
2 $\ = "END\n";
3 print @words;      # -> "awesome--cats--hunterEND" с возвратом каретки

Пойдем дальше. Если мы помещаем идентификатор массива в строку с двойными кавычками (см. 3я и 4я строки первого листинга заметки), вступает в дело контекст строковой интерполяции. В этом контексте массив интерполируется в строку с разделителем $" по умолчанию равному " " (пробел). Эту фичу можно красиво использовать для отладочного отображения аргументов функции. Аргументы могут содержать пробелы, и для ясности сепаратор можно локально поменять:

 1 sub is_fatherof {
 2   if ($debug) {
 3     local $" = "][";
 4     print "args = [@_]\n";
 5   }
 6   conquer_the_universe...;
 7 }
 8 
 9 $debug = 1;
10 is_fatherof('Darth Vader', 'Luke Skywalker'); # -> "args = [Darth Vader][Luke Skywalker]"

Вобщем, строковая интерполяция массива эквивалентна join $", @words

Последний пример (print "" . @words) демонстрирует поведение массива в скалярном контексте. Да, в этом контексте массив заменяется своей длиной. Perl is SATAAAN!!! Спасибо за внимание.

суббота, 28 декабря 2013 г.

iptables ssh only.

Простейший скрипт настройки файрволла, позволяющий залезть на сервер по ssh и при этом блокировать все остальное.

#!/bin/sh

# Стираем все старые правила и удаляем все пользовательские сhains.
iptables -F
iptables -X

# Установим все дефолтные политики в DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Разрешим все без ограничений на интерфейсе loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
 
# Разрешим ssh траффик
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

чуть более подробно: источник

вторник, 5 ноября 2013 г.

Повседневные программы CLI

Установил Xmonad window manager и теперь стало очень актуально, как запускать всякие повседневные пользовательские задачи из коммандной строки (And how to configure f*kin russian keyboard layout and pretty fonts =)))
Тут я буду выкладывать то, что использую таким образом.
  1. eog
    просмотр изображений
  2. mplayer
    простейший медиаплеер. забавно писать скрипты с пользовательской оболочкой вокруг него.
  3. amixer and alsamixer
    аудио микшеры. первый - строго cli. Второй работает в терминале, но имеет userfriendly интерфейс.

pymongo getting started

  1. установка mongodb и pymongo MongoDB пока пропустим, см. их мануал.
    Pymongo:
    sudo apt-get install python-setuptools # если еще нет йих
    sudo easy_install pymongo
       
  2. Готовим котов
    import mongodb
    from mongodb import MongoClient
    client = MongoClient()                    # если монга крутится на локальной машине и стандартном порту
    client = MongoClient('hostname', 27017)   # если нужно эти параметры специфицировать
                                              # и юзать БД с удаленного хоста
    client.database_names()                   # посмотрим, что за базы есть в этой вашей монге
    db = client.db_chosen_name                # выбираем базу для работы
    db.collection_names()                     # смотрим, какие коллекции в энтой вашей базе есть
    collection = db.test_collection           # выбрали одну
    collection = db.['my.col-test']           # то же самое, но работает и с именами, в которых есть точки          
      
  3. Добавим документ в базу
    db = client.mydb                          # выбрали базу, если такой не было, она создается
    users = db["users"]                       # коллекция users. если не было - создается
    user = {"name": "Vasia",
            "age": 43,
            "interests": ["vodka", "balalayka"],
            "pets": {"dog": "Tuzik",
                     "cat": "Mashka"}
           }
    _id = users.insert(user)                  # добавляем в базу, функция возвращает uuid
      
  4. Поиск в базе
    vasias = users.find({"name": "Vasia"})          # возвращает итератороподобный объект
    old_peaple = users.find({"age": {"$gt": 60}})   # все документы с полем "age" > 60
    tuzik_owner = users.find({"pets.dog": "Tuzik"}  # поиск по вложенным полям
    old_people.count()                              # сколько же их нашлось?
    tuzik_owners.sort("age")                        # отсортировать по возрасту всех владельцев Тузиков
     
Полная документация по pymongo(eng)

понедельник, 21 октября 2013 г.

Не знаю куда сунуть эти ссылки, но они мне нужны под рукой.

askubuntu.com
ubuntu help

RHCSA Objectives
стредства мониторинга системы

Заметки по работе с сетью в ubuntu

получить свой видимый внешний ip адрес: wget -O - -q icanhazip.com

получение доступа по ssh к хосту с public ip:

  устанавливаем: sudo apt-get install ssh-client
                                         -server

  посмотрим, что в iptables (любопытства ради):
  # sudo iptables -L

  и пропишем принятие пакетов по порту ssh (22 port):
  # sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT

  сохраним наши правила файрволла:
  # sudo sh -c "iptables-save > /etc/iptables.rules"

  все, можно подключаться к хосту по ssh



для создания обратного SSH-туннеля можно:
  На клиентской машине:
  # ssh -R remoteport:localhost:22 username@servername
  На стороне сервера:
  # ssh -p remoteport username@localhost


пятница, 27 сентября 2013 г.

Основные команды shell

Еще пока сырой документ, но т.к. сам часто пользуюсь, выложу. Оригинал, от которого постепенно буду отходить в сторону лучшей структурированности и полезности: Basic shell commands by Jeremy Sanders Вообще, посмотрите на сайте, что там Джереми наваял, есть еще интересное :)

Все, что написано на русском языке, было проверено мной лично в терминале на Ubuntu 12.04LTS

  1. cat - Распечатать содержимое на экране. Можно использовать в связке с другими утилитами.
    cat helloworld.py                           # Отобразить любопытный листинг в терминале 
    cat file1 file2 file3 > outfile             # собрать файлы в один
    cat *.txt > outfile                         # собрать все .txt файлы вместе
    cat egg.py spam.py | grep '\bdef\b'         # найти в указанных файлах 
                                                # все вхождения def - определения функции
    
    cat foo.py bar.py | sed -e 's/шило/мыло/g' > out.py 
                                  # заменить в файлах шило на мыло и сохранить это в out.py
    

  2. cd - Сменить текущую директорию
    cd                     # в домашнюю папку
    cd ~/books             # /home/user/books
    cd ~dima               # /home/dima
    cd somedir             # в директорию относительно текущей
    cd /dir1/dir2/dir3...  # в указанную абсолютно директорию
    cd -                   # в предыдущую директорию (аналог backspace в оконном менеджере)
    cd ..                  # в директорию уровнем выше
    

  3. mkdir - Создать директорию
    mkdir testdir                  # в текущей папке появится testdir
    

  4. cp - Копировать файл(ы)
    cp file1 file2                      # копировать file1 в file2
    cp file1 directory                  # копировать file1 в папку directory
    cp file1 file2 file3 ... directory  # копировать несколько файлов в директорию
    cp *.txt myTextsDir                 # копировать все .txt файлы в директорию myTextsDir 
    cp -R dir1 dir2/  # copy dir1 into dir2 including subdirectries
    cp -pR dir1 dir2/ # copy directory, preserving permissions
    

  5. date - Текущая дата и время
    > date
    Вт. Сент. 24 16:14:46 MSK 2013
    

  6. chmod - Управление доступом
    chmod +x script.py             # делает script.py исполняемым файлом
    chmod -x script.py             # script.py перестает быть исполняемым
    

  7. vim - Текстовый редактор, требует установки и изучения(!)
    vim foo.txt               # открывает файл для работы в терминале
    gvim foo.txt              # открывает файл в отдельном окне 
                              # M-x start server first)
    

  8. file - Выводит информацию о типе файла
    > file temp_70.jpg 
    temp_70.jpg: JPEG image data, JFIF standard 1.01,
    resolution (DPI), 72 x 72
    

  9. gedit - Текстовый редактор gedit
    gedit file.txt # открыть файл в gedit
    

  10. gnuplot - Пакет для построения графиков, требует дополнительной установки.

  11. grep - Ищет текст в файлах. Показывает список строк с найденным текстом (с указанием имени файла, если ищем больше чем в одном файле).
    grep "привет" file1 file2 ...   # ищет текст 'привет' в указанных файлах
    grep -i "ПрИвЕТ" filename       # регистронезависимый поиск
    cat filename | grep "hi there"  # связать команды
    grep -v "ложь" filename         # вывести строки, НЕ содержащие 'ложь'
                                    # кавычки могут быть одинарными
    

  12. sed - Потоковый текстовый редактор
    sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName 
                  # типичное использование sed:
                  # s - заменить
                  # oldstaff - старое
                  # newstaff - на новое
                  # g - глобально, во всем документе inputFileNama
                  # и затем это все дело сохранить в outputFileName
    
    sed на википедии

  13. cc или gcc - Компиляция программы на C
    cc test1.c                     # компилирует test1.c в a.out
    cc -o test2.prog test2.c       # компилирует test2.c в test2.prog, выходной файл после ключа -o
                                   # запуск программы ./a.out или соответственное название
    

  14. gtar - GNU version of the tar utility (also called tar on Linux). Store directories and files together into a single archive file. Use the normal tar program to backup files to a tape. See info tar for documentation.
    gtar cf out.tar dir1    # put contents of directory into out.tar
    gtar czf out.tar.gz dir1 # write compressed tar, out.tar.gz
    gtar tf in.tar          # list contents of in.tar
    gtar tzf in.tar.gz      # list contents of compressed in.tar.gz
    gtar xf in.tar          # extract contents of in.tar here
    gtar xzf in.tar.gz      # extract compressed in.tar.gz
    gtar xf in.tar file.txt ... # extract file.txt from in.tar
    

  15. gzip / gunzip - GNU Compress files into a smaller space, or decompress .Z or .gz files.
    gzip file.fits          # compresses file.fits into file.fits.gz
    gunzip file.fits.gz     # recovers original file.fits
    gzip *.dat              # compresses all .dat files into .dat.gz
    gunzip *.dat.gz         # decompresses all .dat.gz files into .dat
    program | gzip > out.gz # compresses program output into out.gz
    program | gunzip > out  # decompresses compressed program output
    

  16. info - A documentation system designed to replace man for GNU programs (e.g. gtar, gcc). Use cursor keys and return to go to sections. Press b to go back to previous section. A little hard to use.
    info gtar               # documentation for gtar
    

  17. kill - Kill, pause or continue a process. Can also be used for killing daemons.
    > ps -u jss
    ...
     666  pts/1        06:06:06  badprocess 
    > kill 666        # this sends a ``nice'' kill to the
                      # process. If that doesn't work do
    > kill -KILL 666   # (or equivalently)
    > kill -9 666     # which should really kill it!
    
    > kill -STOP 667  # pause (stop) process 
    > kill -CONT 667  # unpause process
    

  18. logout - Closes the current shell. Also try ``exit''.

  19. lp - Sends files to a printer
    lp file.ps  # sends postscript file to the default printer
    lp -dlp2 file.ps           # sends file to the printer lp2
    lp -c file.ps    # copies file first, so you can delete it
    lpstat -p lp2         # get status and list of jobs on lp2
    cancel lp2-258                  # cancel print job lp2-258 
    
    lpr -Plp2 file.ps                    # send file.ps to lp2
    lpq -Plp2                        # get list of jobs on lp2
    lprm -Plp2 1234                   # delete job 1234 on lp2
    

  20. ls - Показать список файлов или информацию о них
    ls file     # проверить, существует ли 
    ls -l file  # показать информацию о файле
    ls *.txt    # показать все файлы с расширением .txt
    ls -lt      # показать информацию о всех файлах в директории в порядке создания
    ls -lrt     # above reversed in order
    ls -a       # показать все файлы, влючая скрытые
    ls dir1     # показать содержимое папки dir1
    ls -d dir1  # существует ли папка dir1?
    ls -p       # добавляет значащие символы к концам файлов
    ls -R       # показывает файлы и в поддиректориях
    ls -1       # показывать 1 файл в каждой строке
    

  21. man - Справочная информация о командах
    man man      # справка о самом man
    man grep     # справка о grep
    

  22. more - Показать файл последовательно по одному экрану
    more file                # показать file, следующий экран - пробел
    grep 'frog' file | more  # сделать то же с выходом другой команды
    

  23. mv - Перемещает или переименовывает файлы
    mv file1 file2                     # переименовать file1 в file2
    mv dir1 dir2                       # переименовать папку dir1 в dir2
    mv file1 file2 file3 ... directory # переместить файлы в папку directory
    

  24. nano - Очень простой текстовый редактор. Поддерживает подсветку кода и запускается прямо в терминале. Бывает удобно.

  25. nice - Start a process in a nice way. Nice levels run from -19 (high priority) to 19 (low priority). Jobs with a higher priority get more CPU time. See renice for more detail. You should probably be using the grid-engine to run long jobs.
    nice +19 myjob1   # run at lowest priority
    nice +8 myjob2    # run at lowish priority
    

  26. openoffice.org - a free office suite available for Linux/Unix, Windows and Mac OS X.

  27. passwd - change your password

  28. pine - A commonly used text-based mail client. It is now called alpine. Allows you to send and receive emails. Configuration options allow it to become quite powerful. Other alternatives for mail are mozilla mail and mutt, however I suggest you stick to alpine or thunderbird.

  29. printenv - Print an environment variable in tcsh
    setenv MYVARIABLE Fred
    printenv MYVARIABLE
    printenv # print all variables
    

  30. ps - List processes on system
    > ps -u jss          # list jss's processes
      934 pts/0    00:00:00 bash
    ^^^^^ ^^^^^    ^^^^^^^^ ^^^^^^^
    PID   output   CPU time name
    > ps -f      # list processes started here in full format
    > ps -AF     # list all processes in extra full format
    > ps -A -l            # list all processes in long format
    > ps -A | grep tcsh   # list all tcsh processes
    

  31. pwd - Текущая рабочая директория
    > pwd
    /home/jss/writing/lecture
    

  32. renice - Renice a running process. Make a process interact better with other processes on the system (see top to see how it is doing). Nice levels run from -19 (high priority) to 19 (low priority). Only your own processes can be niced and they can only be niced in the positive direction (unless you are root). Normal processes start at nice 0.
    > ps -u jss | grep bigprocess      # look for bigprocess
     1234 pts/0    99:00:00 bigprocess
    > renice 19 1234                   # renice PID 1234 to 19
    

  33. rm - Удалить файлы
    rm file1     # молча удаляет файл
    rm -i file   # удалить файл, спросив перед этим y/n
    rm -r dir1   # удаляет папку и все в ней (осторожно с этим, детки!)
    rm -rf dir1  # то же самое, но не спрашивает, даже если поставить флаг -i
    

  34. rmdir - Удаляет директорию, если она пуста (rm -r dirname удалит с содержимым)
    rmdir dirname
    

  35. staroffice - An office suite providing word processor, spreadsheet, drawing package. See Users' Guide on how to install this. This is a commercial version of the openoffice office package - use openoffice.org on linux.

  36. setenv - Set an environment variable in tcsh.
    setenv MYVARIABLE Fred
    echo Hi there $MYVARIABLE
    

  37. tar - Combine files into one larger archive file, or extract files from that archive (same as gtar on Linux).
    tar cvf /dev/rmt/0 ./      # backup cwd into tape
    tar tvf /dev/rmt/0         # list contents of tape
    tar xvf /dev/rmt/0         # extract contents of tape
    

  38. thunderbird - Почтовая программа mozilla thunderbird.

  39. top - Interactively show you the ``top'' processes on a system - the ones consuming the most computing (CPU) time. Press the ``q'' key in top to exit. Press the ``k'' key to kill a particular process. Press ``r'' to renice a process.

  40. sudo apt-get remove program - Удалить программу program из системы