LINUX.ORG.RU

Сообщения bonta

 

Linux vs FreeBSD

Форум — Talks

интересную стетейку хабр подкинул.

https://habr.com/ru/post/490408/

Интересно ваше мнение основанное на реальном опыте, а не на предвзятости или фанатизме :)

Перемещено leave из general

 , ,

bonta
()

Есть ли в конце 2019 в продаже нормальные новые компьютерные корпуса?

Форум — Linux-hardware

Может кто в курсе чего там сейчас на рынке корпусов классных есть. Чето перелистал предложения 3х магизинов и не вижу ничего достойного

Желалки: 0. Крепкий, из люминия, но боковая створка вполне себе может быть с пластиковым окном.

1. Бигтовер/Фуллтовер, с норм дизайном а не для аля-корпус-сервер (люблю безшумные компы. Чем корпус больше тем компутер безшумнее в виду хорошей вентиляции комопнетов)

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

3.Крышка закрывается на замок (никто не сможет включить твой комп если ты его «закрыл»)

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

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

==== Ну вот если от 5го пункта я еще могу отказаться то от 0-4 не хочу отказываться. И вот смотрю и вообще не вижу таких корпусов.

А ведь это не спец-корпус, в начале 2000х таких решений было много. Например мой настоящий корпус «thermaltake xaser v», но ему уже лет 15 и он «устал», вот ищу достойную замену и не могу найти.

Если кто-то встречал подобные корпуса в 2019 - напишите.

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

 

bonta
()

IPC с дочерним процессом по pipes. Как читать больше PIPE_BUF за один запрос чтения?

Форум — Development

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

Но ребенок может вообще ничего не ответить или ответить слишком много, намного превышающим лимит PIPE_BUF (man 7 pipe), поэтому выходом будет процесс чтения защитить таймаутом. Не блокирующее или асинхронное чтение для решения данной проблемы не нужно - достаточно select-а.

Самый простой вариант видится таким:

// k_systemDependetLimitation == PIPE_BUF
struct timeval tv;
tv.tv_sec = k_ipcWaitDataDelay;
tv.tv_usec = 0;

std::string ret;
int returnCode;

while (true) {
    if ((returnCode = select(m_istance(client).m_readFromChildProccess[0] + 1,
        &m_istance(client).m_readFromChildWait, nullptr, nullptr, &tv)) > 0) {

        char rawBuffer[k_bufferLength] = {0};
        ssize_t readLegth;
        if ((readLegth = read(m_istance(client).m_readFromChildProccess[0], rawBuffer, k_systemDependetLimitation)) > 0) {
            ret.append(rawBuffer, rawBuffer + readLegth);
            if (readLegth == k_systemDependetLimitation) {
                continue;
            }
            break;
        } else {
            releaseIpcAndswitchToErrorState(client);
            break;
        }
    } else if (!returnCode) {
        FD_ZERO(&m_istance(client).m_readFromChildWait); // reinit for select (see man select)
        FD_SET(m_istance(client).m_readFromChildProccess[0], &m_istance(client).m_readFromChildWait);
        break;
    } else {
        releaseIpcAndswitchToErrorState(client);
        break;
    }
}

По скольку чтение блокирующее мы не можем быть уверены что после readLegth == k_systemDependetLimitation что-то есть или чего-то нет

поэтому тут неизбежно нужно запрашивать select, если что-то есть select сразу же вернёт управление и read опять начнёт читать, если ничего нет - повисит за зря (а что делать?) и вернет управления по таймайту else if (!returnCode).

Если прочли меньше, значит конец чтения.

Но я хотел бы читать больше чем 4096 за раз. Мотивация: не хочу лишние переключения контекста. И вообще хотел бы например использовать select только изначально, и дальше с помощью каких-то техник определять стоит ли запускать read еще или нет, но похоже это не возможно?

Дело в том что читать >4096 сложно. Даже при условии что пишет в канал только один процесс и даже с гарантией что он пишет ровно тогда когда буффер пайпа полностью свободен (родитель все ранее записанное, от прошлого запроса, прочитал).

