пятница, июля 03, 2009

Третья программа на wxWidgets

В прошлый раз мы остановились на простенькой программке в одну кнопку и один текстовый блок. Пора добавить одно текстовое поле.

1 #include
2
3 class MainApp: public wxApp{
4 public:
5 virtual bool OnInit();
6 };
7
8 enum{
9 BUTTON_Pimpa = 1,
10 Question_ID = 2
11 };
12
13 class MainFrame: public wxFrame{
14 public:
15 MainFrame( const wxString &title, const wxPoint &pos, const wxSize &size );
16 wxButton *Pimpa;
17 wxStaticText * Warning;
18 wxTextCtrl *Question;
19 void changeText(wxCommandEvent& event){Warning->SetLabel(_T("А вы нажали на кнопку."));}
20 private:
21 DECLARE_EVENT_TABLE()
22 };
23
24 BEGIN_EVENT_TABLE ( MainFrame, wxFrame )
25 EVT_BUTTON ( BUTTON_Pimpa, MainFrame::changeText)
26 END_EVENT_TABLE()
27
28 DECLARE_APP(MainApp)
29 IMPLEMENT_APP(MainApp)
30 bool MainApp::OnInit(){
31 MainFrame *MainWin = new MainFrame(_("Заголовок окна"), wxDefaultPosition, wxSize(580, 200));
32 MainWin->Show(true);
33 SetTopWindow(MainWin);
34 return true;
35 }
36
37 MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size):wxFrame((wxFrame *) NULL, -1, title, pos, size) {
38 Pimpa = new wxButton(this, BUTTON_Pimpa, _T("Произвести вычисления"),wxDefaultPosition, wxDefaultSize, 0);
39 Warning = new wxStaticText (this, BUTTON_Pimpa + 1, _T("Я написал что-то на wxWidgets!!"), wxPoint(10,100), wxDefaultSize,0,wxStaticTextNameStr);
40 Question = new wxTextCtrl(this, Question_ID, wxEmptyString, wxPoint(390,40), wxSize(25,20));
41 }

Пример не идеальный, поэтому мы ещё будем его исправлять. Но сначала я объясню, где что значит.
Из действительно новых элементов интересна только строка 40.
wxEmptyString - это строка, которая стоит в текстовом поле по умолчанию - при запуске программы и при вызове метода Question->Clear().
wxSize(25,20) - это размер текстового поля.

Теперь - к усовершенствованиям.Добавьте после 40й строки ещё две:

Question -> SetMaxLength(2);
Question -> SetValidator(wxTextValidator(wxFILTER_NUMERIC));

Что это даёт? Это иллюстрирует ограничения на ввод. Первое ограничение говорит о том,что ввести можно лишь 2 символа. Второе ограничение - то,что эти символы могут быть только цифрами. Здесь необходимо сделать замечание: при обработке методом Question->GetValue() библиотека возвращает wxString - значение поля. Но числа можно задать разными способами: это может быть обычная нотация,как 1, 2, 3 и так далее, это может быть 3.14, или 3,14, или 3e+13. Таким образом, на деле в нашем текстовом поле может оказаться не только цифра.

Чтобы считать число из поля и записать его в переменную, удобно писать такую конструкцию:
if (!(Question->GetValue()).ToLong(&variable,10)){...}
, где на месте ... обрабатывается случай, когда значение Question не удалось преобразовать в десятичное число.

Но я отвлёкся к частному случаю. Если с maxLength всё более или менее понятно, про валидаторы можно рассказать подробнее.
Валидаторы, как вы уже поняли, служат для разнообразных ограничений ввода.В базовом варианте они проверяют нажатия клавиш и блокируют недопустимые. Есть много стандартных валидаторов, которые используются в самых простых случаях; также можно описать свой, если, например, вам нужны только буквы А,В,С,Е,Н,Й,М и Ψ. Это уже отдельная тема, не буду отвлекаться настолько сильно.

Что же мы получили сейчас? Программу с одним текстовым блоком, одним текстовым полем и одной кнопкой. Помнится, я именно из такого набора составлял графическую версию "Магического Шара". Более того: до фига моих лабораторок за 3й курс сводились к приёму и обработке параметров, это реализуется так же просто. Ну, или этот набор годится для кроссплатформенного кейгена (ни разу не встречал ничего подобного, но это просто фантазии).

Поэтому пока что закончу серию. Простейшая программа готова и работоспособна.Что ещё осталось сказать?
"Ура!"

четверг, июля 02, 2009

Вторая программа на wxWidgets

