Среднеквадратичное приближение функций

Добрый день, читатель. Сегодня я решил написать об одном методе из моей лабораторной по вычислительному практикуму (и заодно получить инвайт на Хабрахабр). С исходным кодом (на C#), блэкджеком и плюшками.

Итак, что требуется? Написать программу, вычисляющую среднеквадратичное приближение функции, заданной таблично, по степенному базису — методом наименьших квадратов. Сразу оговорюсь, что тригонометрический базис я не рассматривал и в этой статье его брать не буду.

Посмотреть статью можно на Хабрахабре.

Ярлык в области уведомлений

Сегодня я всего лишь хочу привлечь внимание к одной проблеме — различающихся способов сворачивания программ в область уведомлений.

Недавно я поспорил с другом из-за µTorrent - я всегда настраиваю его так, чтобы при нажатии кнопки «Свернуть» он сворачивался в область уведомлений и «Закрыть» — закрывался. По мнению друга, логичнее сделать, чтобы после нажатия «Свернуть» программа сворачивалась в панель задач, «Закрыть» — в область уведомлений, а закрывалась при выборе в меню пункта «Выход».

Приведу свою аргументацию, она довольно проста. Когда вы пишете программу, и в ней есть код, который закрывает дочернее окно, то закрывается именно это окно. Если же в коде обозначено, что надо закрыть главное окно, то завершает работу вся программа. И если уже задумано так, что по «Закрыть» закрывается вся программа, то зачем переназначать действие этой кнопки, это ведь путает конечного пользователя. От таких переназначений и вся неразбериха.

Я решил обратиться к официальному источнику, и нашел Руководство по созданию пользовательских интерфейсов для Windows. Внимательно посмотрев, что там написано про область уведомлений, нашел следующее на странице 792:

Minimizing programs to the notification area
Note: Minimizing program windows to the notification area is no longer recommended for Windows 7. Use regular taskbar buttons instead. Your program may support both mechanisms for backward compatibility.

• To reduce taskbar clutter, consider providing the ability to minimize programs to the notification area only if all of the following apply:
- The program can have only a single instance.
- The program is run for an extended period of time.
- The icon shows status.
- The icon can be a notification source.
- Doing so is optional and users must opt in.
• Use the Minimize button on the application’s title bar, not the Close button.

В переводе получается примерно так:

Минимизация программы в область уведомлений
Примечание: минимизация окна программы в область уведомлений больше не рекомендуется для Windows 7. Вместо этого используйте обычные кнопки панели задач. Ваша программа может поддерживать оба механизма для обратной совместимости.

• Для борьбы с засорением панели задач, следует рассмотреть вопрос о предоставлении возможности минимизации программы в область уведомлений, только если выполняются следующие условия:
- Программа может иметь только один экземпляр.
- Программа выполняется в течение длительного периода времени.
- Значок показывает статус.
- Значок может быть источником уведомлений.
- Это не является обязательным и пользователи должны иметь возможность настройки
• Используйте кнопку Свернуть в строке заголовка приложения, а не кнопку Закрыть.

Microsoft даже не рекомендует, а прописывает как должное «Используйте кнопку Свернуть в строке заголовка приложения, а не кнопку Закрыть».

Надеюсь, что в скором времени все разработчики станут придерживаться данного руководства, чтобы не вводить в заблуждение и без того запутавшихся пользователей!

Администрация ответственности не несет

Ужасный выдался денек. А началось все с похода в универмаг.

Погода у нас не лучшая сейчас, поэтому взял с собой зонтик, положил его в пакет. Зашел в магазин, положил в камеру хранения, закрыл и взял ключ от нее с собой. Купил что нужно. Выхожу — опа, а камера-то открыта и в ней оставлен ключ — точно такой же, как у меня и номер там тот же — 67 (я уже говорил, что не люблю цифру 4 — не по Фен-Шую? 6 + 7 = 13, 1 + 3 = 4). Пошел к администрации — несколько минут доказывал, что я ничего не попутал, если бы не было дубликата ключа мог бы и не убедить. Посмотрели видеозапись — действительно, утащила женщина, вполне приличная, лет 50. А что, честный человек. Видно, как она выходит из магазина, прощупывает, что лежит в пакете, сворачивает его и кладет в сумочку.

Но на этом все не закончилось. Из принципа пошел в нашу Доблестную Полицию, прихватив паспорт. Настоял на оформлении дела (лень им это делать), приводили доводы, что у них у самих крали телефоны и ничего они не предпринимали. Ну ладно, по закону им пришлось все оформить.

Но ведь нашли, как ко мне подкопаться — живу не по месту прописки более 90 суток! Заставили подписать бумагу и вписать туда, что оформлю временную регистрацию.

В общем, не самый лучший день в моей жизни.

Доброе дело #0

Добрый день.

Дай, думаю, выложу исходники биржи трафика Вирвин — все равно ведь закрыта. Чего зря пропадать коду, может кому пригодится. Что и делаю сейчас, скачать можно здесь.

Также сообщаю для тех, кто бы хотел защитить свои биржи трафика, но посчитал сервис Эдбака слишком дорогим, что скоро состоится перезапуск и теперь сервис будет работать уже на бесплатной основе.

Удачи и до новых встреч.

P.S. Нашел хорошую партнерку с оплатой за действие (pay per action) — смотреть здесь.

Автозамена ключей Nod32 (запись #4)

Как я уже писал в предыдущей статье, я переписал программу для обновления ключей Nod32 на C#.

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

Итак, индексный файл у меня содержит последний ключ и отдающий этот ключ код:

<?php

$avUserName = "EAV-54794372";
$avPassword = "0 214 224 233 229 240 207 242 57 100 77 173 128 200 44 117 154 49 94 188";
$avExpiried = "2017-02-20";

echo "OK\n".$avUserName."\n".$avPassword."\n".$avExpiried;

?>

И есть файл add.php, в котором содержится код, модифицирующий индексный файл:

<?php

$avUserName = AddSlashes($_POST["username"]);
$avPassword = AddSlashes($_POST["password"]);
$avExpiried = AddSlashes($_POST["expiried"]);

$file = @fopen("index.php", "w");
fwrite($file, "<?php\n\n");
fwrite($file, "\$avUserName = \"".$avUserName."\";\n");
fwrite($file, "\$avPassword = \"".$avPassword."\";\n");
fwrite($file, "\$avExpiried = \"".$avExpiried."\";\n\n");
fwrite($file, "echo \"OK\\n\".\$avUserName.\"\\n\".\$avPassword.\"\\n\".\$avExpiried;\n\n?>");
fclose($file);

?>

В обычном режиме программа просто берет ключ и устанавливает в систему. В случае двойного клика по номеру ключа программа обращается к файлу add.php и передает ему текущие значения ключа на компе, с которого она запущена. Вот собственно и все. Проще, пожалуй, некуда.

Скачать исходный код программы можно здесь.

Переезд сайта

Добрый день!

Сегодня наконец-то переезжаю на виртуальный сервер. По этой причине блог может быть недоступен в ночь с 8 на 9 марта.

Жаль, что модуль Витрины ссылок пока никто не купил, ну да ничего, я уже добавил на пару посещаемых сайтов о DataLife Engine (и работающих конечно же на этой CMS) информацию о возможности за небольшую плату получить очень неплохой модуль (поскорее бы опубликовали). Срочно нужно продать 10-12 его копий, чтобы получить 12$ * 10-12 копий = 144$ ≈ 3600-4200 рублей — чтобы в свою очередь купить нетбук. Так что придется постараться с распространением.

 

09.03.2011 0:33: Переезд полностью завершен.

LinkCase 1.0

Добрый день.

Пару дней назад мне поступил заказ на создание модуля «Витрина ссылок» с интеграцией в CMS DataLife Engine. Однако на следующий день заказчик передумал, тем не менее я решил дописать сей модуль.

Представляю вам «LinkCase 1.0 — Витрина ссылок для DLE». Вот пара скринов его работы:

Более подробное описание можно узнать в магазине Plati.ru. Цена модуля — 12$

Обещал C#? Будет C#

Добрый день. Помните программу для автозамены ключей Nod32? Если нет, посмотрите на 2 поста назад.

Освежили знания? Итак, я переписал ее на C# (заодно изменив и серверную часть). В конце статьи я приложу архив с программой и серверным скриптом. А сейчас хочу рассказать о некоторых тонкостях.

Я уже не помню, делал ли отдельный поток в версии на Delphi, но кажется, что нет. А в новой версии на C# сделал. Создал класс Checker, которому при создании передаются адрес для запроса к серверу, старый ключ и пароль к этому ключу. Таймер, который проверяет наличие новых ключей создает поток таким вот образом:

Checker checker = new Checker(server, username, password);
Thread thread = new Thread(new ThreadStart(checker.Check));
thread.Start();

Ну и собственно весь прикол потока.

Далее немаловажный момент. Я сейчас использую Windows 7 x64. И 4 часа я убил на выяснение того, почему же вся ветка реестра HKEY_LOCAL_MACHINE у меня в программе не читается, пока не оказалось, что 32-битные приложения не могут работать с ней напрямую. Собрав 64-битную версию, я получил то, чего хотел — возможность чтения/записи информации из ветки реестра, в которой НОД хранит информацию о ключе:

RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile", true);
username = (string)regKey.GetValue("Username");

Для автозагрузки проги:

regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
if (regKey != null)
{
  regKey.SetValue("AVActive", Application.ExecutablePath);
}

Ну вот вроде и все с тонкостями. Ниже можно скачать исходники.

Скачать архив

P.S. В этой версии нет необходимости вручную добавлять ключи в базу. Когда серверный скрипт видит, что программа запущена не в первый раз и ключа, который она использует, отсутствует в базе, скрипт добавляет этот ключ в базу и в течение трех часов этот ключ оказывается установленным на все компьютеры, использующие программу.

Переезд, C# и все-все-все

Добрый день, посетитель блога. Рад сообщить об успешном окончании семестра, а также надеюсь что и у тебя дела не хуже.

В феврале мой блог переедет с хостинга на виртуальный сервер (если удастся договриться о MoneyBack с хостинг-компанией — обещают, что деньги забрать можно в любой момент). А пока что он неприлично долго генерируется на стороне сервера.

Изучаю C# — скорее всего в ближайшее время на сайте появятся записи с информацией, что же в нем хорошего и что на нем можно написать — в контексте создания программ (не люблю теорию). А хорошего в нем предостаточно.

Спасибо за внимание, еще увидимся!

Автозамена ключей Nod32 (запись #2)

Как же давно я не писал в блог, просто какой-то ужас. Я уже даже забыл, что собирался завершить цикл постов про автоматическую установку ключей для антивируса Nod32.

Итак, что осталось сделать. А всего лишь программу, которая бы забирала ключи с сервера (отдающий их скрипт уже написан) и устанавливала в систему. Для начала хочу объявить функцию для нормального отображения русского языка при получении страницы:

function RussianToUnicode(S: String): String;
var
  Wrd: Word;
  pW,pR: PWord;
  len: integer;
begin
  pW:=@S[1];
  len:=Length(S);
  SetLength(Result,len);
  pR:=@Result[1];
  while Len<>0 do
  begin
    Wrd:=pW^;
    case Wrd of
      $C0..$DF,$E0..$FF:pR^:=Wrd+50;
      else pR^:=Wrd;
    end;
    inc(pW);
    inc(pR);
    dec(Len);
  end;
end;

Укажем константы и переменные:

const
  serv = 'your-server.com';
  pcid = '75434347623';
var
  can: boolean;
  keynod, hashnod: string;

На форму кинем TButton и TIdHttp. Для TButton в событии OnClick пропишем следующее:

// получаем ключ (ну или хотя бы пытаемся)
try
  if (can) then temp:=RussianToUnicode(idHTTP.get('http://'+server+'/key4nod.php?type=2&pcid='+pcid));
except
  // в случае ошибки - снимаем флажок
  can:=false;
end;
// если нет новых ключей, снимаем флажок
if (temp = 'Нет новых ключей') then can:=false;
if (can) then keynod:=temp;   // запоминаем ключ
// получаем хеш пароля (ну вообще это не хеш, а видимо зашифрованный пароль
// и сохраненный в бинарном виде - главное, что на разных компах этот "хеш"
// не меняется (по крайней мере на проверенных мной трех компах)
try
  if (can) then temp:=RussianToUnicode(idHTTP.get('http://'+server+'/key4nod.php?type=5&pcid='+pcid+'&key='+keynod));
except
  // надоели уже проверки, но что же поделать...
  can:=false;
end;
// бинарный код получили - можно продолжать
if (can) then hashnod:=temp;
if (can) then
begin
  codes:=TStringList.Create;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  i:=0;
  temp:='';
  while Pos(' ', hashnod)>0 do
  begin
    temp:=Copy(hashnod, 1, Pos(' ', hashnod)-1);
    Delete(hashnod, 1, Pos(' ', hashnod));
    Buf[i]:=StrToInt(temp);
    inc(i);
  end;
  // и пытаемся установить ключ в систему (должно быть выключено SelfDefendece)
  try
    Reg.OpenKey('SOFTWARE\ESET\ESET Security\CurrentVersion\Plugins\01000400\Profiles\@My profile', True);
    Reg.WriteString('Username', keynod);
    Reg.WriteBinaryData('Password', Buf, SizeOf(Buf));
    Reg.CloseKey;
  Reg.Free;
  except
    ShowMessage('Ошибка при установке ключа');
  end;
  codes.Destroy;
end;

Ну вот как-то так это и будет. Программа передает серверу id устройства, получает от него ключ в случае наличия такового, получает хеш ключа, формирует его в необходимом для записи в реестр в бинарном виде и затем производит непосредственно запись.

Да, чуть не забыл о самом главном. У антивируса должен быть снять флажок напротив пункта «Self-Defendece» так как иначе он будет защищать себя и не даст заменить свои настройки в реестре.