Еще одна коллекция Flash-игр

Все перекодировано в экзешники, совместимо со всеми Windows от XP до 10.

2 — надо спасать милых шарообразных существ от попадания в кислоту и другие неприятности
8_figur — надо расположить 8 шахматных фигур, чтоб они не стояли на одной прямой или диагонали
bobry_i_futbol — Бобры и футбол
bubble — надо порвести мыльный пузырь по лабиринту
CAT_bowling — боулинг, вместо кеглей коты
cat_kill — стреляем котами (аналог классических «Пингвинов», только с котами)
catjump — аналог динозаврика Google, только с котом
Crazy_Race — гоночный симулятор
cubshoot3 — еще один аналог «Пингвинов», но я не понял, как играть
dead_morozzz — Пьяный Санта
dead_morozzz2 — Пьяный Санта 2
deathjunior3 — ученик Смерти
e-states — Захвати все США (мини-стратегия)
headspace — леталка, надо отбиваться от НЛО
heliattak3 — простенький платформер
hovercraftgame — лабиринт, аналог мыльного пузыря
Immigrant — вы перешли мексиканскую границу, надо свалить от ментов!
lesnik [НЕПОЛИТКОРРЕКТНО] — мочи пидорасов, иначе выебут!
Missile_strike — надо защищать базу от метеоритов
muravji — мочи тараканов, иначе жильцы разбегутся!
nu_pogodi — симулятор игры «Ну, погоди»
Opol4enezIraka — симулятор чмобика
Orbox — головоломка
Panic — симулятор пользователя ПК
pong — Пинг-понг
security — очередной лабиринт, избегайте камер наблюдения
skakalka — симулятор скакалки, садистский и неполиткорректный (можно расчленить негра)
Smehun — логическая игра, надо не взять последний шарик.
Snezhki — замочи снежками российских звезд, политкорректная игра
Strelbishe
xiaoxiao6
xiaoxiao8
xiaoxiao9 — файтинг рисованных человечков
yozh — платформер, играем за ежика
zamok — классический «расстрел замка», есть возможность играть вдвоем
zmeyka — Змейка, почти как на Nokia 3310
zmeyka2 — еще один вариант Змейки

Скачать с Mega.nz

Lazarus: Crt, WinCrt, русский язык и нажатие клавиши в консоли.

Понадобилось сделать что-то типа такого:

Файл уже существует. Заменить? [Y/N]

Вспомнил, что в Турбопаскале была функция ReadKey из модуля Crt, а вдруг и во FreePascal есть?

Есть, но модуль Crt делает глюк русскому языку:

program TestCrt;
uses Crt;
var Ch:char;
begin
  WriteLn('Нажмите любую клавишу...');
  Ch:=ReadKey;
end.

Ладно, пробуем заменить Crt на WinCrt.

Глюк с русским языком пропал, но функция ReadKey на нажатие клавиш не реагирует, да пиздец, еб твою мать!

В общем, долго плевался, реализовал через TKeyEvent из модуля Keyboard:

uses SysUtils,Keyboard;

function Ask(FilePath:UnicodeString):boolean;
var K: TKeyEvent;
    KS:String;
begin
    WriteLn ('File ', FilePath, ' is exists! Replace file? [Y/N]');
    InitKeyBoard;
   while true do begin
      K:=GetKeyEvent;
      K:=TranslateKeyEvent(K);
      KS:=KeyEventToString(K);

      if (KS='Y') or (KS='y') then begin DoneKeyBoard; exit(true); end;
      if (KS='N') or (KS='n') then begin DoneKeyBoard; exit(false); end;
   end;

  DoneKeyBoard;
  exit(false);
end;


Исходник на PasteBin

Lazarus, сортировка TStringList.

Преамбула

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

Тестовые списки

Для начала сформируем тестовые списки, для русского и английского языков. Там код тривиален, потому не буду загружать заметку, ссылки на PasteBin:

Тестовый список для английского языка
Тестовый список для русского языка

Заодно уж и выведем списки в их изначальном виде:

Стандартная сортировка

Она же единственная из коробки, является стандартной сортировкой по возрастанию, т.е. список сортируется от меньшего к большему, а об алгоритме будет ниже. Вызов функции простой:

lstTest.Sort;

Пробуем. Выводим список на экран:

WriteLn('Сортировка по возрастанию (по-умолчанию, логическая):');
i:=0;
while i < lstTest.Count do begin
WriteLn(lstTest[i]);
inc(i);
end;

Writeln(); WriteLn('Press Enter...'); ReadLn();

Результат:


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

Стандартный алгоритм сравнения строк во freepascal

Алгоритм:

1. Строки сравниваются посимвольно. Например, в словах parrot и puppy первые символы (p и p) равны, а далее a меньше u, т.е u в кодовой таблице находится ниже, чем a.
2. На этом сравнение прекращается, строка puppy больше чем parrot.
3. Если начальные символы строк совпадают, то в дело вступает длина, чем строка длиннее, тем она больше, поэтому, зависимая от центра Каталония, все еще больше, чем кот, который гуляет сам по себе:

program test;
var
  S1:string;
  S2:string;