Blogger с утра не пускал меня, поэтому пишу пост немного позже ожидаемого.
Продолжаем tutorial, теперь пора добавить немного активности.
Прежде всего - добавить кнопку. Назовём её Pimpa.
Пусть при нажатии на эту кнопку меняется значение нашего текстового поля. Но тогда это поле должно тоже приобрести имя - пусть будет Warning.

1 #include <wx/wx.h>
2
3 class MainApp: public wxApp{
4 public:
5 virtual bool OnInit();
6 };
7
8 enum{
9 BUTTON_Pimpa = 1
10 };
11
12 class MainFrame: public wxFrame{
13 public:
14 MainFrame( const wxString &title, const wxPoint &pos, const wxSize &size );
15 wxButton *Pimpa;
16 wxStaticText * Warning;
17 void changeText(wxCommandEvent& event){Warning->SetLabel(_T("А вы нажали на кнопку."));}
18 private:
19 DECLARE_EVENT_TABLE()
20 };
21
22 BEGIN_EVENT_TABLE ( MainFrame, wxFrame )
23 EVT_BUTTON ( BUTTON_Pimpa, MainFrame::changeText)
24 END_EVENT_TABLE()
25
26 DECLARE_APP(MainApp)
27 IMPLEMENT_APP(MainApp)
28 bool MainApp::OnInit(){
29 MainFrame *MainWin = new MainFrame(_("Заголовок окна"), wxDefaultPosition, wxSize(580, 200));
30 MainWin->Show(true);
31 SetTopWindow(MainWin);
32 return true;
33 }
34
35 MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size):wxFrame((wxFrame *) NULL, -1, title, pos, size) {
36 Pimpa = new wxButton(this, BUTTON_Pimpa, _T("Произвести вычисления"),wxDefaultPosition, wxDefaultSize, 0);
37 Warning = new wxStaticText (this, BUTTON_Pimpa + 1, _T("Я написал что-то на wxWidgets!!"), wxPoint(10,100), wxDefaultSize,0,wxStaticTextNameStr);
38 }

Скомпилируйте и зацените.А теперь по строкам.
Строки 8-10 задают идентификатор для кнопки. Зачем нужны эти ID, я упоминал уже ранее; теперь же можете посмотреть на строку 23.У этой строки такой смысл: при вызове контрола с ID Button_Pimpa надо звать метод changeText. Обработка событий происходит в закрытой части класса, что логично,а вот метод закрывать необязательно.
Строка 37 даёт ещё одно понятие арифметики идентификаторов. В самом деле, мы же можем взять следующий после кнопки. Есть ещё один трюк - это когда вы пишете wxID_HIGHEST + 1,, это даёт наибольший свободный ID. Ну да не суть важно.
Возможно,у вас ещё давным-давно возник вопрос, почему строковые константы заключены в интересные _T("") и _(""). Это макросы wxWidgets, которые конвертируют строки во внутренний тип wxString. Различие _T() и _ в том,что _T() позволяет включать интернационализацию строки - если вы вздумаете использовать gettext, то вам оно понадобится.
Кстати - здесь я также играю с позициями. Можно запросто поставить в тупик стандартный компоновщик, если прописать обоим контролам wxDefaultPosition. Но чем усложнять программу хаками, лучше сосредоточимся на действительно нужных вещах.

Итак,у нас есть уже кнопка и текстовый блок. Это уже кое-что. Но для какой-либо полезной программы не хватает ещё чего-то...текстового поля. Поля,куда вводятся числовые или строковые параметры.Этим мы и займёмся в следующем выпуске.

среда, июля 01, 2009

Первая программа на wxWidgets

От нечего делать решил написать маленький тьюториал. В своё время меня по-настоящему достало отсутствие нормальных обучалок по wxWidgets.
Прежде всего, обговорю два момента. Во-первых, я надеюсь,что мой читатель знает,что такое библиотека wxWidgets, что он умеет программировать на C++, что он уже установил себе всё необходимое и настроил компилятор (самый простой способ на Windows - это поставить IDE wxDev-Cpp, на Linux все способы одинаково простые) и что он горит желанием начать.
Второе - это то,что я хочу сейчас сделать. Я хочу создать минимальное рабочее GUI-приложение на wxWidgets, не обращая пристального внимания на оптимизации и трюки. Из чего состоит минимальное приложение? Дайте подумать...кусочек текста на сером фоне подойдёт.
Сперва даю код,после этого - объясняю,что он делает, договорились?

