пятница, 29 мая 2009 г.

Раскладка клавиатуры в Xfce

Что-то в последнее время часто ломалось переключение раскладок. Сначала разработчики xorg, а за ними и Xfce.

Суть в том, что Xfce4-xkb-plugin научился управлять раскладками самостоятельно, а не только отображать текущую.

Итак, алгоритм решения наших проблем:
  1. Xorg чинится просто. Из /etc/X11/xorg.conf убираем все упоминания о клавиатуре и мыши (секции InputDevice). Установить пакет xf86-input-evdev.
  2. Xfce4-xkb-plugin отсутствует winkeys клавиатура для русского языка. Поставим Legasy.
  3. Работать на виндовской клавиатуре с такой раскладкой - садомазохизм. Так что поправим настройки в /usr/share/X11/xkb/symbols/ru. Заменим
partial alphanumeric_keys
xkb_symbols "legacy" {
include "ru(common)"

name[Group1]= "Russia - Legacy";
};
на
partial alphanumeric_keys
xkb_symbols "legacy" {
include "ru(winkeys)"

name[Group1]= "Russia - Legacy";
};

Обновление от 10.07.2009г.

Версия вторая. Исправленная и доработанная.

Ох уж эти интерфейсы...
Оказывается, я создал себе проблемы на пустом месте.

Необходимо просто выбрать из списка "Россия".
Спасибо за комментарий.

четверг, 21 мая 2009 г.

Перенастройка DNS записей домена

После смены тарифного плана провайдер выдал нам новый IP. Пришлось менять DNS запись для нашего домена.

Оставлю тут (забываю постоянно, когда становятся нужны) пару ссылок на полезные ресурсы:
http://tests.nettools.ru/
http://tools-on.net/

Раньше пользовался dnsstuff.com, но теперь они хотят денег...

понедельник, 6 апреля 2009 г.

Linux Advanced Routing & Traffic Control в деле

На работе наконец-то созрели для подключения второго интернет провайдера.

Для упрощения повествования опустим некоторые детали (типа биллинга). На сервере есть три сетевых интерфейса, два из них для выхода в Интернет.
eth0 - локальная сеть.
eth1 - первый провайдер, используется для postfix и httpd.
eth2 - второй провайдер, для доступа пользователей в интернет.

Путь его IP адрес второго соединения IP_eth2, шлюз GWIP_ETH2.

Доступ в интернет организован с помощью NAT и прозрачного Squid следующим образом:
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -o eth0 -j SNAT --to-source IP_eth2

default gw на сервере - это eth1, соответственно squid начинает работать именно через него. Пытался использовать в настройках squid параментр tcp_outgoing_address, но он его игнорировал.

В итоге остановился на таком решении:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1
ip rule add fwmark 1 table saturn.out
ip route add default via GWIP_ETH2 dev eth2 table saturn.out
ip route flush cache
Теперь трафик со squid идёт на нужный интерфейс, но остаются сомнения о верности такого решения.

воскресенье, 11 января 2009 г.

Ещё раз про Mac OS

- Кто-нибудь здесь на маке сидит?
- Я против наркотиков!

Небольшой отчёт о найденном решении для
KALYWAY 10.5.2 Leopard.
Напомню, что в предыдущий раз споткнулся на зацикливании установщика при создании учётных записей.
Решение оказалось не слишком сложным:
  1. Загрузился с установочного DVD.
  2. В служебных программах вызвал утилиту для смены пароля и установил новый пароль для root.
  3. Вызвал терминал и выполнил следующие команды (для проверки диска и установки флага загрузки раздела ОС):
/sbin/fsck_hfs -fy /dev/rdisk0s1
fdisk -e /dev/rdisk0s1
update
f 1
w
q
reboot
После перезагрузки я увидел приглашение для ввода пароля и залогинился под рутом. Немного покопался в настройках системы. Поставил драйвера на принтер и звуковую карту, причём официальные на последнюю не подошли, заработали какие-то открытые...

Фактически целью было установить на обычном PC хакинтош и увидеть рабочий стол в живую. Не более.

Возможно Mac OS и пришлась мне по душе, но я уже освоил Linux, да и отвечает он моим требованиям куда больше, чем ОС от Apple. Да и нет в ней того духа свободы...

В общем моё мнение отображено в эпиграфе к этой публикации.

воскресенье, 21 декабря 2008 г.

Эксперименты с Mac OS

Попытался поставить на свой PC Mac OS X.

