barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 30 мая 2011 г.

Перезапуск USB-устройства из командной строки в Linux

Для перезупуска usb-устройства из командной строки можно воспользоваться этой программкой:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>

int main(int argc, char **argv)
{
 const char *filename;
 int fd;
 int rc;

 if (argc != 2) {
  fprintf(stderr, "Usage: usbreset device-filename\n");
  return 1;
 }
 filename = argv[1];

 fd = open(filename, O_WRONLY);
 if (fd < 0) {
  perror("Error opening output file");
  return 1;
 }

 printf("Resetting USB device %s\n", filename);
 rc = ioctl(fd, USBDEVFS_RESET, 0);
 if (rc < 0) {
  perror("Error in ioctl");
  return 1;
 }
 printf("Reset successful\n");

 close(fd);
 return 0;
}

Компилируется она следующим образом:
gcc usbreset.c -o usbreset
Для запуска нужно посмотреть, какой номер имеет USB-устройство, которое нужно перезапустить:  
[aspirin@aspxeee ~]$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 003: ID 13d3:5111 IMC Networks Integrated Webcam Bus 003 Device 002: ID 0eef:480d D-WAV Scientific Co., Ltd Bus 002 Device 002: ID 09da:000a A4 Tech Co., Ltd Port Mouse
Например, нужно перезапустить мышь:  
[aspirin@aspxeee ~]$ sudo usbreset /dev/bus/usb/002/002 Resetting USB device /dev/bus/usb/003/002 Reset successful  

Неработающий wifi после возвращения из ждущего режима в Fedora 15 на EeePC T101MT

Столкнулся со следующей проблемой в Федоре: после выхода из ждущего / спящего режима не работает wifi, причем включить его как-либо (через графическую утилиту / командную строку) не получается, лечится только перезагрузкой.
Вылечилось это дело следующим образом: через файл, помещенный в /etc/pm/sleep.d/ (я его назвал 1eeepc, при этом разрешив его выполнение, установив chmod 777), я сделал, чтобы перед уходом в suspend / hibernate сеть выключалась, после выхода - включалась обратно (выполняется это все через cnetworkmanager, который предварительно нужно установить из репозитория). В итоге содержимое файла получилось такое (кроме борьбы с неработающей сетью в нём ещё отключается APM винчестера):

#!/bin/sh

case $1 in
      hibernate|suspend) # disable networking
            cnetworkmanager -o false
            ;;
      thaw|resume) # enable networking, disable HDD APM
            hdparm -B255 /dev/sda
            cnetworkmanager -o true
            ;;
esac


Осталось ещё решить проблему с перестающим работать по возвращении из suspend / hibernate тачскрином.

воскресенье, 29 мая 2011 г.

Щелчки винчестера на EEEPC T101MT и как от них избавиться в Windows

Я уже писал ранее как избавиться от этого самоубийства винчестера в Ubuntu (http://barbitoff.blogspot.com/2011/04/ubuntu.html) и в Fedora (http://barbitoff.blogspot.com/2011/05/eeepc-t101mt-fedora.html), теперь я наконец-то нашел решение проблемы и для Windows 7:
1) скачать и установить hdparm (http://barbitoff.blogspot.com/2011/05/hdparm-windows.html), поставить в свойствах exe-шника hdparm (C:\Program Files\hdparm\bin) "Запускать от имени администратора"
2) Создать bat-ник со следующим содержимым: hdparm -B255 hda
3) Добавить этот bat-ник в автозагрузку (точнее сделать так, чтобы он запускался при каждом входе в Windows) как написано тут: http://barbitoff.blogspot.com/2011/05/windows-7.html

Автозапуск программы с правами администратора в Windows 7

Иногда надо добавить какую-то программку в автозагрузку Windows, которая однако требует административных прав. При этом если просто поместить её ярлык в папку "Автозагрузка" меню "Пуск", при запуске будет вылезать запрос на разрешение (ну или если у программы в свойствах не стоит "запускать с правами администратора", то она запуститься без оных). Выход - создать запланированную задачу через планировщик:
1) Пуск -> Все программы -> Стандартные -> Служебные -> Планировщик заданий
2) Действие -> Создать простую задачу
3) Ввести для задачи какое-то имя, далее выбрать "При входе в Windows" или "При запуске компьютера" в зависимости от того, что именно Вам нужно
4) Выбрать "Запустить программу" и выбрать собственно саму программу (или bat-ник)
5) Нажать "Готово", после чего зайти в свойства только что созданной задачи (или сразу перед нажатием на "Готово" установить соотв. галочку)
6) На вкладке "Общие" установить галочку "Запускать с наивысшими правами"