1 #include <wx/wx.h>
2
3 class MainApp: public wxApp{
4 public:
5 virtual bool OnInit();
6 };
7
8 class MainFrame: public wxFrame{
9 public:
10 MainFrame( const wxString &title, const wxPoint &pos, const wxSize &size );
12 };
13
14 DECLARE_APP(MainApp)
15 IMPLEMENT_APP(MainApp)
16 bool MainApp::OnInit(){
17 MainFrame *MainWin = new MainFrame(_("Заголовок окна"), wxDefaultPosition, wxSize(580, 200));
18 MainWin->Show(true);
19 SetTopWindow(MainWin);
20 return true;
21 }
22
23 MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size):wxFrame((wxFrame *) NULL, -1, title, pos, size) {
24 new wxStaticText (this, wxID_ANY, _T("Я написал что-то на wxWidgets!!"), wxPoint(10,100), wxDefaultSize,0,wxStaticTextNameStr);
25 }


За этими 25 строчками кроется глубинный смысл. Пока что скомпилируйте, а я расскажу,что да как. Напоминаю,что на Linux это делается командой:


g++ `wx-config --cxxflags` <ЗДЕСЬ_ИМЯ_ФАЙЛА> `wx-config --libs` -o <ИМЯ_БИНАРНИКА>


Начнём,пожалуй. Строка 1 подключает собственно wxWidgets. Для случая прекомпиляции предусмотрен иной подход, но что я говорил насчет оптимизаций?
Итак, на строке 3 мы создаём класс MainApp. Это будет основной класс нашей программы,о чём напоминают строчки 14 и 15.В строках 8-12 создаётся фрейм программы - собственно окошечко, в котором будет виден текст. Позднее туда ещё добавится пара контролов.

Если вы заметили,то программа не содержит функции main(). Вместо неё первой выполняется функция OnInit(),это строки 16-21. В них всё довольно топорно: пичкаем фрейм нужными параметрами (заголовок, позиция на экране и размер), выводим на экран, и даём команду сделать его основным окном программы.

В строках 23-25 описывается содержимое фрейма. Собственно, что и будет выведено после выполнения строки 18. У нас это безымянный текстовый блок. немного о параметрах конструктора:

new wxStaticText (this, wxID_ANY, _T("Я написал что-то на wxWidgets!!"), wxPoint(10,100), wxDefaultSize,0,wxStaticTextNameStr);

this - это указатель на окно,в котором выводится текстовый блок. У нас, собственно,и нет выбора.
Значение wxID_ANY нужно объяснять долго. wxWidgets использует систему ID - то есть,каждый объект на фрейме имеет собственный целочисленный номер. Это понадобится чуть позже, когда придётся обрабатывать события. Пока что обработка событий в наши планы не входит, поэтому и ID мы задаём произвольным образом.
wxPoint(10,100) - это положение тестового блока на фрейме. Объект класса wxPoint задаёт его левый верхний угол - здесь только две координаты, которые считаются от левого верхнего угла.Вместо этого можно написать wxDefaultPosition - размещение по умолчанию, но ведь лёгкими путями не достигнуть просветления.
Здесь хотелось бы сделать замечание. При ручной расстановке я заметил,что в разных осях разные шрифты и размеры блоков. Так, в одной операционке мне не хватает ширины на фрейме,в другой - высоты. Разница в шрифтах, разница в размере границ полей..всё это даёт сильные перекосы, поэтому старайтесь придерживаться всё-таки стандартных компоновщиков,это сильно сэкономит нервы и время.
wxDefaultSize - размер блока. Рекомендую не вычислять вручную, библиотека это превосходно сделает за вас.
0 - отвечает за стиль текста. Если интересно - смотреть здесь. Но в большинстве случаев вам это смотреть не понадобится.
wxStaticTextNameStr - имя окна. Играть с этим не требуется,но если есть желание - почитайте маны и попробуйте.

Итак, вроде всё. У нас получилось одинокое окошко с текстовым блоком.Попробуем чуть-чуть усложнить задачу. За что я не люблю остальные руководства - они думают, что статусбар и меню - это обязательные элементы интерфейса. Чушь собачья! Интерфейс должен быть максимально простым и требовать не больше одного клика мышки.Что требует всего лишь одного нажатия? Кнопка.

Так, на сегодня пока всё. В следующий раз попробуем сделать ещё одну бессмысленную программу, в которой значение текстового поля будет меняться с щелчком кнопки. При желании, кнопку можно будет сделать красной :-)

воскресенье, июня 28, 2009

Небольшой скрипт

