Hatred's Log Place

DON'T PANIC!

Oct 20, 2009 - 5 minute read - programming

Arduino: небольшой отчет по мастер-классу

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

Все исходники по семинару (презентация, схемы, разводка, листинги программ) приложены в конце статьи.

Количество пришедшего народу несколько порадовало, хотя очень расстроило, что не было никого из политена (народное название ДВГТУ), кто сейчас там учится или преподает, особенно электрические машины, ведь, по сути, я продемонстрировал готовый вариант ШИМ управления двигателем, и применить подобную наработку в какой нибудь курсовой или дипломной работе - милое дело.

Вот новых лиц было малова-то: с Русланом Остапенко (учитель информатики из села Раздольного) приехали 4 школьника, надеюсь им было интересно и информация хоть частично осядет в их головах, и было 2 студента из ДВГУ— увидели объявление, заинтересовались.

В общем, главное, что был интерес.

Oct 19, 2009 - 2 minute read -

EeePC: 2.6.31.4 + wifi

EeePC 1000HA, wifi, карторчка Atheros (чип - AR2425, согласно этому, это AR5007EG, хотя lspci называет её как AR5001), ядро 2.6.31.4

возможные драйвера:

  • ath5k - стоковый
  • madwifi-hal - из AUR
  • ndiswrapper - из core + виндовый драйвер (нужны *.sys и *.inf файлы)

Поведение:

ath5k

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

UPD: с какой-то версии ядра данный драйвер стал прекрасно работать, сейчас, на 2.6.36 он прекрасно трудится и не чихает. Немного можно почитать тут

madwifi-hal

Работает. Не сумел завести карточку в режиме 802.11g, хотя она это поддерживает, как и точка доступа. Скорость крайне медленная, меньше 1 мбита, хотя точка в 1.5 метрах. Иногда бывают затыки, потом на короткое время соединение опять поднимается.

ndiswrapper

наконец дошли руки попробовать, точне довело: раньше нормально работал madwifi-hal, поставил, особо ничего трудного, в вики есть немного информации. Карта встала как 802.11g, скорость в выводе iwconfig светится как 54Mbit, но, судя по всему, сумма в обе стороны, скачка большого файла с сервера идет со скоростью примерно 2.7 Мбайт/сек, что примерно равно 24мбит. Пока ещё наблюдаем, надеюсь, с madwifi-hal что–то сделают.

UPD: а у этого способа оказался свой косяк: убивается, со временем, шина USB, перестаёт реагировать мышка, принудительная выгрузка модулей помогает, но следующий слет USB приводит к Kernel Panic

Настройка

Для настройки сетевых подключений использую wicd, остальные настройки, ниже.

ath5k/ath9k

ath9k драйвер используется для новых карточек 802.11n

  1. /etc/rc.conf: bashMODULES=(... !ndiswrapper ath5k !ath_hal !ath_pci ...)
  2. /etc/modprobe.d/wifi_balacklist.conf: blacklist ndiswrapper blacklist ath_hal blacklist ath_pci
  3. при использовании acpi-eeepc-generic, */etc/conf.d/acpi-eeepc-generic.conf//: bashWIFI_DRIVERS=("ath5k")

madwifi-hal

  1. скачиваем из AUR: http://aur.archlinux.org/packages.php?ID=20857, распаковываем, строим, устанавливаем, без подробностей.
  2. /etc/rc.conf: bashMODULES=(... !ndiswrapper !ath5k ath_hal ath_pci ...)
  3. /etc/modprobe.d/wifi_balacklist.conf: blacklist ndiswrapper blacklist ath5k blacklist ath9k
  4. /etc/modprobe.d/madwifi.conf: options ath_pci autocreate=sta ratectl=minstrel countrycode=0 xchanmode=1 intmit=1 ath_debug=1 ieee80211_debug=1 вы можете поиграться с этими опциями, посмотреть можно по modinfo ath_pci
  5. при использовании acpi-eeepc-generic, */etc/conf.d/acpi-eeepc-generic.conf//: bashWIFI_DRIVERS=("wlan_tkip" "wlan_ccmp" "ath_pci" "ath_rate_sample" "ath_hal" "wlan_scan_sta" "wlan")

ndiswrapper

