LINUX.ORG.RU

Сообщения uuwaan

 

Как размещать код SQL в проекте?

Есть проект десктопного приложения, который я сейчас активно рефакторю. Там и в коде бардак и в структуре каталогов. Положил я всё это в git, коммичу:

loader/ui: center OK button
loader/model: refactor SomeClass code
...

При этом:

  • файлики, меняемые коммитом «loader/ui», в каталоге проекта лежат тоже в loader/ui;
  • от коммита к коммиту проект должен собираться и работать;
  • коммит не должен изменять более одной области проекта.

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

Первое, что хочу сделать – распилить один файл на мелкие, по одному на каждую таблицу/вьюху/процедуру.

А дальше вопрос – куда их класть? Например, есть класс FooStorage с методом GetFoos, который дёргает хранимую функцию fnGetFoos. Получается, что код fnGetFoos – это как бы часть класса FooStorage, и лежать бы ей рядом с исходником FooStorage. Но я нигде не видел, чтобы SQL исходники хранили вместе с другими, видел только раздельное хранение.

Если я большой SQL распилю, а его части переносить не буду, тогда я буду вынужден нарушать свои же правила по ведению истории git:

  • изменю скрипт таблицы и закоммичу – поломаю код;
  • изменю и скрипт и код класса одновременно – коммит изменит больше одной области;
  • изменю и скрипт и код класса одновременно, и напишу в коммите loader/model – вроде бы всё верно, но один из изменённых файлов не лежит в подкаталоге, указанном в коммите.

Мозги плавятся, перфекционист внутри грызёт углы и воет: хочется сделать правильно и красиво. Возможно, я наркоман.

А как у вас хранятся SQL в проектах? Или может болт забить на аккуратную историю в git и просто фигачить? Проект веду я один, в принципе git могу вести как угодно, но хочется потомкам оставить хорошо структурированную историю.

 , ,

uuwaan
()

Десктоп за 40к

Здравствуйте, господа! Нуждаюсь в вашей помощи.

Проблема моя в том, что я, вернувшись из армии в конце 2010го, прикупил себе ноутбук Lenovo Z570 и до сего момента счастливо на нём кодил. Мир железок и их спецификаций стремительно удалился от меня, друзья, у которых можно было спросить, теперь сидят в планшетах и тоже не алё. И тут мне захотелось поиграть... Я не гонюсь за топовой графикой, макс настройками и т.д., просто хочется пройти выходящий скоро Starcraft не в минимальных настройках и попробовать Elite: Dangerous.

В общем, захотел собрать себе настольный компьютер. Цены на уже собранные - жуть, но что ещё хуже, я понял что совсем не понимаю циферок и буковок в названиях видеокарт, процессоров и памяти: что такое CL9/10/11, чем GTX950 от 960 отличается, чипсеты на материнках вообще тёмный лес, сколько под это хозяйство нужно ватт.

Помогите, пожалуйста, собрать системник в районе 40-45 тыс. Пожелания: ЦПУ Intel, ГА NVIDIA, небольшой но хороший SSD под систему, желательно, чтобы системы охлаждения были малошумные. Топовая производительность не нужна.

На этом всём будет крутиться Gentoo, на которой я буду для остальных машинок с Gentoo собирать бинарные пакеты, собственно поэтому и хочу Intel.

 , ,

uuwaan
()

Аналог стандартной библиотеки C++ для работы без исключений

Приветствую.

Понадобилось сделать небольшой проектик, в котором есть специфическое требование: сборка с флагами -fno-rtti, -fno-exceptions (gcc). В таком режиме бОльшая часть стандартной библиотеки превращается в тыкву. Вместе с тем, как мне кажется, если немного изменить интерфейс контейнеров, то их можно было бы использовать.

Например, возьмём vector и пофантазируем: у него можно оставить только конструктор по-умолчанию, move-конструктор, а операции типа resize() сделать не void и кидающими исключения, а bool и возвращающими false.

Не натыкался ли кто-нибудь на реализацию такой или похожей идеи? То есть: библиотеку контейнеров, которая по возможности копировала бы интерфейс стандартной, но при этом была пригодна для использования в режиме полного отсутствия механизма исключений.

 , ,

