воскресенье, 28 декабря 2014 г.

Как удалить или остановить все контейнеры в Docker

Что бы остановить/удалить все контейнеры можно воспользоваться простой командой 

docker stop $(docker ps -q) 
docker rm $(docker ps -q)

 Ключ –q или –quiet заставляет команду ps возвращать только идентификаторы контейнеров

четверг, 5 ноября 2009 г.

Использование Application Recovery API в Windows Vista/Windows 7

Приложения иногда падаю. Чаще всего это происходит в самый неудачный момент, когда несколько часов работы не сохранены. Это делает пользователя очень грустным. Выходом будет использование Application Recovery API


Идея довольно проста. При падении программы ядро Windows вызывает заданный метод, который производит сохранение данных. После этого программа запускается с заданным параметром командной строки, реагирую на который программа должна востановить данные.


Продемонстрирую на примере. Напишем консольное приложение, которое будет генерировать 60 случайный чисел от 1 до 100, и в конце падать от необработанного исключения


  1. class Program
  2. {
  3.   static void Main(string[] args)
  4.   {
  5.     RunAndCrush();
  6.   }
  7.  
  8.   private static void RunAndCrush()
  9.   {
  10.     Console.WriteLine("Generating random numbers");
  11.     Thread.Sleep(1000);
  12.     Random rand = new Random();
  13.  
  14.     for (int i = 0; i < 60; i++)
  15.     {
  16.       numbers[i] = rand.Next(1, 100);
  17.       Console.WriteLine("Number N{0} = {1}", i + 1, numbers[i]);
  18.       Thread.Sleep(1000);
  19.     }
  20.  
  21.     throw new Exception("Crash");
  22.   }
  23. }
* This source code was highlighted with Source Code Highlighter.

Для востановления программы нам понадобятся 4 функции содержащиеся в kernel32.dll. Достанем их с помощью Interop


[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern uint RegisterApplicationRestart(string pwzCommandLine, RestartFlags dwFlags);

[DllImport("kernel32.dll")]
static extern uint RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK     pRecoveryCallback, object pvParameter, int dwPingInterval, int dwFlags);

[DllImport("kernel32.dll")]
static extern uint ApplicationRecoveryInProgress(out bool pbCancelled);

[DllImport("kernel32.dll")]
static extern uint ApplicationRecoveryFinished(bool bSuccess);

[Flags]
enum RestartFlags
{
  NONE = 0,
  RESTART_CYCLICAL = 1,
  RESTART_NOTIFY_SOLUTION = 2,
  RESTART_NOTIFY_FAULT = 4,
  RESTART_NO_CRASH = 8,
  RESTART_NO_HANG = 16,
  RESTART_NO_PATCH = 32,
  RESTART_NO_REBOOT = 64
}


* This source code was highlighted with Source Code Highlighter.



  • RegisterApplicationRestart сообщает Windows, что наше приложение должно перезапуститься при крахе. Приложение должно проработать минимум 60 секунд. Так сделано, чтобы оно не могло монополизировать систему падая и перезапускаясь каждые несколько секунд.

  • RegisterApplicationRecoveryCallback позволит вам указать ядру Windows, какую функцию вашего приложения нужно вызывать перед непосредственным перезапуском приложения

  • ApplicationRecoveryInProgress - это функция, которая вызывается приложением при восстановлении данных. Если операционная система получает этих команд во время,то она не закроет приложение.

  • ApplicationRecoveryFinished вызывается когда восстановление завершено.
    Теперь добавим приложению возможность перезапускаться. Для этого надо вызвать RegisterApplicationRestart


Метод RegisterApplicationRestart принимает два аргумента

  • pwzCommandLine содержащий командную строку, применяемую для повторного запуска приложения

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



Перезапуск


Изменим нашу программу


static string crashHint = "Crashed";

static void Main(string[] args)
{      
  uint i = RegisterApplicationRestart(crashHint, RestartFlags.NONE);
  Console.WriteLine("Application restart registration {0}.", i == 0 ? "succeeded" : "failed");

  if (args.Length == 1 && args[0] == crashHint)
  {
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Application restarted after crush\n");
    Console.ResetColor();

    Recovery();
  }
  else
  {
    RunAndCrush();
  }       
}