Казалось бы можно просто указать читать не 4096 а больше, и всё. Но в редких случаях ядро остановит чтение на границе 4096 Т.е. как раз на границе атомарной передачи по каналу.

Это можно попытаться отловить:

Например:

//k_bufferLength == 9000
...
        if ((readLegth = read(m_istance(client).m_readFromChildProccess[0], rawBuffer, k_bufferLength)) > 0) {
            ret.append(rawBuffer, rawBuffer + readLegth);
            if (readLegth == k_bufferLength) {
                // здесь мы по прежнему ничего не можем сказать о том что больше нечего читать
                continue;
            }
            // если чтение прервано не на границе PIPE_BUF то оно конечно
            if (readLegth % k_systemDependetLimitation) { 
                break;
            }
        } else {
            releaseIpcAndswitchToErrorState(client);
            break;
        }
    }
...

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

что может быть прочтено только:

или ==9000 (т.е. 2 полных атомарных цикла записи в пайп и один не атомарный)

или <9000, но не кратный границе 4096 тогда типа явно всё прочитано, потому что типа ядро не прервёт такое, потому что граница атомарности (судя по размеру прочитанного уже пройдена - а значит то что не лежит на такой границе - ядро не прерывает)

или кратный_атомарному - значит тут есть возможность того что ядро первало.

Но такие выводы, оказались не верны, крайне редко но бывает:

что сначала прочитали 9000, потом вместо например 4132 (что бывает в большинстве случаев и тогда ок)

мы прочитали скажем 3800 - и все - тогда код прерывает чтение, а по факту еще осталось читать (4132-3800 байт).

И так есть ли какой-то красивый способ без дополнтельного вызова select пусть и с минимальными миллисекунндыми таймаутами - определять что ядро все передало что пишет дочерний.

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

но вот фишка в том что то что отправлят дочерний я менять не могу и там таких маркеров нет :)

 , ,

bonta
()

VMSVGA и Debian

Форум — General

В старых версиях Vbox было всё ок.

Под ок - имею ввиду что игры AllienArena и OpenArena замечательно работали c высоким fps.

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

В последних версиях Vbox появился VMSVGA, да появился так что они говорят что начиная с 6.1 версии VBoxVGA больше не будет поддерживаться.

Кстати VBoxVGA и сейчас не работает если использовать клиентское расширение соотвествующее версии Виртбокса. Если расширение откатить до 6.0.0 (самой первой 6-й версии) то работает.

Ну и вот. Я попробовал VMSVGA(на новых кл.расширениях) и нифига - ОпенАрена вообще не запускается (говорит что не находит каких-то .so или ф-й внутри .so, не помню точно), Allien похоже видит что чего-то такого нет и запускается - но судя по fps похоже как будто-бы в софтвер-рендере.

У меня не самая свежая версия Дебиан.

Ну и вот решил последнюю попробовать стейбл версию Дебиана (на кл.расширениях соотвествующих версии Вбокса) и ничего не поменялось.

Итого вопрос: 1. Кто-нибудь как-нибудь заметил на чём-нибудь работоспособность VMSVGA? В браузере тоже не появилось ускорения, в DE(KDE) тоже.

p.s. раньше в браузере и КДЕ тоже не было ускорения, оно было лишь в играх в гостевой ос.

2. Может это проблема игр что они не умеют общаться с VMSVGA или это проблема дистрибутива и в какой-нибудь свежепакетой дистре на подобии Убутны работает?

 ,

bonta
()

IPC через пайпы, в частности способ echo «text» | mybinary

Форум — Development

Похоже я столкнулся впервые в жизни с IPC через пайпы и вот я делал так что моя апа запускалась как дочерняя и тогда на её stdin можно было слать командочки и это было норм т.к. тогда на stdin не приходил eof

а если делать так echo «text» | mybinary то приходит EOF.

И похоже после EOF с потоком вообще нельзя никак работать. Верно ли эта мысль?

