четверг, 14 мая 2015 г.

Skype отключить нотификацию

В скайпе как обычно несколько чатов. Есть нужные и важные, а есть просто спамилки. Вот эти спамилки иногда так спамят, что хочется выйти из них. Отвлекают от работы. Из за них не обращаешь внимание на нужные нотификации.
В Windows версии в интерфейсе есть возможность отключить нотификации. А в линукс версии нету такой возможности.
Но оказывается Skype поддерживает команды прямо в окне чата.
Вот как отключить нотификацию конкретного чата.

  1. Зайти в чат
  2. Ввести /alertsoff
Всё. Теперь пиликать и вылетать попап с новым сообщением для этого чата не будет. Но чат будет подсвечивать количество не прочитанных сообщений. 

Вот список команд для чата Скайпа
 /me [text]
 /topic [text]
 /add [skypename+]
 /alertson [text]
 /alertsoff
 /leave
 /get creator
 /get role
 /whois [skypename]
 /setrole [skypename] MASTER|HELPER|USER|LISTENER
 /kick [skypename]
 /kickban [skypename]
 /get uri
 /get options
 /set options [[+|-]flag] ..
 /setpassword [password] [password hint]
 /clearpassword
 /get password_hint
 /get banlist
 /get allowlist
 /set banlist [[+|-]mask] ..
 /set allowlist [[+|-]mask] ..
 /golive [token]
 /invite [skypename]
 /fork [skypename+]
 /help

воскресенье, 5 октября 2014 г.

VirtualBox как удалённо задать разрешение

Доброго времени суток.
Есть удалённый комп, на котором крутится виртуальная машина (VirtualBox) с Ubuntu 10.10.
Иногда при подключении через rdesktop не работает явное указание разрешения. То есть задаю разрешения 1280х800, а оно его не применяет. В настройках экрана в гостевом гноме нет нужного разрешения, а вносить его вручную через xrandr каждый раза не хочу...
Нашел способ поменять разрешение самой виртуальной машине. Для этого нужно зайти через ssh на удалённый хост  и выполнить команду:
VBoxManage controlvm <ИмяВиртуалки> setvideomodehint 1280 800 16
, где 1280 800 - это разрешение, а 16 - глубина цвета

среда, 24 сентября 2014 г.

Putty: как выключить системный звук

Есть привычка вместо написания команды полностью, добивать её с помощью Tab. Когда работаю в linux это проблем не вызывает. Но вот пришлось пользоваться putty в windows.
Этот системный "бум-бум" начал раздражать. Пришлось смотреть как его выключить. Оказалось довольно просто: правый клик по заголовку окна putty, Change Settings...
Дальше Terminal->Bell и выбираем что душе нравится.

P.S. Однако оно показало как часто я использую Tab при вводе команд.

воскресенье, 14 сентября 2014 г.

java: Too many levels of symbolic links

После какого-то обновления перестала запускаться java  на моём Арче. Пишет:
/usr/bin/java: line 2: /usr/lib/jvm/default/bin/java: Too many levels of symbolic links
/usr/bin/java: line 2: exec: /usr/lib/jvm/default/bin/java: cannot execute: Too many levels of symbolic links

Решение: запустить програмку
sudo archlinux-java fix

понедельник, 4 августа 2014 г.

Skype 4.3 падает при старте