Пока использую его на последнем ядре.

  1. Устанавливаем ndiswrapper и ndiswrapper-utils
  2. /etc/rc.conf: bashMODULES=(... ndiswrapper !ath5k !ath_hal !ath_pci ...)
  3. /etc/modprobe.d/wifi_balacklist.conf: blacklist ath_pci blaclist ath_hal blacklist ath5k blacklist ath9k
  4. распаковать виндовый драйвер (можно взять отсюда последний: http://www.atheros.cz), выполнить команды от рута: bashndiswrapper -i netathw.inf ndiswrapper -l ndiswrapper -m
  5. при использовании acpi-eeepc-generic, */etc/conf.d/acpi-eeepc-generic.conf//: bashWIFI_DRIVERS=("ndiswrapper")

Oct 16, 2009 - 1 minute read - linux

Перечень и краткое описание основных команд при работе операционной системе Linux и список рекомендуемой литературы

Часто в последнее время приходится показывать пользователям, что помимо GUI и всяких WM/DE есть ещё команды. В ответ интересуются, а где про них прочитать? Случайно наткнулся на эту статью:

Перечень и краткое описание основных команд при работе операционной системе Linux и список рекомендуемой литературы

Так что, на будущее, буду рекомендовать.

Oct 16, 2009 - 1 minute read - life

Уважаю БГ!

Нет, это не дядя Билли, это другой, тот самый БГ!

Почему уважаю? Недавно вышел новый альбом Аквариума “Пушкинская, 10”, так вот скачать песни можно официально и бесплатно или заплатив кто сколько хочет, по желанию.

Oct 11, 2009 - 2 minute read -

exo: решение проблемы с кодировками при монтировании от разработчиков

Версия exo 0.3.104, репортуют о решении проблемы с установкой кодировки при монтировании сменных устройств.

Version exo 0.3.104, developers reporting us about resolving problem with code-page setup on mounting removable devices.

Russian

Анализ кода дал следующий результат:

    else if (strcmp (device->fsoptions[m], "umask=") == 0
                   && strcmp (fs, "ntfs-3g") == 0)
            {
              /* we need to pass umask=0077 to ntfs-g3 or else it gets 0777 perms */
              options[n++] = g_strdup ("umask=0077");
            }
          else if (strcmp (device->fsoptions[m], "iocharset=") == 0)
            {
              /* get the charset from a variable set by the user or glib */
              charset = g_getenv ("EXO_MOUNT_IOCHARSET");
              if (G_LIKELY (charset == NULL))
                if (g_get_charset (&charset))
                  charset = "utf8";

              if (G_LIKELY (charset != NULL && *charset != '<br/>0'))
                options[n++] = g_strdup_printf ("iocharset=%s", charset);
            }

Они так и не ушли от тупого жесткого указания опций в коде. Да, кодировку теперь можно указывать через переменную окружения, но как задать те опции монтирования, что не предусмотрели разработчики??? По сути это Alt’овци пропихнули свой патч. Теперь баг закроют, потому как проблема не будет наблюдаться, но сделано-то криво. Я расстроен.

PS как чуял неладное: перешел на openbox + pcmanfm + lxpanel (вариация на тему lxde).

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

PPPS Если кто может перевести этот пост на английский язык - помогите пожалуйста.

English

Code analysis gave me following result:

    else if (strcmp (device->fsoptions[m], "umask=") == 0
                   && strcmp (fs, "ntfs-3g") == 0)
            {
              /* we need to pass umask=0077 to ntfs-g3 or else it gets 0777 perms */
              options[n++] = g_strdup ("umask=0077");
            }
          else if (strcmp (device->fsoptions[m], "iocharset=") == 0)
            {
              /* get the charset from a variable set by the user or glib */
              charset = g_getenv ("EXO_MOUNT_IOCHARSET");
              if (G_LIKELY (charset == NULL))
                if (g_get_charset (&charset))
                  charset = "utf8";

              if (G_LIKELY (charset != NULL && *charset != '<br/>0'))
                options[n++] = g_strdup_printf ("iocharset=%s", charset);
            }

Mount options are still hardcoded. Yeah, now we can choose code-page setting up environment variable. But how we can setup another mounting options? Now bug will be marked as fixed, but bugfix is horrible. I’m disappointed.

Oct 8, 2009 - 3 minute read -

Генерация меню в IceWM

Подробно это описано в АрчВики по следующим ссылкам:

Рекомендую использовать первый способ, а ещё - подкорректировать вики, у меня пока руки не доходят.

Беда в том, что меню генерируется без картинок. Пошаманив немного, а если быть точнее - подсмотрев в Mandriva 2009.1 как это сделано, сделал небольшой патч для xdg_menu который добавляет иконки в меню:

--- xdg_menu.old	2009-10-08 15:27:26.387920020 +1100
@@ -65,6 +65,89 @@
     }
 }
 