uuwaan
()

C++: передача коллекций из динамической библиотеки.

Есть у меня рабочий проект, который состоит из разделяемой библиотеки и утилит, которые выполняют прикладные задачи, дергая из неё функции. ПО пишется под Linux+Windows, и есть требования не использовать сторонние библиотеки. Из-за этого библиотека предоставляет не только функции, решающие конкретную проблему, но и всякие обёртки: рекурсивное сканирование каталога, чтение настроек из ini-подобного файла и т.д. И есть также требование, чтобы интерфейс библиотеки был максимально бинарно совместим: под Windows мы собираем в Visual Studio 2008, а другие проекты, юзающие библиотеку, могут быть собраны и в 2010, например; или в Линуксе мы собираем gcc + libstdc++, а клиенты библиотеки могут быть собраны чрез clang + libc++. Из-за этого интерфейс библиотеки оперирует только POD-типами данных и абстрактными классами с фабриками.

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

std::list<std::string> scanDir(const std::string &path)

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

Вижу два варианта:

1) пишем интерфейс «итератор по файлам», внутри либы пишем реализацию итератора, который хранит в себе std::list<std::string>, позволяет бегать по нему;

2) пишем интерфейс «коллбэк», передаём его в ф-цию, та его дергает, а мы на стороне клиента уже строим std::list<std::string>.

Покритикуйте пожалуйста подходы. Может, есть третий вариант?

 ,

uuwaan
()

mount(2) чудит

Хочу в своём коде примонтировать самбовскую шару, для чего использую такой вот кусок, подсмотренный в mount.cifs:

mount("//192.168.1.11/share", "/mnt", "cifs", MS_NODEV | MS_NOEXEC, "ip=192.168.1.11,unc=\\\\192.168.1.11\\share,user=petya,pass=vasya");
Мне возвращают 0, типа всё сделано, а по факту каталог монтирования как был пуст так и остался пуст. mount -t cifs -v ... выдаёт в отладочной печати ровно такую же строку параметров, и у него получается примонтировать шару, а у моего кода — нет. Код исполняется из-под рута. Чего ему не хватает?

 ,

uuwaan
()

Перегрузка функций, принимающих строки в C++

В стандартной библиотеке C++ есть куча функций вида:

void do(const char *text);
void do(const std::string &text);

Да, вроде здорово: можно передать и «сырую» строку и объект. А вот как быть, если строковых параметров два:

void set(const char *key, const char *val);

inline void set(const std::string &key, const char *val) {
    set(key.c_str(), val);
}

inline void set(const char *key, const std::string &val) {
    set(key, val.c_str());
}

inline void set(const std::string &key, const std::string &val) {
    set(key.c_str(), val.c_str());
}

Уже многовато перегрузок как-то. Пока что вообще не пишу перегрузок, принимающих std::string, но приписывать постоянно .c_str() некрасиво.

А можно написать так:

void set(std::string key, std::string val);

С точки зрения использования сплошная красота: принимаются оба типа строк, всего одна функция. Но если передать такой функции «сырую» строку, то она будет лишний раз скопирована в объект (поскольку от COW-реализации строк в C++ отказались), что нехорошо.

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

И ещё вопрос по оптимизациям в компиляторе. Вот такой код:

inline void set(std::string key, std::string val) {
    set_cargs(key.c_str(), val.c_str());
}

Может быть соптимизирован компилятором так, что создание промежуточного string не будет производиться, если оба параметра — const char *? Насколько я понимаю, так не получится, но может всё же кто-то сталкивался?

 ,

uuwaan
()

Конструкция антенны для 3G-модема

В данный момент на даче 3G-модем стоит на шесте под крышей дома, воткнутый в РЭМО Connect 2.0. Для ещё большего усиления сигнала хочу поэкспериментировать с офсетной спутниковой тарелкой СУПРАЛ 0.9. Истории успеха в Интернете есть. Так как у модема антенна ненаправленная, то часть мошности будет уходить на сигнал, идущий к зеркалу, а часть — в противоположную сторону. Эту часть в статье на Хабре предлагается перенаправить на зеркало с помощью жестяной банки.