* This source code was highlighted with Source Code Highlighter.

crashHint – параметр командной строки, который обозначает что приложение упало и перезапускается.

Востановление


Для того, чтобы восстановить данные их надо сначала сохранить. Для этого добавим вызов RegisterApplicationRecoveryCallback в Main


i = RegisterApplicationRecoveryCallback(Recovery, null, 50000, 0);
Console.WriteLine("Application recovery callback registration {0}.\n", i == 0 ? "succeeded" : "failed");


* This source code was highlighted with Source Code Highlighter.

Входные параметры


  • pRecoveryCallback - Делегат

  • pvParameter - Объект, передаваемый в делегат

  • dwPingInterval - время ожидания вызова функции ApplicationRecoveryInProgress в миллисекундах. Если по истечении времени ожидания функция не вызвана, приложение считается зависшив и завершается без сохранения результатов

  • 0 – зарезервированный флаг



А вот и сам метод, в котором производится сохранение данных


private static int Recovery(object o)
{
  Console.ForegroundColor = ConsoleColor.Yellow;
  Console.WriteLine("\nRecovering ... ");

  Timer t = new Timer(KeepAlive, null, 1000, 1000);

  FileStream recoveryStream = new FileStream(@"recovery.dat", FileMode.CreateNew, FileAccess.Write);
  BinaryFormatter bf = new BinaryFormatter();
  bf.Serialize(recoveryStream, numbers);
  recoveryStream.Close();

  ApplicationRecoveryFinished(true);

  return 0;
}

static void KeepAlive(object o)
{
  bool cancelled;
  ApplicationRecoveryInProgress(out cancelled);

  if (cancelled)
  {
    Console.WriteLine("Recovery cancelled");
    Environment.FailFast("Recovery cancelled");
  }
}


* This source code was highlighted with Source Code Highlighter.

Мы запускаем таймер, каждую секунду вызывая метод KeepAlive. В нем мы с помощью функции ApplicationRecoveryInProgress проверяем, не отменил ли пользователь востановление программы. Когда сохранение завершено, мы вызываем функцию ApplicationRecoveryFinished и позволяем Windows перезапустить программу.


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


static void RecoverData()
{
  FileStream recoveryStream = new FileStream(@"recovery.dat", FileMode.Open, FileAccess.Read);
  BinaryFormatter bf = new BinaryFormatter();
  numbers = bf.Deserialize(recoveryStream) as int[];

  Console.WriteLine("Random Numbers is:");
  for (int j = 0; j < 60; j++)
  {
    Console.WriteLine("Number {0} = {1}", j + 1, numbers[j]);
  }

  Console.ReadLine();
}


* This source code was highlighted with Source Code Highlighter.


Исходные коды программы

понедельник, 19 октября 2009 г.

Вирусный маркетинг от Microsoft

Не так давно на сайте MSDN появился пост с необычным содержанием. Были заголовок "Скоро наступит это", ссылка на mp3 файл с пафосным посланием и таймер, отсчитывающий время до 21:00 19 октября по МСК. Если выделить весь текст на странице появлялось послание


Самые преданные пользователи MSDN и Visual Studio соберутся отпраздновать появление этого 23 октября в 19.00 по местному времени в следующих городах: Москва, Санкт-Петербург, Самара, Челябинск, Краснодар.
Преданность этих людей будет вознаграждена ценными подарками, а главное - общением с единомышленниками.
Координаты зашифрованы: шифр смогут разгадать только настоящие программисты.
Здесь представлена первая часть координат: N 37 B.2BC; N 3B 37.366; N 2D 01.30D; N 35 C.253; N 37 2E.F4
Когда обратный отсчет завершится, на главной странице MSDN появится вторая часть шифра.