Вчера была очередная игра, но я не об этом.
Я написал скрипт для того,чтобы обновлять внешний IP'шник в своём DC++. Предполагается linuxdcpp последних версий. Сильно, думаю, упростит жизнь людям с динамическим IP. Перед использованием проверьте переменные $path и $url

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple; #получение IP
my $path = ".dc++/DCPlusPlus.xml";#местонахождение собственно конфига
my $url = "http://p2p.kuzbass.net/getip.php";#адрес, с которого берётся IP. Подойдёт любой стабильный и простой по выводу, как http://whatismyip.ru или http://whatismyip.org. Основной критерий, конечно же, стабильность.
my $ip = get($url) or die($!);
$ip =~ /(\d+.\d+.\d+.\d+)/; $ip = $1;
print "Your IP is: $1\n";
my $CONFIG, my $BACKUP;
open (CONFIG,$path) or die($!);
open (BACKUP,">",$path."~~") or die($!);
while (){
s{\d+.\d+.\d+.\d+}{$ip};
print BACKUP;
}
close(CONFIG);
close BACKUP;
exec ("mv $path~~ $path");

четверг, июня 25, 2009

Небольшие планы...


Игра по системе Fallout продолжается, и постоянный геймтестинг даёт плоды.
Собираюсь внести свой вклад в создание Fallout P&P 3.0. Моя система,которую я создавал до этого,всё равно во многом заимствована оттуда (чего стоят одни Traits), за исключением,конечно, магии.
Так что у меня есть все основания чувствовать себя так же, как и VaultBoy на этой картинке.
Правда, я не знаю насчет своего знания английского и понравятся ли там мои правки, но уверен,что у меня будет возможность опробовать их на живых игроках :-)

вторник, июня 16, 2009

Законы жанра: MMORPG

Почему-то натыкаюсь на призывания сделать новую MMORPG, где "всё будет по-другому".
Здесь я хочу написать законы этого жанра и объяснить,почему по-другому делать невыгодно.
Итак:
  1. Опыт начисляется за убийство монстров. Квесты дают меньше опыта, чем кач на монстрах.
  2. NPC стоят как столбы на одном месте и ничего не делают. Их характер слабо прописан, никакого отыгрыша.
  3. Маленькие возможности социального интерактива, упор на бой.
Попробую объяснить, откуда это так придумано.
Начну с простого. "Кач" на монстрах против "кача" на квестах.
Посмотрите на игру для одного игрока "Ведьмак". Гениальная игра, образец single-player RPG. Опыт даётся преимущественно за выполнение квестов, монстры дают сравнительно ничтожное число "экспы". Но! Но квесты в игре тщательно прописаны и невообразимо интересны. Более того: у игры очень низкий replayability. Если вы сыграли в неё один раз, два раза...десять раз, вы не захотите её проходить в одиннадцатый раз, поскольку вы уже знаете все или большинство поворотов сюжета. А мочить монстров невыгодно, потому что на них не раскачаешь персонажа. Поэтому даже если в MMORPG квесты хорошо прописаны, но опыта они всё равно дают существенно меньше, чем "мочилово" монстров. Это обеспечивает интерес к игре, чтобы в игре можно было сидеть неделями\месяцами\годами, даже когда основная сюжетная линия закончена.
Пойдём дальше. "Тупые" NPC.
Я напомню, как расшифровывается название жанра - Massive Multiplayer Online RolePlaying Game. Ролевая онлайн-игра для огромного числа игроков. Скажите мне, когда по миру бегут тысячи персонажей, отыгрываемых игроками, так ли уж важно заморачиваться над несколькими персонажами, отыгрываемых компьютером? Допустим,что важно. Пойдём дальше. Большинство из этих игроков бегут очертя голову, качаясь до последнего уровня и хватая квесты напропалую. Они не оценят работу над NPC, потому что просто пробегут мимо неё. Поэтому у NPC очень слабо прописывают характер: никто не остановится и не оценит этой работы.
Почему же компьютерные персонажи стоят на одном месте? Это самое простое. Представьте,что в город пришло Очень Много Героев одного уровня.Например, первого.И им всем нужен один и тот же NPC. А он ушёл. В это время он спит, потому что ночь. Он лежит у себя дома,в постели,вместо того,чтобы стоять на площади и ждать игроков.
Очень Много Героев одного уровня будут без дела слоняться по городу и искать нужного NPC, после чего не найдут его и уйдут из игры. Либо найдут и добьются нужного. Но дело не в этом - дело в том,что они потеряют уйму времени на то,чтобы поймать Абсолютно Незначительного Персонажа. Поэтому этот персонаж должен нести свой пост круглые сутки на одном месте.
Теперь - боёвка vs. социалка. Здесь уже большую роль играют лень и новизна жанра. Боёвка - это взаимодействие игрока с монстрами - т.е. игрока с компьютером. Здесь всё намного проще, ведь это уже давно продумано в обычных RPG. Придумал систему боя, нарисовал десяток летающих бурундуков - вот тебе уже геймплей.Социалка же - это обязательно взаимодействие с человеком, потому что только человек сможет нормально в ней участвовать. Причём должен быть полный отыгрыш, потому что не каждого человека можно заставить соблюдать правила, подобно компьютеру. Здесь уже идёт фантазия игротехов. Самое простое решение - выдать обоим игрокам по чату, пусть чатятся и там уже показывают,как они *охают*, *ахают*, *преклоняются на одно колено* или что ещё. Посложнее - дать систему охов, ахов и прочаго в самой игре, т.е. отрисовать это. В этом направлении подвижек очень мало, потому что трудно придумать что-то новое и вместе с тем не запороть весь соц. интерактив. Тем более,что он не исследован в оффлайн-играх с двадцатилетней историей. Вот и остаётся делать упор на бой.
Вроде бы всё. Думаю, в близком будущем посмотрю законы других жанров,если получится интересно. Если я что-то забыл - не стесняйтесь напомнить в комментариях.

