воскресенье, 3 октября 2010 г.

Прокачиваем gedit

Gedit это программа, которая идет по умолчанию с GNOME и является аналогом Блокнота Windows. Точнее говоря  Блокнот Windows это жалкая тень Gedit:) Gedit по своим возможностям споставим с OpenSource проектом Notepad++ в Windows. Нам итак из коробки предоставляется возможность подсветки синтаксиса многих языков программирования, проверки орфографии, вывода статистики документа, сопряжения с внешними программами и т.д. 
Но на самом деле это далеко не все: у Gedit есть постоянно расширяющийся набор плагинов. Вот о них то мы и поговорим. Чтобы установить их наберем в командной строке:
 sudo apt-get install gedit-plugins
Дальше запускаем Gedit и входим в меню плагинов: Правка->Параметры->Модули 
А здесь нам откроется выбор плагинов. 
Меня заинтересовали такие модули:
1)  Встроенный терминал. При помощи этого модуля вы сможете получить доступ из Gedit к командной строке Linux.
2) Дополнение скобок. Добавляет автоматически закрывающие скобки
3) Python консоль. Комментарии не требуются:)     
На самом деле это далеко не все плагины. Не забудьте включить нижнюю панель в меню Вид             

четверг, 30 сентября 2010 г.

Python для студента

Python это простой для освоения, открытый интерпритируемый язык. Но чем он полезен студенту? Кроме всех перечисленных свойств он имеет кучу открытых расширений.
Пройдемся по некоторым:
Numpy это библиотека матричных вычислений на Python. Его особенностью является использование С++ и С кода для реализации матричных вычислений.Это дает хороший прирост скорости,так как все эти операции сразу используют скомпилированные расширения python, написанные на С/С++ c использованием низкоуровневой библиотеки  LAPPACK(решатель задач линейной алгебры). Эта же библиотека лежит в основе MATLAB
Но одной линейной алгебры мало нам и по сему обратим свой взор к Scipy она использует numpy и предоставляет такие возможности(взято из Википедии):
Доступные субпакеты

  • constants: Физические константы и коэффициенты пересчёта (с версии 0.7.0)
  • cluster: Векторное квантование
  • fftpack: Дискретные алгоритмы преобразования Фурье
  • integrate: Инструменты для интегрирования
  • interpolate: Инструменты для интерполяции
  • io: Ввод/вывод данных
  • lib: Врапперы Python для внешних библиотек
  • linalg: Линейная алгебра
  • misc: Разные утилиты
  • optimize: Средства оптимизации
  • sandbox: Экспериментальный код
  • signal: Обработка сигналов
  • sparse: Поддержка разреженных матриц
  • special: Специальные функции
  • stats: Статистические функции
  • weave: Позволяет включение кода C/C++ внутри кода Python

Дополнительная функциональность:
Основной функционал SciPy расширяется за счёт других инструментов.
Например:
Графика. На данный момент рекомендованным пакетом для отрисовки двухмерной графики является Matplotlib, тем не менее существует множество других, например HippoDraw, Chaco, и Biggles. Также популярными являются Python Imaging Library и MayaVi (для 3D визуализации)
Оптимизация. Хотя SciPy имеет свой пакет для оптимизации, OpenOpt имеет доступ к большему количеству оптимизационных пакетов и решателей
Продвинутый анализ данных. При помощи RPy, SciPy обеспечивает интерфейс к статистическому пакету R предназначенному для сложного анализа данных.
База данных. SciPy может взимодействовать с  PyTables, иерархической базой данных разработанной для эффективного управления большими объёмами данных на основе HDF5.
Интерактивная оболочка. IPython это интерактивная среда которая обеспечивает дебаггинг и создание кода в стиле близком к MATLAB. Ну что ж мне кажется Вики все вполне хорошо описала для затравки.
Символьная математика. Существует несколько библиотек для Python, такие как PyDSTool, Symbolic и SymPy-- которые позволяют работать с символьной математикой.Библиотеки
Как видите это довольно серьезный набор для математика.Кроме того такие библиотеки как NetworkX,Boost.Python,igraph позволяют работать со структурами типа графов.  
    Если же касаться вопроса о символьной математике детальней, то остановемся на Sympy