или существует способ в рамках C++ приложения как-то отцепиться от std::cin и подключиться к его свежей инстанции?

 ,

bonta
()

Asus ZenFone Max Pro m2 | или боль в глазах

Форум — Mobile

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

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

А самая главная желалка, была чтобы было удобнее читать что-нибудь, в дороге или на природе, и хотелось экран побольше чем на моём Htc One M8.

Но вот как оказалось как раз главная желалка и не сбылась - не могу смотретьбольше 3-5 минут на экран, внутри глаз, начинается такая боль, как буд-то они сейчас взорвутся, потом от этого начинает верх головы болеть, т.е. сам мозг [p.s. ниже в комменатриях сказали что мозг болеть не может, пусть так, суть в том что голова болит :)]

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

Я попробовал войти в бут-меню (вдруг это какая-то настройка сглаживания андроида, а в бут меню её не будет) но там все так же по резкости.

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

Попробовал показать телефон другим 5 людям, никто кроме 1го не заметил что-то плохое. У одного тоже как у меня - только вообще сразу говорит что не может смотреть, что кружится голова :) А я минуты 3 могу.

Ну и вот я сделал вывод что на моём экране htc one m8 просто очень резко все а на Асусе не резко, но правда как тогда более не резкие (встроенные автонавигаторы, меню мыльниц, принетеров) не вызывают боль. Подумал может дело в dpi или размере экрана..

Но когда у знакомых попросил посмотреть дать посмотреть на их экраны. Увидел что у одноного человека какой-то Самсунг, который в 2 раза дороже, но экран по резкости +- такой-же как на Асусе, но у меня от Самсунга не болели глаза. А у другого человека вообще какой-то нонейм из Китая, но схожий по размеру, яркости, не знаю сколько там разрешение, но текст по сравнению с моим еще более не резкий, но тем не менее глаза от него не болят и не устают.

Вот и не могу понять в чём дело.

Бывает ли какая-то индивидуальная непереносимость экранов?

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

 

bonta
()

Как работают устройства usb->ps/2

Форум — Linux-hardware

Недавно пришлось обновить клавиатуру, после пролитого кофе с мёдом. Прежняя была usb и работала в ps/2 через переходник. Новая в ps/2 не определяется.

Стало интересно как это работает. Понял что про эту, часть аппаратного обеспечения вообще ничего не знаю. И что достаточно тяжело гуглится.

Мои предположения:

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

Так получается? Или какое-то другое объяснение есть этому?

 , ,

bonta
()

Про комментарии в исходном коде

Форум — Talks

Предварая темку, хочу сказать что фактически я занимаюсь чем-то типа аутсора на дому, т.е. это и не фриланс, где, наверное, для заказчика продукт это действительно черный ящик со входами и выходами – в аутсорсе же твой продукт проверяется работодателем как именно проект (архитектура, алгоритмы, код), но тем не менее это не есть плотное взаимодействие с коллективом… Т.е. «вращайся» бы я в каком-нибудь коллективе очно – может быть таких вопросов и не было :)

Так вот, очень часто, в рекомендациях по оформлению исходного кода, можно встретить мол «в хорошем коде комментарии не нужны. Комментарии заменяет именование».

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

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

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

I. Буквально каждый метод любых интерфейсных классов продокументирован (в стиле доксиген).

II. В каких-то алгоритмических штуках (там всякие графы и алгоритмы поиска) важные места кратко описаны в комментариях непосредственно в коде.

III. К проекту есть описательная документация (т.е. такая общая – например, как работают алгоритмы в общем, без привязки к деталям реализации).