+sub findicon
+{
+
+#       my $theme = "hicolor";
+
+        my $iconname = shift;
+
+
+        my $home = $ENV{"HOME"};
+        my $xdg_data_dirs = $ENV{"XDG_DATA_DIRS"};
+
+        my (@xdg_data_dirs);
+        @xdg_data_dirs = split(":",$xdg_data_dirs);
+
+        my (@icon_search_path);
+
+        my (@categorylist);
+        @categorylist = ("apps", "places", "devices", "actions", "animations", "categories", "emblems", "emotes", "filesystems", "intl", "mimetypes", "status", "stock");
+
+        my (@sizelist);
+        @sizelist = (16, 22, 24, 26, 32, 36, 48, 64, 72, 128, 192, 256);
+
+        my $thisdir = $home."/.icons";
+        ( -d $thisdir ) && push @icon_search_path, $thisdir;
+        foreach my $dir (@xdg_data_dirs)
+        {
+                my $theme = "hicolor";
+                my $size;
+                my $category;
+                foreach $size (@sizelist)
+                {
+                        foreach $category (@categorylist)
+                        {
+                                $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+                                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                        }
+                }
+                $thisdir = $dir."/icons/mini";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $thisdir = $dir."/icons";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $thisdir = $dir."/icons/large";
+                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+                $theme = "gnome";
+                foreach $size (@sizelist)
+                {
+                        foreach $category (@categorylist)
+                        {
+                                $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+                                ( -d $thisdir ) && push @icon_search_path, $thisdir;
+
+                        }
+                }
+        }
+
+        push @icon_search_path, "/usr/share/pixmaps";
+
+        my $filename;
+
+        #if ( -f $iconname )
+        #{
+        #        return $iconname;
+        #}
+        #else
+        {
+
+                foreach my $dir (@icon_search_path)
+                {
+                        foreach my $ext ('','.png','.xpm')
+                        {
+                                $filename = $dir."/".$iconname.$ext;
+                                ( -f $filename ) && return $filename;
+                        }
+                }
+        }
+}
+
+sub add_png_extension_if_needed ($)
+{
+        my ($f) = @_;
+        return $f =~ /<br/>.(png|xpm|svg)$/ ? $f : "$f.png";
+}
+
 sub scan_AppDir ($$;$)
 {
     my ($pool, $dir, $topdir) = @_;
@@ -1565,11 +1648,13 @@
     $indent = 0 unless defined $indent;
 
     my $menu_name = $menu->{'PrepName'};
+    #my $menu_icon = $menu->{'PrepIcon'} || "folder" ;
+    my $menu_icon = findicon($menu->{'PrepIcon'} || "folder");
 
     if($indent)
     {
 	$output .= ' ' x $indent;
1. $output .= "menu <br/>"$menu_name<br/>" folder {<br/>n";
+	$output .= "menu <br/>"$menu_name<br/>" $menu_icon {<br/>n";
     }
 
     foreach my $entry (@{$menu->{'entries'}})
@@ -1580,9 +1665,10 @@
 
             my $name = $desktop->{'PrepName'};
             my $exec = $desktop->{'PrepExec'};
+            my $icon = findicon(add_png_extension_if_needed($desktop->{'Icon'})) || "-";
 
             $output .= ' ' x $indent;
1.            $output .= " prog <br/>"$name<br/>" none $exec<br/>n";
+            $output .= " prog <br/>"$name<br/>" $icon $exec<br/>n";
         }
         elsif ($entry->{type} eq 'menu')
         {

У меня получилось примерно следующее:

Oct 3, 2009 - 2 minute read - life

Последние электрички

Наболело, размещаю тут копию письма на адреса mail@expresspk.ru и primexpress@mail.ru (взяты с http://expresspk.ru) с копией на info@primamedia.ru

Предлагаю разместить ссылку на этот пост на всех доступных вам ресурсах. А так же писать свои комментарии в адрес ЭкспрессПК.

Доброй ночи.

Ребата, вы совсем… … отменять последние электрички?

Теперь что бы сходить в поход на выходные, куда нить на Скалистую или Воробья, обратно нужно бегом бежать, что бы успеть на ЕДИНСТВЕННУЮ вечернюю электричку? или есть какой другой способ выбраться из Красноармейского с рюкзаком под 25 кг за спиной?

А из города? Ладно, убрали электричку в 21:40, ерунда, что теперь, после работы с девушкой в кино не сходить, потому как живешь на угольной, последний автобус примерно в 20:00, а более-менее хорошее кино идет часа два, а ещё и добраться от кинотеатра нужно. Вы плюнули, мы - утерлись. Второй раз, в первый было, когда днем электричек стало практически незаметно.

Но когда отменяется и электричка на 20.30 из центра, это уже смачный харчок (и не говорите, что мол, Чуркинская осталась, до Моргородка из центра, ещё добраться нужно, по пробкам, сколько времени теряем?). Или что, нету никакой на вас управы, и можете творить что хотите? Терпеть хамство контроллеров? Хотя их ещё понять можно, вы, понятия не имею, как вас прилично называть можно, сидите далеко, а им аплеухи достаются за ваши творения. А нам, ночевать на лавочке или платить по 600-800 рублей за такси до Угольной? А если в Артеме или Надеждинске человек живет?

Повторюсь с вопросом: какие альтернативные пути добраться домой на Угольную, вечером из Владивостока, хотя я чертовски некорректен: Угольная - это Советский район, г.Владивстока, так что, просто из одного конца Советского района (Вторая речка) до другого? Сверхдорогое такси? А сделать это же днем? На марштурке за 60 рублей? или на забитом, как сардины в бочку, 102 маршруте, который тоже ходит не часто и намного дольше?

PS копию письма размещаю у себя в блоге http://hatred.homelinux.net в открытом доступе.

– Пытающийся найти к вам хоть каплю уважения, Alexander Drozdov

Oct 2, 2009 - 3 minute read - programming

0b00100100

Покрутил тут ардуино,точнее прикручивал к нему ЖКИ, для него хоть и есть готовая библиотека, но хотелось разобраться с даташитом и сделать по описанию (задача удалась процентов на 90, т.к. подглядывать в исходники библиотеки пришлось, но, как в итоге оказалось, из-за небольшой ошибки в схемотехнике,так бы моё работать начало).

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

#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

или в восьмеричном:

#define BIT0 0001
#define BIT1 0002
#define BIT2 0004
#define BIT3 0010
#define BIT4 0020
#define BIT5 0040
#define BIT6 0100
#define BIT7 0200

тут нетрудно проследить закономерности, разделив биты в группы по 4 (в hex представлении) или по 3 (начиная с нулевого, в oct представлении).

Но голова не резиновая, решил поискать, а не придумали что в C/C++ для непосредственного задания констант в битовом представлении.

Оказалось - придумали, по крайней мере в компиляторах GCC и GCC-AVR можно задавать непосредственно битовое число, используя префикс 0b:

#define BIT0 0b00000001
#define BIT1 0b00000010
#define BIT2 0b00000100
#define BIT3 0b00001000
#define BIT4 0b00010000
#define BIT5 0b00100000
#define BIT6 0b01000000
#define BIT7 0b10000000

или (кому как более наглядно):

#define BIT0 0b1
#define BIT1 0b10
#define BIT2 0b100
#define BIT3 0b1000
#define BIT4 0b10000
#define BIT5 0b100000
#define BIT6 0b1000000
#define BIT7 0b10000000

Не ручаюсь абсолютно на совместимость с другими компиляторами (да и нет её скорее всего), но интересно было бы узнать как там обстоят дела с подобной bin-нотацией констант.

PS да, объединять потом в нужное число или исключать нужные биты:

unsigned char c1 = BIT0 | BIT4 | BIT7; /* включить биты */
unsigned char c2 = c1 ^ BIT4; /*выключить биты */
if(c1 & BIT4) {} /* проверить установку бита */

UPD:

Вот выдержка из документа по GCC, страница 556:

6.56 Binary constants using the ‘0b’ prefix nteger constants can be written as binary constants, consisting of a sequence of ‘0’ and ‘1’ digits, prefixed by ‘0b’ or ‘0B’. This is particularly useful in environments that operate a lot on the bit-level (like microcontrollers).

Секция 6 этого документа зовется “Extensions to the C Language Family”, в начале этой секции говорится:

GNU C provides several language features not found in ISO standard C. (The ‘-pedantic’ option directs GCC to print a warning message if any of these features is used.) To test for the availability of these features in conditional compilation, check for a predefined macro GNUC, which is always defined under GCC. These extensions are available in C and Objective-C. Most of them are also available in C++. See Chapter 7 [Extensions to the C++ Language], page 547, for extensions that apply only to C++. Some features that are in ISO C99 but not C89 or C++ are also, as extensions, accepted by GCC in C89 mode and in C++.

сиречь, если захотите публиковать программу, скомпилируйте её с параметром -pedantic, проверьте все предупреждения и… или давайте рекомендации или используйте препроцессорные директивы.

Sep 28, 2009 - 2 minute read -

Микродрель на коленке

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

Посмотрел в Омеге, такая там стоит около 700 рублей, пока соотношение - нужности/цены не в её пользу, но отверстия сверлить нужно. Купил сверла 0.5, 0.7 и 1.0 мм (нужно ещё будет 1.5 мм взять), нашел дома двигатель (мощный движок EG1000 от привода ЭПО), сбил шестеренку…

И тут стал вопрос - а как сверла то крепить? Тут вспомнил, что в наборе “юного химика”, у меня должен быть шприц с иглой, снял иглу, ухватил крепко тонкогубцами и стянул пластиковое основание, примерил - туда в аккурат с натягом взалит 1мм сверло, и то хорошо, капнул каплю лактайта, насадил сверло.

На шток двигателя намотал немного изоленты, промазав лактайтом (лучше если усадить термоусадки, но у меня подходяшего диаметра не оказалось).

Cобрал конструкцию, питание подал 12В от старого блока питания, ещё AT. Вращение получилось соосное, попробовал - нормально сверлит дерево, стеклотекстолит в т.ч. с фольгой, так что пока на первое время хватит. Вот только движок сильно греется, так что нужно делать перерывы или сменить на менее мощный.

Конструкция в сборе:

UPD:

Но в Омеге купил таки микродрель, хотя теперь мало-мало плююсь, вал там из какого-то сверх-мягкого материала, нужно будет отдельно патрон взять на мощный мотор, если что суровое сверлить :)

Sep 20, 2009 - 1 minute read -

Раритеты

Вчера перебирал завалы своей радиоэлектронной элементной базы. Походу копания попались довольно забавные вещички, некоторым место в музее уже :)