Вопрос такой: а нельзя ли вместо этой банки использовать Рэмо-Коннект?

 , ,

uuwaan
()

Проблема с прошивкой Samsung Galaxy Note II.

С весны на аппарате стоит Cyanogenmod 10.1.3, сначала nightly-сборки, потом stable. Когда появились первые версии 10.2, я скачал, потыкал палочкой и восстановился из бэкапа на прежнюю версию. Теперь появился OmniROM, который клепается силами бывших разработчиков CyanogenMod, и сразу на базе Android 4.4. Захотелось попробовать его, и вот что я обнаружил: на моем аппарате теперь не стартует ни одна прошивка, отличная от CM10.1.3. Появляется анимация загрузки и крутится вечно. CM10.1.3 же ставится любым способом и прекрасно работает.

Вопросы: что это может быть, как это лечить, и можно ли как-то лог загрузки снять, чтобы диагностировать проблему?

 , ,

uuwaan
()

Раскраска приглашения BASH: графика и текстовый режим

Решил покрасить приглашение командной строки:

PS1="\n\[\e[1;31m\]┌(\[\e[0;34m\]\u@\h\[\e[1;31m\])-(\[\e[0;33m\]`cat /etc/place`\[\e[0;31m\])-(\[\e[1;32m\]\w\[\e[0;31m\])\n\[\e[0;31m\]└\[\e[0;31m\]┤\[\e[0m\]"

В urxvt покрасилось без проблем. В текстовом режиме — полный угар.

Точно знаю, что можно покрасить так, чтобы в текстовом режиме было нормально, но не знаю как.

uuwaan
()

Старые темы на первой странице трекера

Сегодня при обновлении трекера постоянно вижу на первой странице сообщения, датированные 2011, 2012, январём 2013 года, вперемешку с опубликованными сегодня.

И чтобы два раза не вставать, JAMWiki, видимо, лично для меня, теперь постоянно выплевывает java.lang.NullPointerException. Ни в справку по LORCODE не посмотреть, ни что-нибудь другое.

 , ,

uuwaan
()

Три вопроса о разрешении монитора (в точках на дюйм)

У меня неделя борьбы с ШГ, в связи с этим расширяю свои теоретические познания на эту тему. Есть вопрос по выставлению разрешения монитора в .fonts.conf и .Xresources.

Вопрос первый:

На домашнем ноутбуке

xpdyinfo | grep dots
показывает «квадратное» разрешение 96x96 точек, на рабочем компьютере в офисе — 103x105 точек. Найденные материалы гласят: вбейте команду, посмотрите разрешение, впишите число в конфиг. В случае «прямоугольного» разрешения мне надо вбить вертикальное, вбить горизонтальное, или посчитать некое среднее значение?

Вопрос второй:

В Гугле легко ищется калькулятор DPI: вбиваешь диагональ, вбиваешь разрешение матрицы, получаешь результат. Этот результат может быть использован в конфиге, или толку не будет? Значения в калькуляторе процентов на 5 отличаются от показаний xdpyinfo.

Вопрос третий:

Если у меня «прямоугольное» разрешение, то, считая среднее, получаю не целую величину. То же самое с калькулятором. Есть ли эффект от выставления в конфиге вещественных значений? Что касается .fonts.conf, то используемый там тег <double></double> кагбэ намекает.

 , ,

uuwaan
()

Не работает glx-alternative-mesa в Debian amd64

На Debian 7 amd64 после установки glx-alternative-mesa:

$ update-alternatives --list glx
update-alternatives: ошибка: нет альтернатив для glx

На системах с гибридом Intel+NVIDIA при установке bumblebee-nvidia это приводит к полному отвалу 3D-функций на Intel, поскольку glx-alternative-nvidia нормально регистрируется и видна в выводе указанной команды, а mesa — нет.

На i386 всё нормально — видны обе альтернативы. Есть ли способ поправить, надо ли идти писать багрепорт по пакету glx-alternative-mesa?

