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

Python: типы данных.

Здесь я решил собирать небольшие записки путешествия по миру python +примеры. И начнем мы его с типов данных. Python это язык типизированный, но сама система типизации в нем динамическая. Что это для нас значит?   Это значит что в одной и той же переменной мы можем совершенно спокойно хранить: числа, строки,кортежи, списки и ваши собственные типы данных. Кошмар:)И например такие строки совершенно нормально воспримет интерпретатор:
 a='Stroka'
a=1
a=[4,3]
Как такое возможно ? Вся тонкость в том чтобы понять что такое переменная в python: это не жестко статически выделенная область памяти, а динамически распределяемая область памяти, которая реализована за счет не типизированных указателей С. Именно поэтому python может свободно жонглировать типами данных, приводя переменную к нужному типу данных по мере необходимости.
А зачем же типы? А они нужны затем, что для каждого типа данных определен свой собственный набор операций и то что например вполне корректно для числа будет совсем некорректно для списка или кортежа.
Так же важно помнить, что python делит все типы данных на две категории:
1. Изменяемые
2. Неизменяемые
На всякий случай поясню: если мы создаем объект первого типа, то мы можем его изменять целиком или отдельные части и мы будем работать все с тем же объектом.
А вот со вторым типом объектов такие штучки не пройдут.
Продемонстрируем это на примере работы с двумя одинаковыми по содержанию коллекциями, но одна из них это список (изменяемый тип данных), а вторая кортеж (неизменяемые объекты).
am=[1,2,3,4]
aim=(1,2,3,4)
for i in xrange(0,len(am)-1):
     am[i]=7*am[i]
 print am           
В результате нам спокойно покажут:
>>>
[7, 14, 21, 4]
Но стоит нам добавить такие строки в скрипт:
 for i in xrange(0,len(am)-1):
     aim[i]=7*aim[i]
print aim
Как Python нам сообщит:
Traceback (most recent call last):
  File "/home/abc/блог/PyMutInmut.py", line 7, in
    aim[i]=7*aim[i]
TypeError: 'tuple' object does not support item assignment  
Собственно и произошло то о чем говорилось ранее: нельзя в неизменяемых объектах менять отдельные части,
Зачем так было придумано? Логика в этом есть и неплохая между прочим, неизменяемость объектов позволяет легче реализовывать, быстрее доступ к таким объектам на чтение но не на запись.Кроме того неизменяемые объекты нужны для функционального программирования, где воздействия на аргументы кроме возврата результата функции не допускаются.  
Здесь есть одна тонкость: неизменяемые объекты можно изменять!) Как ?Ну например так:
stri='hel'
stri=stri+'hel'
Произойдет прозаическая конкатенация строк. Однако заглянем за кулисы:
1) Python возьмет копию исходной строки+вторая
2) Пометит а потом и утилизирует (то есть уничтожит в памяти) исходную строку
3) Присвоит идентификатор новой строке.
То есть видите любая операция с неизменяемым объектом где он меняется порождает новый объект . Но на самом деле список и другие изменяемые структуры могут легко решить ваши проблемы по скорости записи и уступают по скорости чтения не намного.        

пятница, 22 октября 2010 г.

Gedit+FASM