Все эти три пункта делают хороший вклад и в ориентировании в коде, и в видении архитектуры продукта и т.п. Без любого из этих пунктов тратилось бы намного больше времени чтобы разобраться. При этом пункты 1, 2 так вообще кажется не потратят много времени на своё сопровождение от разработчика. Да, если в методах много параметров, и много методов с документацией_доксиген этих параметров, и бывает что параметры меняются, и отвлекаться когда «прёт» на отражение изменений в комменты_документации не хочется – ну и пусть. Ведь можно же выделить скажем раз в неделю, в пятницу вечером, время на приведение этих комментов к новым изменениям (исключительно в своей зоне ответственности). А пункт 3 конечно тяжелый, но мне кажется, если это не проект на просто «раз-два и в продакшн» - то для самого себя же возможно пригодится, если случится вернуться к проекту спустя годы…

И вот например в проектах, которые такие доолгие, как колекция компиляторов GCC (по крайней мере STL ++ либа), как ядро Линукса - всё очень хорошо с комментариями.

Там не стесняются писать их в коде, и у каждой ф-ии для каждого параметра в заголовке есть описание. Порой даже (из-за обилия входящих параметров) на имя и параметры ф-ии тратится строчка текста ,а на доксиген_описание параметров – строчек 10. Иногда это может усложнить навигацию по коду, но мне кажется это нормальная плата за ту пользу которую несут столь длинные комменты.

А вот взять не такие дооолгие проекты – Телеграмм, движок Блинк, какие-нить простенькие игры которые по умолчанию в дистрибутивах включаются – в их коде нет комментов. Ладно Xmoto, но над Блинком и Телеграмом, ведь трудятся огромное кол-во людей… Неужели им не мешает отстуствие комментов в коде?

В общем интересно что Вы думаете про комментарии в коде.

1. Ведете ли I,II (а может III) в своих личных проектах?

2. В «корпоративных» проектах – как у вашей компании принято на тему I, II, III – т.е. доксиген_комментариям_к_параметрам_фии_и_её_предназначения(I), комментам_внутри_тела_ф-ии(II), отдельного_описания_логики(III). Может быть у вас даже принято UML схемы составлять и прицеплять их в (III). Расскажите, пожалуйста, очень интересно.

3. Что думаете на тему Блинка, Телеграмма, и прочих больших проектов, код которых открыт – почему там нет комментов? Может быть там все это есть (I,II) но во внутреннем, скрытом репозитории кода, а в открытом – версия без комментов, т.к. возможно именно комменты и описание алгоритмов поверх открытого исходного кода, они воспринимают как интеллектуальную собственность, и поэтому не публикуется?

 ,

bonta
()

C++ нетривиальные static поля класса

Форум — Development

Хочу поинтересоваться у опытных старших товарищей, на сколько страшно когда в классе есть статик поля нетривиальных классов.

стандарт_кодинга_гугла говорит что не стоит использовать в качестве глобальных статиков ничего что нетривиально создаётся и разрушается.

Но что делать, если это было бы очень удобно?

Например возьмём простейший случай где в Си++ используются нетривиальные типы - это строки, причем некоторые строки конструируются через конкатинацию других constStaticStrN(constStaticStr1 + constStaticStr2)

Не использовать же Си-строки в 2018 году в Си++.

Я конечно не принципиально против Си-строк, я даже за них, но очень ограниченно - например передать как параметр в какой-нить устоявшийся интерфейс, где действительно нет нужды сначала собирать std строку. - например в std::ifstream - обычно нет смысла передавать std::string (т.к. внутри себя он всеравно работает с си строками, по крайней мере в g++)

Во всех других случаях я не хочу работать с Си строками. В том числе и с константными строками, которые нужно сравнивать с каким-то значением, обращаться к их размеру, конкатенировать в другие (уже не статик) строки - не хочется портить код в данном случае Си-шными string.h и т.п.

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

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

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

 

bonta
()

c++ и utf-8

Форум — Development

Допустим есть файл сохранённый в UTF8. Читать я его могу исключительно std::ifstream (без std::wifstream).

После прочтения файла, я хочу иметь возможность итерироваться по utf-8 символам, и даже сравнивать их

for (size_t i = 0; i < utf8String.size(); i++) {
    if (utf8String[i] == 'ф') {
        //...
    }
}