Фото смотреть подкатом.

Sep 16, 2009 - 1 minute read -

Интернет радио

Искал, что себе подключить на послушать на работе, в результате ничего подходящего не нашел. Сделал на связке mpd+icecast2 (почитать можно тут и тут).

Адрес: http://hatred.homelinux.net:8000

Добавить в проигрыватель: http://hatred.homelinux.net:8000/radio.ogg

Пару заметок для ArchLinux:

  1. создать директорию: /var/log/icecast и сменить владельца на nobody
  2. прописать в загрузке сначала icecast, потом mpd

Ну и запустил вещание свободной музыки с Magnitune, добавлял при помощи плагина к gmpc - gmpc-magnatune.

ЗЫ сегодня в эфире джаз :)

Sep 10, 2009 - 1 minute read - life

Попэарим

http://headshotboy.livejournal.com/93626.html пейсатель Багиров пилит сук на котором сидит, поможем сохранить ветку - поругаем его.

Да, к нацикам, как и к обратному их проявлению, ровно как и другим радикалам отношения не имею )

Sep 9, 2009 - 1 minute read -

Простой информер "Сайт переехал"

Иногда сайт переезжает на новое место, часто при этом структура не меняется и возникает необходимость как-то довести до пользователя, что данное событие состоялось. Можно просто уведомить в новостях, это безусловно нужно, но я использовал следующий вариант…