пятница, июня 12, 2009

Пробы картографии

Только что попробовал себя в качестве картографа.
Перо, чернила, бумага, 2009г.
Карта неизвестного острова.
Сильно оптимизировал при загрузке в инет, так что она весит 30 Кб и даёт довольно сносное качество, чтобы рассмотреть мелкие детали (хотя бы деревья).
Обозначения взял с потолка, хотя старался быть правдоподобным (к сожалению,но только после второго росчерка пера - первый оказался слишком гладким, нетрудно догадаться каким именно он был).
Опыт считаю удачным. Потом попробую на более осмысленных местах и,возможно, с подписями.

четверг, июня 11, 2009

Пиратская партия

http://translated.by/you/the-pirate-party/
Очень интересные идеи затрагиваются в этом манифесте.На такой маленькой, казалось бы, основе - всего лишь авторское право - создать целую партию.
Цитирую:
Монополия владельцев авторских прав на коммерческую эксплуатацию художественных произведений должна ограничится пятью годами после публикации.
Хорошо, но маловато. Если бы так было, то "Гарри Поттер и философский камень" выпускался бы всеми кому не лень без отчислений Роулинг уже в 2006м. Мне кажется, что срок 50-60 лет после публикации более резонен, за это время произведение становится классикой. В любом случае, не меньше 40 лет - к этому времени приходит второе поколение, а их уже мало смысла удерживать.
Мы также хотим полностью запретить использование DRM-технологий

Смело. Смело,но пока неясно, готовы ли к этому издатели.Утверждение имеет под собой основания, между прочим - DRM вредит пользователям больше,чем даёт пользы издателям. Разработчики так вообще от него проигрывают: им приходится клепать этот самый DRM,а если они это сделают очень хорошо (как Steam или Spore), то покупатели могут обидеться и обратиться к пиратам. Единственное предложение, за которое я за - безоговорочно.
Европа только выиграет и ничего не проиграет от безоговорочного упразднения патентной системы.

Очень,очень смелое заявление.Европа - может быть,и выиграет, а вот как насчет изобретателей? Между прочим,научные открытия даются труднее,чем выпуск музыкального альбома или серии книг,а учёные не получают столько славы.Такое утверждение только сделает их жизнь ещё хуже.Я согласен с тем, что эпидемия есть эпидемия, и если какой-то институт намеренно скрывает спасительные рецепты, это очень гнусно и должно лежать на его совести, но в таком приказном порядке заставлять всех и каждого вскрывать карты,если народу оно надо... Очень, очень дурное предложение.
Соблюдение права на неприкосновенность частной жизни

На первый взгляд,имеет мало общего с названием партии, но это - ещё одна больная тема, особенно в Европе.Человеческая паранойя не знает границ. Если ставить защитные меры всё строже и строже, можно попасть в действительно непритягательный мир. Об этом сказано довольно расплывчато, и не совсем понятно. Мой дом - моя крепость, как только я вышел на улицу - я под колпаком.Это тоже соблюдение неприкосновенности частной жизни, в особом подходе.