Редактор Gedit я думаю в особых представлениях не нуждается:) И кроме всего прочего (а про прочее можно прочесть здесь) он позволяет подсвечивать синтаксис разных языков программирования. Чтобы включить этот режим достаточно выбрать:
Вид->Подсветка синтаксиса->...(нужный язык)
Итак что же мы имеем? Имеем мы много чего кроме ассемблера. Я остановил свой выбор на FASM(Flat Assembler). И заглянув на форум FASM-community обнаружил следующее: http://board.flatassembler.net/topic.php?t=6365 
Тем в топике не так уж и мало что вдохновляло, а с подсветкой синтаксиса FASM для Gedit была связана эта:http://board.flatassembler.net/topic.php?t=8523
Итак качаем файлики из темы. Это описания в формате xml лексем для ассемблера разновидности fasm. Эти файлы нужны для GTKSourceView. Это в свою очередь С-библиотека расширение для GTK, которое позволяет осуществлять многострочное редактирование текста, операции redo/undo   неограниченной глубины,регистронезависимый  поиск в тексте с кодировкой UTF-8, и прочие вещи специфичные для редакторов исходных текстов. Именно на этой библиотеке работает например Gedit,Anjuta(среда разработки для GNOME). Так вот, чтобы добавить возможности   подсветки нового синтаксиса в Gedit нам нужно распакавать файлики из темы, после чего кидаем в папку GTKSourceView по адресу: /usr/share или /usr/local/share или /user/gnome/share или /usr/X11R6/gnome/share  (у меня сработал первый путь ). Но здесь нас ждет засада: usr относится к системным папкам, которые Linux абы кому модифицировать не дает поэтому root спешит нам на помощь=)
И здесь есть два пути (точнее 3:)):
1) Пойти истинным Unix-way и копировать все командой sudo cp /path/to/your/file  /usr/share/ GTKSourceView/language-specs/asembly.lang
2)запустить nautilus из командной строки sudo nautilus
3) или его же запустить но немного иначе gksu nautilus
Далее когда вы скопируете файл asembly.lang  в language-specs,а в styles   oblivion2.xml останется только перезапустить gedit и возрадоваться.
    
 

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

Python: запускаем скрипты

 Если вы пользователь Linux то скорее всего у вас уже все есть и проверить наличие python довольно просто:откройте командную  строку и наберите: python
На самом деле все вы уже можете писать программы) Каждое ваше действие вы непосредственно передаете интерпретатору и его результаты будут немедленно показаны на экране в командной строке. Можно так же установить IDLE это штатная и очень неплохая среда разработки на python:
apt-get install idle. 
  А если нам захочется немедленнот в консоли проверить команду python? Ответ: 
python -c "print( 'Twest')"
-с заставляет python интерпретировать строку как код. 
Чтобы запустить скрипт в консоли можно написать python имя_скрипта.py 
А если написать в скрипте первой строчкой: #!env/python 
То python будет запущен с этим скриптом автоматом по команде 
./имя_скрипта.py    
./ Так как заставляет искать скрипт не по переменным окружения, а в текущем каталоге   

Что такое copyleft?

Все нам внушают то что собственность это святое и неприкосновенное, и то что за все нужно платить.Производители коммерческого программного обеспечения явно довольно таким положением вещей и всячески его стремятся закрепить.Однако практика развития ИТ показала, что оказывается можно иначе. Как? Окунемся немного в историю OpenSource движения
Первые открытые лицензии это лицензия MIT и BSD. Но это были весьма мягкие лицензии для пропиетарных программ.Но свою пользу они принесли, например система FreeBSD и ей родственные используются и поныне.   главное отличие лицензий MIT и BSD от GPL и сходных с ней лицензий в том, что они не запрещают совмещать открытый код и закрытый и делать весь код закрытым. Пропиетарные дельцы этим пользуются, например продукт LabVIEW использует виртуальную машину LLVM для организации выполнения байт-кода, однако исходные тексты LabVIEW вы не получите:) 
В 1984 году Ричард Столлман выдвинул новый тип лицензии GPL. Ее отличиемот предыдущих лицензий открытого типа была очень жесткая позиция по отношению к закрытым программам, а именно: ни одной строчки кода под GPL не может попасть в закрытый продукт. Для защиты от пропиетарных(закрытых) продуктов GPL-кода от закрытия было выдвинуто 4 права и одно ограничение GPL лицензии. 
Права:

  • Выполнять программу с любыми целями как коммерческого так и некоммерческого характера 
  • Свободно получать исходный текст программы 
  • Модифицировать исходный текст программы 
  • Распространять свою версию программы вместе со всеми   изменениями на условиях той же лицензии с которой вы ее получили 
Именно благодаря последнему пункту мы наблюдаем бурное развитие GPL-софта и его возрождение из пепла даже если разработчики бросили проект. Конечно то что производные работы заставляют то же лицензировать под GPL очень не нравится производителям коммерческого софта и они потому не особо то и хотят участвовать в OpenSource движении.Microsoft кроме того открыто поливает грязью открытый код. 
   Хотя и я уже об этом и говорил, но повторюсь: приучать со школы надо именно к открытым GPL-разработкам, так как они гораздо дешевле государству, либо равны, а часто и лучше своих коммерческих аналогов  по возможностям. Кроме того так как многие открытые программы таят в себе множество возможностей при внимательном изучении и требуют своего изучения, то пользователь приучится читать документацию. 