Т.е. я хочу чтобы была возможность работать с каждым utf-8 символом, в независимости от того какой он длинны как с одним символом.

Что мне для этого нужно?

Я думал что wchar_t. Но есть такие два источника: 1. https://ru.wikipedia.org/wiki/Широкий_символ 2. https://stackoverflow.com/questions/17871880/should-i-use-wchar-t-when-using-...

Которые вроде как говорят что это не очень хорошо.

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

что std::wstring wstr = L"добро"; //да, система дебиан 8, x86-64, исходник сохранен в utf8.

в общем wstr==«добро» в оперативной памяти будет представлено не в utf-8 а в неведомой кодировке. Но по которой можно итерироваться и сравнивать.

Буква 'д' из этой строки будет иметь следующий байт-код 00110100 00000100 00000000 00000000 (wchar_t)

При этом если бы 'д' была в utf8 то она должна была бы иметь такие байты 11010000 10110100 {00000000 00000000} - в скобках хвост который как бы не имеет отношение к коду 'д', но заполняет тип wchar_t.

Вопросы: Можно ли как-то сделать так чтобы компилятор (g++) видя wchar_t c = L'д' или whchar_t c = 'д' - конструировал utf8 букву в wchar_t типе, а не в непонятной кодировке. И кстати в какой кодировке он её кодирует по умолчанию?

Есть ли какой-то способ прочитать преобразовать utf-8 строку, хранимую в std::string в std::wstring так чтобы после такого преобразования содержимое этой wstring можно было бы корректно вывести в std::wcout?

Я нашел такой способ Преобразование std::string в std::wstring

Но во первых он какой-то страншный и не очень понятный, какие-то шаблоны актуализируются...

А самое главное в моём debian8 и gcc4.3 нет такого хедера include <codecvt>

Поэтому у кого поновее пакетная база, и кому не лень, пожалуйста из ссылки выше запустите пример. Сделайте std::string str(«добро») и преобразуйте её в std::wstring Нужно чтобы после преобразования wstring строка корректно выводилась в std::wcout и можно было побуквенно (а не побайтово) итерироваться по ней, и посимвольно сравнивать.

В общем, т.к. у меня нет этого codecvt я сделал преобразование руками (да можно красивее, переносимее (учитывать порядок байт), при вызове из main не выходить за границы строки и т.д. и т.п. - не суть): https://pastebin.com/4E3nuNcM

и вот если приблизительно таким методом конструировать std::wstring которая содержит utf-8 можно будет итерироваться по ней (да, я знаю что utf8 может быть длиннее чем размер wchar_t, но у меня будет набор латиницы и кириллицы из utf8 документа), можно будет сравнивать с символами, но к сожалению не так wstr[0] = 'ы' а только с заранее созданными символами, подобным методом как строка создавалась. wstr[0] == wcharSymbol.

Это не удобно, а еще такая строка не может корректно выводится на std::wcout.

Т.е. заключительный вопрос - можно ли как-то пользуя нативный wchar_t работать посимвольно с utf-8 в c++ в линукс, имея полный ф-л такой как итерации, посимвольное сравнение, корректный вывод в std::wcout.

Если нельзя - есть ли возможно какие-то сторонние (причем легковесные библиотеки, код которых можно включить в проект, и собрать статически, и чтобы места не много тратили) которые предоставляют некий тип wideChar, полностью совместимый и с std::wcout и со всей stl(конейнерами, алгоритмами) и при этом желательно кросплатформенная?

Кстати в презренной винде на этом же наборе символов utf8 (латиница и кириллица) - всё очень хорошо (плохо там будет когда потребуется символ длиннее 2 байт) - т.к. там wchar_t это 2 байта, т.е. он как раз отлично соотвествует, и в wcout тоже выводится :)

Просьба не флудить а по конкретике писать :)

 , , , ,

bonta
()

Размер стека процесса, можно ли увеличить?

Форум — Development

ulimit -a говорит что размер стека процесса не может превышать 8ми мегабайт.

