понедельник, 17 июля 2017 г.

Обновления Windows vs. WannaCry

Обновления, которые закрывают дыру через которую распространяется WannaCry


Для Windows 7 это KB4012212
Для Windows XP это KB4012598

Проблема с временными зонами Windwos XP и Windows 7

Всем уже известно, что поддержка Windows XP прекращена, но у многих еще используются компьютеры с этой операционной системой. Ну, наш балаган не исключение. Проблема следующая, если формировать сообщение "Собрание" в Outlook 2010 с Windows 7 и отправить это сообщение на компьютер с Windows XP в Outlook 2010, то время начала и окончания "Собрание" будет смещено на час. Это связано с тем, что время часовых поясов Windows 7 и Windows XP различаются, даже если у Windows 7 и Windows XP выстовлены один и тот же часовой пояс. Решили проблему следующим способом, экспортировали ветку реестра с временными зонами из Windows 7 и импортировали эти зоны в реестр Windows XP. С это момента временные зоны стали одинаковые Windows 7 и Windosw XP, и время начала и конца собрания в Outlook 2010 стали отображаться одинаково.


Путь в реестре к временных зон на Windows 7:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Обновления для Microsoft Outlook 2007 и 2010 блокирующие вложения


Указываю номера обновлений, которые блокирую вложения в письмах в клиентах Microsoft Outlook 2007 и Microsoft Outlook 2010. На моей практике блокировались pdf - файлы, которые имели в своем название две точки, например:
Счет..pdf
Возможно и с другими названиями.
Для Microsoft Outlook 2007 это обновление KB3191898. Для Microsoft Outlook 2010 это обновление KB3203467. После удаления этих обновлений файлы стали открываться из вложения. Для Outlook 2013 и Outlook 2016 данная проблема сводится выводу сообщения, что вложения небезопасно, но файл открывать разрешает.

понедельник, 3 июля 2017 г.

Используем Glade для создания минимального GTK+ приложения

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

Запустите приложение Glade и при помощи его возможностей создайте окно (Смотрите рисунок 1).

Рисунок 1. Создание окна при помощи Glade


1) В палитре виджетов в разделе Toplevel выберите виджет с именем Window.
2) Присвойте виджету главного окна имя mainwindow. Также задайте заголовок окна и его размеры.
3) Сохраним интерфейс главного окна в файл с именем mainwindow.glade в ранее подготовленный каталог с именем glade_p1, где-нибудь в вашем домашнем каталоге.

Все свойства окна мы правили на вкладке General. Теперь перейдем на вкладку Signals и прикрутим функцию gtk_main_quit к сигналу destroy. Это нужно для того, чтобы наше главное окно закрывалось по нажатию на кнопку закрытия окна или просто крестик (Смотрите рисунок 2).

Рисунок 2. Установка сигнала destroy и соединение его с функцией gtk_main_quit


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

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

Создайте и сохраните файл main.c в каталог с файлом интерфейса mainwindow.glade. Пропишите параметры компиляции и сборки проекта. Об этом я писал в прошлых постах. Напишем код - основу, с которого и начнем развивать проект:

#include <gtk/gtk.h>


int main(int argc, char **argv) {
  GtkWidget *window = NULL;

  gtk_init(&argc, &argv);

  gtk_widget_show(window);

  gtk_main();

  return 0;

}


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

GtkBuilder *builder = NULL;

Далее определим указатель на структуру для подробного отчета об ошибке:

GError *error = NULL;

Далее после строчки, где мы провели инициализацию GTK — функция gtk_init, создаем новый объект типа GtkBuilder, в нем будет хранится описание пользовательского интерфейса:

builder = gtk_builder_new( );

Следующей строчкой мы пытаемся загрузить, в структуру типа GtkBuilder, с именем builder, описание пользовательского интерфейса из файла mainwindow.glade и проверяем загрузку на ошибки, которые могут возникнуть.