begin
  S1:='cat';
  S2:='catalonia';
  if S1 < S2 then Writeln ('S1 (',S1,') < S2 (',S2,')' );
  if S1 = S2 then Writeln ('S1 (',S1,') = S2 (',S2,')' );
  if S1 > S2 then Writeln ('S1 (',S1,') > S2 (',S2,')' );
  Readln();
end.

Вывод:

S1 (cat) < S2 (catalonia)

Что, конечно, печально, потому что кот свободнее Каталонии, и явно больше в этом смысле.

Пользовательские функции сортировки

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

Для этого надо установить пользовательскую функцию сортировки, таким вот образом:

lstTest.CustomSort(@MySort);

где MySort — имя вашей функции сортировки. Естественно, она должна быть заранее создана, чтобы все откомпилировалось и заработало.

Не забудьте про символ @ перед именем функции, в Delphi не надо было его указывать, компилятор сам знал, где вместо имени функции вставить ссылку на ее адрес, в freepascal это надо указывать явно.

Формат функции следующий:

MySort(List: TStringList; Index1, Index2: Integer): Integer;

Т.е. на входе нужна переменная типа TStringList и две переменные типа Integer, для индексов строк в списке, функция должна возвращать значение типа Integer:

1 — Если строка Index1 > Index2
0 — Если строки равны
-1 — Если строка Index1 < Index2

Конечно, по мнению пользовательского алгоритма сортировки. Например, можем повторить стандартный метод сортировки:

function SortByAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if List[Index1]>List[Index2] then
  begin
    Result := 1;
    Exit;
  end;
  if List[Index1]=List[Index2]
    then Result := 0
    else Result := -1;
end;

Внезапно, починился русский язкы 🙂

Сортировка по убыванию

function SortByDesc(List: TStringList; Index1, Index2: Integer): Integer;
  begin
    if List[Index1]<List[Index2] then
    begin
      Result := 1;
      Exit;
    end;
    if List[Index1]=List[Index2]
      then Result := 0
      else Result := -1;
  end;

Вообще просто, достаточно заменить знак > на < в операторе сравнения.

Другие пользовательские сортировки

Возможности пользовательских сортировок не ограничены практически ничем. Покажу, как обычно, самое простое — сортировка строк по длине.

Сортировка по возрастанию:

function SortByLenAsc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if Length(List[Index1])>Length(List[Index2]) then
  begin
    Result := 1;
    Exit;
  end;
  if Length(List[Index1])=Length(List[Index2])
    then Result := 0
    else Result := -1;
end;

Т.е. просто применяем функцию Length в операторе сравнения:

Length(List[Index1])

Тот же вариант, но по убыванию:

function SortByLenDesc(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if Length(List[Index1])<Length(List[Index2]) then
  begin
    Result := 1;
    Exit;
  end;
  if Length(List[Index1])=Length(List[Index2])
    then Result := 0
    else Result := -1;
end;

Тестовые программы

Пример для английского языка на GitHub
Пример для русского языка на GitHub

По мотивам

Обсуждения на Исходниках, но более подробнее и лучше у меня.

Lazarus. Поддержка Unicode в консоли Windows.

Продолжаем бодаться с русским языком в консоли (копия).

Ну не может же быть так, что виндовая консоль и Unicode (UTF-8) не поддерживает, подумал я. У меня и функции, которые, собственно, в программе нужны, UTF8 требуют, и с русским языком, если исходник не в UTF-8 работают криво, и в документации по Lazarus написано, что он поддерживает вывод на консоль в UTF-8, и в документации по винде написано, что она тоже нежно любит UTF-8, хотя может и в OEM(которая CP866).

Хинт оказался небольшим, неочевидным, и вообще был обнаружен чисто случайно, кодировку исходника надо поменять на на CP866, как я делал по ссылке выше, а на UTF-8 с BOM!

И нигде в документации (не в виндовой, не в Лазарувской) об этом не сказано, ну или закопано в такие бездны Варпа, что не докопался.

До (исходник в UTF-8):

После (исходник в UTF-8 с BOM):

program Project1;

begin
  WrileLn('Какая-то фигня с русскими буквами');
  WrileLn('А, уже не фигня');
  Readln();
end.

Lazarus, встроенный парсер командной строки.

Преамбула

В Lazarus есть довольно неплохой парсер командной строки, который (почти) работает из коробки.

Для его использования нужно создать приложение на базе класса TCustomApplication, который обладает таким функционалом. Готовый шаблон проекта имеется в комплекте. Проект —> Создать проект… и в появившемся окне выбрать тип проекта Консольное приложение:

Можно ввести параметры для генерации кода:

Основной код приложения размещается в процедуре DoRun, например, в procedure TMyApplication.DoRun;

Решил расширить пример с поиском файла по маске (копия), заодно поэкспериментировать с парсером командной строки.

Параметры будут такие:

Использование: smallfinder.exe <аргументы>
-h - эта помощь
-m <маска> - маска файла для поиска. Обязательный параметр
-d <директория> - Начальняя директория, если параметр не указан, используется текущая.
-s - включить в поиск подкаталоги

Анализ параметров командной строки

Примечание: весь код в процедуре TSmallfinder.DoRun.

Почему-то способ проверки из документации, случая, когда параметров нет вообще, у меня сработал криво, так что пришлось вспоминать более старый:

// check if no parameters - способ из документации нихуя не сработал

if ParamCount=0 then begin
	WriteHelp;
	Terminate;
	Exit;
end;

Но далее все вроде бы пошло как надо, единственное, что параметры регистрозависимые (т.е. -d и -D программа воспринимает как разные параметры), пока не стал с этим разбираться, может после, если сильно надо будет. Длинные имена параметров не использовал, только короткие.

Вывод помощи:

//help
if HasOption('h', '') then begin
	WriteHelp;
	Terminate;
	Exit;
end;

Процедуру WriteHelp можно создать при создании нового проекта, а потом только запомнить, примерно так:

procedure TSmallfinder.WriteHelp;
begin
  writeln('Usage: ',ExtractFileName(ExeName), ' <arguments>');
  WriteLn('-h - this help');
  WriteLn('-m <mask> - file mask for search. Parameter must be!');
  WriteLn('-d <directory> - start directory. If not, use current dir.');
  WriteLn('-s - include subdirs');
end;

Маска файла:

//mask
if HasOption('m','') then begin
	Mask:=GetOptionValue('m','');
	if Mask = '' then begin
		WriteHelp;
		Terminate;
		Exit;
	end;
end;

Стартовый каталог:

//start directory
StartDir:=GetOptionValue('d','');
if StartDir='' then begin
	StartDir:=GetCurrentDir();
end;

Искать в подкаталогах:

//Include subdirs
IncludeSubdirs:=HasOption('s','');

Ну и сам процесс поиска, до кучи:

WriteLn('Start directory: ',StartDir);
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, StartDir, Mask, IncludeSubdirs);
i:=0;
while i < lstFiles.Count do begin
	WriteLn(lstFiles[i]);
	inc(i);