Есть ли способы увеличить размер стека процесса доступные из под контекста обычного пользователя (без всяких настроек через su, и тем более без перекомпиляции чего-либо системного)

В виндоуз 64битной, по умолчанию размер стека 1мб, но при потребности (если прога скомпилирована с соответствующим ключом) - то можно нарастить стековое пространство до 1гигабайта

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

 , ,

bonta
()

Компиляция .so и непонятки с static членами класса

Форум — Development

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

Моя задача собрать его в линуксе (дебиан, g++4.9.2), итак сделал симейк, проект собирается из кучи отдельных модулей

модули собираются с ключами set(CMAKE_CXX_FLAGS "-Wall -std=c++14 -fpermissive -fPIC") в объектники add_library(NAME OBJECT ${NAME_SOURCES}) с этим все ок.

Результирующая либа собирается такой строкой

add_library(ИМЯ SHARED ${Сырцы_Главного_Модуля_Либы} $<TARGET_OBJECTS:имя_объектника1>...$<TARGET_OBJECTS:имя_объектникаN> >)

тут вроде тоже все норм (вообще первый раз в жизни сам руками собирал симейк, обычнно это IDE делали за меня).

Но а теперь то что я не могу понять до сих пор.

Есть класс, код не мой, поэтому приводить не детали реализации не могу, но тут суть именно в переменных:

	class TopologicalSorter {
	public:
		int method_1(ссылка на неконстантный контейнер);
		static const int sm_success = 0;	
		static const int sm_circle = -1;	
		static const int sm_badGraph = -2; 


	private:
		int method_1_private() //юзается в method_1

		std::vector<int> m_state;

		static const int sm_notVisited = 0;
		static const int sm_pcocessing = 1;
		static const int sm_finished = 2;
	};

итак, мы видим статик члены. Напомню в винде компиляется работает, в линуксе компиляется но не линкуется:

перемещение R_X86_64_PC32 для неопределённого символ «_ZN12_GLOBAL__N_117TopologicalSorter13sm_notVisitedE» не может использоваться при создании общего объекта(ов)

я конечно гуглил, даже на лоре чето нашел (ошибка при создании shared объекта в x86_64. (комментарий) но это не мой случай). Далее я обнаружил, что класс объявлен и реализован в .cpp файле и в пустом неймспейсе

namespace {
class TopologicalSorter {код который я урезанно привел};
}

вопрос1 - пустой неймспейс - какая-то смыслу у этого есть, или это просто автор забыл имя дать или т.п.?

далее я убрал неймспейс и получил более читаемую ошибку