В моём случае я ещё на вкладке "Условия" снял галочки "Останавливать при переходе на питание от батарей" и "Запускать только при питании от электросети", т.к. создавал задачу на ноутбуке.

hdparm для Windows

Windows-аналог linux-утилиты для настройки HDD (например, для отключения Advanced Power Managment) можно скачать тут:
http://hdparm-win32.dyndns.org/hdparm/
С помощью неё можно справиться с постоянной парковкой головок винчестера, отключив APM полностью:
hdparm -B255 hda
(нужны права администратора)

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

Яркость экрана EEEPC в Fedora 15

Похоже, проблема с яркостью экрана EeePC T101MT проявляется по всех Линухах: "из коробки" максимальная яркость экрана оказывается процентов 70 от реального максимума (например, в Винде). Для Ubuntu был пакет eeepc-brightness-workaround из репозитория ppa:plippo/t101mt, для Федоры ничего подобного не нашел, пришлось крутить руками. Добавление опций "acpi_osi=Linux acpi_backlight=vendor" в параметры ядра, в отличие от других EeePC, на моем не работает (грузиться начинает система с нормальной яркостью, однако после запуска Kernel Device Manager яркость снова убавляется), пришлось распотрошить deb-пакет eeepc-brightness-workaround (т.к. я не нашел способа ставить deb пакеты на Федору, впрочем, я особенно и не искал) дабы посмотреть, как же проблема с яркостью решается в нем. Оказалось, что достаточно просто: всего одной командной строчкой "setpci -s 00:02.0 f4.b=ff", которая находится в файле, вызываемом при загрузке системы (файл помещается в /etc/init.d/). Однако у меня после вызова этого файла видимо вызывается что-то ещё, что опять таки убавляет яркость, только что установленную на максимум "моим" скриптом. Искать, в каком из полутора десятков файлов это делается, было лень, так что пришлось поместить эту строчку в /etc/rc.d/rc.local, вызываемый после всех остальных файлов. И всё наконец-то заработало, теперь максимальная яркость действительно максимальна.
Файл /etc/rc.d/rc.local в итоге у меня выглядит так (он также решает проблему с щелчками винчестера из-за частой парковки головок):

hdparm -B255 /dev/sda
setpci -s 00:02.0 f4.b=ff

Щелчки винчестера на EEEPC T101MT на Fedora и как от них избавиться

Да, не повезло мне с винчестером на моём EEEPC, он воспринимает любые значения Advanced Power Managment (APM), отличные от 255 (отключено), слишком экстремально - паркует головки раз в 20-30 секунд, что, естественно, не может положительно сказываться на его здоровье, да и звуки мерзкие.
Как решить эту проблему в Винде, я пока не понял, в Ubuntu я решал её так, однако в Fedora аналогичного конфигурационного файла я не нашел, и у меня осталась единственная идея - добавлять вызов hdparm -B255 /dev/sda в скрипты запуска (причем из-за того, что значения APM сбрасываются при выходе из спящего / ждущего режима, придется выполнять этот вызов и при выходе из них). Итак, вот что пришлось сделать:
1) Добавить "hdparm -B255 /dev/sda" в /etc/rc.d/rc.local
2) Создать файл "1eeepc" (имя не важно) в /etc/pm/sleep.d/ со следующим содержимым:
#!/bin/bash case $1 in thaw|resume)
hdparm -B255 /dev/sda
;;
esac

пятница, 27 мая 2011 г.

Fedora 15: проблема с не работающими комбинациями клавиш с Ctrl в KDE-приложениях