Вообще, Пиратская Партия - это интересное движение,но у нас в стране оно пока не началось,да и вряд ли начнётся. Наши законы не настолько жёстки,как в Европе, чтобы им противостоять,а защитники авторского права не столь агрессивны. Файлообменники никто не закрывал, torrents.ru идёт навстречу правообладателям, когда они требуют. Так что остаётся только смотреть,к чему придёт Евросоюз. А потом будем поступать по-своему.

Бороды

Только что посмотрел Кабачок "13 стульев" на телеканале "Ретро". Съёмка 1968г.
Там был Спартак Мишулин,и он участвовал в диалоге про верблюда.
Ёлки-палки,я не думал,что сценки "Аншлага" НАСТОЛЬКО древние. Я думал,они датируются 1980-1990ми годами XX века.
Ну и там было много бородатейших анекдотов из свежайших газет,конечно.

среда, июня 10, 2009

Стены

Одна из моих любимых песен имеет интересную историю.
Эта песня называется Mury ("Стены") и была написана Яцеком Качмарским году в 1978м. Музыку он взял у гимна антифранкистов Испании L'Estaca, автором которого был бард Луис Льях.Это - самая известная песня Яцека, потому что она,в свою очередь, стала гимном польского антикоммунистического союза "Солидарность".

В песне очень много символов, призывов и сил, но интересны вот какие обороты. По сюжету, молодой бард поёт освободительную песнь, и за ним подхватывают массы. Они поют,поют,и поют про то, как упадут стены - а стены только сжимаются и сжимаются. И вот бард смотрит на эти толпы, как они идут, тихо гремя цепями - а стены растут и растут. Вот такой вот невесёлый конец.

Песню быстро подхватили, и действительно выучили наизусть - она стала гимном оппозиции.Её припев стал сигналом "Радио Солидарности", а вот как раз этот пессимистический финал часто оставляли. То,что припев в песне был заключён в кавычки, просто не поняли.Таким образом, песня заканчивалась на том, как толпы народа поют про то,как падают стены, и всё. Предположительно стены падают, народный дух поддержан. Очень много людей из всей песни слышали только припев.

Хуже того: как только песня получила народную славу, её начали коверкать. Это обычное дело - люди же не записывают слова, они просто их помнят. И они могут их помнить не совсем верно. Или им не нравятся слова - так, в Гданьске конец песни вместо "Стены растут,растут, растут..." был оптимистическим - "Стен нет,нет,нет...". В каждом городе был свой вариант "Стены" и люди вкладывали в него то,что хотели.

Качмарский сильно ругался по этому поводу и говорил,что его не понимают и что песню исковеркали наоборот; он даже написал продолжение под названием "Стены '87" и хотел,чтобы все перестали петь,а начали уже что-то делать. Всё без хорошего толку,гимн пел каждый и не понимал никто.

В конце концов, коммунизм в Польше всё-таки пал, лидер "Солидарности" стал президентом...в общем, снова народ счастлив.

Сам я не знаю польского, поэтому читал всё со словарём. Если интересно, об этом написано в польской и английской Википедиях, а также на офиц. сайте Качмарского.

Вот сама песня - исполнение Жана-Мишеля Жарра вместе с Академическим хором Гданьского университета и оркестром Польской Филармонии Балтики на концерте, посвященном 25-летию "Солидарности".
Слова песни (на польском,естественно)
Перевод Андрея Базилевского (очень качественный)

Линии в LaTeX

Иногда хорошо отчеркнуть часть текста длинной горизонтальной линией. Но команда \hline работает только в таблицах. Как нарисовать линию?
Ответ прост, хотя и часто забывается в руководствах на русском. Для этого служит команда \line:
\line(x,y){длина}

Она рисует линию указанной длины по указанному вектору.

Координаты вектора (x,y) есть целые числа по модулю не больше 6. Кроме того, они должны быть взаимно простыми (то есть, не иметь общих делителей кроме ±1). Чаще всего используются (1,0) - это горизонтальная линия, и (0,1) - вертикальная линия.

вторник, июня 09, 2009

User style

