| | Tags: | linux, ubuntu | | Музыка: | Stevie Ray Vaughan and Double Trouble - Pride And Joy | | Subject: | О Линуксе | | Time: | 04:34 |
|
| Начал постигать эту замечательную операционную систему — Linux (а именно, Ubuntu Gutsy).
Что мне нравится: здесь можно понять внутреннее устройство всего. Открытость подразумевает не только открытость исходных кодов, но и открытость стандартов и простоту (не в ущерб мощи) подходов.
Как реализовано системное обновление в Windows? Программой с непонятными настройками, разбросанными по системе (при этом, для тонкой настройки, приходится лезть в недра системы и править реестр), работающей на непонятном протоколе и неочевидным образом непонятно что загружающим.
Как реализовано обновление в Debian (дистрибутив Linux, на котором основана Ubuntu; впрочем, я думаю, данный аспект не сильно различается между разными дистрибутивами)? Через менеджер пакетов, который лёгким образом настраивается. Протокол тоже очевидный: HTTP или FTP (хоть вручную зайди на сайт-репозиторий и скачай, что надо; обычно это не требуется). При обновлении чётко видно, что именно обновляется, при этом это может быть всё, начиная от ядра Linux'а и заканчивая «Квакой».
И так везде. Принцип предельной простоты и наименьшего удивления.
На уровне программиста преимущества Unix-way ещё более очевидны. К сожалению, там я пока немногое изучил, но то, что видел — это так, как это делать надо. От запутанного и перегруженного WinAPI (лично мне приходилось сталкиваться с GDI и работой с сокетами, но, надо полагать, там везде так) испытываешь отвращение. Работая с Unix API — получаешь удовольствие.
Программируя под Unix (я говорю Unix, потому что это с равным успехом относится к любой разновидности данной операционной системы) понимаешь, зачем и как надо использовать язык программирования C. Я даже перестал его считать «плохим», усложнённым языком: просто дело было, оказывается, в соответствующем API. Зато C++ начал считать мёртворождённым монстром =)
В общем, метод погружения (я сразу полностью удалил Windows) сработал на все сто процентов, теперь меня за уши не перетащишь обратно.
Поговорим теперь немного конкретно об Ubuntu. ( Read more... ) Стоит ли переходить на Linux?
Сложно советовать.
Если вы разработчик или администратор не-Win приложений — наверное, да.
Если вы тот, кого называют опытным пользователем — попробуйте, вдруг понравится. По мнению многих, к которым я недавно присоединился, здесь всё именно так, как опытный пользователь и хочет. Ни сложнее, ни проще.
Если вы учитесь и хотите продолжить пользоваться интернетом и офисными/научными пакетами программ, но при этом перестать играть в игрушки — попробуйте, на несколько дней поможет (после чего открывается Battle for Wesnoth, не говоря про прочее с более громким именем, и всё встаёт на круги своя).
Если вы просто любопытный человек — можете рискнуть.
Всяческих благ.
P.S. Нашёл тут замечательную книгу: The Art of Unix Programming, всячески рекомендую интересующимся. | комментарии: 2 комментария, оставить комментарий  |
| Поставил Linux (Ubuntu 7.04).
Основное прикладное ПО для работы, а именно, Firefox и Netbeans выглядят почти также. Другое дело — оконная среда в целом. Ну да ладно, привыкну как-нибудь. Работает более гладко. Правда с видео и звуком небольшие проблемы, гугл мне в помощь.
Есть особое удовольствие в прослушивании музыки из плеера, запущенного во второй консоли, в то время как в первой идёт установка gem-ов, а в графическом терминале — ставятся пакеты с помощью поставляемого с дистрибутивом менеджера...
Шрифты здесь, конечно, выглядят непривычно и отталкивающе =( | комментарии: 9 комментариев, оставить комментарий  |
| Доброго времени суток!
Надеюсь, читатели простят мне длительную отлучку. За её время много чего произошло интересного. Однако, надеюсь, в будущем записи в данном блоге будут появляться на строго регулярной основе. Приложу к этому все силы :)
Сегодня хотелось бы поговорить о модуле Enumerable. Enumerable, переводясь с английского как «счётное», отвечает, соответственно, за всё, что можно представить в виде упорядоченного набора элементов.
Любой класс, включивший в себя данный модуль, становится обладателем таких, вне всякого сомнения, удобных и всячески полезных методов, как find, inject, max/min, sort, map и множества других. Полный список можно посмотреть по ссылке. Как, вы пропустили ссылку? Вот она ещё раз.
Стандартные классы Array и Hash, включая в себя этот модуль, обладают всеми данными методами. Подробно останавливаться на каждом из них не будем, а посмотрим, как можно использовать данный модуль в собственных классах на небольшом простом примере.
Итак, задача, насквозь синтетическая. Через стандартный поток ввода поступают числа, по одному на строку, ряд заканчивается строкой со словом «END». Задача — выяснить их количество и вывести по возрастанию.
Решение.
class NumberReader
include Enumerable
def each
line = gets
yield line.to_i while (line = gets) != "END\n"
end
end
reader = NumberReader.new
numbers = reader.sort
puts "quantity: #{numbers.length}"
puts "numbers: #{numbers.join(" ")}" Возможно, решение не самое лучшее, однако наглядно демонстрирующее способ использования Enumerable в собственных классах.
Для того, чтобы заклинание сработало, достаточно
а) написать в объявлении класса include Enumerable б) реализовать метод-итератор each с очевидной функциональностью (а именно, передаче в блок последовательного всех своих элементов)
Итак, все сладкие методы, которые даёт нам Enumerable, работают через одну и ту же... то есть, я хотел сказать, через один и тот же метод each. И только его мы и должны реализовать.
Разберём приведённый выше пример подробнее.
Строка
include Enumerable
всего-навсего добавляет в наш класс NumberReader методы модуля Enumerable, о которых речь шла выше по тексту.
Потом, собственно, идёт метод each.
line = gets
yield line.to_i while (line = gets) != "END\n"
Первой линией кода считываем строку из стандартного потока ввода системной функцией gets(). Вторую линию разумно разобрать по частям. То, что идёт до while — «yield line.to_i» отправляет блоку, с которым был вызван наш метод each, ту самую строку из потока ввода. После while идёт выражение «(line = gets) != "END\n"» что означает буквально следующее: «присвой переменной line очередную строку из потока ввода и верни true, если она не равна "END\n", в противном случае верни false».
Почему в коде "END\n", а не просто "END"? Очень просто. Ибо gets() возвращает очередную строку вместе с символом перевода строки на конце.
«Что такое yield, я так и не понял?» Отсылаю к более фундаментальным трудам, например, на Wikibooks.
После того, как определён наш класс NumberReader, можно его тут же использовать. Создадим экземпляр этого класса, вызовем у него метод sort... Постойте, но мы ведь не определяли никакого метода sort?! Совершенно верно, этот метод вместе с другими подключился из модуля Enumerable. Причём этот метод во время работы будет использовать наш each. Удобно? Очень. Полезно? Несомненно. Понятно? Со второго раза, обычно, да.
Спасибо за внимание, заходите. | комментарии: оставить комментарий  |
| Захотелось мне как-то раз посмотреть, что у Ruby под Windows с поддержкой стандартного API.
Посмотрел я примеры по этому делу в «Pickaxe».
В двух словах: поддержка фиговая. В принципе, те, кто хотел краткого обзора, могут дальше не читать. Я бы не советовал для WinAPI программирования использовать Ruby. Вообще говоря, сама мысль об использовании интерпретатора в подобной связке в известной мере нелепа.
Но, тем не менее. Чисто удовольствия ради поэкспериментируем.
Что пишет первым делом человек, только-только начинающий знакомиться с WinAPI? За всех говорить не могу, но у меня первая программа, использующая API, меняла заголовки всех окон. Версия 2.0 делала это в цикле, не давая окнам возможности сменить на длительное время свой заголовок. Версия 3.0 сама копировала себя в системную папку и прописывала в автозагрузку. Были и последующие релизы...
Хоть так далеко мы не пойдём, но начальную версию сейчас сваяем.
Создайте произвольный файл, например, «APITest.rb».
APITest.rb
require 'Win32API'
GW_CHILD = 5 GW_HWNDNEXT = 2 GW_HWNDFIRST = 0
get_window = Win32API.new 'user32', 'GetWindow', 'LI', 'L' set_window_text = Win32API.new 'user32', 'SetWindowText', 'LP', 'I' get_desktop_window = Win32API.new 'user32', 'GetDesktopWindow', 'V', 'L'
desktop = get_desktop_window.call
child = get_window.call(desktop, GW_CHILD) child = get_window.call(child, GW_HWNDFIRST)
str = "OMG! It's working!"
while (child != 0) do set_window_text.call(child, str) child = get_window.call(child, GW_HWNDNEXT) end
Выполните в консоли «ruby APITextt.rb». Наслаждайтесь =)
Разберём подробнее.
Первая строка подключает файл с описанием класса Win32API, который ответственен за загрузку и выполнение API-функций. Далее мы определяем константы из MSDN-а для функции GetWindow(). Потом начинается сама «магия» — объявление импортируемых API-функций.
Метод new класса Win32API возвращает, как не сложно догадаться, объект класса Win32API. Принимает четыре аргумента: имя библиотеки, имя функции в библиотеке, тип аргументов, тип возвращаемого значения. Для обозначения типов используются следующие литеры: L - длинное целое (в т.ч. и HWND), I - целое, P - указатель (Ruby-строки автоматически конвертируются к char *), V - void (пустота). Вызов функций происходит через метод call объекта типа Win32API.
Детальное описание используемых функций можно найти в MSDN/Platform SDK. Краткое приведу здесь.
long GetWindow(long, int)
принимает хендл окна и константу, обозначающую отношение между окнами (GW_CHILD — дочернее, GW_HWNDNEXT — следующее с тем же предком, GW_HWNDFIRST — первое с тем же предком); возвращает окно, относящееся к данному указанным образом.
int SetWindowText(long, char *)
принимает хендл окна и строку, в которую устанавливается заголовок окна; возвращает 1, если завершена без ошибок.
long GetDesktopWindow()
возвращает хендл окна рабочего стола (все другие видимые окна принадлежат ему).
Итак, в середине скрипта мы устанавливаем child на хендл первого окна, лежащего на рабочем столе. Затем в цикле перебираем все видимые окна и с помощью SetWindowText() устанавливаем им наш заголовок.
В качестве упражнения можно предложить читателям развить скрипт до следующих версий. Идеи были указаны ранее =)
В заключение замечу, что я всячески не рекомендую использовать WinAPI на Ruby в целях иных, кроме как развлекательных. Документированы соответствующие классы плохо (пожалуй, можно сказать, что документация совсем отсутствует), многое приходится делать наугад или, в лучшем случае, заглядывая в исходники стандартных библиотек Ruby. Для меня остался загадкой механизм использования callback функций. Опытный читатель, должно быть, уже ранее про себя заметил, что вместо GetWindow() разумнее было бы использовать EnumWindows(), однако... (Хинт: копать следует в сторону библиотеки DL.)
До новых встреч. | комментарии: 5 комментариев, оставить комментарий  |
| Итак, речь пойдёт о модном сегодня языке программирования Ruby (ссылка ведёт на официальный сайт).
Почему Ruby?
Честно говоря, не знаю как лучше ответить на этот вопрос. Последним моим увлечением перед тем, как я окончательно на него перешёл, был C#. Богатая стандартная библиотека, автоматическое управление памятью... Ну, вы знаете, после этого старика C++ (или Delphi, кому что больше нравится) живётся привольно и легко. После того, как я в первый раз увидел код на Ruby, я подумал, что это что-то несерьёзное и не очень понятное. А потом мне предстояло написать курсовой на Ruby, тут то я, после недолгого обучения, и почувствовал всю мощь динамической типизации, итераторов, «duck typing» и всех прочих вкусных вещиц, которые сделали жизнь простого программиста-любителя, меня, проще и веселей.
Теперь я пишу
i = MyLongClassName.new
вместо
MyLongClassName i = new MyLongClassName
(из данного примера экономия кода неочевидна, но что, если подобное приходится писать в тысячах строк?)
something.each do |x| ... end
вместо какого-нибудь
for(vector<Something>::iterator i = something.begin(); i < something.end(); i ++) { ... }
Проще и понятней, кроме того, что короче, не правда ли? (Кто сказал «не правда»? =) Ладно, данное замечание не касается людей, просидевших десять лет в Визуал Студии и держащих на полке Кнута со Страуструпом). Это всего лишь два примера, но, поверьте, лаконичность и читаемость кода — то, что характерно для всех программ на Ruby.
Конечно, за всё приходится платить. В данном случае эта плата — производительность. Скрипты на Руби медлены и ресурсоёмки. Но... ну и что? =) Нет, действительно, если подумать, так ли уж на самом деле каждый раз, когда вы решаете посредством написания программы ту или иную задачу, важна быстрота исполнения и потребляемая память или вам дороже собственное время? Не знаю, каждый выбирает, исходя из своих нужд. У меня, например, чаще возникают такие задачи, для решения которых я напишу небольшой скрипт за пятнадцать минут и пусть он выполнится за час, чем задачи, в которых требуется год разрабатывать средство, время работы которого будет порядка секунд.
Милый синтаксис — не единственное приятное, что есть в Ruby.
Стандартная библиотека построена таким образом, что по мере освоения языка с удивлением выясняешь, что для любой задачи над строками и массивами уже придумана своя стандартная функция. При этом простая и очевидная в использовании. При этом все эти функции вполне реально удержать одновременно в голове, их не бесчисленное множество и они друг друга не повторяют. Возникает чувство полного контроля над языком, средой и собственной программой, которое лично для меня очень важно.
Забавный факт. Все мои коллеги, «пересевшие» в своё время на Ruby с других языков программирования (порядка полудесятка людей), не соглашаются больше добровольно писать код на чём-то другом! Они, конечно, вынуждены применять и другие языки программирования из соображений совместимости или по требованию заказчика/преподавателя. Но, будучи предоставлены самим себе, пишут на Ruby. Programming is fun again.
Ссылки.
1. Ruby - http://www.ruby-lang.org/ (официальный сайт, повторяю ссылку =) ) 2. Учебник по Ruby на wikibooks - http://ru.wikibooks.org/wiki/Ruby 3. Интересный блог профессиональных web-разработчиков на Ruby on Rails - http://www.novemberain.com/ 4. Подборка решений задач на Ruby на acm.mipt.ru - http://acm.mipt.ru/twiki/bin/view/Ruby/ | комментарии: 6 комментариев, оставить комментарий  |
| Доброе время суток.
Под данным именем я, devirt, буду писать вещи, так или иначе связанные с программированием и ИТ в целом.
Сразу замечу, что я не профессиональный программист (то бишь, на жизнь этим не зарабатываю), но имею многолетний стаж программирования «для себя» =)
Ваши комментарии о компетентности, полезности и интересности той или иной записи только приветствуются. Также можете предлагать темы для будущих записей.
Заходите, должно быть интересно =) | комментарии: оставить комментарий  |
|