Это библиотека позволяет дифференцировать, интегрировать, раскладывать в ряды и производить упрощения символических выражений. Библиотека свободная для использования под лицензией BSD, а по сему вы можете делать на ее основе и коммерческие продукты. В конце статьи будут приведены некоторые дополнительные ссылки.
А если мы хотим написать игру? Пожалуйста BSD библиотека PyGame спешит нам на помощь.Она позволит нам:
Создать нестандартный интерфейс
Работать с текстурами
Звуком
Другими графическими файлами
Библиотека использует средства OpenGL. Кроссплатформеная. Легка в инсталяции. На ее основе сделаны различные разработки в области графики кроме 2D игр.
Кстати если вы психолог, то вас может заинтересовать система проведения экспериментов в области восприятия PsychoPy. Это открытая разработка интгерирующая в себе инструменты для проведения экспериментов и их последующую численную обработку. Начинается все с того что вы пишите python скрипт, который описывает будущий эксперимент. Затем уже по его результатам система позволит провести различные статистические рассчеты по его результатам. Поддерживается весьма широкий спектр статических и прочих математических функций.
  А захотелось нам например реализовать задачи связанные со сложной обработкой и анализом текстов. Пожалуйста! для этого у нас есть такой инструмент как NLTK (опять же под лицензией Apache).Эта библиотека разработана для того, чтобы предоставить инструменты анализа слов, синтаксического анализа и максимально облегчить работу с информацией текстового характера. Вокруг этой библиотеки реализовано много академических и учебных проектов. Кроме того на основе этой библиотеки написан учебник по синтаксическому анализу и прочим вопросам работы с текстовой информацией: Natural Language Processing with python.Книжечка зарубежная и непереведенная, но сама в рунете есть. Можете поискать ее в списке книг на форуме сайта python.su 
На самом деле есть еще большое множество иных библиотек, которые в обзор не попали. А для многих компонентов Linux и OpenSource приложений поставляются python-библиотеки, открывающие доступ к возможностям последних. Вобщем возможности python заслцуживают внимания:)
Ссылки:
Расширения Python,упомянутые в заметке:

  1. Библиотека Numpy 
  2. Библиотека Scipy
  3. Библиотека Sympy
  4. Библиотека   анализа данных, имитации систем и физ. процессов  PyDSTool    
  5. Библиотека  NetworkX
  6. Библиотека Boost.Python
  7. Библиотека igraph
  8. Комплекс Psychopy
  9. Библиотека NLTK 
  10. библиотека Pygame