end;
lstFiles.Free();

Естественно, все нужные переменные перечисляем в секции var процедуры TSmallfinder.DoRun

var
   Mask, StartDir:string;
   IncludeSubdirs:boolean;
   i:LongInt;
   lstFiles:TStringList;

Примеры работы

smallfinder.exe -m *.exe -d C:\Windows

smallfinder.exe -m *.exe -d C:\Windows -s

smallfinder.exe -m *.exe

Ссылки

Мануал по обработке параметров командной строки
Пример целиком на GitHub

Lazarus: Транслит строки (в консоли)

1. Понадобятся модули regexpr и fgl:

uses regexpr, fgl;

regexpr нужен для небольшой оптимизации, a fgl — для создания аналога словаря (Dictionary).

2. Создаем тип для будущего словаря:

type
  TDictTrans=class(specialize TFPGMap<string, string>);

Документация по TFPGMap

3. Сделаем функцию для транслитерации, с одним параметром, входной строкой с русскими буквами:

function Translit(Str:string):string;
//тут будет код
end;

4. Заводим внутренние переменные функции:

var Regex:TRegExpr;
Dict:TDictTrans;
Ch,oStr,oTrans:string;
I:LongInt;

Regex — экземпляр класса для работы с регулярным выражением.
Dict — словарь для транслитерации.
Ch — транслитерируемый символ
oStr — выходная строка
oTrans — сюда будем возвращать результат транслита отдельного символа.
I — счетчик цикла, в котором будем анализировать строку.

Небольшая оптимизация

Создаем новое регулярное выражение для кириллицы (и пробела) и проверяем входную строку на наличие русских букв. Если их нет — возвращаем исходную строку и выходим из функции:

Regex:=TRegExpr.Create;
Regex.Expression:='[А-Я]|[а-я]|\s';
if not Regex.Exec(Str) then begin
   exit(Str);
end;

5. Заполняем словарь (транслит взят из старого армейского учебника времен СССР, можете сделать свой):

Dict:=TDictTrans.Create;
Dict.Add(' ','_');
Dict.Add('А','A'); Dict.Add('а','a');
...
Dict.Add('Я','JA'); Dict.Add('я','ja');

Словарь целиком на PasteBin

6. Инициализируем переменные, используемые в цикле:

Ch:=''; oStr:='';

7. Заводим цикл for, нумерация символов в строке идет с 1, длина строки получается функцией Length(Str):

for I:=1 to Length(Str) do begin
...
end;

8. В цикле получаем символ из строки:

Ch:=Copy(Str,I,1);

9. Пробуем получить данные из словаря по ключу, которым является русская буква. Если это удалось, присоединяем результат транслита к выходной строке, если нет — это не русская буква, присоединяем исходный символ к выходной строке:

if Dict.TryGetData(Ch, oTrans) then begin
	oStr:=oStr+oTrans; //russkaya bukva - transliteriruem
end
else begin
	oStr:=oStr+Ch; //nerusskaya bukva, ostavlaem v pokoe
end;

10. Освобождаем память словаря после цикла:

Dict.Free;

11. Возвращаем результат работы функции:

exit(oStr);

Функция целиком на PasteBin

12. Код основной программы:

var
    strInput, strOutput:string;
...
begin
  Write('Input string:'); ReadLn(strInput);
  strOutput:=Translit(strInput);
  WriteLn(strOutput);
  WriteLn('Press Enter...'); ReadLn();
end.

Для совместимости с русским языком в консоли необходимо добавить директивы компилятора, иначе словарь будет работать неправильно:

program translit;
{$mode objfpc} {H+}
{$codepage CP866}
...

