Hatred's Log Place

DON'T PANIC!

Nov 16, 2009 - 1 minute read - Comments -

Последние события жизни LUG

Крайне кратко и обзорно.

31 октября провели Arch Linux Install Fest, поставлен на несколько машин, некоторым помогли разобраться с возникшими проблемами, в частности о установке и создании RAID1, потому как оригинальный мастер установки этого не позволяет, но есть всё необходимое, дабы это реализовать.

Как раз проведение совпало в первым снегопадом, но людей было много, настоящие пингвины снега не боятся :)

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

Второй снегопад совпал с проведенной мини-туксовкой (был я, leen, morphey) 15 ноября, на которой разбирали, вопрос с корректным выключением и перезагрузкой борды на арме, собственно появилось несколько решений, вспомнил старый добрый SourceNavigator, который опять начал развиваться.

Следущее мероприятие, ориентировочно - 5го декабря.

Oct 30, 2009 - 6 minute read - Comments - linux

Как запустить...

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

Начальная загрузка

Тут относительно просто, и уже все рассмотрено в интернетах, но пару слов скажу.

После того как ядро загрузилось, оно передает (в общем случае) управление пользовательскому процессу init (обычно /sbin/init), который дальше запускает необходимые скрипты, соотвутствующие разным уровням запуска (знаменитые run-levels((0 - останов; 1(S) - однопользовательский режим; 2 - зарезервирован; 3 - многопользовательский режим; 4 - зарезервирован; 5 - запуск графической системы; 6 - перезагрузка))). Какие скрипты будут запускаться, определяется в файле /etc/inittab, там же определяется какой run-level будет использован для запуска, по умолчанию (его можно передать через команду загрузки ядра), в классической схеме, это - 3. В модных дистрибутивах, это - 5.

Hint: man inittab

Скрипты запуска, указанные в конфиге init, обладают своей логикой, в зависимости от дистрибутива, в большинстве своём, реализуют схему загрузки в стиле SysV (Mandriva (ex. Mandrake), Fedora (ex. RedHat), AltLinux, ASPLinux и им подобные) или BSD-like (типа Slackware, ещё примеров не приведу). Часто схему трудно определить, например в моём любимом ArchLinux: вроде просто набор скриптов в /etc/rc.d, но управляются порядком запуска удобно через /etc/rc.conf.