Для случая использования apache+php (другие варианты возможно будут рассмотрены, особо интересно на nginx+perl):

В корне сайта создаем файлы .htaccess и index.php

.htaccess:

RewriteEngine on
RewriteBase /
RewriteRule ^$                        index.php  [L]
RewriteRule (.*)                      index.php  [QSA,L]

index.php:


<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="Refresh" content="10;http://linuxdv.ru<?=$_SERVER['REQUEST_URI']?>">
</head>
<body>
	<div align="center">
		<h1>Сайт переехал</h1>
		Сайт переехал на новый хостинг, предоставленный компанией <a href="http://linuxcenter-dv.ru">Линуксцентр ДВ</a><br />

		Через 10 секунд Вы должны быть перенаправлены на новый адрес, если Ваш браузер не поддерживает перенаправление,
		нажмите на ссылку ниже для перехода на новую страницу:<br />

		<strong>
			<a href="http://linuxdv.ru<?=$_SERVER['REQUEST_URI']?>">http://linuxdv.ru<?=$_SERVER['REQUEST_URI']?></a><br />
		</strong>
	</div>
</body>

Пример работы можно посмотреть по следующему адресу (может стать уже неактивным): http://vl-lug.homelinux.net

Sep 5, 2009 - 1 minute read - projects linux

Crowns: версия 0.3.0

Реализовано измерение площадей, написаное базовое руководство пользователя.

Подспутно некоторая оптимизация по скорости.

Страница для скачивания тут