uuwaan
()

Альтернатива дуалбуту

Периодически слышу о Винде на соседнем разделе «для поиграться». А ведь можно поступить умнее: сделать Windows хост-системой, а Линукс загнать в виртуалку.

Сам сделал по такой схеме: 1) основная система — Windows 7, которая шла в комплекте с ноутбуком. Обеспечивает хозяйство драйверами под всю периферию. С помощью Панели Управления отключены все опциональные компоненты Windows, в т.ч. IE и Media Player. Используется для запуска VirtualBox, игрушек и каких-нибудь тяжелых приложений, которых пока нет.

2) Debian Testing + MATE внутри VirtualBox на 2ГБ виртуальном жестком диске, все каталоги внутри home выведены в основную систему. Дополнительно решил поизвращаться и ограничил объем ОЗУ до 1024МБ с одновременным включением подкачки в zRAM, работает хорошо. Здесь проводится все то время, что не играется в игры: постоянно открыт Iceweasel с десятком вкладок, играет онлайн-радио, смотрятся киношки, иногда правится код проектов по работе.

Я тут о чем. О том, что ведь всем хорошо! Ноутбук холодный — утилита управления для ноута хоть и страшна как смертный грех, но дело свое знает. Linux в виртуалке прекрасен: никаких проблем с железом; звук есть; 3D есть, чтобы тени рисовать; снапшоты, позволяющие как угодно дико экспериментировать с конфигурацией системы. Пишу этот текст, и о том, что делаю это из виртуалки, напоминает только однопиксельная полоска внизу экрана — панель VirtualBox.

Короче, я откровенно наслаждаюсь Линуксом в таком варианте. Предал ли какие-либо светлые идеалы? Или так многие делают?

 , ,

uuwaan
()

Сделал wine-unstable 1.5.29 для Wheezy

По случаю майских праздников немного разобрался с созданием пакетов под Дебиан и наклепал пакетов с WINE 1.5.29 под Wheezy.

Особенности:

  • за основу взяты пакеты wine-unstable из Debian Sid.
  • по этой причине, это не один большой пакет, как в Ubuntu или репозитории Liquorix, а набор, разделенный по подсистемам.
  • WINE собран без поддержки gstreamer, hal, opencl — ИМХО, малоприменяемые куски.
  • пакеты только i386 (под amd64 каменый цветок не выходит), но собраны в multiarch-стиле.

Проверено на Debian Wheezy amd64 путём 10-минутных забегов в L4D2 и Starcraft II через optirun, а также редактированием пары документов docx в MS Word 2003.

Если кому-то интересно, то надо решить, куда выложить это добро: хостинга нет, Dropbox, боюсь, не порадуется, если с него начнут качать больше чем 10 человек в неделю.

Оказалось несложно, поэтому планирую пакетировать каждый новый релиз.

UPD: Пакеты на Яндекс.Диске

 , ,

uuwaan
()

Не могу найти madvice()

Успешно реализовал в проекте чтение и запись файлов через mmap, поскольку в моём случае это оказался самый производительный способ. Хотел протестировать, вставив в код вызов madvice(), однако в системе мана по функции нет, программа компилируется, но не линкуется, жалуясь на неразрешенный символ madvice. Это так и должно быть, или можно поставить какой-нибудь пакет?

 ,

uuwaan
()

Используемое DE и имидж человека

На работе тружусь за собственным ноутом и довольно часто что-то демонстирую коллегам: логи, куски кода. Коллеги в большинстве люди от Линукса далёкие, максимум — стандартная Убунта в виртуалке для поверхностного тестирования кроссплатформенного софта.

За два года работы перепробовал разные подходы к взаимодействию с компьютером: и общепринятый (стековый оконный менеджер, все иструменты — в графике, мышка — основной манипулятор) и «хакерский» (тайловый менеджер, везде зелёный Terminus, всё в консоли, всё с клавиатуры) и комбинировать пытался. В общем, экспериментировал.

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