undefined reference to `TopologicalSorter::sm_finished'

С которой естественно уже, помня азы плюсов - справился таким образом

	class TopologicalSorter {
	public:
		int method_1(ссылка на неконстантный контейнер); 
		static const int sm_success = 0;	
		static const int sm_circle = -1;	
		static const int sm_badGraph = -2;

	private:
		int method_1_private() //юзается из "некийМетод" в случае успеха возвра sm_success

		std::vector<int> m_state;

		static const int sm_notVisited;
		static const int sm_pcocessing;
		static const int sm_finished;
	};
        const int TopologicalSorter::sm_notVisited = 0;
        const int TopologicalSorter::sm_pcocessing = 1;
        const int TopologicalSorter::sm_finished = 2;

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

Вопрос2 - почему такие члены как sm_success или sm_badGraph успешно линкуются, а sm_notVisited, sm_pcocessing, sm_finished - нет?

Дело вероятно не в public/private (пробовал переносить в зону паблик эти три переменные, которые не линкуются). Доподленно известно что sm_notVisited, sm_pcocessing, sm_finished не используются нигде кроме класса в котором определены.

Но тем не менее: sm_badGraph и sm_circle так же используются только внутри класса, а вот sm_success имеет return наружу, но к слову и sm_badGraph, sm_circle косвенно тоже передаются наружу, через int error_code =

При этом нигде в коде-пользователе классом TopologicalSorter нет пользования этими переменными, что возвращает метод method_1, т.е. он вызывается как «процедура» в каком-то из классов-клиентов: TopologicalSorter sorter; sorter.method_1(input_output_container);

 , ,

bonta
()

D-link DIR-615 rev. E4 + Quake3/OpenArena

Форум — Talks

Есть старинный роутер D-link DIR-615 rev. E4 (продававшийся где-то в начале 10х годов), короче древняя железяка, которую пользую дома.

У него есть глюк, что если попробовать в сетевую игру в Quake3 или игрушек на том же движке - например OpenArena - то роутер перезагружается. В инете данная проблема гуглится слабо (http://forum.dlink.ru/viewtopic.php?f=3&t=129685&start=270), и всё что я нашел: что-то пытались, но так и не находили решение.

Может кто-нибудь сталкивался и как-то смог решить проблему, кроме как заменой роутера?

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

 , ,

bonta
()

Будет ли работать ssh -XC если от иксервера откажутся, полностью перейда на wayland

Форум — Talks

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

Вот например на картинке файрфокс запущенный на другой машине. Скорости ssh с ключом -xc вполне хватает даже для анимаций.

Кстати да, посмейтесь, вместо телеграмма местечковый лохопровайдер заблочил документацию на кьют. Именно документацию, остальной сайт работает. Но нормального провайдера пока в мою новостройку не провели.

Так вот. Я весьма поверхностно знаю и про x-server и про wayland. Ключ -X - это «Enables X11 forwarding.» Так вот, если от икс-сервера откажутся в пользу wayland - будет ли работать данная опция?

Если не будет, то как думаете - будет ли её замена на что-то вейландское чтобы гуй через ssh работал? Просто возможно это не очень поппулярная фича и её не захотят поддерживать.

 , ,

bonta
()

Windows8.1+FreeBSD10.3+Debian8.5 на 4 Гигабайтах

Галерея — Скриншоты

Обычно ничего не выкладываю в галерею, т.к. в ней есть и интереснее картинки чем могу предложить. Впрочем одна тёплая и ламповая на моём счету уже имеется

Прокоментить тут особо нечего, двумониторная среда, слева обычно открыт браузер с документаций, справа код (изучаю Си++ сам по себе, так и делая некоторые вставки в один достотчно хороший проект, в который попал благодаря «Лору» (темка была для тех кто хочет попрактиковаться языку, не думал что такие темки работают, а работают))

а так обычно со скрипом ssd (из-за иногда бывающей нехватки физической памяти и необходимости поработать с pagefile.sys), система стабильно держит Фряху для бложика в котором конспектирую изученное, и для дебиана.

Обоим виртуалкам выделены все 6 ядер CPU, под фряху выделено 640 мегабайт памяти, это более чем хватает для скоромного сервера, который никто, кроме гуглабота и меня не посещает), под дебиан ровно 2000 мегабайт - остальные выделены венде. В винде может работать DC++ и Firefox и все это дело живет на 4 гигибайтах, иногда даже игрушки идут как в дебиане так и хосте.

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

А да почему винда. Были времена что на моём компьютере вообще не стояло ничего от MS, но однажды я крепко увлекся фотографией, а нативных аналогов продуктам Adobe для Linux не существует. Только не пишите здесь про the Gimp или Wine :)

 , , ,

bonta
()

Дополнительная Специализация конструктора шаблонного класса

Форум — Development

Пробую (для обучения) реализовать свою двустороннюю очередь.

template <class T> class Deque
{
private:
    enum { defaultSize = 25, len = 5 };
    void dealloc ( );
    int alloc   ( const unsigned & = defaultSize, const T & = T() );
    T ** array;
    pair<int,int> xy;
...

public:
    Deque ( const unsigned &, const T & = T() );                       //1
    template <class Iterator> Deque (Iterator _first, Iterator _last); //2
    Deque ( ); 
    virtual ~Deque();


};

В main.cpp идёт создание дека:

Deque<int> test1(25, -1);

Все хорошо если нет 2-го конструктора. Второй конструктор «перебивает» действие первого. Почему так происходит я не понимаю, ведь в конструктор передаются типы const unsigned и const int и как я понимаю компилятору следовало бы направить этот путь к первому конструктору, но он упорно использует второй...

Подскажите пожалуйста что не так.

 , ,

bonta
()

virtual public наследование, есть вопросы

Форум — Development

Изучаю множественное наследование:

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

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

т.е. как там в vtbl(?) заносятся отсылки на члены базового класса (именно судя по всему на переменные методы все же будут сдублированны, т.е. D будет содержать 3 метода f() и еще свой ) как там формируются методы.

например немного не понятно, почему если

A { virtual void f(); };
B: virtual public A { void f();};
C: virtual public A { void f();};

D: public B, public C {}; не описать метод B: void f(); - то компилятор скажет типа не знаю какую ф-ю выбрать.

т.е. даже если в D void f() не нужен - нужно сделать его пустое тело.

Но при этом, если мы бы имели не виртуальное наследование то без void f() в D скомилялось бы.

 

bonta
()

Не могу добавлять комментарии в галерее.

Форум — Linux-org-ru

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

На форуме зареган достаточно давно (пруф ностальгия :) RedHat 9 && KDE 3 )

но при попытке комментировать что-то из галереи - вижу «Закрыто добавление комментариев для недавно зарегистрированных пользователей.»

===================================

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

Смешно вышло, извиняюсь за поднятый шум, и спасибо за оперативные ответы! :)

 ,

bonta
()

debian guest in virtual box зависает при >1 виртуальном процессоре

Форум — Desktop

Здравствуйте. Обожаю линукс, в частности Debian, когда-то именно эти дистрибутивы были основными в моём компьютере, но волею судеб на нем на очень долго обосновалась венда (возможно даже и на всегда, не вижу пока перспектив open source vs adobe photoshop, когда ты по хобби профи фотограв с Nikon D800 - но это весьма холиварный оффтопик)

Есть windows8 на ней virtual box, которым пользуюсь очень давно и очень уважаю эту ВМ, т.к. для моего «любительского» использования не нашел ничего удобнее и быстрее (когда-то юзал и VmWare, Qemu), но выбор пал именно на Vbox из-за юзабилити, производительности, да и стабильность всегда радовала. Кроме последнего времени. Всегда юзал однопроцессорные гостевые конфигурации, а тут нужно было заюзать OpenMP ну и подключил сразу все 6 ядер гостю (Debian 8.3), в итоге дебиан повисает вместе с виртуалбоксом например в половине случаев запуска OpenArena, или же скажем в 1 из 6 раз просто при загрузке КДЕ. Впрочем если не трогать OpenArena и не зависнет при старте КДЕ то хоть несколько дней будет работать стабильно, вплоть до poweroff, но играть то хочется, а в хосте опенарену лень ставить, да и очень уж приятно в виртуалке иметь все 6 ядер, вот и озадачился.

Пробовал разные вариации настроек - паравиртуализация KVM и «Совместимый» - дают самые худшие результаты - самые частые зависания. Потом я поставил «Отсутствует» - думал обрадоваться стабильной работе - но не тут то было - изредка но зависает намертво.

Единственный вариант стабильной работы - использовать только одно ядро.

Судя по интернетикам - с виндами_гостями проблем ни у кого нет. Так же у меня стоит FreeBSD там тоже нет проблем - как её не гонял - не падает с 6 ядрами и Hyper-V

Сталкивался ли кто с подобным и есть ли решение проблемы?

Хост Windows 8.1 64bit Гость Debian 8.3 64 bit

Vbox5, включен AMD-VT, Nested Paging, 3D ускорение Процессор AMD Phenom x6

Логи, если нужно, прицеплю.

 , ,

bonta
()

ностальгия :) RedHat 9 && KDE 3

Галерея — Скриншоты

Это был первый мой linux :)

bonta
()

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