Теперь посмотрим на это и с другой стороны: государству то же есть немалая выгода в OpenSource, ведь вокруг нужного продукта формируется сообщество, которое может помочь тестированием кодом и т.д. При чем процесс можно вполне контролировать госорганизациям.А реализация научных разработок в рамках открытой модели это и дальновидное решение с точки зрения правительства. Почему? 
1) Открытая форма распространения знаний позволит более эффективно совершенствовать разработку. Если применять GNU/GPL  то и воровать код, чего так боятся, будет невыгодно потому что разработка будет нелегальной и это будет грозить судебными разбирательствами. 
2) Разработка комплекса ПО для исследований с открытым исходным текстом позволит избежать волокиты и высоких затрат для университетов и НИИ страны. Кроме того открытые исходники будучи способствовать более лучшему вовлечению студента в процесс обучения программирования.        
3) Государству и крупным корпорациям будет выгодно распространять часть технологий как открытые стандарты, привязывая тем самым разработчиков к своей инфраструктуре            

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

wget: менеджер заначек командной строки

В Windows для многих является совершенно привычной вещью менеджер закачек. Linux нам то же его предоставляет при том несколько вариантов, но мы рассмотрим один из самых популярных, особенно когда дело касается больших файлов: консольную качалку wget. На самом деле ее интерфейс весьма прост, поэтому начнем с ней знакомится не откладывая   дело в долгий ящик.
Решим с помощью нее несколько простых задач(качать будем ну например CentOS с зеркала Яндекс):
Задача 1 просто скачать файл:
wget       http://mirror.yandex.ru/centos/5.5/isos/i386/CentOS-5.5-i386-bin-DVD.iso
В этом случае файл сохранится в домашнем каталоге. Или в том каталоге в который перешел пользователь до начала загрузки wget'ом
Задача 2  Скачать и сохранить файл в определенный каталог:
wget  -P /home/auser/download      http://mirror.yandex.ru/centos/5.5/isos/i386/CentOS-5.5-i386-bin-DVD.iso
Не забываем про волшебное сочетание: ./ Это указывает на текущий каталог и заставляет уже в нем искать необходимую папку. Обратите внимание при необходимости иерархия папок указанная после ключа -P будет создана.
Задача 3: скачать файлы из списка, хранящемся в файле:wget -i spisok.txt
В сам файл нужно записать прямые ссылки на файлы. И wget последовательно скачает файлы из списка.
Задача 4: докачка файла:
wget   -с    http://mirror.yandex.ru/centos/5.5/isos/i386/CentOS-5.5-i386-bin-DVD.iso
Здесь важно предварительно перейти в директорию, где хранится нужный файл, а ключ c(continue) укажет что необходима докачка.    
Задача 5: создать зеркальную копию сайта(на примере http://mirror.yandex.ru/):
wget -r  http://mirror.yandex.ru/
Ключ -r заставляет заходить wget последовательно во все подкаталоги и воссоздавать всю структуру каталогов у вас на компьютере. Так же можно указать уровень рекурсии, то приведет к скачиванию только части каталогов. Допустим файловая структура site/content/1.htm  и внутри  content еще есть каталог subcontent. Вот если мы укажем уровень рекурсии 2, то будет загружен лишь каталог content , а подкаталог subcontent нет.      
Задача 6:отключить машину по окончании загрузки:
sudo wget   http://mirror.yandex.ru/centos/5.5/isos/i386/CentOS-5.5-i386-bin-DVD.iso &&shutdown -h now
Нам обязательно нужно предоставить права суперпользователя для того чтобы могла сработать команда shutown, флаг -h(halt) говорит о том что компьютер нужно выключить а now я думаю объяснять не надо:) При помощи операции логического И(&&) мы объединяем две операции для последовательного выполнения, т.е. сначала будет выполнено скачивание файла, а затем команда shutdown. Внимательно изучите вывод команды wget --help в нем много интересного:)  
Удачных закачек!