$mode objfpc
H+ — чтоб строки по умолчанию не были ShortString‘ами
$codepage CP866 — установка кодовой страницы.

Документация по работе со строками

Проверка

Исходник примера на GitHub

Lazarus, поддержка русских букв в консоли (Windows 7)

Из коробки русские буквы в консоли поддерживаются через жопу:

Это потому что Lazarus по умолчанию создает файл в UTF8, а консоль Windows 7 поддерживает CP 866 (кодировку DOS/OEM), достаточно перекодировать файл:

1. Щелкаем по пустому месту в исходнике в редакторе.

2. Выбираем Параметры файла —> Кодировка

3. В выпадающем списке выбираем CP866:

4. В появившемся окне нажимаем кнопку Изменить файл:

5. ФАНФАРЫ!

Источник
Тестовый пример на GitHub

Lazarus, регулярные выражения.

Из коробки доступен мощный класс TRegExpr, вполне себе работает с регулярками. Сожрал даже C#-овскую, без изменения синтаксиса вообще. Пример регулярки для обнаружения русских букв:

program regexptest;
uses regexpr;
var  Regex:TRegExpr;

begin
     Regex:=TRegExpr.Create;
     Regex.Expression:='[а-я]|\s';
     Writeln(Regex.Exec('АБВГ'));
     Writeln(Regex.Exec('ABCD'));
     ReadLn();
end.

Документация
Пример на Киберфоруме

Этот пример на GitHub

UPD: Более лучшая регулярка для поиска кириллицы (и пробела).

[А-Я]|[а-я]|\s

Первая ([а-я]|\s) нормально работает, если формат файла исходника UTF-8, и текст в UTF-8, а вот с консолью в Win7 она работает только на строчных буквах, на заглавных не работает. А консоль требует CP866.

О других косяках кириллицы в консоли — в следующих выпусках нашего журнала.

Lazarus, список каталогов с подкаталогами

Плохо, что по маске не умеет каталоги искать. А в остальном все просто.

program alldirs;
uses Classes, SysUtils, FileUtil;
var
   lstDirs:TStringList;
   i: Integer;
begin
     lstDirs := TStringList.Create;
     FindAllDirectories(lstDirs,'C:\Windows',true);
     i:=0;
     while i < lstDirs.Count do begin
       WriteLn(lstDirs[i]);
       inc(i);
     end;
     WriteLn ('Found: ',lstDirs.Count);
     WriteLn ('Press Enter');
     lstDirs.Free();
     ReadLn();
end.

Ссылка на GitHub

Поигрался с Freepascal/Lazarus

Больше по служебной необходимости, и воле случая, чем по собственному желанию.
Инет отсутствовал, компы нормальные все заболели, а утилиту писать надо. Ще було, на том и писали.

Поиск файла

Наконец-то нормальный поиск файла, где маска файла работает как надо (как в DOS) и не принимает, например, расширение *.htm и *.html за одно и то же. C# мне не удалось этому очевидному решению научить, конечно, можно потом по выборке прогнать регулярное выражение, но оно тоже плохо срабатывает, упускает некоторые случаи, например, если имя файла начинается с расширения (т.е. на файл .html оно не сработает):

В Lazarus все работает из коробки:

program testfind;
uses Classes, SysUtils, FileUtil;
var
   lstFiles:TStringList;
   i: Integer;
begin
     lstFiles := TStringList.Create;
     FindAllFiles(lstFiles, 'C:\Temp\Test', '*.htm', true);
     i:=0;
     while i < lstFiles.Count do begin
       WriteLn(lstFiles[i]);
       inc(i);
     end;
     WriteLn ('Found: ',lstFiles.Count);
     WriteLn ('Press Enter');
     ReadLn();
     lstFiles.Free();
end.

Пример и каталог с тестовыми файлами на GitHub

UPD: Ссылка на мануал

Небольшая коллекция игр на Flash

cutiequake — Битва с яйцами.
egg_fighter — Битва с яйцами, еще одна версия.
gopher_war — Убей суслика
NURSING — Будни работника соцзащиты, замочи пенсирнеров, пока они не замочили тебя.
office_war — кидаемся в офисе друг в друга документами
Spearbritney — Надо убить Бритни Спирс, проткнув ее.
xiaoxiao9 — файтинг
L4 — Маньяк-инопланетянин жжет людей через лупу, как муравьев.

Скачать с Mega.NZ (SWF+EXE) RAR

ПИЗДИ!