Не трудно было догадаться, что если что-то связано с программистами, то это записывается в шестнадцатиричной системе. А буква N в коде намекала на географические координаты. После небольшого перебора нашлась координата для Москвы: N 37 2E.F4 или в десятичном формате N 55 46.244'. Эта параллель подозрительно близко проходила от офиса Microsoft на Крылатских холмах...
В 21:00 в появившееся данные убили всю интригу.

23 октября в этих городах России пройдут празднования, посвященные выходу бета-версии Visual Studio 2010 и обновленного MSDN!

Челябинск: N 37 B.2BC E 3D 12.331

Санкт-Петербург: N 3B 37.366 E 1E 15.127

Краснодар: N 2D 01.30D E 26 38.9A

Самара: N 35 C.253 E 32 07.166

Москва: N 37 2E.F4 E 25 19.165

Встретимся в 19.00 по местному времени в указанных местах!

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

пятница, 17 апреля 2009 г.

Прощай AJAX, да здравствует WebSockets!

Мода на AJAX по поводу и без повода, появилась, казалось бы, совсем ещё недавно, примерно в 2005-ом. С тех пор этим словечком уже никого не напугаешь, книги перестали продаваться, а недостатки технологии стали бельмом на глазу системных администаторов. Появилось много (полу-)решений а-ля COMET, об одном из которых я как-то уже писал, но ни одно не стало de facto. А пользовали требовали всё более интерактивных веб-аппликаций, а сервера всё сильнее трещали под натиском AJAX poll-ов, и уже программисты начали коситься на Flash/Silverlight/JavaFX с их сокетами…

И снова на помощь пришли веб-стандарты — новый HTML 5 описывает поддержку WebSockets. Обещается простой интерфейс для JavaScript-приложений:

[Constructor(in DOMString url)]
interface WebSocket {
readonly attribute DOMString URL;

// ready state
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
readonly attribute long readyState;

// networking
attribute EventListener onopen;
attribute EventListener onmessage;
attribute EventListener onclosed;
void postMessage(in DOMString data);
void disconnect();
};

Действительно, ничего сложного:

var mySocket = new WebSocket("ws://example.com/server");
mySocket.addEventListener("open", openHandler);

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

К сожалению, серверная часть потребует модификации, поэтому мы получим “мосты” (bridges) для веб-серверов. Радует лишь то, что мосты эти будут довольно тупы, эдакие прокси, потому что весь парсинг протоколов высокого уровня по определению должен происходить на стороне клиента.

Понятно, что спецификация еще далека до завершения, но некоторые вопросы всё ещё неясны. К примеру, уже сразу ясно, что WebSockets задуманы в основном для текстовых протоколов, таких как XMPP, где вся коммуникация происходит в виде XML, но что будет с текстово-бинарными, такими как IMAP (допустим вам нужен почтовый клиент на JavaScript)? Далее, как “мосты” будут обращаться с серверным приложением, к примеру для авторизации? Джависты быстро получат поддержку в своих application-серверах, а как быть нам, простым пользователям CGI-интерфейса и PHP?

Как бы то ни было, технология многообещающая и использовать её можно уже сейчас, ведь для этого существует Kaazing Gateway — первый сервер с поддержкой WebSockets. JavaScript клиент для Jabber, идущий в примерах очень впечатляет. Начав работу сейчас, к выходу спецификации, можно выпустить первое реальное веб-приложение на WebSocket’ах в мире :)

четверг, 26 марта 2009 г.

Сегодня впервые почувствовал радость от хабра. http://aanto.habrahabr.ru/blog/17675/


Как перестать путать артикли в английском языке (в терминах ООП)
Когда говорим про "описание класса" — применяем артикль "a" или "an". Когда имеем дело непосредственно с конкретным воплощением объекта(instance) — говорим "the". Всё просто :)

the_Apple = new an_Apple();


Кстати этот же принцип можно применять и в обратном направлении, чтобы не путать описания классов с самими объектами.


Когда же наконец и я попаду туда?

среда, 18 марта 2009 г.

vs2008 + sql 2008

Сегодня вдруг умер старичок MSSQL 2005, поэтому затеял переход на 2008. Переход прошел легко, правда для студии пришлось скачать Microsoft® Visual Studio Team System 2008 Database Edition GDR