Обновился скайп для linux с версии 4.2 до версии 4.3 где-то месяц назад. Я попробовал, но он падал, и ещё хотел pulseaudio.
Однако старая версия ещё работала и я ничего не делал. Но вот настало 2 августа 2014 и старая версия перестала поддерживаться. А Skype мне нужен для работы :(.

Пришлось ставить pulseaudio. Однако проблему падения надо было решить. Нашел 2 решения.


Удалить папку ~/.Skype

rm -Rf ~/.Skype
Это меня не устраивало, т.к. терялась вся история всех переписок.

Поправить данные в ~/Skype/[username]/main.db. 

Там проблемы с записями, которые содержали информацию о передаваемых файлах.
$ sqlite3 ~/.Skype/[username]/main.db
> UPDATE Messages SET body_xml=substr(body_xml,instr(body_xml,'> .quit
но тут меня смутило что искалось  по слову posted, а у меня там было несколько языков. В общем не сработало.

Удалить проблемные записи. 

sqlite3 .Skype/[USERNAME]/main.db
sqlite> DELETE FROM Messages WHERE type=68;
sqlite> .quit

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

вторник, 19 марта 2013 г.

umount... device is busy? Кто держит мою флешку?!!!

Частенько после того как поработал с флешкой, внешним или сетевым диском не возможно его нормально демонтировать - device is busy!

Вопрос кто держит мою флешку?

Ответ можно получить в два хода
fuser -m <устройство или точка монтирования>
получим PID а дальше
ps -A|grep <PID который получили>
Дальше можно соорудить конвеер, чтобы сразу получить имя процесса, который держит устройство. Но не сейчас.

Например как я узнал, кто захватил мой внешний диск

root@legatus ~ # fuser -m  /run/media/magedon/7f9776a7-7cef-4105-860c-17a723220f85
/run/media/magedon/7f9776a7-7cef-4105-860c-17a723220f85:   645
root@legatus ~ # ps -A|grep 645
  645 ?        01:05:51 skype
и так мой диск захватил skype. Скайп выключил штатным методом, без всяких киллов.
И дальше просто демонтируем диск тоже штатными средствами. 

P.S. Кстати, а что это понадобилось Майкрософту на моём диске? Ведь скайп уже Майкрософт.
Пора искать альтернативу скайпу.

пятница, 15 марта 2013 г.

WebBrowser x64 && Java Applets

Система ArchLinux x64
Установленные пакеты:

  • jdk7-openjdk
  • jre7-openjdk

Хочу Ява Приложение запускаемое с сайта банка.

При переходе на страничку с java апплетом меня просто перекидывало на сайт Oracle с предложением установить java.

Думал, что надо ставить 32ный браузер с 32ной явой.

Но попробовал поставить icedtea-web-java7 и все заработало.

Надо будет попробовать еще WebEx. Интересно будет ли работать звук?

суббота, 9 марта 2013 г.

Как заставить Konqueror нормально отображать страницы

Доброе время суток, Все!

Преамбула

В рабочей обстановке мне нужно подключаться к одним и тем же сервисам под разными аккаунтами. Например к gmail.comCalendar Google и так далее и тому подобное. И каждый раз при этом мне нужно уточнять каким аккаунтом нужно подключится. И хорошо ещё что сервис спрашивает.
Решил я эту проблему тем что пользуюсь несколькими браузерами одновременно. До недавнего времени это были Chromium и Firefox. Но настало время что мне их стало не хватать. Но т.к. я пользуюсь KDE, в который по умолчанию включен свой веббраузер Konqueror, который может работать как и Dolphin. Название слеплено из KDE + conqueror. Conqueror, A214 -  британский тяжёлый танк 1950-х годов

Теперь суть

Как оказалось, у нашего танка можно менять движки. По умолчанию он использует KHTML и поэтому отображение некоторых страниц довольно корявое. В частности gmail сразу говорит, что браузер не совместим. Поэтому нужно заменить этот движок на WebKit.
Для начала нужно поставить этот движок в систему. У меня в арче это делается так
pacman -S kwebkitpart
В вашей системе смотрите сами как.
Потом просто запускаем Konqueror и в настройках меняем ему движок.
По английски эта опция называется Default web browser engine.

Вывод

После этого Konqueror стал показывать как Chromium. Однако для меня он всётаки не удобен.

вторник, 5 февраля 2013 г.

Chromium постоянно просит пароль

Как же меня достал этот Chromium! Постоянно просит пароль!
Вначале я терпел. Пытался вводить пароль. А ему плевать.

В общем нашёл ключик как это отключить -  запускать его с параметром --password-store=basic
Командная строка будет выглядеть примерно так
/opt/google/chrome/google-chrome --password-store=basic %U
Что это означает не искал. Возможно не самое правильное решение, но он перестал меня доставать. 

четверг, 8 ноября 2012 г.

Групповая обработка файлов в bash (цикл for)

Есть две папки
  1. bin - куда собирается программа
  2. 10y - папка с материалами, с которыми должна работать программа.
Раньше я просто копировал папку с материалами в bin. Однако настало время что я узнал, что мой винт не резиновый а материалов там пол Гига.

В общем решил симлинки положить в bin. Но создавать в ручную около 50 симлинков лень. Решил поискать как это дело можно автоматизировать.
Нашел.

Итак, структура каталогов следующая

project
├── 10y
├── bin
...
└── src


for file in 10y/*; do ln -s ../10y/$file ../bin/$file; done
  1. Заходим в каталог project
  2. Пишем выше приведенную строчку и жмем ентер
  3. Наслаждаемся результатом ))
следующая строка ищет все файлы и каталоги в папке 10y
for file in 10y/*;
где  file - это переменная итератор

далее создает для каждого выбранного файла или каталога относительный симлинк в папке bin
do ln -s ../10y/$file ../bin/$file;
значение переменной извлекается через  $, поэтому пишем не просто file, а $file

В общем виде цикл организован так
for <переменная итератор> in <маска>; do <действие>; done
Обратите внимание на точки с запятыми do и done - это обязательно

суббота, 18 февраля 2012 г.

Как убрать закладки у PageControl?

Уже много раз нужно было убрать у TPageControl эти закладки. Не TabSheet,  а именно сам заголовок. Мне нужно было для визарда, для формы настроек, где слева дерево, а справа страница с контролами.
Как сделать это с TPageControl сразу не понятно и поэтому как я только не изголялся - использовал и TFrame, и TNoteBook. Всё неудобно. Но как это сделать с TPageControl я долго не искал, потомучто нужно было делать срочно.
И вот настал момент, когда сказали переделать существующий PageControl, у которого около 20 страниц, на каждой из которых может быть до 20 контролов. Переделывать все это заново как-то не хотелось.
Правду люди говорят:
"Лень -  двигатель прогресса"
Нашел как это сделать. И все оказалось очень просто. И так.

  1. Кидаем на форму TPageControl.
  2. Устанавливаем  TPageControl.Style := tsButtons.
  3. Заполняем его TTabSheet-ами
  4. У каждого табшита устанавливаем TabVisible := False;
  5. Потом присваиваем TPageControl.ActivePage := TabSheet1;
В моем случае я сделал при создании формы
 pcMain.Style := tsButtons;
 for I := 0 to pcMain.PageCount-1 do
    pcMain.Pages[I].TabVisible := False;
 pcMain.ActivePage := tsBasic;

Заполнил TreeView нодами с заданными значениями SelectedIndex. Потом в TTreeView.OnChange 

procedure TfrmMain.PropTreeChange(Sender: TObject; Node: TTreeNode);
begin
  case Node.SelectedIndex of
    10  : pcMain.ActivePage := tsBasic;
    20  : pcMain.ActivePage := tsDocs;
    30,
    31  : pcMain.ActivePage := tsTextsOffer;
    32  : pcMain.ActivePage := tsTextsInfo;
...

где tsBasic и тому подобные - это TTabSheet


Вот и все

пятница, 17 февраля 2012 г.

Проблемы с наследниками TFrame

Добавил в проект фрейм  TCustomTextFrame = class (TFrame). Визуальных контролов на него не ложил. Просто добавил нужные свойства, методы, объявил абстракные...
Добавить наследника TCustomTextFrame  через File/Add New/Other/Inherited не получилось.
Добавил простой фрейм и вручную в коде поменял ему предка с TFrame на TCustomTextFrame 
TframeTextsOffer = class(TCustomTextFrame)
Всё  нормально подхватилось и заработало.

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

Оказалось что делфи почемуто добавляет внуку, так сказать, фрейма в *.dfm свойства ClientHeigh, ClientWidth и ещё кучу всякого. Но у фрейма такого нет. Вот и ругается.
Но простое удаление не дает результатов -  делфи при открытии TframeTextsOffer  в дизайнтайме упорно добавляет эти свойства, на которые потом сама же и ругается.

Помогло только изменение вручную в *.dfm object frameTextsOffer: TframeTextsOffer  на inherited frameTextsOffer: TframeTextsOffer.

Не знаю насколько это правильно, но пока работает.

вторник, 24 января 2012 г.

Delphi и дескрипшены к полям MS Access

Задача: Получить коментарии (описания) полей в MS Access и сделать их хинтами к контролам.


Итак что нужно сделать
  1. Получить комментарии к полям
  2. Список Таблица.Поле=Коментарий
  3. Обновить хинты контролов.
Первое.
В DataModule делаю 


private
  FFieldsComments: TStrings;
  ...

  procedure UpdateFieldsComments;
published
  property FieldsComments: TStrings read FFieldsComments;


FFieldsComments создается в DataModuleCreate и разрушается в DataModuleDestroy.


procedure TdmMain.UpdateFieldsComments;
var
  ADODataSet: TADODataSet;
begin
  if Assigned(FFieldsComments) and ADOConnection1.Connected then
  begin
    FFieldsComments.Clear;
    ADODataSet := TADODataSet.Create(Self);
    try
      ADOConnection1.OpenSchema(siColumns, VarArrayOf([Unassigned, Unassigned, tblDeviceCharacteristics.TableName]), EmptyParam, ADODataSet);
      ADODataSet.Open;
      ADODataSet.First;
      while not ADODataSet.Eof do
      begin
        if ADODataSet.FieldByName('DESCRIPTION').AsWideString <> '' then
          FFieldsComments.Append(ADODataSet.FieldByName('TABLE_NAME').AsWideString + '.' +ADODataSet.FieldByName('COLUMN_NAME').AsWideString + '=' +ADODataSet.FieldByName('DESCRIPTION').AsWideString);
        ADODataSet.Next;
      end;
    finally
       FreeAndNil(ADODataSet)
    end;
  end;
end;



Всё делается методом OpenSchema.Самый мне непонятный параметр это второй. Туда передаю VarArrayOf(...), но я пока не нашел описания что есть что в этом масиве. Я просто подставил то что нашёл в инете и получил, что хотел. Может, если найду описание дополню статью. 
Процедуру UpdateFieldsComments вызываю в ADOConnection.OnAfterConnect.

Теперь в форме нужно обновить хинты.


procedure TfrmMain.UpdateHitnsFromDB;
var
  i: integer;
  procedure UpdateDBEditHint( AControl: TDBEdit);
  begin
    if AControl.DataSource.DataSet is TADOTable then
      AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
  end;

  procedure UpdateDBLinkEditHint( AControl: TDBLinkEdit);
  begin
    if AControl.DataSource.DataSet is TADOTable then
      AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
  end;

  procedure UpdateDBLookupComboBoxHint( AControl: TDBLookupComboBox);
  begin
    if AControl.DataSource.DataSet is TADOTable then
      AControl.Hint := dmMain.FieldsComments.Values[TADOTable(AControl.DataSource.DataSet).TableName + '.' + AControl.DataField];
  end;

begin
  for I := 0 to ComponentCount-1 do
    if Components[I] is TDBEdit then
      UpdateDBEditHint(Components[I] as TDBEdit)
    else if Components[I] is TDBLinkEdit then
       UpdateDBLinkEditHint(Components[I] as TDBLinkEdit)
    else if Components[I] is TDBLookupComboBox then
       UpdateDBLookupComboBoxHint(Components[I] as TDBLookupComboBox)
end;

UpdateHitnsFromDB вызываю в actConnectExecute
Вот и все.  


среда, 18 января 2012 г.

Delphi и Диалог выбора папки

Сколько себя помню у Delphi никогда не было своего компонента выбора папки типа TOpenDialog и каждый раз когда нужно было выбирать именно папку искал как это делается.
Вот теперь решил записать то что я нашел и немного переделал для себя.
Это пока функция, возможно когда-то сделаю компонент типа TOpenFolder.

И так всё эавязано на функции ShBrowseForFolder из модуля ShlObj или по новому Winapi.ShlObj.
Но множество примеров, которые я видел были без кнопки Create New Folder и без возможности установки пути по умолчанию.
И так код:
...
function SelectFolder(hWnd: HWND; const Caption: WideString; var Folder: WideString): boolean;
...
implementation
uses  ShlObj, ActiveX, Forms;
var
  DefaultPath: widestring = '';
...
//Эта функция нужна для установки пути по умолчанию
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): integer; stdcall;
begin
  Result := 0;
  if uMsg = BFFM_INITIALIZED then
    SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PWideChar(DefaultPath)));
end;

function SelectFolder(hWnd: HWND; const Caption: WideString; var Folder: WideString): boolean;
var
  WindowList: Pointer;
  BrowseInfo : TBrowseInfo;
  Buffer: PChar;
  RootItemIDList, ItemIDList: PItemIDList;
  ShellMalloc: IMalloc;
  IDesktopFolder: IShellFolder;
  Eaten, Flags: LongWord;
begin
  FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
  if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
  begin
    Buffer := ShellMalloc.Alloc(MAX_PATH);
    try
      DefaultPath := Folder;
      RootItemIDList := nil;
      with BrowseInfo do
      begin
        hwndOwner := hWnd;
        pidlRoot := RootItemIDList;
        pszDisplayName := Buffer;
        lpfn := @BrowseCallbackProc;
        lpszTitle := PWideChar(Caption);
        ulFlags := BIF_RETURNONLYFSDIRS or $0040 or BIF_EDITBOX or BIF_STATUSTEXT;
      end;
      WindowList := DisableTaskWindows(0);
      try
        ItemIDList := ShBrowseForFolder(BrowseInfo);
      finally
        EnableTaskWindows(WindowList);
      end;
      Result :=  ItemIDList <> nil;
      if Result then
      begin
        ShGetPathFromIDList(ItemIDList, Buffer);
        ShellMalloc.Free(ItemIDList);
        Folder := Buffer
      end;
    finally
      ShellMalloc.Free(Buffer);
      DefaultPath := '';
    end;
  end;
end;



Теперь пример использования:
procedure TframeGeneralSettings.Button1Click(Sender: TObject);
var
  Value: WideString;
begin
  Value := edtImagesFolder.Text;
  if SelectFolder(Handle,  'Select ' + lblImagesFolder.Caption, Value) and (Value <> edtImagesFolder.Text) then
    edtImagesFolder.Text := Value;
end;




пятница, 9 декабря 2011 г.

Delphi не загружает мои компоненты

Появилась необходимость написать свой компонет потомок TCustomLabel. Написал. Может в будущем сделаю заметочку, что и как писал

Так вот. Создал пакет, создал компонент и с дефотными настройками собрал и поставил. Стало без проблем. Заменил в основном проекте все лабелы на свои.

Всё работает отлично. Настроение хорошее...

Пока делфу не перегрузил. Тут оказалось, что оно не видит мой пакетик, мою бэпээлочку. Разбираюсь. Оказалось если не указать, куда ставить пакет, то  оно его ставит в 
С:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Bpl\
С:\Documents and Settings\All Users\Documents\RAD Studio\5.0\Dcp\
И при загрузке от туда не поднимает. Т.к. я буду отдавать этот компонент людям, что бы они дальше с ним работали, то я не надаюсь, что каждый додумается добавить эти папки в пути поиска.

Полез в настройки делфы и подсмотрел как она обзывает папку с собой и  в настройках пакета прописал пути Output directory и DCP output directory



Теперь пакет ставится в 
С:\Program Files\CodeGear\RAD Studio\5.0\bin\
С:\Program Files\CodeGear\RAD Studio\5.0\lib\
Может я что-то сделал не канонично. Но по крайней мере работает.

вторник, 29 ноября 2011 г.

Archlinux & VirtualBox перекомпиляция модуля ядра

На данный момент пользую на хосте ArchLinux, а для работы пользую виртуалки под VirtualBox. Но иногда обновляю систему на хосте и когда обновляется ядро, VirtualBox отказывается работать и проси пересобрать ядро такой командой
/etc/rc.d/vboxdrv setup
Она то и сбивала меня с толку. Дело в том, что в Арче не команды /etc/rc.d/vboxdrv. А так как это обнаруживалось во время рабочего дня - искать каноничных решений времени обычно небыло. Просто переставлял VirtualBox.

Но вот нашлось время более внимательнее посмотреть на проблему и вот что оказалось нужно было запускать
/etc/rc.d/rc.vboxdrv setup

пятница, 21 октября 2011 г.

Samba 3.6.0: В windows не работают симлинки

Т.к. я в основном работю в сетях с машинами на которых стоит Windows, то часто бывает нужно дать кому-то что-то переписать.

Но все данные (аудио, видео, книги...) у меня лежат посортированные по папочкам (мечтаю сеть и до конца все посортировать :)). А открывать доступ на кучу папок не есть Ъ. Поэтому в линуксе я открываю одну папочку для людей, а туда кидаю симлинки на нужную мне информацию.

Получается что открывать ничего не надо. А что бы дать доступ нужно только проверить права на сам файл\папку (должны иметь право чтения для группы самбы или для всех) и кинуть туда симлинк.

Так вот. Давно никому ничего не надо было открывать. Система переставилась. Теперь у меня Archlinux. Обновился пару раз. И тут оказалось что из под винды нельзя ходить по симлинкам.

Погуглив нашел решение: в /etc/samba/smb.conf дописать

[global] 
follow symlinks = yes 
wide links = yes 
unix extensions = no

пятница, 17 июня 2011 г.

Virtualbox, Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND)

Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND).The service might be not installed on the host computer.

Код ошибки: 0x80004005
Компонент: Host Интерфейс: IHost {81729c26-1aec-46f5-b7c0-cc7364738fdb} Вызванный объект: IMachine {0332de0e-ce75-461f-8c6f-0fa42616404a} 

Решение:
Добавить в /etc/fstab следующую строку
none /proc/bus/usb usbfs devgid=46,devmode=664 0 0 
И перемонтировать
mount -a 
Подробнее тут
Взято здесь

вторник, 17 мая 2011 г.

KDE не выключает комп

Некоторое время назад мой KDE4 перестал выключать комп. Я ему выключить, а он вырубает графику и переходит в консоль. В конце концов надоело каждый раз заходить и писать sudo poweroff. Погуглив тему, увидел, что не только у меня такая проблема. И сразу выискалось решение
kdesu systemsettings -> Вход в систему -> Выключение -> Команды завершения работы, "Выключение:"
У меня там было
/sbin/shutdown -p now 
Я поменял на
/sbin/poweroff 
И всё заработало.
 

суббота, 14 мая 2011 г.

Nepomukservises - пожиратель процессорного времени

Если у вас KDE4 и комп что-то тормозит гляньте список процессов. Возможно и у вас злобствует сабж.
Список процессов можно посмотреть в консоли командой top или в KDE4 по хоткею Ctrl+Esc 
Это оказалась поисковая система типа GoogleDesctop. Когда-то я сталкивался уже с этим поделием, но разобравшись с проблемой не записал её сюда. Поэтому пришлось искать решение ещё раз.
Пакета с именем Nepomuk в моём текущем дистрибутиве (Archlinux x64) не нашлось. Поэтому если не удалить, то, погуглив, нашёл хоть как отключить сабж.
Оказалось проще простого.
1. Открываем Параметры системы

2. Открываем поиск по меткам и содержимому

 3. Отключаем этот Nepomuk


Ну и убить уже запущенный процесс. Для этого нам нужно получить PID запущенного процесса. Его можно узнать в списке запущенных процессов (см. выше) а потом просто
kill -9 ПолученныйPID
-9 это убить без суда и следствия.