1. Leo4All v3 (Mac OS X 10.5.2 Intel & AMD SSE2/SSE3)

Установка прошла, но компьютер зависал при запуске. Графическая оболочка так и не появилась.

2. KALYWAY 10.5.2 Leopard

Установка вновь без проблем. Но при запуске система зацикливается на стадии настройки профиля (Окно Do you already own a Mac?). Найти решение пока не смог.

пятница, 12 декабря 2008 г.

Теория и практика объектно-ориентированного программирования в Delphi

Сессия приближается как всегда стремительно. Решил заняться программированием на Delphi. Поскольку раньше объектно-ориентированным программированием (ООП) в Pascal не занимался, пришлось немного напрягать мозги.

Итак, цель была поставлена следующая:
Разработать диалоговую программу как Windows-приложение для работы с объектами заданного типа. Программа должна содержать меню и выполнять следующие операции: создание объектов двух заданных классов и сохранение их в списке TList, просмотр и редактирование объектов, сохранение объектов в потоке TList и загрузка их из потока.

Ниже приведён кратенький рассказик о сохранении и чтении информации в этой программе.

1. Основная форма приложения Form1. На ней были размещены компонент TMainMenu, два списка TListBox для просмотра объектов (для каждого типа объектов свой список), две кнопки TButton сортировки списка TList по разным критериям, а также компоненты стандартных диалогов TOpenDialog и TSaveDialog.
2. Создан модуль Unit2, содержащий код двух пользовательских классов и один абстрактный класс.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs;
type
TOrganization = class(TComponent)
Private
Name: String;
Year_founded: Integer;
Capital: Real;
Protected
Public
Constructor Create(Collection: TComponent); override;
Procedure Show(); virtual; abstract;
Published
Property MyName: String read Name write Name;
Property MyYear_founded: Integer read Year_founded write Year_founded;
Property MyCapital: Real read Capital write Capital;
end;

TInsurance = class(TOrganization)
Private
Clients: Integer;
Protected
Public
Constructor Create(nname: string; ncapital: real; nyear: integer; nclients: Integer);
Procedure Show(); override;
Published
Property MyClients: Integer read Clients write Clients;
end;

TShipbuilding = class(TOrganization)
Private
Vessel: Integer;
Protected
Public
Constructor Create(nname: string; ncapital: real; nyear: integer; nvessel: Integer);
Procedure Show(); override;
Published
Property MyVessel: Integer read Vessel write Vessel;
end;

implementation
uses Unit5, Unit6, Unit7;

Constructor TOrganization.Create;
begin
end;

Constructor TInsurance.Create(nname: string; ncapital: Real; nyear: integer; nclients: Integer);
begin
Name:=nname;
Year_founded:=nyear;
Capital:=ncapital;
Clients:=nclients;
end;

Constructor TShipbuilding.Create(nname: string; ncapital: Real; nyear: integer; nvessel: Integer);
begin
Name:=nname;
Year_founded:=nyear;
Capital:=ncapital;
Vessel:=nvessel;
end;

Procedure TInsurance.Show();
begin
Form5.Edit1.Text:=Name;
Form5.Edit2.Text:=inttostr(round(Capital));
Form5.Edit3.Text:=inttostr(Year_founded);
Form5.Edit4.Text:=inttostr(Clients);
Form7.Visible:=True;
Form5.Visible:=True;
end;

Procedure TShipbuilding.Show();
begin
Form6.Edit1.Text:=Name;
Form6.Edit2.Text:=inttostr(round(Capital));
Form6.Edit3.Text:=inttostr(Year_founded);
Form6.Edit4.Text:=inttostr(Vessel);
Form7.Visible:=True;
Form6.Visible:=True;
end;

initialization
RegisterClasses([TComponent, TOrganization, TInsurance, TShipbuilding]);
end.
Важно не упустить следующие вещи:
  1. Абстрактный класс должен быть наследником TComponent.
  2. Все свойства (Property) класса, которые будет необходимо сохранить в файл, нужно объявлять в Published части.
  3. Все классы нужно зарегистрировать с помощью RegisterClasses.
3. Формы для ввода новых элементов. Form3 и Form4 создаются аналогично друг другу, различие только в пользовательском классе.
Код для кнопок выглядит следующим образом:
procedure TForm3.Button1Click(Sender: TObject);
Var
NewInsurance: TInsurance;
begin
if Edit4.Text='' then Edit4.SetFocus;
if Edit3.Text='' then Edit3.SetFocus;
if Edit2.Text='' then Edit2.SetFocus;
if Edit1.Text='' then Edit1.SetFocus;