Утрируя, если для монтирования флешки ты открываешь консольку, вбиваешь туда mount /dev/sdc1 /mnt и после этого в mc переходишь в /mnt, то ты — чудаковатый хакер из фильма, чувак несомненно умный, но со странностями, так что слушать тебя можно, но надо осторожно. А если у тебя скажем MATE в оформлении а-ля Linux Mint с симпатичной зеленой обоиной с завитушками, то ты вызываешь расположение и доверие.

Как вы считаете, имеет ли место такое быть в объективной реальности?

 

uuwaan
()

Автостарт bumblebeed в Ubuntu 12.04

Есть ноутбук с Ubuntu 12.04, в которую из ppa:bumblebee-stable поставлен Bumblebee. В отличие от Debian, где bumblebeed поднимается безусловно, скрипт для Upstart поднимает bumblebeed, насколько я понял, во время логина пользователя через графический логин-менеджер:

# initctl show-config -e bumblebeed
bumblebeed
  start on login-session-start (job:, env:)
  start on desktop-session-start (job:, env:)
  stop on desktop-shutdown (job:, env:)
Я не пользуюсь логин-менеджерами, просто сделал автологин в консоль через mingetty, а в .bash_profile стоит строчка, которая поднимает иксы. На такой вариант Upstart не реагирует никак и bumblebeed не запускает. Попробовал поставить SLIM, но реакции опять нет: после логина bumblebeed не стартует. Сам bumblebeed исправен: по
# service bumblebeed start
поднимается и работает.

Вопрос мой таков: можно ли изменить условия старта bumblebeed, чтобы он либо запускался безусловно при старте системы, либо реагировал на поднятие X-сервера?

 , ,

uuwaan
()

Gentoo, USE-флаги и зависимости пакетов. Правильно ли я делаю?

Решил на выходных поделать первые шаги в использовании Gentoo. Базовую систему установил по хендбуку без проблем, перезагрузился. Теперь хочу начать ставить прикладной софт. Хочу поставить wicd, делаю:

emerge --pretend wicd

И получаю километры зависимостей, тянущие за собой Qt, Gtk+, CUPS и т.д. Я же хочу настроить себе по возможности минималистичную среду, с преобладанием консольных интерфейсов.

Насколько я понимаю, наиболее правильный вариант, это внимательно изучать USE-флаги самого пакета и его зависимостей, а затем пополнять список /etc/portage/package.use минусующими флагами для этих пакетов. Или есть более простой способ?

uuwaan
()

Push через Wi-Fi или сотовую сеть?

Что iPhone что Android-девайсы имеют такую фичу как push-уведомления. Устройство поддерживает долгоживущее соединение с сервером, временами получая от него некоторые данные.

Мой вопрос состоит в следующем: при условии, что качество сотовой связи в офисе довольно плохое (слабый сигнал), будет ли выгоднее с точки зрения расхода электроэнергии аппаратом поддерживать push с помощью подключения к Wi-Fi сети, а не к сотовой? Режим сотовой связи я могу выставить принудительно либо в GSM (и юзать EDGE) либо в 3G.

 , , ,

uuwaan
()

Продление срока службы аккумулятора.

Приобрел себе ноутбук Lenovo IdeaPad Z570, и в комплектной установке Windows, в менеджере производительности, нашел интересную опцию: продление срока службы аккумулятора за счет поддержания в нём 50% заряда, он в таком режиме меньше изнашивается, если компьютер постоянно подключен к электрической сети.

Windows на машине прожил недолго, его место занял Debian GNU/Linux Wheezy. Попробовал поискать аналогичное решение с настройкой аккумулятора, нашел пакет tp-smapi-dkms, который не заработал, потому что предназначен для линейки ThinkPad.

Не подскажет ли мне кто, может в дальних репозиториях какого-нибудь ГитХаба завалялось специфическое решение для IdeaPad или универсальное (потому что видел подобную утилиту для ноутов от Samsung)? Мой английский меня подводит, видимо, потому что мой запрос «extend battery life on linux» исправно показывает мне статьи о том, как продлить время работы системы от одной зарядки, а это не то.

 ,

uuwaan
()

RSS подписка на новые темы