Статьи:
  1. Программирование и научные вычисления на языке Python

  2. Математический Python
  3. Анализ социального графа
              


      понедельник, 27 сентября 2010 г.

      автоматизируем Linux: установка многих пакетов в один присест

      Допустим каждый раз нам приходится устанавливать группу пакетов на машины. Все это набивать каждый раз в консоли утомительно, но та же консоль может снять с нас эту рутину. Все достаточно просто, напишем такой скриптик:
      apt-get install djview python-djvu
      При чем в строчку через пробел можно вписывать любое количество пакетов. Запускать надо его из под sudo таким образом(предположим что сохранили мы его в myinst.sh):
        sudo ./myinst.sh
      ./ заставит оболчку просмотреть тот каталог где вы сейчас находитесь 


      среда, 22 сентября 2010 г.

      Запускаем и выключаем Linux: Часть 1

      Это вопрос довольно таки важный для любой операционной системы. Мы рассмотрим его в двух статьях, где поговорим о следующих вопросах:
      • Этапы запуска системы 
      • Что такое MBR 
      • Что такое загрузчики, какие они бывают и что позволяют делать 
      • rc сценарии загрузки
      • начальное монтирование файловых систем при загрузке системы
      • Проблемы загрузки
      • Этапы выключения системы 
      • Два способа выключения  системы. 
      В первой статье мы рассмотрим вопросы общетеоретического характера(кратко), и это нужно для того, чтобы читатель знал как загружается система более детально, нежели "я нажал на кнопку и жду появления окошка ввода пароля GNOME/ KDE/XFCE etc" а так же научимся выключать компьютер и поймем как это происходит.


      1. Запускаем Linux:  этапы большого пути)
      Ясно что первый этап он очень сложен нажать на кнопочку power у блока машины:). После этого начинает выполняться BIOS(Basic Input Output System  ) это как бы встроенная ОС компьютера, которая должна его подготовить к работе с настоящей ОС. BIOS производит проверку оборудования (т.н. POST ),активирует жесткий диск, распознает другое базовое   как результат вы слышите различные звуки из спикера. Если все пройдет успешно, то BIOS насчет считывать первые 512 байт с жесткого диска, т.н. MBR(Main Boot Record Главную Загрузочную Запись ). Она должна иметь особую структуру и передать управление загрузчику. Для Linux это либо LILO либо GRUB. Они позволяют  выбрать необходимую операционную систему и ядро Linux для загрузки. Рассматривать в 1 части будем GRUB как наиболее распространенный из загрузчиков, итак что же он позволяет?

      • Выбирать какую операционную систему из установленных загрузить, выбирать необходимую версию ядра 
      • Передавать параметры ядру перед его загрузкой
      • Производить операции по просмотру дисковых разделов и т.д. из командной строки 
      Я думаю что с первым пунктом все ясно, а вот со вторым разберемся.

      1.1 Загрузка ядра и параметры загрузки 
      загрузчик и ядро Linux выполняет много дел. Что ж кратко пробежимся по параметрам строки:
      Возьмем для примера эту:
      root (hd0,0)
      kernel /boot/vmlinuz-2.6.26-2-686
      root =/dev/sda1 ro qeit
      initrd  /boot/initrd.img 2.6.26-2-386
      Первая строчка говорит загрузчику на каком устройстве размещено устройство
      Вторая, где ядро
      Третья куда монтировать.  параметр qeit задает ожидание
      Четвертая показывает, где находится сценарий загрузки.  
      Что ж с этим я думаю понятно
      1.2 От скрипта Init до DE(Desktop Envirement )

        Если загрузка ядра корректна, то ядро начнет инициализацию своих подсистем  и поиск оборудования. Каждое действие ядра сопровождается выводом сообщений и они сохраняются в лог. Если поиск оборудования прошел успешно, то следующий этап это:
      а) Старт оболочки командной строки (обычно bash). Правда это не первый процесс запускаемой системой, родителем всех процессов в системе является скрипт init. Если все пройдет успешно, то вы увидите запрос на авторизацию в системе
      б) Если в системе предустановлена графическая оболочка, то после активации всех систем ядра произойдет запуск X-server это базовая графическая система в *Nix системах 
      И уже, исходя из файлов конфигурации X будет запущена та или иная графическая среда рабочего стола.
      Вот после этого можно считать что загрузка завершена. Итак если обобщить:

      1. Запуск BIOS и самотестирование оборудования
      2. Поиск  MBR и передача управления программе, записанной в MBR
      3. Запуск загрузчика, выбор ядра при необходимости корректировка параметров загрузки 
      4.  Определение оборудования, загрузка необходимых модулей(выгрузка если в течении 10 сек не использованы), запуск сценариев инициализации системы
      5.  Запрос авторизации и после успеха штатный режим работы. 

      2. Выключаем Linux
      Когда система выключается перед ней возникает несколько задач:


      •  Остановка всех процессов,выполняющихся в системе
      • Сброс на диск данных из буферов ввода/вывода
      • Закрытие всех объектов ядра и освобождение памяти
      • Останов аппаратуры 
      • Отключение электропитания через ACPI 
       Важно что при выключении системы будет послан сигнал всем процессам на их выключение. При несохранении данных до выключения они могут быть утеряны. Кроме всего прочего Linux и другие Nix системы применяют отложенную запись на диск, т.е. ядро не сразу сбрасывает данные на диск, а спустя некоторое время. Вот это время они находятся в буферах ввода/вывода. И если система в этот момент внезапно отключится, например вы нажмете на кнопку отключения питания, или отключится электричество, то все данные находящиеся в ОЗУ, в том числе буферы ввода/вывода просто исчезнут и данные будут утрачены.
      Отсюда два вывода:
      1. Всегда выключайте компьютер через средства операционной системы 
      2. Обзаводитесь такими приборами как ИБП (источники бесперебойного питания) они дадут вам время для сохранения данных и корректного завершения работы      
      При некорректном завершении операций ввода/вывода может сложится ситуация полного разрушения файловой системы и это не вина Linux такая ситуация характерна для любой операционной системы. К слову, журналируемые файловые системы типа Ext4/3, Raiser и другие предоставляют инструменты для максимального снижения развития ситуации по описанному сценарию. В штатном режиме работы операционная система в обязательном порядке гарантирует сброс данных диск из буферов(либо при полном их заполнении, либо при выключении).На самом деле то, что применяется такая политика записи данных имеет свои преимущества,  а именно: уменьшение обращений к жесткому диску что повышает скорость работы системы. При выключении системы ядро закрывает открытые файлы, завершает все процессы, потоки, закрывает все сетевые соединения. После этого ядро останавливает различные подсистемы управления оборудованием. Ну и в конце концов ядро на современных машинах может управлять электропитанием и следовательно может программно выключить машину.     
      Как мы можем выключить машину?
      1 способ через графический интерфейс и здесь никаких комментариев не требуется.
      2 способ  через командную строку, так как выключение компьютера это процесс глобальный, то вам потребуются права суперпользователя(root) значит вам придется запустить команду  выключения из под sudo, а сама команда выключения это shutdown. Для этой команды существуют различные ключи и параметры, нас же интересует следующие: -h это указание к останову системы, указать время мы можем либо словесно(например чтобы немедленно выключить машину: sudo shutdown -h now) или в форме указания времени до выключения (sudo shutdown -h +30 это приведет к выключению системы через 30 мин ) или указав точное время, например(shutdown -h 18:30).
      На этом завершим краткое введение в тему старта/останова Linux, а во второй части изучим все эти процессы детальней.            
       
                      

        
                       
                    

      суббота, 11 сентября 2010 г.

      Система безопасности Linux


      Итак мы уже говорили о том как устанавливать приложения из исходников и пакетов, а теперь самое время поговорить о безопасности Linux. История системы безопасности Linux уходит в те времена когда Билли был всего лишь одним из кодеров IBM, а уж о Балмере вобще никто не знал, за то UNIX правила бал. И главное для ее концепции безопасности было то, что работает она в многопользовательском режиме. Система UNIX обязана обеспечить корректную работу нескольких пользователей в системе. Что мы в данном случае понимаем под корректностью работы:
      а) Изменения произведенные одним пользователем не должны затрагивать другого пользователя в большинстве случаев.
      б)Должна быть предусмотрена легкая система переключения активных пользователей
      в) Должна быть реализована возможность назначения разным процессам, разных прав.
      г) Должна быть реализована надежная система защиты аунтетификационных данных пользователя.
      Ну это конечно грубый список требований. Рассмотрим как все это реализуется в Linux.
      Начнем с процесса аунтентификации и идентификации пользователя. Итак определимся для начала с терминами. Пользователь это тот кто использует систему с определенным уровнем прав, то есть разрешенных действий. Ну например пользователю root можно все и немножечко больше:) А вот обычному пользователю системы можно далеко не все, например изменить системные библиотеки ему не дадут, а вежливо пошлют например фразой acess dined:).Но сама система узнать кто ее включил не может и был придуманы различные механизмы идентификации пользователя. Мы не будем говорить о такой экзотике как биометрия или что нибудь такое, а поговорим про рабоче-крестьянский пароль и логин. Это старая добрая система, используемая практически всюду.
      Итак когда вы вводите пароль, то система проверяет наличие вашего имени в системе, а так же корректность введенного пароля. Но было бы слишком не осмотрительно хранить такую важную информацию как пароль открытым текстом. Что же придумали для решения этой проблемы? Пароли не хранятся в открытом виде и даже не шифруются, вместо этого хранятся их хеши. Что такое хеш? Хеш это некое контрольное значение вычисленное на основе пароля, в нашем случае, при чем по самому значение пароль невосстановим в идеальном случае кроме как подбором.То есть даже если я получу хеш, то мне придется долго сидеть и придумывать различные комбинации разных символов, в надежде что я таки угадаю пароль:) Это можно перепоручить компьютеру тогда процесс ускорится, но все ж не настолько как хотелось бы.Мы можем себя поздравить: Linux умеет надежно защищать наши пароли. Однако есть несколько проблем: если мы этим паролем будем светить везде, то... ну вы поняли). Сейчас есть довольно таки много словарей, где есть миллионы слов даже очень заковыристых, а потому слова даже сложные как пароль не годятся. Клички животных ваших, имена вас и ваших знакомых, друзей, родных то же. Слишком маленькие пароли(не более 5 символов) ломаются к сожалению довольно быстро. С другой стороны не делайте пароли суперсложными, чобы потом сами не помнили. Ну ладненько хватит нам теории перейдем ближе к практике.
      1 фаза общения с системой для вас это старт загрузчика GRUB. Он позволит вам выбрать ту операционную систему, которую вы хотите загрузить сейчас. Вы можете установить пароль на доступ к GRUB, см. здесь.
      2 фаза это запуск оболочки. Оболочка это процессор командной строки, который может принимать от вас текстовые команды и выполнять их. Обычно это bash. Именно через оболочку защитные механизмы системы запрашивают логин/пароль для входа.
      3 фаза Запуск графической оболочки(среды) в современных дистрибутивах обычно все настроено таким образом, что сразу после запуска оболочки(шелла) происходит старт X-сервера(подсистемы графических возможностей UNIX системы), а после этого графической среды рабочего стола например GNOME или KDE.У них есть собственные системы аунтентификации пользователя и именно с ними вы и сталкиваетесь, когда система запрашивает пароль окном следующего вида:
      (картинку)
      4 фаза: работа в системе как обычного пользователя, а в случае выполнения каких то важных для системы действий получения прав root.
        Теперь поговорим о таком понятии как группы  и пользователи в Linux.В Linux пользователь обладает правами на выполнение определенных файлов, доступа к определенным каталогам, а вот те файлы, для которых пользователь не прописан в разрешенных ему будут не доступны. Действует жесткое правило: все что явно не разрешено, то запрещено.
      Для определения кому что можно действуют так называемые ACL Posix списки, где явно прописаны  права для всех пользователей. Права есть такие: чтение, запись и выполнение. Всего есть три категории с точки зрения ACL POSIX: пользователь владелец файла, группа пользователей в которую входит пользователь -владелец файла и остальные. Права на файл можно назначать и в графическом режиме:(контекстное меню файла->свойства->права )

      И в консольном.Вот с последним разберемся подробнее.Но прежде подытожим насчет ACL POSIX общую информацию:

      1. Списки ACL POSIX позволяют назначать различные права разным пользователям на основе групп. Группа это набор пользователей, который для системы безопасности имеют одинаковые права. Система идентифицирует  принадлежность пользователя к той или иной группе при помощи специального параметра GUID. Это особый идентификатор, который хранится вместе с другой информацией об учетной записи и именно по нему подсистема безопасности в ядре узнает а к какой группе пользователей относится данный пользователей. Сам пользователь ядру известен по UID (User ID). Пользователь с UID это root, а называться он может по разному. Важно отметить что любой пользователь входит в группу, если ее не назначает администратор, то система создает группу одноименную с логином пользователя(то есть пользователь с именем exampuser будет по умолчанию входить в группу exampuser )      
      2. Система    ACL POSIX различает: пользователя-владельца, который может менять любые права у файла, вплоть до удаления из системы, группу пользователей куда входит владелец, остальных. Каждой группе может быть назначена своя комбинация прав. 
      3. Права: чтение/запись, выполнение. По поводу последнего права: UNIX система, когда решает нужно ли выполнять файл смотрит отнюдь не на расширение, расширение может быть любым, она смотрит на то выставлен ли у файла бит разрешающий выполнение, если бит выставлен то она его выполнит без лишних вопросов. Поэтому будьте внимательны при даче такого права: во первых если файл например просто текст, то система будет пытаться его выполнить, что может привести к зависанию. И второе : файл может быть вирусом. Не давайте права выполнение тем кому это не надо даже если программа безобидна, то же самое переполнение буфера правильно использованное хакером сделает из безопасной программы крайне опасный таран системы безопасности любой ОС.     
      Теперь рассмотрим как в консоли выставить права для файла . Есть такая команда chmod. Вот при помощи нее такие вопросы и решаются.Для начала создадим файлик Test и напишем туда веселое  echo "Hello Linux!", а на первой строчке #!/bin/bash. Таким образом наш файлик будет таков:

      #!/bin/bash
      echo "Hello Linux!" 

      У меня он хранится в папке /home/gur/python_compitation. Итак первое мы хотим посмотреть права, которые есть:
      сделаем переход в папку:

      cd /home/gur/python_compitation
       ls -l  test
      -rw-r--r-- 1 gur gur 20 2010-08-31 20:28 Test
       
      Допустим мы хотим наделить наш файл правом выполнения Для этого напишем
      chmod +x Test

      Такой командой мы добавили себе право на выполнение этого файла, а если напишем
      chmod user_name +x Test  то тем самым дадим право заданному пользователю.
      Вот какие права есть в Linux:
      r-чтение
      w-запись
      x-выполнение
      такая комбинация как rw означает одновременную комбинацию прав чтение и запись.
      более подробно о правах на файлы можно прочесть здесь
      Рассмотрим теперь вопрос о том какие есть дополнительные средства безопасности в Linux.
      Есть во всех UNIX системах такая вещь как chroot.   Что это такое? Это ни что иное как средство ограничения  для определенных программ. Точнее даже их обмана. Это системный вызов, который меняет для программы корневой каталог. В обычных условиях мы знаем что это ни что иное как / . А сhroot позволяет сказать что для некоторой программой корневой папкой является myroot. Что это значит на практике? На практике это означает что программа даже и знать не будет о тех файлах и папках. которые не находятся внутри подставного корневого каталога. Так должно быть в идеале. На практике в реализации chroot, выявлялись ошибки, которые приводили к тому что программы могли сами обмануть chroot. Чаще всего сам chroot одинокий никому не интересен, он интегрируется в комплекс программ реализующих концепцию Jail(темница ). Это концепция и реализующая политика безопасности позволяет:
      -Запускать программу с измененным корневым каталогом, что позволит создать изолированное окружение  для подопытной программы
      -Наделять теми привилегиями, которые минимально необходимы службе или программе для выполнения
      -Накладывать ограничения на расход ресурсов программой находящейся в Jail(память и процессор)
      -Жестко ограничивать и контролировать сетевую активность приложения
       Правда неплохо? Да, но все же не забывайте, что все же остаются методы вырваться узнику из темницы. Например, если программа под правами root (Суперпользователя), то она может выполнить системный вызов chroot повторно, а в некоторых UNIX-системах ядро может некорректно его обработать... и темница разлетится в вдребезги.
      Еще один важный механизм безопасности Linux это SElinux.Данная система позволяет создавать сложные политики безопасности, которые позволят контролировать доступ к различным системным компонентам со стороны программ. При чем здесь речь идет отнюдь не только о файлах, но и многом другом.
      Последней системой безопасности, которую мы не рассмотрим в этой заметке будут системы актуализации. В чем ее суть? На физической машине имитируется виртуальная при чем все ее компоненты важные для запуска программ. Поэтому практически вы получаете в распоряжение второй компьютер, на который вам нужно установить операционную систему и вы можете работать с программами. При этом чащ всего, если только это неспециально написанный вредный код, ошибки и сбои программ никак не выходят за рамки виртуальных машин. Есть простые пользовательские решения типа Virtual Box, а есть решения, которые могут использовать целые наборы компьютеров балансировать нагрузки на них. Одно из них это XEN.Очень часто именно на нем организуют виртуальные серверы VPS.          
      Ссылки:  
      подсистема Jail
      XEN 
      SELinux