Поставил Федору, включил русскую раскладку, и столкнулся с очень неприятной проблемой: не работает ниодна комбинация клавиш с Ctrl (Ctrl+A, Ctrl+S ...), причем независимо от того, какая в данный момент раскладка.
Перерыл настройки горячих клавиш вдоль и поперек - всё бесполезно.
Случайно наткнулся в инете, что у кого-то была аналогичная проблема, и при этом только при активированной (добавленной в список доступных раскладок) русской раскладке, после чего попробовал у себя удалить русскую раскладку (Параметры системы -> Устройства ввода -> Клавиатура -> Раскладки, где нужно поставить галку "Настроить раскладки", после чего удалить русскую) и вуаля - Ctrl-комбинации заработали!
Но без русской раскладки достаточно печально, попробовал добавить её обратно - и был неимоверно удивлен, когда оказалось, что комбинации клавиш продолжили работать.
Так что способ борьбы с этим глюком прост - удалить и добавить заново в список раскладок русскую. По крайней мере мне это помогло.

Установка LiveCD Fedora 15 на флешку из-под Ubuntu

Решил я таки забить на Убунту после обновления её до 11.04: Unity мне не понравилась (хотя в ней и есть интересные и удобные идеи, но в целом впечатление о ней сложилось отрицательное, в частности, из-за крайней сложности поиска программ в главном меню), да и ещё есть пара процессов, жрущих периодически 100% процессора, с чем я ничего поделать не смог. К тому же она виснет периодически, особенно при вставке флешек.
После долгого общения с Гномом я понял, что для нетбука не самая подходящая оболочка, и решил попробовать КДЕ, причем, т.к. общение с последней версией Kubuntu кроме длинной последовательности нецензурной лексики у меня никаких эмоций не вызвало, решил посмотреть в сторону других дистрибутивов. И остановился на федоре (сам точно не знаю почему.. Дебиана с КДЕ, работающим "из коробки", я не нашел, openSuse пользовался раньше и повторяться не хотелось, так что выбор пал на Федору).
И первая задача, вставшая передо мной, была поставить LiveCD на флешку, чтобы с неё загрузиться и начать установку, предварительно посмотрев-потыкав, вдруг мне Федора уж очень сильно не понравится.
Universal-USB-Installer-1.8.0.8 и UltraISO из-под винды заставить бук загрузиться с флешки не смогли (аналогичная проблема была в свое время и с Убунтой, так и не понял в чем же дело), поэтому решил создать загрузочную флешку из-под убунты.
Стандартная утилита создания загрузочных флешек в Убунте дружит только с дистрибутивами самой убунты и её производных, но на диске с Федорой 15 в папке "LiveOS" я нашел бинарник livecd-iso-to-disk, который позволяет записать iso на флешку.
Отформатировав флешку в ext3 так, как я писал ранее (http://barbitoff.blogspot.com/2011/05/linux.html, почему именно в ext3 - сам не знаю, можно было и vfat), я запустил утилиту livecd-iso-to-disk:

livecd-iso-to-disk Fedora-15-i686-Live-KDE.iso /dev/sdb1

Прога выругалась на отсутствие команды checkisomd5, на что я благополучно нажал Enter, т.к. уже проверил md5 сразу после скачки образа, и процесс начался. Минут через 5 у меня была рабочая загрузочная флешка с LiveCD Fedora 15.

Форматирование флешки в Linux из командной строки

1) Посмотреть устройство, соответствующее флешке: sudo fdisk -l (можно определить, что именно является флешкой, например, по объему) или dmesg | tail после включения флешки, где будет строчка вроде:
[14122.361247] sd 4:0:0:0: [sdb] Attached SCSI removable disk
где sdb и должно быть флешкой (правда, оно представляет флешку вцелом, а не раздел на флешке, который мы хотим форматировать, поэтому в моём случае форматируемый раздел оказался sdb1).
2) Размонтировать форматируемый раздел: sudo umount /dev/sdX
3) В зависимости от файловой системы, в которую форматируем, выполнить одну из следующих команд:
sudo mkfs.vfat /dev/sdX
sudo mkfs.ext3 /dev/sdX
sudo mkfs.ntfs /dev/sdX
...

четверг, 5 мая 2011 г.

Хранение параметров подключения к БД в конфигурационном файле в приложениях .NET

Строки подключения к БД можно хранить в конфигурационном файле (app.config для настольных приложений и web.config для ASP.NET), чтобы при изменении параметров доступа к БД не лазить все время в код программы.
Для этого в файл конфигурации добавляется тег вида:

  
    
  

После этого строка соединения будет доступна в программном коде следующим образом:

ConfigurationManager.ConnectionStrings["MainConnection"].ConnectionString