Как бы ты не прочел этот девиз, дорогой друг, это мой основополагающий принцип борьбы с СИСТЕМОЙ. И так по порядку…

         1. Скажи честно, и у тебя появлялись мысли о том, что неплохо было бы иметь кучу баблоса, тачку крутую, снимать красивых телок и нюхать качественный кокс, а не клей «Момент»? Хотелось тепленького уютненького гнездышка, ненапряжной денежной работы, регулярного оттяга на Гавайях? Были? И у меня бывают. И тогда я беру и начинаю пиздить в себе обывателя, того кому холодильник или новый телевизор важнее человеческого самоуважения. Посмотри на окружающих нас людей, уважают ли они себя, довольны ли они? Большинство нет. Им всем чего-то нехватает. Они все нигилисты, но их нигилизм обывательский, он характеризуется фразой: «Все плохо, но что я могу сделать?». Посмотри на поколение 45-60 летних, наполняющие КПРФ’ные митинги, это поколение просравшее свои идеалы. Хотя были ли они у них? Те кто моложе, въебывают из-зо дня в день ради копеек, надеясь на повышение зарплат, окладов и премий в далеком будущем, провозглашаемое властью, надеясь на улучшение своего быта, своей каморки (ты кстати заметил, что в наших квартирах жить нельзя, там можно только ночевать), если она есть. Власть регулярно покупает недовольные слои населения очередными подачками, как собакам бросает объедки. То пенсию повысит, то устроит показательный суд над олигархом, то боевика какого-то подстрелит… И все терпят, ворчат, ругаются, но терпят. Как ослы, которым обещали давать больше сена, если они будут еще усерднее и терпеливее въебывать. И пиздить надо такое животное в себе, пока досмерти не запиздишь.
         2. После Ф. Энгельса стало модным повторять: «Труд сделал из обезьяны человека». Может быть в ту древнюю эпоху да, но для нашего времени это утверждение откровенный пиздеж. Сейчас труд является средством подавления, отвода энергии в безопасное и самое главное доходное для хозяев русло. SWAROMIR писал как-то о том, что человек вынужденный трудиться приносит себя в жертву. Жертвуя своим временем, удовольствиями, своей жизнью. А что получает в итоге? Гавно на блюдечке. Я работаю уже 5 лет, и понял уже давно, что я готов меньше зарабатывать, если буду меньше работать, если время моего труда сократиться. Собственно я сейчас так и живу. Но ты скажешь мне, а как же кормить себя, семью и т.д. Пизди! СИСТЕМА в лице государства наживается на тебе, наживайся и ты на ней. Сейчас с распространением Интернета это не особенно трудно. Я лично взламывая Интернет-магазины и сайты зарабатываю значительно больше, чем получаю на официальной работе. И все это в свое удовольствие.
         3. Особенностью всякой СИСТЕМЫ является ее бессистемность, хаотичность. Посмотри на нашу власть, хуй знаешь что от нее ожидать. Древние говорили: «Мысль изреченная — есть ложь». Позже Алистер Кроули изрек: «Изначальная ложь значительно ближе к истине». Поэтому пизди! Пизди там, где этого меньше всего ждут, ибо там где пиздежь предполагается, твои слова не дойдут до слушателей, и ты получишь статус пиздобола или кидалы. Пиздеть своим товарищам или подельникам (можно было бы сказать коллегам по бизнесу, но каков наш бизнес ты знаешь) это долбоебство. Пиздежь должен быть умным, тогда СИСТЕМА его проглотит и примет за правду. Приведу пример: мой знакомый работал в одном вузе, и у них проходила довольно пафосная конференция с участием приглашенных гостей из власти. Можно было бы сорвать это мероприятие, закидать яйцами и помидорами гостей. Мы сделали лучше, мы написали несколько совершенно долбоебских статей от имени гондурасских профессоров, содержанием которых был полный бред о скором наступлении мировой революции. Благодаря этим статьям и заявкам конференцию сделали международной. Отправили эти статьи с подставных почтовых ящиков, и через неделю уже видели сборники выпущенные в Москве с этой поебенью, плюс на конференции все эти пофостные морды ждали «видных» гондурасских ученых с пленарными докладами. Руководство вуза потом в письмах очень сожалело о том, что ученые несмогли добраться до России, из-за вылазок гондурасских партизан-наркоторговцев, и с нетерпением ждут видных гостей на следующую конференцию…
         Может быть не совсем хороший пример пиздежа, но мы его провернули недавно.

         Так что лозунгом моим является: «Пизди СИСТЕМУ, пизди у СИСТЕМЫ, пизди СИСТЕМЕ! Это борьба без конца. До самой смерти, ибо смерть и будет ПОБЕДОЙ!

         ДА, СМЕРТЬ!

Durito

В рамках сохранения HTML-пямятников истории и культуры, 2004

Армия: идти или не идти. Дедовщина.

          … Не буду подробно останавливаться на понятии «дедовщина», наверное все (или большинство) с этим словом знакомы, возможно, кто-то даже ощутил на себе все ее прелести; лучше поведаю, как служилось мне лично и то, что я видел своими глазами. В некоторых местах этого повествования каждый из читающих волен мне не верить, дело, как говорится, хозяйское, но с другой стороны — не сочинял же я все это.
         Итак. Начну с того места, как благополучно призвавшись и миновав на поезде Петрозаводск и Питер, мы попали в Ковров. Город славится оружейным заводом имени Дегтярева, мотоциклами «Ковровец» и обилием учебных частей различных родов войск.
         Приехали естественно в «гражданке», которую нам, по приезду в пункт распределения, что располагается в воинской части № N, посоветовали снять, зашить в наволочки и, подписав, отправить на родину маме с папой. Стоит ли говорить, что ни одна из посылок до пункта назначения не дошла, если точнее они оттуда не отправлялись вовсе. Вот что сказал мне один служащий из «молодых», увидевший меня за складыванием одежды, цитирую: «Не е..и себе мозги! Лучше сразу в общую кучу кинь. Они, че получше себе берут, а остальное сжигают. Иди лучше форму получи!»
         Переодев, начали осматривать личные вещи. Оставляли следующее: ручки, тетради, конверты (если были подписаны), дешевые станки для бритья и пр. туалетные принадлежности. Все. Деньги, сигареты с фильтром, зажигалки, хорошие туалетные принадлежности либо меняли на плохие, либо изымали совсем. Цепочки (подарки любимых девушек), конечно же нам бы не пригодились, поэтому их вежливо просили оставить тем, «кому домой».
         «Приятно удивила» столовая, точнее ее персонал. Такая картина: новобранец, которого еще не успели обрить (наголо) подходит с подносом к раздаче, откуда слышится такая речь: «А тебя «душара», я зажигалкой побрею, сука!». Признаться, после таких слов я понял, куда я попал.