if ((Edit1.Text<>'') and(Edit2.Text<>'') and (Edit3.Text<>'') and (Edit4.Text<>'')) then
Begin
NewInsurance:=TInsurance.Create(Edit1.Text,strtofloat(Edit2.Text), strtoint(Edit3.Text), strtoint(Edit4.Text));
MyArray.Add(NewInsurance);
Form1.ListBox1.Items.Add(NewInsurance.MyName);
Modified:=true;
ModalResult:= mrOK;
End;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
Form3.Close;
end;
4. Итак, самое интересное. Функция записи в файл реализована на TStream с использованием функции WriteComponent. Вызывается из соответствующего пункта меню на Form1.
procedure TForm1.N2Click(Sender: TObject);
var
FileStream: TStream;
I: Integer;
MySave: TOrganization;
begin
if not Modified then exit;
SaveDialog1:=TSaveDialog.Create(self);
SaveDialog1.Filter:='dat';
SaveDialog1.DefaultExt:='dat';
if SaveDialog1.Execute then
Begin
FileStream:=TFileStream.Create(SaveDialog1.FileName, fmCreate);
for I:=0 to MyArray.Count-1 do
Begin
MySave:=TOrganization(MyArray.Items[I]);
FileStream.WriteComponent(MySave as TOrganization);
End;
FileStream.Free;
end;
Modified:=false;
End;
5. Функция Чтения из файла. Здесь на нас трудится функция ReadComponent.
procedure TForm1.N3Click(Sender: TObject);
var
FileStream: TStream;
Temp: TComponent;
MyLoad: TOrganization;
begin
OpenDialog1:=TOpenDialog.Create(self);
OpenDialog1.Filter:='dat';
OpenDialog1.DefaultExt:='dat';
if OpenDialog1.Execute then
Begin
//Очистка
MyArray.Clear;
ListBox1.Clear;
ListBox2.Clear;
//Сама загрузка
FileStream:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
while FileStream.Position
begin
MyLoad:=TOrganization.create(self);
MyLoad:=TOrganization(FileStream.ReadComponent(nil));
MyArray.Add(MyLoad);
if MyLoad is TInsurance then ListBox1.Items.add(MyLoad.MyName);
if MyLoad is TShipbuilding then ListBox2.Items.Add(MyLoad.MyName);
end;
Modified:=false;
FileStream.Free;
End;
end;
Прошу прощения, что код программы не полон и отсутствуют толковые комментарии. Возможно подобная инструкция кому-нибудь пригодится :)

среда, 3 декабря 2008 г.

"Домашний" сервер и локальная сеть

В начале этого месяца вновь сменил интернет провайдера и подключил мегабитный анлим.

В своей маленькой домашней сети раздаю интернет с помощью отдельного компьютера, который специально собирал для этого. Состоит "домашний" сервер из следующих компонентов:
  • Материнская плата Intel на 945 чипсете,
  • Процессор Intel Celeron 420 с частотой 1.60ГГц,
  • 1ГБ оперативной памяти,
  • 500ГБ жёсткий диск от Samsung (стрекочет довольно-таки громко),
  • Дополнительная сетевая карта от D-Link (для подключения модема провайдера),
  • Симпатичный чёрного корпуса.
Кто-то может начать возмущаться и спрашивать почему я не использую компьютер уровня Pentium I или II, ведь его ресурсов должно хватить. Но помимо функций NAT и защиты локальной сети firewall'ом, на этот компьютер установлена программа для закачки и раздачи torrent файлов. Я использую для этой цели Torrentflux, программа меня устраивает и ни разу не подводила. Из минусов могу назвать только высокие требования к ресурсам и низкую скорость проверки файлов.

На сервере недавно установил Archlinux вместо Debian, причём случайно поставил 64 битную версию. Настроил так, что при старте подымается pppoe соединение, устанавливаются правила iptables, запускается web сервер (использую lighttp вместе с FASTCgi), сервер баз данных mysql, samba для обеспечения доступа к скаченным файлам с других компьютеров, а также sshd, чтобы иметь возможность управлять компьютером с домашнего компьютера или с работы.

Особых проблем с установкой и настройкой сервера не возникло, тем более на wiki.archlinux.org можно найти инструкции по установке и настройке этих программ.