if ( !gtk_builder_add_from_file( builder, "mainwindow.glade", &error ) ) {
  g_warning( "%s", error->message );
  g_free( error );
  return ( 1 );
}

Следующей строчкой мы выбираем объект пользовательского интерфейса с именем mainwindow и преобразовываем его в виджет окна с именем window.

window = GTK_WIDGET( gtk_builder_get_object( builder, "mainwindow" ) );

Далее мы переносим все сигналы из описания пользовательского интерфейса, которые мы создали в Glade, и потом сопоставляем их с нашим приложением:

gtk_builder_connect_signals( builder, NULL );

Уменьшаем количество ссылок на объект GtkBuilder с именем builder, если количество ссылок будет 0, то объект уничтожается.

g_object_unref( G_OBJECT( builder ) );

Далее мы показываем виджет с именем window и передаем управление GTK библиотеки.

Результат работы программы показан на рисунке 3.

Рисунок 3. Окончательный вариант программы

Код полностью:

#include <gtk/gtk.h>

int main(int argc, char **argv) {

 GtkWidget *window = NULL;
 GtkBuilder *builder = NULL;
 GError *error = NULL;
 
 gtk_init( &argc, &argv );
 
 builder = gtk_builder_new( );
 
 if ( !gtk_builder_add_from_file( builder,  
                "mainwindow.glade", &error ) ) {
  
  g_warning( "%s", error->message );
  g_free( error );
  return ( 1 );
  
  }
 
 window = GTK_WIDGET( gtk_builder_get_object( 
                      builder, "mainwindow" ) );
 
 gtk_builder_connect_signals( builder, NULL );
 
 g_object_unref( G_OBJECT( builder ) );
 
 gtk_widget_show( window );
 
 gtk_main( );
 
 return ( 0 );
 
}


syntax highlighted by Code2HTML, v. 0.9.1

воскресенье, 2 июля 2017 г.

Ошибки и непонятные состояния Центра обновления Windows 7

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


1) Например такое состояние, когда вы знаете, что ни одного обновления не установлено, но при нажатие на кнопку Поиск обновлений, центр обновлений выдает сообщение что, Windows не требует обновлений. И так происходит каждый раз при нажатие на кнопку Поиск обновлений. Решить данную проблему мне помогает следующая последовательность действий в командной строке:


net stop wuauserv
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientIdValidation /f
net start wuauserv
wuauclt /resetauthorization /detectnow


Первой командой, net stop wuauserv, мы останавливаем службу Центра обновлений Windows. Второй и третьей командой мы удаляем ключи реестра. Предварительно экспортируйте ветку реестра (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate) себе на компьютер, чтобы была резервная копия. Чтобы сделать это, нажмите сочетания клавиш на клавиатуре знак Windows + буква r. После этого у вас откроется окно Выполнить. В поле с названием Открыть введите команду regedit. После этого у вас должен открыться редактор реестра Windows. В редакторе реестра откройте ветку реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate, где HKLM - HKEY_LOCAL_MACHINE. Щелкните правой кнопкой мыши на имени раздела WindowsUpdate и выбирете пункт меню Экспортировать. Сохраните резервный файл ветки реестра под именем backup.reg
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientIdValidation /f
Четвертой командой, net start wuauserv, мы запускаем службу Центра обновлений Windows. Пятой командой, wuauclt /resetauthorization /detectnow, мы запрашиваем обновления из Центра обновлений Windows.  


2) Если вы получили ошибку 8024001F Центра обновлений Windows, то эта ошибка связана с отсутствием подключения к Интернет или вообще с общими неполадками в сети (Не подключен кабель локальной сети или неисправно сетевое оборудование и т.д.).


3) Если вы получили ошибку 80072ee2 Центра обновлений Windows, то эта ошибка возникает если Центр обновлений сильно занят (скорее всего центр обновлений подготавливает вам обновления) и не может в данный момент выполнить ваш запрос на получение обновлений. Для исправления этой ошибки вам необходимо подождать какое-то время.