Мне надоело оформление юзеров diary.ru. Я понимаю,что отсутствие вкуса - это дело терпимое, но когда их движок даёт полную волю подобным выкрутасам...
Представляю вашему вниманию Уничтожитель Оформления для всего diary.ru и прочих. Пользователям Mozilla Firefox - вставить в плагин Stylish. Пользователям Оперы - можно инсталлировать как user script,хотя вам он и не пригодится-то в общем. Прочим не беспокоиться.
Как только вспомню свой пароль на userstyles.org, выложу туда.
Скрипт не очищенный,но действенный. Шрифт Free Times можете поменять на любой любимый.

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("diary.ru") {
body {
font-family:Free Times !important;
font-style: normal !important;
font-weight: normal !important;
background-color:#FFFFFF !important;
background-image:none !important;
color:#000000 !important;
}

#topNav, #bottomNav {background-color:#FFFFFF !important;}
#topNav a, #bottomNav a {color:#000000 !important;}

.block_design .bordered{background-color:#FFFFFF !important; border-color:#9fadbb !important;}
.header,h1{color:#000000 !important; font-weight: bold !important; background-color:#FFFFFF !important;}
.singlePost .header, .linkssection .header{background-color:#FFFFFF !important;}
.menuSection,#epigraph,.formcontainer,.pageBar, .postContent, .postLinksBackg, .postTitle, .authorName, .communityName, .order_button, .section, .list_box{background-color:#FFFFFF !important;}
#side h1 a, .header a{color:olive !important;}
a, .linkssection .postLinks a{color:darkblue !important;}
.countSecond .postContent, .countSecond .postLinksBackg, .countSecond .postTitle, .countSecond .authorName, .countSecond .communityName, .singlePost.countSecond .header, .linkssection.countSecond .header{background-color:#FFFFFF !important;}
.postDate, .countSecond .postDate{color:#000000 !important; font-size:114%; font-weight: bold; background-color:#FFFFFF !important;}
.top .bordered{background-color:#FFFFFF !important;}

.block_design .countSecond .postContent, .block_design .countSecond .header, .block_design .countSecond .postLinksBackg, .block_design .countSecond .authorName, .block_design .countSecond .communityName{background-color:#FFFFFF;}
.calnd th { background-color:#FFFFFF; color:#000000; font-style: normal;font-weight: bold; text-align:center; }
#my_tags{border-color:purple; background-color:#FFFFFF;}

.htmlbox textarea, input.text, #trspisok textarea, #close_text{
background-color: #FFFFFF !important;
font-family: Free Times !important;
font-style: normal !important;
font-weight: normal !important;
color:#000000 !important;
}

#vkl li a{color: #000000 !important;}
#vkl .z_top{background-color: #FFFFFF !important;}
#vkl .current a, #vkl .current .z_n{background-color:#FFFFFF !important;}
#vkl li a, #vkl .z_n{background-color:#FFFFFF !important;}
#vkl .z_v{background-color: #FFFFFF !important;}

#shsmile{background-color:#FFFFFF !important;}
.SmilePanelElement small { background: #FFFFFF !important; color:#000000 !important;}

}

понедельник, июня 08, 2009

Trust is a weakness

Для получения зачётов соц. инжиниринг - это вещь!
Для экзаменов ещё понадобится немного фантазии и удачи.
Но вот курсовик лучше сдавать честно...

Openoffice.org 3. Траблы с оглавлением

После замены шрифта во всех стилях абзацев с Times New Roman на Free Times (это было решением другой проблемы, когда буквы Й и й не пропечатывались) моё оглавление стало выглядеть так:

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


У меня же было 6 заголовков 1 уровня.
Что делать здесь, думаю,уже понятно. Нажмите на лишний заголовок и уберите его влево. И так со всеми ненужными.

воскресенье, июня 07, 2009

The Terminator 4

Только что вернулся с киносеанса.
Чёртов крутой фильм! Это просто супер. Это самое суперское из суперсуперского, какое только может быть.
В фильме до фига хороших взрывов, перестрелок и лихой сюжет. Первый атомный взрыв идёт практически на пятой минуте. Два главных героя - теперь я верю, что Бэйл способен не только на каменную рожу во весь кадр. Чёрт побери, там даже была фраза "I'll be back" (хотя ТЕПЕРЬ её говорит повзрослевший ГГ) и по-настоящему железный Арни! (молодой до чёрта). Да,и я не заметил что-то психоаналитика...жаль старичка.
Был единственный минус - пафоса выше крыши. Проникновенные речи о духе народа и различиях человека с машиной вот так взяли и сподвигли всё человечество на хорошие поступки.
Достойное продолжение серии, которое не снилось самому Кэмерону. Один из редких случаев, когда не стремятся стянуть воедино все нити, а нормально дописывают детали, о которых раньше не знал. Но крови было меньше чем взрывов.

суббота, июня 06, 2009

Chromium

Опробовал сборку Chromium под Linux.Всё ещё сыро. Чего недостаёт?
  1. Как указано при старте, ещё нет многих поддержек и плагинов. Например, Flash и Java.
  2. Google Gears также не входит в набор.
  3. Ну неужели никому не пришло в голову дать главному окну set_decorated(False)? У него две границы - своя и от менеджера окон. Посмотрю исходники, может и исправлю. Мелочь, а неприятно.
  4. Медленный, по сравнению с Firefox. Впрочем, это также свойственно и офиц. сборке Chrome, особенно на vkontakte.ru (часто сайт висел в браузере). С Оперой вообще не стоит сравнивать, потому что оперу он может обогнать только по быстродействию JS.
В общем и целом - это Chrome, великий и ужасный. Действительно каждая вкладка отдельным процессом и всё круто работает, но до офиц. релиза явно дело дойдёт не скоро. Хотя ночная сборка на удивление стабильна и не вылетает вообще. Ей ещё далеко даже до своего Windows-аналога (которому, в свою очередь, далеко до Opera\Firefox).

UPD: По правой кнопке мыши на панели вкладок можно отключить лишнюю границу окна, так что всё нормально.

четверг, июня 04, 2009

Машина времени

Только что обнаружил следы своей деятельности на http://slon.in.ru/empty.html.
Это приблизительно 1999й год, практически памятник культуры 90-х. Сайт не обновлялся с 2005го, к сожалению - но зато и ныне здравствует.
Господи, подумать только! Я когда-то имел ящик на mail.ru! Они удаляют их через 30 дней после неиспользования...я попробовал зайти, не пустили. Всего 9 лет же прошло!
Вот как полезно искать себя по Гуглу одинокими вечерами...

вторник, июня 02, 2009

Только что закончил читать Inkheart Корнелии Фюнке..эта книга выжала у меня из жизни целый день,я не ожидал ни капельки,что она окажется настолько большой...
Поначалу она мне показалась похожей на повести Лемони Сникета. Ни на что не претендующие рассказики о том,как главные герои кочуют по своим дальним родственникам, и что с этими родственниками случается.
Больше всего меня вывело из себя обилие спойлеров. Перед тем, как вы начинаете читать главу, вы читаете её название и эпиграф - причём оба подобраны так,что можно сразу сказать,о чём глава рассказывает. Я никогда не любил авторов с таким стилем, но здесь он доведён до совершенства. Да, сюжетные повороты часто предугадываются - но ведь я не хочу оправдать свои догадки за 5 страниц, как прочитаю их! Даже если и так, то эти 5 страниц становятся ужасно скучными.
Примерно к середине книги, наконец-то начинается действие. Завязка ужасно скучная. А потом...я не знаю,как к этому относиться.Чёртова смесь всего и под неизвестным градусом. Я ещё не решил, это мне понравилось или нет.
Почему я вообще начал это читать? Не так давно один мой друг цитировал эту книгу...не совсем цитировал,но описывал сюжет, поэтому я и заинтересовался. По повести сняли недавно фильм, хотя я слабо себе его представляю - из такого материала может получиться как хорошая лента, так и никакая, потому что грань слишком тонка. Но сюжет вроде бы хороший.
Вроде бы...Но во всяком случае,теперь я могу спокойно закрыть повесть и ехать домой.

P.S. Тысяча чертей! Фильм - дерьмо. Наверняка его снимали в Новой Зеландии. Я так не плевался со времён "Властелина Колец".

понедельник, июня 01, 2009

Изменение дизайна

Немного изменил дизайн блога - теперь ссылки подчёркиваются :-)

воскресенье, мая 31, 2009

Вчера побывал на концерте кельтской арфы Элизбара. Очень хорошая музыка, очень. Элизбар играл сначала на арфе, потом на броненосце (гитара такая маленькая с корпусом из панциря броненосца), на каком-то инструменте, названия которого я не запомнил (это смесь бубна и той металлической штуки, которая в шарманке...если кто-нибудь из вас хотя бы раз видел шарманку внутри), на гитаре,бубне (хотя нет, он был всё время к ноге прикреплён), флейте и дудочке...вроде ничего не забыл.
Элизбар приехал с Будапешта, он очень хорошо знает русский. Рассказывал он мало,больше играл.Под конец даже пел, но это вышло намного хуже...для какого-нибудь бардовского фестиваля,средненько в общем.Лучше всех удалась арфа,это несомненно.
А после концерта залез в долги и купил сборник фолк-музыки, там один альбом его,второй какого-то Ann'Sannat, всё равно интересно.
И,чёрт побери,я узнал об этом концерте всего лишь за несколько часов до начала!

Постоянные читатели

Архив