Сами полгода в «учебке» прошли гладко, остро выраженной «дедовщины», как таковой, не наблюдалось. Не видел, чтоб кого-то били, там с этим строго; правда, разрешено было наказывать физическими упражнениями. Вот и случалось такое, что рота по пол ночи стояла в упоре лежа или «погибала» на плацу. Самое неприятное было, когда приезжают родители (тогда отпускали в увольнение), столь радостное событие омрачает «приказ» старослужащих: «С «увала» приносишь 200 руб., бутылку водки и закусить!». Даже стыдно было смотреть в глаза родителям. Честно.
         Но полгода пролетело, как глазом моргнул. Осенью начали приезжать «покупатели» из настоящих воинских частей, т.е. из регулярной армии (Адыгея, Москва, Владивосток и …Северный Кавказ, со всеми его зонами конфликтов). Мне выпала, не побоюсь этого слова, честь попасть на Северный Кавказ. Сознаюсь, услыхав название района своей дальнейшей службы, но после напутствия сержанта, цитирую: «Не ссы, один раз живешь, а если суждено, то и на гражданке грохнут!». Но все же больше всего мне запомнились слова командира части, провожающего нас на Кавказ. После глубокого вздоха он сказал следующее: «Родина сказала — надо! Мы отвечаем — есть!». Напоминает смертный приговор, не находите?

Итак, Кавказ.

         Уже на поезде, видя из окон эшелона расстрелянные поезда, дома, машины, невольно захотелось домой. Но я хотел рассказать о «дедовщине», войну и душевные переживания оставлю на следующий раз.
         Попал я служить в отдельный гранатометный взвод мотострелкового батальона, который, кстати, ежегодно выезжает на выполнение боевых задач на границу Чечня-Ингушетия, чем в принципе и горжусь.
Вот тут дедовщина, по-моему не только не пресекалась, но скорее наоборот — даже разрешалась в какой-то степени. Слышал краем уха такой диалог: командир — сержант.
         — Товарищ старший лейтенант, молодые не слушаются ни х..я! Чо делать?
         — Дай им п..ды! Чо до меня-то дое..ваешься?
         Нормальное отношение к тем, кто в реальном бою может спасти твою, извиняюсь, задницу! И, кстати, здесь были уже не только старослужащие, но и офицеры.
         Первые полгода, теперь уже на Кавказе показались сущим адом! Каких только унижений я не насмотрелся (на себе не испытывал, решил сразу: пускай лучше изобьют, но не унижусь; жаль не все так решили!); от простых стираний портянок, до орального и анального изнасилования. Последнее мне, правда, не «посчастливилось» лицезреть, но слухи ходили и оправдывались. Так например, солдат, доведенный до отчаяния избиением, а в довершение еще и будучи изнасилован, оставил пост и, прихватив оружие и боекомплект бежал.
         Конечно, была послана поисковая группа, по которой несчастный и открыл огонь и в результате непродолжительной перестрелки был убит. Но, конечно, правда осталась нераскрытой, как и мотивы побега, а виновный через 2 месяца преспокойно уехал домой, живой и здоровый.
В связи с дешевизной алкоголя (7 руб. за 0,5 л. водки) и вездерастущей марихуаной, преступления совершались поистине тяжелые. Где получив сапогом или прикладом по лицу, осознаешь, что ты легко отделался.
         Имели место следующие развлечения: устраивались бои «старый» против «молодого». В таких боях фактор успеха не играл абсолютно никакой роли, или тебя изобьет противник (что гораздо предпочтительнее), или, победив, получаешь уже от всего старослужащего состава.
         И еще, вы видели когда-нибудь армейскую табуретку? А верите ли вы, что человеческая голова способна выдержать шесть (!!!) таких табуретов, т.е. это когда после удара — табурет в щепки, а на голове — шишка (сотрясение мозга, потеря сознания). Вот так-то!
         Не ручаюсь за все воинские части, может где-то и лучше. Ну а идти или не идти решать вам. Конечно, бесспорно, тамошняя атмосфера закаляет, так сказать, показывает темную сторону жизни. Сам я не жалею, что сходил, послужил; все же новые друзья, новые места, да и есть много чего интересного, но для себя решил вот что. Нужна контрактная основа службы, чтоб служили те, кому это действительно надо, кто готов и морально и физически.
         По крайней мере, количество самоубийств и самовольных оставлений части резко бы снизилось.
         Спасибо.

просто Служивый

         От редактора: как и автор статьи, не претендую на абсолютную точку зрения, однако, по-моему, это тот случай, когда лучше сто раз услышать, чем один раз увидеть, и не дай вам боги испытать это на себе…