Обычно скрипты, запускаемые лежат в /etc/rc.d или /etc/init.d, как их запускать в различных ранлевелах, рассказывать не моя задача, хочу сказать, что так или иначе, всегда есть специальный скрипт с именем /etc/rc.local, или /etc/rc.d/local, или /etc/init.d/local или различные вариации на эту тему (интересно для своего дистрибутива - поищите в http://google.com/linux). Этот скрипт нужен, что бы пользователь прописал туда свои команды, которые нужно выполнить при загрузке. В некоторых системах существует скприт rc.local.shutdown, который выполняется при выключении или перезагрузке, поищите его у себя.

Справедливости ради, стоит отметить, что схемой init/SysV/BSD схемы загрузки не ограничиваются, у меня на сервере, допустим, дополнительно используется daemontools для управления автоматическим подключением по pppoe((статья на эту тему: http://hatred.homelinux.net/wiki/zhurnal:2008-10-21_13.26_avtopodkljuchenie_pppoe._perepodkljuchenie_pri_razryve)). Данный механизм относится к асинхронной загрузке + перезапуск сервиса в случае его краха. Кроме того, существуют варианты загрузки с зависимостями (в ArchLinux существуют только базовые средства для определения зависимостей), когда запускаемый процесс определяет, что ему нужно для работы ещё какие-то процессы и автоматически пытается их загрузить. В общем, тут есть что почитать для общего развития, для начала - про свой дистрибутив.

Подытоживая: при начальной загрузке в ArchLinux, пользовательские команды можно прописать в файл /etc/rc.local, команды, выполняемые при выключении/перезагрузки можно прописать в /etc/rc.local.shutdown. Обратите внимание: это файлы можно править только от root’а, и команды из них выполняются только от пользователя root, соответственно, если нужно понизить привилегии, используйте команды:

su - <USER> <COMMAND>

или

sudo -u <USER> <COMMAND>

Вход в систему

Я не буду рассматривать вариант непосредственного запуска в уровень 5 - запуск графической системы. Если случаются какие проблемы, легче их поглядеть для начала в консоли. Но это моя философия.

Итак, вы загрузились, у вас на экране приглашение ввести логин и пароль. Задумываемся, а как сделать так, что бы команды выполнялись после ввода логина и пароля…

Тут немного отвлечемся.

У каждого пользователя или через /etc/passwd или через ldap или ещё какую пень-колоду но задана командная оболочка, в народе - шел((от слова shell)), после успешной проверки имени и пароля, собственно и запускается для пользователя эта его оболочка. В качестве её можно, впринципе, прописать что угодно, есть даже такие команды замечательные: /bin/false или /bin/true, которые можно прописать, и пользователь никогда не войдет в систему (например, ему доступна только почта, удаленно, зачем ему давать локальный файловый доступ?) или rssh - оболочка для ограниченного доступа по ssh, если хотим, что бы пользователь мог заливать себе файлы, но не мог зайти в командный режим (понятно, ога, мне самому не поятно :laughing:)

В общем, при запуске, оболочка считывает настройки и выполняет команды, например bash: * выполняет команды из /etc/profile - общесистемный * из /etc/profile цепляется файл /etc/profile.bash - для конкретной оболочки * далее цепляются скрипты из /etc/profile.d/*.sh * после выполняются файлы в домашней директории пользователя: * ~/.bash_profile * ~/.bash_login (если не обнаружен предыдущий) * ~/.profile (если не обнаружен предыдущий) * ~/.bashrc (всегда)

Вышеперечисленные файлы, кроме .bashrc, выполняются только когда оболочка bash запускается как login-shell (с параметром -l), т.е. или сразу после ввода логина и пароля, или когда принудительно запущена как ‘bash -l’

.bashrc выполняется каждый раз, когда запускается копия шела, а это происходит, например, когда запускается терминал (xterm, termit, konsole, gnome-terminal и пр.). Удобно сюда запихать вызов команд fortune и celebrat или cowsay наблюдать забавные фортунки и нотификации:

cowsay `date` `uname -a`
echo
celebrat
echo
fortune ru
echo

вот что имеем в итоге:

 ______________________________________ 
/ Fri Oct 30 10:23:42 VLAT 2009 Linux  <br/>
| gaz_eeepc 2.6.31-ARCH #1 SMP PREEMPT |
| Fri Oct 23 11:12:58 CEST 2009 i686   |
| Intel(R) Atom(TM) CPU N270 @ 1.60GHz |
<br/> GenuineIntel GNU/Linux               /
 -------------------------------------- 
        <br/>   ^__^
         <br/>  (oo)<br/>_______
            (__)<br/>       )<br/>/<br/>
                ||----w |
                ||     ||

Meeting at the LUG tomorrow.
День военной разведки РФ six days from now.

Рyкописи, может быть, и не горят. Зато диски С отлично форматирyются.

Когда login-shell закрывается (набрали exit или logout) выполняются команды из файла ~/.bash_logout

Загружаемся в X-Window

Теперь дошла очередь до загрузки иксов.

И вновь нам нужно что-то как-то запустить. Я опишу свой случай, когда используется такая связка: staybox + openbox.

Для начала базовый функционал, который предоставляет сами иксы: 1. прописывать системные команды в /etc/X11/xinit/xinitrc 2. создавать скрипты в /etc/X11/xinit/xinitrc.d 3. свои персональные команды в ~/.xinitrc

Первые два игнорируются, когда в домашней директории есть файлик ~/.xinitrc, так что, если вы рулите иксами через него, подцепляйте системные из /etc/X11/xinit/xinitrc.d:

source /etc/X11/xinit/xinitrc.d/*

Если команда не отцепляется от терминала, то обязательно ставьте & в конце команды, некоторые команды можно запускать отложенно при помощи такого фокуса:

(sleep 5; command ) &

В конце файла ~/.xinitrc всегда должна стоять команда bashexec <ваш оконный менеджер или DE> без всяких & в конце.

Пример моего файла, некоторые команды закоментированы (исторически сложилось :))

#!/bin/sh

#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
#

# http://www.linux-archive.org/debian-kde/20524-fish-ssh-kioslave-doesnt-work.html
export KDE_FORK_SLAVES=true

xhost +127.0.0.1
xhost +localhost
#kdeinit &
#gnome-settings-daemon &

#asusosd &
#noteo &

xscreensaver -nosplash &
xrdb ~/.Xdefaults

#gkrellm &
#osmo &
#xfce4-power-manager
xbindkeys
#wicd-client
#icewmtray &

(sleep 5; sbxkb) &

#numlockx
#blueman-applet &

# regenerate menu
#mmaker -f -t xfterm icewm &

#nvidia-settings -a InitialPixmapPlacement=2

source /etc/X11/xinit/xinitrc.d/*
#gnome-keyring-daemon -d

exec ck-launch-session staybox-session
#exec openbox-session
#icewm-session
# exec icewm
#exec startkde
# exec blackbox
# exec fluxbox
#exec startxfce4
#exec afterstep
#exec xterm


##################################################################
# For LXDE only
##################################################################

# Корректор клавиатурного ввода, индикатор раскладки
#gxneur &

# Мыльный нотификатор
#mail-notification &
#gnubiff --systemtray --nogui &

#exec startlxde
#exec xterm

#exec /usr/share/antico/antico

Всякие менеджеры сессий, которые являются неотъемлемой частью различных DE: KDE, Gnome, XFCE, LXDE и т.п. или используемый мною Staybox для собственного окружения, так же читают .desktop файлы из директорий: 1. системные, общие для всех пользователей: /etc/xdg/autostart/ 2. пользовательские: ~/.config/autostart/

Кроме того, у Staybox есть файл ~/.config/staybox/autostart в который можно в специальной форме прописывать команды, так если перед именем команды ставить @, то менеджер будет следить за ним, и, если он рухнет - перезапускать.

У меня в этом файле прописано:

@lxpanel
@pcmanfm -d
dbus-launch nm-applet

Staybox после запускает оконный менеджер, по умолчанию это OpenBox. У него тоже свои средства для запуска приложений, это файл: ~/.config/openbox/autostart.sh

Для оконного менеджера IceWM, файлом запуска будет ~/.icewm/startup

Хочется отметить, что в случае использования xdm/gdm/kdm/slim или им подобным графическим менеджерам входа в систему, стадия пользовательского .xinirc пролетает, и там следует отдельно читать как выполнить свои команды, но я данный подход не использую, поэтому особо и не страдаю.

На этом пожалуй все, если у кого есть что дополнить - комменты ждут.

Oct 27, 2009 - 1 minute read - Comments -

Макробиблиотека CyrillicTools для OpenOffice

Юзал давно, недавно опять вспомнил, сходу найти не смог, поэтому оставляю эту заметку.

Библиотека представляет собой набор макросов на OpenOffice Basic для работы с кирилистическим текстом, всякие заявленные “сумма прописью” я не использую, но вот когда открываешь документ в старом формате MS Office 95 (пользователям 1C посвящается), то часто там битая кодировка, помогает преобразить текст конвертация Latin1->Cyrillic.

В документации сказано как установить библиотеку для всех пользователей в системе, но, если нужно по быстрому, то в OpenOffice 3.x и выше можно воспользоваться услугами менеджера расширений: * скачать архив библиотеки: http://openoffice.vspu.ac.ru/cyrtools1.3.uno.zip * в запущенном OpenOffice выбрать Tools -> Extension Manager, нажать Add… и выбрать скачанный вами архив * перезапустить OOo и наблюдать новый пункт меню Cyrillic Document

Сайт проекта: http://openoffice.vspu.ac.ru/ Документация проекта: http://openoffice.vspu.ac.ru/doc/

Из дополнительных интересных расширений советую посмотреть LanguageTool((Домашняя страница: http://www.languagetool.org/)), в некоторых сборках OpenOffice он уже идет в комплекте, проверьте свою.

Oct 22, 2009 - 2 minute read - Comments - linux programming

medit: 'PHP check syntax' tool

Medit((http://mooedit.sf.net)) замечательный редактор, написанный на Gtk, пока, за малым исключением, удовлетворяет все мои запросы. Корнями уходит графическому интерфейсу GGAP((http://ggap.sourceforge.net/)) для GAP((http://www.gap-system.org/)). Будет время, напишу более полную заметку про него, благо, писать есть что.

Но сегодня рассмотрим вопрос создания тула ‘PHP syntax check’.

Делаем тул

Первым делом идем в Изменить -> Параметры -> Инструменты вкладка Панель инструментов и создаем новый инструмент, даем ему имя ‘PHP syntax check’ и нажимаем Enter. Далее заполняем поля инстумента:

* Файлы: langs:php * Параметры: need-doc или need-save (подробности в документации) * Тип команды: команда оболочки * Вывод: Панель вывода * В окне ввода скрипта пишем: bashphp -l $DOC

Все, сохраняем, выходим. Теперь, когда мы будем редактировать php скрипт, у нас в меню Инструменты будет появляться пункт ‘PHP syntax check’, вывод по которому будет производиться в окно вывода.

Оптимизируемся

Тул работает, но если возникает ошибка, удобно было бы переходить по клику по не в окне вывода в нужное место документа.

Вспоминаем, что при создании инструмента был пункт Фильтр… Они нужны как раз, что бы Medit из потока вывода мог выбрать для себя нужные данные, на основе которых сделать какие-то действия. Только для наших задач фильтра нет. Нет, так создадим!

Идем в ~/.local/share/medit и создаем там файл filters.xml с, примерно, таким содержимым:

<filter id="php-syntax-check" name="php-syntax-check">
  <match what="stderr" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;<br/>d+)"/>
  <match what="stdout" pattern=".*Parse error:.* in (?P&lt;file&gt;[^:]+) on line (?P&lt;line&gt;<br/>d+)"/>
</filter>

Описания формата нет, а мои изыски на официальной вики канули в лету, поэтому пока так: * ?P((в XML:xml?P<file>)) говорит Medit, что в этой позиции находится имя файла. * `?P<line>`((в XML:xml?P<line>```)) говорит Medit, что в этой позиции идет строка.

Все остальное - обычные регулярные выражения. Более подробные применения фильтров, можно глянуть в /usr/share/moo/filters.xml, особенно пасы с pop/push

Теперь идем обратно в Изменить -> Настройки -> Инструменты, ‘PHP syntax check’ и в качестве фильтра выбираем наш ‘php-syntax-check’ сохраняемся. Теперь если при проверке синтаксиса вылетит ошибка, мы можем перейти на неё, просто щелкнув по строчке с сообщением о ней.

В качестве дополнительного тюнинга, идем Изменить -> Настройка горячих клавиш, в списке находим ‘PHP syntax check’ и задаем горячую клавишу, я задал F9.

Несколько снимков экрана, всё кликабельно:

Настройка инструмента

Настройка горячей клавиши, пример работы на заднем фоне

Oct 21, 2009 - 3 minute read - Comments - linux

NetworkManager

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

Это пост-размышление и попытка найти золотую середину.

Итак, исходное: нетбук Asus EeePC 1000H, дистрибутив ArchLinux, из тех менеджеров, что можно найти в стандартных репозитариях: networkmanager, wicd, nuts (в AUR или в чакра-проджект).

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

wicd

Исторически так сложилось, что это был первый мененджер сетевых подключений, который я использовал. Он меня всем устраивал, даже тем, что можно было указать только под одному сетевому интерфейсу для проводной и беспроводной сети. Все, больше ничего лишнего: не VPN, не PPPoE, ни подключения телефона и т.п. Только управление профилями проводных и безпроводных (WIFI) сетей.

Изначально обладал только графическим клиентом - wicd-client, в последних версия обзавелся и консольным - wicd-curses, и все бы было хорошо, если бы не написан на питоне (есть у меня предубеждения к этому языку, считаю его идеальным для обучения хорошему стилю кодирования, но не как не для создания полноценных приложений, по сути, в мире *nix он стал эквивалентом Visual Basic для Windows).

Ладно, мне главное ехать, а не шашечки. Но в какой-то момент времени стали наблюдаться непонятные события - при отключении сетевого подключения (например если просто вынуть кабель) долгие тормоза, при этом от системы никакого отклика. Те же события при подключении, причем, я не могу выловить закономерности (мало-мало грешу на флеш в Firefox, конкретно - всякие ролики типа с Ютуба). Это меня сподвигло на поиск альтернативы.

NetworkManager

Логичной альтернативой стал NetworkManager, разработанный в рамках проекта Gnome. Исследуя его зависимости, оказалось, что сам демон (NetworkManager) от gnome никак не зависит, а вот с клиентами чуть каша (про это позже).

Краткие возможности: написан на Си, что несколько радует, позволяет настраивать сеть по нескольким сетевым интерфейсам, как проводным так и беспроводным, позволяет настраивать соединения по PPPoE, поддерживает настроку VPN (OpenVPN, pptp и ещё что-то), но через допольнительные плагины (которые требуют, для чего-то, установленного network-manager-applet)

Стандартный клиент - gnetwork-manager-applet (вызывается nm-applet), встраивается в системный трей, откуда можно вызвать и конфигуратор, имеет гномовские зависимости: gnome-keyring, policykit-gnome, notification-daemon

Есть клиент для KDE - knetworkmanager, к сожалению есть только в AUR((http://aur.archlinux.org/packages.php?ID=19526)) и только для KDE3

Для консоли, клиент cnetworkmanager-git или cnetworkmanager, опять таки только в AUR((cnetworkmanager-git - http://aur.archlinux.org/packages.php?ID=18097 или cnetworkmanager - http://aur.archlinux.org/packages.php?ID=29595)). Клиент написан на питоне.

В общем, GUI клиента без лишних DE зависимостей пока найти не удалось, так что если кто предложит, написанный только на QT/Gtk, буду благодарен, а пока наблюдаю работа в nm-applet.

nuts

Орешки :) Но пока я его не расколол - в клиенте так и не увидел ни одного профиля. Из минусов программы: жесткая настройка сетевых профилей в конфигурационном файле, но работать может с несколькими интерфейсами. В комплекте графический клиент на QT4 - qnut и консольный - cnut.

Доступен из AUR((kdemod-nut-git - http://aur.archlinux.org/packages.php?ID=28846)) или из репозитариев чакра-проджект((У них есть отличное руководство - http://chakra-project.org/wiki/index.php/Get_NET_with_NUT)), для отстройки нужен пакет kdemod-openresolv((http://aur.archlinux.org/packages.php?ID=28847)) и хотя оба пакета в своём названии содержат kdemod, никаких kde зависимостей они не тянут((openresolv вообще набор скриптиков)).

Вообще программа интересная, буду курить, но больше мне про него на данный момент сказать нечего.

Oct 20, 2009 - 5 minute read - Comments - programming

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

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

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

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

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

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

Начал свой рассказ с небольшой демонстрашки, топорной, но да не суть, можно будет после переделать.

В общих чертах рассказал что собой представляет плата Arduino, какие внешние интерфейсы предоставляет.

После беглого знакомства, перешли к демонстрации, того, что я сказал словами.

Первый пример, был типичным из оперы “Hello, world!”, я назвал его - “Hello, Arduino!”, представляет собой простейшую программку, которая дрыгает 13м цифровым выходом, устанавливая там поочередно высокий и низкий уровень. Сердобольные разработчики подумали о начинающих, что бы они смогли сделать быстро свой первый проект: на 13ю ногу посадили светодиод. Так что, дрыгая ногой, мы заставляем мигать его, получается простейший маячок :)

Далее, усложнили этот пример, оставил программу той же, но на 13 ногу посадили простейший генератор прямоугольных импульсов, и, дабы не нагружать ногу коммутацией, а только управлением, добавил простейший ключик на транзисторе. Схемка прилагается.

Результат - тот же маячок, только звуковой.

Есть у нас генератор звука, управляемый автоматически микроконтроллером, что дальше? А дальше первое, что приходит на ум - автоматический генератор азбуки морзе.

Сказано - сделано, теперь уже не меняется схема, а меняется программа, которая стала выбивать морзянкой “Hello, world”, так что, первый полноценный пример хеловорлда.

Далее, думаем, а ведь дергая ногой мы тоже формируем прямоугольные импульсы, а следовательно… А следовательно, что бы издавать звук морзянки, нам даже не нужна никакая внешняя схема!

В качестве примера генерации звука, я ограничился только бип-бип, дальше - полет фантазии.

После этого перешли к ШИМ ((Широтно-импульсная_модуляция|ШИМ (или PWM) - Широтно Импульсная Модуляция (Pulse Width Modulation) )), и опять таки, ничего сложного, по сути, то же дерганье ногой.

Демонстрационный стенд представлял собой ключ на мощном полевом транзисторе, для коммутации силовой цепи, кулер на 12В от старого компьютерного блока питания и сам блок питания стандарта АТ.

Программная часть была реализована с помощью программного ШИМ (без задержек) и с помощью ШИМ на таймере (используя только стандартную библиотеку Arduino ((Подробнее - EN/RUS))). Там же было реализовано базовое взаимодействие с пользователем через терминальную программу (в демонстрации использовал screen /dev/ttyUSB0 9600).

К этому времени, мы уже задергались ногами, пора уже что-то и вводить. Для этих целей применил обычную PS/2 клавиатуру, но стандартная AT или даже XT вполне тоже подойдут для этих целей, программа только читает скан-коды, все остальное можно почерпнуть в интернет, в частности таблицу этих самых скан-кодов.

Затем перешли к вопросу: а можно сделать гирлянду на новый год? Можно, вот только 14ти светодиодов будет явно маловато, в случае индивидуального управления. Как быть? А так же, как быть, если для управления не хватает 14 цифровых выходов? Ответ находим листая даташиты (по русски - спроврочные листки) на микросхемы логики 74й серии (можно и любую другу, главное фантазия и предоставляемые возможности), находим там чудный образец 74HC595 - сдвиговый регистр ((Что такое и с чем едят, а так же варианты другой логики - Shift_register|EN /Регистр_(цифровая_техника)|RU )).

Из всего умного: при помощи трех интерфейсных проводков (стробирование, клок и данные), накачиваем побитово байт в микруху, после чего переключаем состояние строба с высокого на низкий уровень, и заданные байтом биты становятся активными на выходах микросхемы. В итоге имеем преобразование - 3 выхода в 8. Но и это не все! Есть чудный выход 7’, туда начинает вылазить, что не поместилось в 8 бит, а следовательно, мы можем их цеплять последовательно, получая на тех же самых 3х выходах 8-16-24 и т.д., главное, что бы быстродействия хватило :)

Подробнее популярно про сдвиговый регистр можно прочитать на сайте http://easyelectronics.ru, там же есть хак, как можно управлять регистром по 2м и даже 1 проводу (встречу в производстве - убью, такая фраза про это решение :))

Для демонстрационного стенда нарисовал схемку (gschem((http://www.gpleda.org/index.html))), сделал разводку (pcb((http://pcb.gpleda.org))) и по технологии Лазерно-утюжная_технология|ЛУТ сделал печатную плату, сделал с таким расчетом, что бы можно однотипные наращивать в каскады без пайки.

Программная часть представила собой 1 функцию для вывода байта в сдвиговый регистр и вывод цифр от 0 до 255 (от 0b00000000 до 0b11111111 в бинарном виде), индикация - светодиодами.

Теперь можно и собрать гирлянду и управлять сегментными индикаторами, на которые нужно много ног. Но помимо сегментных индикаторов, есть и LCD дисплеи на чипе HD44780((Подробности - EN/RUS)), по сути является стандартом де-факто. Демонстрационный стенд для подключения этого индикатора по 8битной и 4битной шине был следующим после сдвигового регистра. Программная часть была сделана на собственных функциях (полностью своя реализация работы с дисплеем, используя только справочный листок) и на библиотеки LiquidCrystal, идущий вместе с ПО Arduino.

Уже после семинара, я подключил данный индикатор через сдвиговый регистр, сделав так, что теперь на индикатор тратится 4 вывода, 3 из которых управляют сдвиговым регистром, а 1 заведен на Enable вывод LCD (без этого работа получалась не стабильной, где-то слетали тайминги и индикатор начинал сходить с ума).

На этом мои демонстрационные примеры закончились, и сделали небольшой экспромт: Руслан Остапенко, привез свой модуль Arduino с подключенным цифровым температурным датчиком DS18B20 с выводом строки с температурой на последовательный порт. Соединили RX/TX выходы Arduino, на моем модуле, настроил прием строки и вывод её на дисплей. Монстрообразно, нннно :)

На этом закончили и разошлись, не успел сделать демонстрацию работы по шине i2c, для чего прикупил часы реального времени PCF8583, но, думаю, не последний раз собираемся.

В общем, Arduino хороший способ окунуться в мир микроконтроллеров, без опасности утонуть :)

PS Фото предвидятся.: * http://linuxcenter-dv.ru/gallery/2009-10-17/ от Im’а * http://picasaweb.google.ru/25ru.shilo/geIvk от Rushila * будут дополняться(???).

Материалы по мастер-классу

  • - презентация, схемы, разводка печатных плат, исходные коды для Arduino, схема модуля Arduino 2009 + бонусом мои компоненты для schem и pcb
  • Справочные листки используемых компонент:
    • - LCD
    • - сдвиговый регистр
    • - температурный сенсор

Полезные ссылки

Oct 19, 2009 - 2 minute read - Comments -

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 - Comments - linux

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

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

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

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

Oct 16, 2009 - 1 minute read - Comments - life

Уважаю БГ!

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

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

Oct 11, 2009 - 2 minute read - Comments -

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 - Comments -

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

Подробно это описано в АрчВики по следующим ссылкам: * http://wiki.archlinux.org/index.php/XdgMenu#IceWM * http://wiki.archlinux.org/index.php/IceWM#Menu

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

Беда в том, что меню генерируется без картинок. Пошаманив немного, а если быть точнее - подсмотрев в 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 - Comments - 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 - Comments - 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 - Comments -

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

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

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

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

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

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

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

UPD:

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

Sep 20, 2009 - 1 minute read - Comments -

Раритеты

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

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