Читайте следующую статью об армии, коия близка к моему мнению.

В рамках сохранения HTML-памятников истории и культуры, 2004 год, воспоминания респондента о чеченской кампании.

Какой перед вами долг?

         Хотелось бы осветить один из аспектов «военного вопроса», а именно само понятие воинского долга, коим так любят «помахать перед носом» у молодого человека призывного возраста и коим, надо сказать, махать-то, в принципе и незачем.
         Честно говоря, слушая все эти разглагольствования о воинском долге я все никак понять не могу — кому это я должен? Ради чего я должен рисковать своей жизнью? Простите, уважаемые военные, она у меня одна и нет мне никакого резона подчиняться вашим приказам. Да и предлагаемая альтернативная служба у меня, как и у авторов статьи кроме вопросов ничего не вызывает.
         Какой у меня перед вами, совершенно чужими и незнакомыми мне людьми может быть долг? Чего вы мне такого сделали, что я вдруг стал вам должен? Кто вы мне? В данный момент на эти вопросы у меня нет ответов, может, вы поясните?
За мой счет и так уже кормится жутких размеров армия чиновников, так я еще и на вас должен работать. А зачем? Я для вас — цифра в отчете, винтик в четком отлаженном механизме Системы, частью которой вы являетесь, за счет которой живете, и, надо сказать, неплохо.
         Так что, простите, никакого долга перед Вами я не обнаруживаю и работать на вас (хотя бы в форме службы в армии) не собираюсь, своя жизнь еще не устроена.
         Конечно, многие могут не согласиться со мной, начнут рассуждать о войнах, отвечу им заранее: войны ведутся и выигрываются не накаченными мужиками в погонах, и никак не мальчишками, а политиками, чиновниками. Это люди, которые все давно уже поделили, проверили и рассчитали.
         Для них мы, простые парни, которым идти в армию, всего лишь инструмент для достижения их личных целей.
         И цели эти, такие же, как у всех, хотя и прикрыты кричащими словами вроде «долг». «А каковы же они?», — спросите вы меня. Подумайте, что человеку нужно для жизни — долг, честь, обязанности? Нет! Еда, воздух, жизненное пространство… И как это не назови, как не прикрывай, все равно никуда от этого не деться.
         Так что, господа власть предержащие, не надо, хотя бы лицемерить.
         А вы, ребята, срочники и призывники, держитесь и помните о собственной значимости.
         Помните о том, что о себе вы можете позаботиться только сами.

Вампирметр

2004.
В рамках сохранения HTML-памятников истории и культуры.

Подарили нашему российскому корешу автограф БГ

В обмен на «Курочку» конечно же. БГ еще 400 лет концерты давать будет, а вот «Курочку» хуй в третий раз перевыпустят.

Автограф выиграли на партизанском канале ARU TV, аж сам Артемий Троицкий нам подарил.

Опубликовано с разрешения всех источников и акторов. Копилефт всех материалов подтвержден.

Dyna Blaster for DOS (Бомбермен)

Родное demo игры:

По многочисленным просьбам зрителей, Werwolf сделал репак старой DOS-овской игры.

Под Windows XP и выше можно играть в DOSBOX последней версии (на момент написания заметки 0.74-3).

Добавлена возможность включения и отключения фоновой музыки:

Для включения надо запустить файл ONMUSIC.EXE, для выключения OFFMUSIC.BAT, по умолчанию фоновая музыка отключена.

Добавлен файл CHEATS.TXT с кодами для доступа к каждому уровню и кодом на бессмертие. Копия на PasteBin

Скачать

DYNA Blast for DOS с Mega.NZ(ZIP)

Курочка открыла дверь в Карелии.

И теперь едет открывать ее в Финляндии.

«Курочка, открой дверь», это тебе не простая крипипаста про деревню. Тут и непонятной природы сущности, и странные секты, и спецслужбы, тайное российское, а возможно и мировое правительство. Даже отряд казаков встречается.

В общем, если бы Стивен Кинг и Виктор Пелевин писали сценарий к Евангелиону, примерно оно бы и вышло.

Думаю, вообще, произведение недооцененное, по причине «камерности» и совсем никакого пиара, Раймонду Крумгольду должно было бы зайти. И вообще, по повести аниме надо снимать, а уж статья на Катабасии обязательна вообще.

Книга с «Курочкой» и еще несколькими рассказами того же автора, вновь вышла ограниченным тиражом. Мы ждали этого джва минимум 5 годиков.

Текст и озвучка доступны в сети бесплатно:

Текст на Мракопедии
Озвучка от Криперс

Заказать книжку, если кому надо, и если осталось, можно в описании под озвучкой.

Скрипт для тестирования сетевых соединений. Инструкция.

Преамбула

Друзья из одной небольшой фиромочки попросили написать небольшой скрипт для тестирования соединений, чтобы быстро понять, где отвалилось. Например, упал роутер, не отвечает внутренний сервер, упал провайдер, или сдох VPN. Попросили сделать кросивое, с этим тоже справился, ошибки выделяются красным цветом, пройденные этапы зеленым, можно включить или отключить звуковое оповещение через PC-speaker.

Что умеет

+ Последовательно проводить два вида тестов: ping и получение страницы (или файла) с web-сервера
+ Оповещать пользователя об ошибках или пройденных тестах, с цветным текстом.
+ Выдавать звуковые сигналы об успешном завершении теста, или об ошибке на PC-speaker.

Для звуковых оповещений должен быть настроен PC-speaker и установлена утилита beep (копия).

Последовательность операций задается в конфигурационном файле.

Конфигурационный файл

Конфигурационный файл состоит из строк следующего формата:

операция|адрес|отображаемое описание|прервать/игнорировать

Пока поддерживаются только две операции:

ping — для ping’а адреса
getp — для получения страницы или файла с WEB-сервера (с помощью wget)

адрес — адрес, WWW для getp, IP или WWW для ping.

отображаемое описание — описание операции, текст, который будет выводиться на консоль.

прервать/игнорировать — при ошибке операции, если указано ключевое слово break, скрипт останавливает работу и выводит сообщение о том, что в ходе тестирования произошли ошибки. Если указать иное значение, например, skip, то скрипт продолжит производить тесты, пока не закончится конфигурационный файл, или пока не будет следующий сбой в тесте, где указана опция break.

Названия операций и break нечувстивительны к регистру (т.е. можно написать Ping, ping или Getp, GeTP или BreaK, breaK).

Первые два поля (операция и адрес) являются обязательными. Если они не будут указаны, скрипт будет прерван на строке с ошибкой:

...
Ping|192.168.0.1|Main router|break #Main router ping
ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|break
getp
...

Если не будет указано поле описания, то оно будет по умолчанию установлено в значение No desription:

Если последнее поле не будет заполнено, то оно принимает значение break.

Если в первом поле будет неверно указанный код операции, то скрипт его проигнорирует, выдав соответствующее сообщение, продолжит выполнять другие операции, но завершится с ошибкой:

Ping|192.168.0.1|Main router|break #Main router ping
ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|break
getp|[ДАННЫЕ УДАЛЕНЫ]|Provider page
1234|[ДАННЫЕ УДАЛЕНЫ]|VPN Server IP|break
ping|8.8.8.8|Internet IP|break
getp|google.com|Internet page|break

Для разделения полей используется символ |

В конфигурационном файле можно использовать комментарии, начинающиеся с символа #, все, что находится после этого символа — игнорируется. Пустые строки также игнорируются.

Пример конфигурационного файла (без данных)

#inettest.cfg example

Ping|192.168.0.1|Main router|break #Main router ping
ping|x.x.x.x|Provider IP|break #Change x.x.x.x to your provider ip
getp|myprovider.net|Provider site page|skip #change myprovider.net to real site your provider
ping|x.x.x.x|VPN Server IP|break #Change x.x.x.x to real VPN provider IP
ping|8.8.8.8|Internet IP|break
getp|google.com|Internet page|break

Переменные скрипта

Скрипт не имеет параметров командной строки, основные настройки осуществляются через переменные самого скрипта:

CONFIG — путь к конфигурационному файлу, например CONFIG="./inettest.cfg". Если конфигурационный файл не будет найден, скрипт выдаст ошибку:

CRITICAL ERROR: Config file ./inettest.cfg not exist!

NOCOLOR — если значение равно 0, включить вывод цветного текста на консоль, если 1 — отключить. По умолчанию 0

NOCOLOR=1:

NOSOUNDP — включение ( по умолчанию 0) или отключение (1) звука в процессе тестов. Звук выдается после каждого отдельного теста.
NOSOUNDF — аналогично предыдущей переменной, только звук звучит после окончания всех тестов или их прерывания.

NOADDR0, включить тестируемый адрес в вывод скрипта, 1 — не включать.

NOADDR=0:

NOADDR=1:

PACKETS — количество пакетов для команды ping (по умолчанию PACKETS=3)
TIMEOUT — тайм-аут для получения страницы или файла (в скрипте делается с помощью wget, по умолчанию TIMEOUT=5)

Тест при ошибке сети

Конфиг:

Ping|192.168.0.1|Main router|break #Main router ping
ping|[ДАННЫЕ УДАЛЕНЫ]|Provider IP|skip
getp|[ДАННЫЕ УДАЛЕНЫ]Provider page|skip
ping|[ДАННЫЕ УДАЛЕНЫ]|VPN Server IP|break
ping|8.8.8.8|Internet IP|break
getp|google.com|Internet page|break

Результат:

Коды ошибок

ping:
1 — No reply (не один из пакетов до пингуемого адреса не дошел)
2 — Other error (другая ошибка, в большинстве случаев — «сеть недоступна»).

getp (wget):
1 — Иная / общая ошибка (generic error code)
2 — Ошибка в параметрах командной строки или файлах конфигурации (.wgetrc или .netrc)
3 — Ошибка файлового ввода/вывода (I/O error)
4 — Ошибка сети (например, при обрыве связи)
5 — Ошибка SSL
6 — Ошибка идентификации (неправильное имя пользователя или пароль)
7 — Ошибка протокола
8 — Ошибка сервера (например, нужный файл на сервере не найден, ошибка 404)

Коды возврата скрипта

0 — Ошибок в ходе тестов не произошло.
1 — Произошла хотя бы одна ошибка.

Скачать

Репозиторий на GitHub