LINUX.ORG.RU

Избранные сообщения Bfgeshka

Полноразмерный человекоподобный робот

Галерея — Рабочие места

Привет, господа. Последние 6 месяцев я занимаюсь разработкой полноразмерного, полностью рабочего человекоподобного робота. Робот работает под Debian Linux. Механическая часть робота основана на открытом проекте inmoov. Основное моё достижение не просто распечатанные готовые файлы, а проработанные с точки зрения мехмата части для повышения прочности, электроника основанная не на arduino, рассчитанные переходные характеристики, высокая скорость и точность позиционирования движущихся частей

 ,

disee
()

Игра с душой

Форум — Games

Помните как было выпасть на месяц+ из жизни, уйдя с головой в Morrowind?

Посоветуйте еще игр с душой аналогичного объема!

 

stevejobs
()

быстрый парсинг целочисленных значений

Форум — Development

https://github.com/dzidzitop/libafc/blob/master/src/afc/number.h#L264

Сабж. Работает в 2-3 раза быстрее std::stroul от GCC. Pure C такую скорость выдать не сможет никогда - в этом сила «плюсов». У кого есть идеи что можно ускорить - предлагайте.

 

dzidzitop
()

Полезные примочки для Firefox’a (user.js|prefs.js)

Форум — General

Интересуют полезные примочки для FF, которые можно быстро класть в папку профиля в виде user.js или дописать в prefs.js, дабы не настраивать в самом about:config. В винде класть в %userprofile%\AppDataAppData\Roaming\Mozilla\Firefox\Profiles %профильпользователя%\

//Масштаб 100% вне зависимости от изменённого масштаба системы
user_pref("layout.css.devPixelsPerPx", "1.0");
//Отключить гео
user_pref("geo.enabled", false);
//что-то-там про приватность, отправку в гугл и т.д.
user_pref("browser.safebrowsing.appRepURL", "");
user_pref("browser.safebrowsing.downloads.enabled", false);
user_pref("browser.safebrowsing.enabled", false);
user_pref("browser.safebrowsing.gethashURL", "");
user_pref("browser.safebrowsing.malware.enabled", false);
user_pref("browser.safebrowsing.malware.reportURL", "");
user_pref("browser.safebrowsing.reportURL", "");
user_pref("browser.safebrowsing.updateURL", "");
user_pref("datareporting.healthreport.service.enabled", false);
user_pref("datareporting.healthreport.service.firstRun", false);
user_pref("datareporting.healthreport.uploadEnabled", false);
user_pref("media.peerconnection.enabled", false);
user_pref("media.eme.enabled", false);
user_pref("loop.enabled", false);
user_pref("browser.search.suggest.enabled", false);
user_pref("privacy.trackingprotection.enabled", true);

Наверняка у вас найдутся какие-то свои настройки. Желательно выкладывать в формате, считываемом из user.js с комментариями. Результат буду хранить у себя.

 ,

Dreamject
()

си C99

Форум — Development

Уважаемые форумчане. Что Вы думаете по поводу использования этого стандарта? Стоит ли его использовать? И использует ли кто либо вообще. Столкнулся с предупреждением вида:

warning: universal character names are only valid in C++ and C99 [enabled by default]
Это из за значения юникода (типа \u2663) в массиве char, обойти(сь) могу, не использовать. Но всё-таки?

 

Frost
()

Научите правильно готовить монады через CPS

Форум — Development

Тут будет много букв, я морально готовился месяц, поэтому за объем заранее извиняйте. Сразу скажу - на ассемблерах я не писатель, и цель треда - не обсуждение дизайнерских решений, а производительность монад. Суть всплывёт ближе к концу (я надеюсь).

Представим, что мы моделируем некий процессор, у которого есть простой набор инструкций. С инструкций и начнем:

data Register = R1 | R2 | R3 | R4 | R5 | R6
                deriving (Show)
     
data Operator = ADD | SUB | MUL | DIV
              | LESS | EQUAL | AND | OR | NOT
              | MOV
              | JMT | JMF | JMP
              | PRN | NOP
                deriving (Show)

class OperandClass a where
   toOperand :: a -> Operand

instance OperandClass Register where
   toOperand = R

instance OperandClass Operand where
   toOperand = id

instance OperandClass () where
   toOperand _ = N

data Operand = R !Register | V !Double | I !Int | N
               deriving (Show)

type Instruction = (Operator, Operand, Operand) 

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

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

-- | Monad for programming instructions 

type ASM a = State [Instruction] a

compile :: ASM a -> [Instruction]
compile c = execState c []

op :: (OperandClass s, OperandClass d) => Operator -> s -> d -> ASM ()
op cmd src dst = modify $ \s -> s ++ [(cmd, toOperand src, toOperand dst)]

pos :: ASM Int
pos = liftM length get

nop :: ASM Int
nop = do { p <- pos; op NOP () (); return p}

putOp :: (OperandClass s, OperandClass d) => Int -> Operator -> s -> d -> ASM ()
putOp p cmd src dst = do
    let instr = (cmd, toOperand src, toOperand dst)
    (before,after) <- liftM (splitAt p) get 
    put $ before ++ instr : tail after

Тут, опять же, ничего сложного. Для наглядности, немного забегая вперед, приведу пример кода на этом «ассемблере». Данный код считает квадратный корень заданного числа методом Герона с заданным приближением (числом шагов):

-- | Heron's method to calculate square root
-- Inputs:  r1 - value to calculate square root from
--          r2 - number of iterations
-- Outputs: r6 - output value
heron :: ASM ()
heron = do
   op MOV (V 1) R5
   op MOV (V 0) R3
   iterStart <- pos
   op MOV R3 R4
   op EQUAL R2 R4
   ifFalse <- nop
   op MOV R1 R6
   op DIV R5 R6
   op ADD R5 R6
   op MUL (V 0.5) R6
   op MOV R6 R5
   op ADD (V 1) R3
   op JMP (I iterStart) ()
   loopEnd <- pos
   putOp ifFalse JMT R4 (I loopEnd)
   op PRN R6 ()

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

Идём дальше. Чтобы это всё выполнять, нужна ещё одна монада:

-- | Monad for executing instructions

data Registers = Registers
               { r1 :: !Double
               , r2 :: !Double
               , r3 :: !Double
               , r4 :: !Double
               , r5 :: !Double
               , r6 :: !Double
               } deriving (Show)

initialRs :: Registers
{-# INLINE initialRs #-}
initialRs = Registers
            { r1 = 0
            , r2 = 0
            , r3 = 0
            , r4 = 0
            , r5 = 0
            , r6 = 0
            }

type CPU a = StateT Registers IO a

execute ::Registers -> [Instruction] -> IO Registers
execute rs code = execStateT (exec code) rs
  where
   {-# INLINE exec #-}
   exec ((JMP, I pos, _    ):is) = {-# SCC "JMP" #-} exec $! drop pos code
   exec ((JMF,   reg, I pos):is) = {-# SCC "JMF" #-} readVal reg >>= \v ->
                                                     exec $! if toBool v
                                                             then is
                                                             else drop pos code
   exec ((JMT,   reg, I pos):is) = {-# SCC "JMT" #-} readVal reg >>= \v ->
                                                     exec $! if toBool v
                                                             then drop pos code
                                                             else is
   exec ((ins,   src,   dst):is) = {-# SCC "OP"  #-} execOP ins src dst >> exec is
   exec []                       = return ()

execOP :: Operator -> Operand -> Operand -> CPU ()
{-# INLINE execOP #-}
execOP ADD   src dst = {-# SCC "ADD"   #-} arith ADD   src dst
execOP SUB   src dst = {-# SCC "SUB"   #-} arith SUB   src dst
execOP MUL   src dst = {-# SCC "MUL"   #-} arith MUL   src dst
execOP DIV   src dst = {-# SCC "DIV"   #-} arith DIV   src dst
execOP LESS  src dst = {-# SCC "LESS"  #-} logic LESS  src dst
execOP EQUAL src dst = {-# SCC "EQUAL" #-} logic EQUAL src dst
execOP AND   src dst = {-# SCC "AND"   #-} logic AND   src dst
execOP OR    src dst = {-# SCC "OR"    #-} logic OR    src dst
execOP NOT   src dst = {-# SCC "NOT"   #-} logic NOT   src dst
execOP MOV   src dst = {-# SCC "MOV"   #-} readVal src >>= \v -> putVal dst $! v
execOP PRN   src _   = {-# SCC "PRN"   #-} readVal src >>= \v -> liftIO $ print v 

arith :: Operator -> Operand -> Operand -> CPU ()
{-# INLINE arith #-}
arith op src dst = do
    v1 <- readVal src
    v2 <- readVal dst
    case op of
       ADD -> putVal dst $! v2 + v1
       SUB -> putVal dst $! v2 - v1
       MUL -> putVal dst $! v2 * v1
       DIV -> putVal dst $! v2 / v1

logic :: Operator -> Operand -> Operand -> CPU ()
{-# INLINE logic #-}
logic op src dst = do
     v1 <- readVal src
     v2 <- readVal dst
     case op of
        LESS  -> putVal dst $! fromBool $ v2 <  v1
        EQUAL -> putVal dst $! fromBool $ v2 == v1
        AND   -> putVal dst $! fromBool $ toBool v1 && toBool v2
        OR    -> putVal dst $! fromBool $ toBool v1 && toBool v2
        NOT   -> putVal dst $! fromBool . not . toBool $ v1

fromBool :: Bool -> Double
{-# INLINE fromBool #-}
fromBool True  = 1
fromBool False = 0

toBool :: Double -> Bool
{-# INLINE toBool #-}
toBool 0 = False
toBool _ = True

readVal :: Operand -> CPU Double
{-# INLINE readVal #-}
readVal (R R1) = gets r1
readVal (R R2) = gets r2
readVal (R R3) = gets r3
readVal (R R4) = gets r4
readVal (R R5) = gets r5
readVal (R R6) = gets r6
readVal (V v)  = return v

putVal :: Operand -> Double -> CPU ()
{-# INLINE putVal #-}
putVal (R R1) v = modify $ \s -> s { r1 = v }
putVal (R R2) v = modify $ \s -> s { r2 = v }
putVal (R R3) v = modify $ \s -> s { r3 = v }
putVal (R R4) v = modify $ \s -> s { r4 = v }
putVal (R R5) v = modify $ \s -> s { r5 = v }
putVal (R R6) v = modify $ \s -> s { r6 = v }

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

Вот и всё!

Полная версия кода доступна на Гитхабе.

С файликом, загруженным в ghci, можно поиграться, например, так:

let h = compile heron
execute (initialRs {r1 = 25, r2 = 4}) h

5.015247601944898 Registers {r1 = 25.0, r2 = 4.0, r3 = 4.0, r4 = 1.0, r5 = 5.015247601944898, r6 = 5.015247601944898}

Но самое важное для меня в данной ситуации - это время, за которое наш компьютер посчитает 10 000 корней. Входные данные и скрипт для запуска есть в репозитории:

$ ghc --make -O3 Asm.hs
$ ./measure.sh

Судя по результатам профайлера, основное время мы таки проводим в нашем процессоре:

COST CENTRE MODULE    %time %alloc

OP          Main       33.6   34.2
PRN         Main       21.4   23.0
READ        Main       16.4   12.8
MOV         Main        8.8   13.2
ADD         Main        5.4    6.7
DIV         Main        3.3    3.7
EQUAL       Main        3.1    3.4
MUL         Main        2.7    3.0
JMT         Main        2.3    0.0
JMP         Main        1.9    0.0


                                                                  individual     inherited
COST CENTRE  MODULE                             no.     entries  %time %alloc   %time %alloc

MAIN         MAIN                                52           0    0.7    0.0   100.0  100.0
 JMT         Main                               113      200000    2.3    0.0    80.7   85.4
  OP         Main                               114     1610000   32.8   33.3    78.3   85.4
   PRN       Main                               121       10000   21.4   23.0    21.4   23.0
   EQUAL     Main                               120      200000    2.7    3.2     2.7    3.2
   JMP       Main                               119      200000    1.9    0.0     1.9    0.0
   MUL       Main                               118      200000    2.7    3.0     2.7    3.0
   ADD       Main                               117      400000    5.4    6.7     5.4    6.7
   DIV       Main                               116      200000    3.3    3.7     3.3    3.7
   MOV       Main                               115      600000    8.2   12.6     8.2   12.6
 EQUAL       Main                               111           0    0.4    0.2     0.4    0.2
 MOV         Main                               108           0    0.6    0.6     0.6    0.6
 OP          Main                               106       40000    0.8    0.9     0.8    0.9
  JMT        Main                               112       10000    0.0    0.0     0.0    0.0
  EQUAL      Main                               110       10000    0.0    0.0     0.0    0.0
  MOV        Main                               107       30000    0.0    0.0     0.0    0.0
 ITER        Main                               105       10000    0.4    0.1     0.4    0.1
 READ        Main                               104           1   16.4   12.8    16.4   12.8
 CAF         Main                               103           0    0.0    0.0     0.0    0.0
  READ       Main                               109           0    0.0    0.0     0.0    0.0

Т.о., исполнение собственно операций (кроме ввода-вывода) занимает около 70% всего времени.

Внимание, суть!. Интересно, как зависит время выполнения от способа организации (или, если хотите, реализации) главной монады в тесте - CPU. Самое простое для начала - попробовать готовые реализации.

Мои результаты:

  • 0.37с - для монады CPU, реализованной поверх пакета transformers
  • 0.39c - для mtl
  • 0.42c - для contstuff

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

newtype CPU a = CPU { runCPU :: forall r. Registers -> (a -> Registers -> IO r) -> IO r }

instance Monad CPU where
   return = retCPU
   (>>=)  = bindCPU

instance MonadIO CPU where
   liftIO = lioCPU

retCPU :: a -> CPU a
{-# INLINE retCPU #-}
retCPU x = CPU $ \s k -> k x s

bindCPU :: CPU a -> (a -> CPU b) -> CPU b
{-# INLINE bindCPU #-}
bindCPU (CPU m) f = CPU $ \s0 k -> m s0 $ \a s1 -> runCPU (f a) s1 k

lioCPU :: IO a -> CPU a
{-# INLINE lioCPU #-}
lioCPU f = CPU $ \s k -> f >>= \x -> k x s

get :: CPU Registers
{-# INLINE get #-}
get = CPU $ \s k -> k s s

gets :: (Registers -> a) -> CPU a
{-# INLINE gets #-}
gets f = get >>= \s -> return $! f s

put :: Registers -> CPU ()
{-# INLINE put #-}
put s = CPU $ \_ k -> k () s

modify :: (Registers -> Registers) -> CPU ()
{-# INLINE modify #-}
modify f = get >>= \s -> let s' = f s in put $! s'

Хотите верьте, хотите нет - такой вариант показал результат в 0.41c. Я в печали.

При ручном анроллинге (без CPS):

newtype CPU a = CPU { runCPU :: Registers -> IO (Registers, a) }

instance Monad CPU where
   return = retCPU
   (>>=)  = bindCPU

instance MonadIO CPU where
   liftIO f = CPU $ \s -> f >>= \x -> return (s, x)

retCPU :: a -> CPU a
{-# INLINE retCPU #-}
retCPU x = CPU $ \s -> return (s, x)

bindCPU :: CPU a -> (a -> CPU b) -> CPU b
{-# INLINE bindCPU #-}
bindCPU m f = CPU $ \s -> do (s', a) <- runCPU m s
                             runCPU (f a) s'

get :: CPU Registers
{-# INLINE get #-}
get = CPU $ \s -> return $! (s, s)

gets :: (Registers -> a) -> CPU a
{-# INLINE gets #-}
gets f = get >>= \s -> return $! f s

put :: Registers -> CPU ()
{-# INLINE put #-}
put s = CPU $ \_ -> return (s, ())

modify :: (Registers -> Registers) -> CPU ()
{-# INLINE modify #-}
modify f = get >>= \s -> let s' = f s in put $! s'

...всё несколько лучше, удалось получить 0.34с, но это всё равно не тот прирост, который я ожидал.

Данные эксперименты и опыт коллег, которые-делали-почти-то-же-самое-и-у-них-получилось, наталкивают на мысли, что что-то где-то пошло не так. Поэтому мой вопрос светлейшим умам форума сего - как воспроизвести те впечатляющие результаты с анроллингом и CPS? Какую деталь я мог упустить?

Для вашего удобства, весь код в его текущем состоянии выложен на Гитхабе, каждый вариант в своей ветке.

Простите ещё раз за такую простыню и неровный почерк. Всем любви!

 ,

yoghurt
()

Red Flat Awesome

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

Примерно год назад решил попробовать awesome. Хотелось чего-то максимально кастомизируемого, но более монолитного и системонезависимого. Данный wm показался интересным в этом плане, так что вооружившись напильником попытался сделать на его основе годное, согласно своим представлениям, окружение.

Еще скриншоты: традиционный с окнами[1] и все остальные[2][3][4][5][6][7].

На панели можно увидеть

  • Модифицированный taglist на самописных виджетах.
  • Набор индикаторов: иконка меню и оповещалка об обновлениях в одном, раскладка клавиатуры, регулятор громкости, почта, кастомный layoutbox. На громкости висит простенький виджет для моего любимого exaile[2], layoutbox умеет меню выбора режима тайлинга[2].
  • Сильно перепиленный tasklist[4][5]. Приложения обозначаются трехбуквенными алиасами, окна одного класса группируются в один значок. При наведении подсказка с полным именем или списком группы, по правой кнопке менюшка управления окном.
  • Специальный виджет для минитрея, точками обозначено количество приложений в трее. По клику/хоткею является собственно сам минитрей.
  • Индикаторы ресурсов - выдрал код из vicious и прикрутил свои визуалы. Была задумка сделать нескучные всплывающие виджеты с системной инфой, как раньше было у меня в доке, но энтузиазм закончился уже на первом, показывающем топ процессов[3]. Даже его не допилил до конца, память отображает криво.
  • Часы.

Виджеты на рабочем столе - перенес свои луа скрипты от коньков на базу awesome. Тут нет готовых датчиков, но на помощь снова приходит vicious. В целом средствами осома такие штуки пилить даже удобнее, ибо тру модульность и интерактивность. Зависимые от сети вещи подключены через модификацию asyncshell. Может быть имело смысл все через него пускать, но поздновато осознал насколько это нужная и полезная штука, лень переделывать.

Для пущего уюта установил uselessgap тайлинг от Lain. Сделал активные грани экрана. Немного переписал awful.menu, добавив автоскрытие, возможность вставлять неиндексируемые элементы(заголовки, разделители), автоматическую расстановку хоткеев и еще по мелочи[2][4]. На базе menubar запилил запускалку приложений[3] в стиле synapse, очень нравится такой визуал. Сильно скучал по классическому альттабу, даже накостылял кое-что, но потом некто Joren Heit выкатил няшный Familiar Alt Tab. Скрестив его и свои наработки получил такую переключалку[5][6]. Адским костылем с помощью asyncshell и rsvg-convert прикрутил адекватное масштабирование векторных иконок, заодно добавив смену цвета на лету. Сделал подсказку по хоткеям[7], как сами знаете где, с интерактивной подсветкой (пока без модификаторов).

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

Awesome 3.5.6, compton, тема gtk - Boje, иконки ACYL, шрифты play и prototype.

 ,

Worron
()

Есть тут специалисты по gtkmm?

Форум — Talks

 , ,

w1nner
()

Программы для работы со звуком

Форум — Multimedia

Базовая система коммутации звуковых потоков:

  • Jack Audio Connection Kit - необходимый элемент системы для соединения разных звуковых устройств, музыкальных инструментов, микрофонов, программ для обработки звука.
  • QjackCtl - графический интерфейс для JACK на Qt4
  • Patchage - удобный графический инструмент для коммутации звуковых потоков и устройств, в частности MIDI.
  • KXStudio: Cadence - набор приложений для коммутации аудиопотоков и устройств, управления Jack-сервером, замера уровня сигнала...
  • KXStudio: Carla - хост аудиоплагинов, поддерживает LADSPA (включая LRDF), DSSI, LV2, VST2/3 и AU форматы плагинов,также поддерживаются файлы GIG, SF2 и SFZ. Работает с Jack и ALSA.

Программы для звукозаписи и обработки звука:

  • Audacity - достаточно простой, но удобный инструмент для записи и обработки звука.
  • Ardour - профессиональный инструмент для многоканальной, многодорожечной записи звука, поддерживает несколько разных источников.
  • Qtractor - многодорожечный аудио/MIDI секвенсор.

Гитарные процессоры:

  • Rakarrack - набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные
  • Guitarix - ещё один набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные.

Синтезаторы:

  • Amsynth - набор синтезаторов с множеством настроек и предустановок. Ввод нот осуществляется с MIDI-клавиатуры, которую удобно подключить при помощи Patchage
  • LMMS - мультимедийная студия с синтезаторами, секвенсорами, кольцами и эффектами.
  • ZynAddSubFX - набор синтезаторов: реального времени, полифонический, мультитембральный, микротональный. Также набор эффектов для обработки звука. Работает с Jack, поддерживает MIDI, в том числе и подключение MIDI-контроллеров.
  • Yoshimi - форк ZynAddSubFX с усовершенствованиями в направлении работы с Jack и MIDI.

Инструменты для создания трекерной музыки:

  • MilkyTracker - инструмент для создания трекерной музыки.
  • Schism Tracker - инструмент для создания трекерной музыки, основанный на модифицированной версии Modplug - OpenMPT

Драм-машины:

  • Hydrogen - удобная графическая драм-машина.
  • DrumGizmo - драм-машина в виде самостоятельно приложения, также и в виде плагина.

Наборы эффектов для обработки звука:

  • Linux Audio Developer's Simple Plugin API (LADSPA) - классический набор эффектов и алгоритмов для обработки звука, также язык для разработи музыкальных программ.
  • LV2 - следующее поколение LADSPA
  • Calf studio gear - набор эффектов и алгоримов для обработки звука.

Нотные редакторы:

  • TuxGuitar - графический нотный MIDI-редактор, есть возможность вбивать ноты на «гитарном грифе» и «пианино».
  • LilyPond - крайне минималистичный, но очень мощный текстовый «нотный компилятор», часть проекта GNU.
  • Frescobaldi - продвинутый графический интерфейс для LilyPond, удобен возможность работы с мышью
  • Denemo - ещё один продвинутый графический интерфейс для LilyPond
  • Rosegarden - графический нотный редактор и MIDI-секвенсор.
  • FluidSynth - MIDI-синтезатор реального времени без графического интерфейса, работающий по спецификациям SoundFont 2.
  • Qsynth - графический интерфейс для FluidSynth.
  • MidiEditor - простой MIDI-редактор.
  • Musescore - нотный MIDI-редактор с графическим интерфейсом.
  • MusE - MIDI-секвенсор.

Статья на LOR Wiki

 , , , ,

toney
()

Повышение квалификации: посоветуйте литературу

Форум — Development

Добрый день. Умею говнокодить на C++, хочу развиваться и получать больше денег. Иду смотреть вакансии яндекса и вижу вопрос:

Какие из следующих стандартных контейнеров позволяют найти в них элемент (по его значению) за O(ln(n))?

std::vector

std::list

std::deque

std::set

std::multiset

std::hash_set

сортированный std::vector

сортированный std::list

сортированный std::deque

сортированный std::set

сортированный std::multiset

сортированный std::hash_set

Аргументируйте ответ, прокомментируйте правильность постановки вопроса

И понимаю, насколько я еще ничтожен. Что такое O(ln(n)) я еще понимаю, но какие алгоритмы используются в стандартной библиотеке - могу только догадываться. Хотя, возможно, вопрос на самом деле не сложный и я даже знаю как на него ответить, не углубляясь в детали реализации. Но всё равно хочется поднять свой уровень. В связи с этим посоветуйте литературу, чтобы углубить знания стандартной библиотеки C++ и вообще знания алгоритмов и с этими знаниями смочь устроиться в нормальное место.

Пожалуйста, не предлагайте перейти на другой язык, это слишком долго.

Ну и заодно пусть развернется дискуссия по поводу решения задач от яндекса:

Перемещено mono из talks

 ,

Hrenomoto
()

XDG Base Directory Specification, даже когда софт не хочет.

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

Довольно давно меня подзадолбала мусорка в домашней директории, постепенно получилось заставить почти весь софт гадить в строго определенное место, а именно в .config, .cache и .local

Для особо одаренных (Skype, Dropbox) пришлось слегка поизвращаться, если для Skype достаточно было изменить параметр запуска на

skype --dbpath=$HOME/.local/share/skype
, то для Dropbox уже пришлось городить костыль в виде

HOME=$HOME/.local/share/dropbox /usr/bin/dropbox start -i 2>&1

Остальной софт относительно разумен, где через alias, где через export, удалось обяснить, куда складировать свое добро. Ниже листинг .bashrc и .profile, авось кому пригодится.

( Листинг )

 

gwinn
()

Олимп 2207 — глубокая модификация Fallout 2

Форум — Games

26 декабря 2014 года вышла версия 1.0 игры «Олимп 2207» — некоммерческой олдскульной постапокалиптической РПГ, действие которой происходит на территории бывшего США, в параллельной вселенной.

( читать дальше... )


Подробности

Перемещено fallout4all из games

 ,

anonymous
()

Классика на свободных движках

Форум — Games

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

  • openKB - движок для King's Bounty - идейного прародителя Heroes Of Might & Magic, Warlords, Disciples, Age Of Wonders.
  • FHeroes2 - Heroes of Might & Magic 2 - прошёл 2 больших карты против AI, всё вполне работоспособно, быстро, красиво, поддерживается вся серия HOMM2, смена разрешений, в настройках можно добавлять плюшки из HOMM3.
  • VCMI - Heroes of Might & Magic 3 - играл против AI, тестировал новые версии движка, испавлял баги, добавлял города. Поддерживаются WOG и ERA, но можно играть и на чистых HOMM3 (поддерживается вся серия). Также много плюшек, новых артефактов, городов, юнитов, героев, смена разрешений и другие вкусности.
  • Dune Legacy - Dune 2 - прошёл несколько миссий за разные дома, играл скирмиши, всё прекрасно работает. Движок вполне современный, взято много идей из последующих игр серии, например выделение множества объектов, очереди строительства, векторы движения, естественно, есть смена разрешений и куча приятных настроек. Также поддерживаются моды.
  • War1gus - движок для Warcraft I, основан на Stratagus.
  • Wargus+Aleona's Tales - свободный движок для Warcraft II + свободные ресурсы (можно играть и с оригинальными) - тоже вполне играбельно и удобно, основа движка - Stratagus, возможность выделять множество объектов, векторы движения, разные разрешения...
  • Stargus - движок для Starcraft I, основан на Stratagus.
  • 7KAA - движок для своеобразной стратегии Seven Kingdoms.
  • OpenRedAlert - движок для Red Alert 1, написанный на C++, в отличие OpenRA (Mono).
  • OpenRA - модифицированный движок для Red Alert, Command & Conquer и Dune 2000 (Achtung! Mono!).
  • OpenXcom - UFO: Enemy Unknown - прохожу капманию, всё работает, с каждой новой версией всё лучше. Также с версии 1.0 поддерживается мод с Ктулху.
  • FreeSynd - Syndicate - тоже вполне играбельно, наконец-то починили радар.
  • Syndicate Wars Port - движок для Syndicate Wars, продолжения Syndicate.
  • GemRB - движок для Baldur's Gate, Icewind Dale и Planescape: Torment. Вполне рабочий, я почти прошёл Baldur's Gate.
  • Micropolis - Свободный движок для SimCity.
  • ECWolf - модернизированный движок для Wolfenstein 3D, Spear of Destiny и Super 3D Noah's Ark, основанный на кодах Wolf4SDL и ZDoom.
  • Cytadela - движок для Cytadela, стрелялки от первого лица для Amiga.
  • Rise of the Triad - движок для уникальной для своего времени игры Rise of the Triad, основанной на сильно модифицированном движке для Wolfenstein 3D.
  • ZDoom+FreeDoom - Модифицированный и современный движок для Doom, Doom 2, Heretic, HeXen, Strife + свободные ресурсы. Множество улучшений: свободный обзор, прицел, приседания и прыжки, объекты больше не имеют бесконечную высоту, высокое разрешение. Также есть замечательный мод BrutalDoom, привносящий моря кровищщи, горы кишок и ультранасилие.
  • GZDoom - OpenGL-форк ZDoom.
  • Doomsday - модифицированный OpenGL-движок для Doom I&2, Heretic, Hexen, HacX, Chex с поддержкой трёхмерных моделей вместо спрайтов.
  • uHexen2 - SDL/OpenGL движок для Hexen II: Hammer of Thyrion.
  • DarkPlaces + Quake Revitalization Project - модифицированный OpenGL-движок для Quake I + обновлённые текстуры.
  • Yamagi Quake II - модифицированный движок для Quake II, также поддерживает дополнения Mission Pack 1 'The Reckoning' и Mission Pack 2 'Ground Zero'.
  • ioquake3 - модифицированный движок для Quake III.
  • Eduke32+HRP - Модифицированный SDL/OpenGL движок для Duke Nukem 3D (свободный обзор, прицел, прыжки, приседания, высокое разрешение) + набор свободных трёхмерных текстур. Прошёл всего Дюка с трёхмерными текстурами и продвинутой отрисовкой Polymer.
  • eRampage - движок для стрелялок Redneck Rampage, Suckin' Grits on Route 66, Redneck Rampage Rides Again и Redneck Deer Huntin'. Основан на EDuke32.
  • BloodCM + HRP for BloodCM - Blood на движке EDuke32 + текстуры в высоком разрешении. Готовы 2 эпизода игры, третий в разработке.
  • Aleph One - модифицированный движок для Marathon, Marathon 2: Durandal и Marathon Infinity. Также сообществом разработаны новые игры Marathon: EVIL, Tempus Irae, Marathon RED, Marathon: Eternal, Marathon: Rubicon X, Marathon: Phoenix. Ещё есть отдельная игра Excalibur: Morgana's Revenge. Эти игры особенно придутся по душе латентным, активным и пассивным любителям Macintosh, ибо изначально Marathon разрабатывался исключительно под эту платформу.
  • Xash3D - свободный движок для Half-Life (аналог GoldSource).
  • D2X-XL - OpenGL движок для трёхмерной леталки-стрелялки Descent. Также разработан редактор уровней DLE.
  • DXX-Rebirth - SDL/OpenGL движок для трёхмерных леталок-стрелялок Descent 1&2.
  • ForsakenX - движок для трёхмерной леталки-стрелялки Forsaken, клона Descent.
  • OpenTTD - свободный движок для Transport Tycoon Deluxe + свободная графика и звуки.
  • JA2-Stracciatella - Jagged Alliance 2. Несмотря на периодические приостановки, проект до сих пор жив и недавно снова вошёл в активную фазу.
  • ScummVM - набор свободных движков в основном для игр в жанре quest (приключение), например от Lucas Arts, Sierra, Westwood, Coktel Vision, The Neverhood Inc., The Dreamers Guild, Revolution Software, Psygnosis, Infocom, Delphine Software International, Adventure Soft, также и для некоторых ролевых игр: Eye of the Beholder I&II, Lands of Lore: The Throne of Chaos. На данном этапе ведутся работы по поддержке таких замечательных игр, как Myst, Riven: The Sequel to Myst, Gabriel Knight, Gabriel Knight 2: The Beast Within, King's Quest VII, Phantasmagoria I&II, Police Quest IV, Police Quest: SWAT, Quest for Glory IV, Space Quest 6: The Spinal Frontier, Leisure Suit Larry 7, Broken Sword 2.5...
  • ResidualVM - движки для трёхмерных игр Grim Fandango и Escape from Monkey Island от Lucas Arts, также добавлена поддержка для Myst 3 Exile. Для Grim Fandango разработан 'point & click интерфейс'.
  • Pentagram - движок для Ultima VIII с поддержкой разных разрешений, разных звуковых систем, миникарты, TrueType.
  • Exult - движок для Ultima VII с поддержкой разных разрешений, разных звуковых систем, статусбаров, Exult Studio для разработки своих игр.
  • Nuvie - движок для Ultima VI.
  • XU4 - движок для Ultima IV с поддержкой VGA и 16-bit графики, смешивание заклинаний как в Ultima V.
  • OpenMW - The Elder Scrolls III: Morrowind. Проект активно развивается, добавляется новый функционал, поддержка модификаций, но на данном этапе поиграть пока не удастся.
  • Lord of the Rings game engine - движок для ролевой игры Lord of the Rings.
  • Arx Libertatis - движок для трёхмерной ролевой игры Arx Fatalis.
  • FS2Open - движок для космического симулятора FreeSpace 2. Также есть fsport - адаптация кампаний FreeSpace 1 для FS2Open.
  • CorsixTH + CorsixTH-Graphics - движок для симулятора больницы Theme Hospital и набор новой свободной графики.
  • Abysmal Engine - движок для System Shock 1 и Ultima Underworld. Проект жив, потихоньку развивается.
  • OpenAge - движок для Age of Empires II. Проект на начальной стадии, ещё сырой. Разработчики пока толком не определились с технологиями, хотят для изометрической графики задействовать OpenGl и шейдеры.
  • Antares - движок для космической стратегии Ares. Трепещите, латентные, активные и пассивные любители Macintosh, игра изначально разрабатывалась исключительно под эту платформу.
  • CaesarIA - симулятор Римской Империи и Цезаря в частности Caesar III.
  • Falltergeist - свободный движок для Fallout 1&2, разрабатываемый на C++ с использованием SDL2. Проект на начальной стадии, но активно развивается.
  • freeablo - свободный движок для Diablo 1 с использованием SDL2. Проект на начальной стадии, готов начальный посёлок с нейтральными персонажами и пара случайно генерируемых подземных уровней.
  • Abuse - аркадная стрелялка-платформер, сюжет вдохновлён вариациями на тему «Хищник против Чужих». Движок использует отрисовку через SDL или OpenGL (на выбор), работает на 32-bit и 64-bit платформах. К игре прилагаются освобождённые ресурсы.
  • New RAW - интерпретатор для аркадной игры Another World.
  • Bermuda Syndrome - SDL-движок для аркадного приключения Bermuda Syndrome.
  • REminiscence - SDL-движок для аркадного приключения Flashback.
  • f2bgl - SDL/OpenGL-движок для трёхмерного приключения Fade To Black.
  • Igor - SDL-движок для испанского квеста Igor: Objetivo Uikokahonia.
  • Carlos - SDL-движок для платформера Carlos.
  • xBaK - движок для уникальной для своего времени ролевой игры Betrayal at Krondor. Относительно играбельно, но некоторых важных функций может не оказаться. Проект, к сожалению, заброшен. Форкайте, господа, пилите для ScummVM.
  • bstone - движок для стрелялки от первого лица Blake Stone: Planet Strike.
  • CatacombSDL - SDL2-движок для фентези-стрелялки Catacomb II.
  • NXEngine - SDL-движок для платформера Doukutsu Monogatari (также известного как Cave Story).
  • Commander Genius - движок для серии платформеров Commander Keen.
  • The Ur-Quan Masters + Ur-Quan Masters HD - движок для космического аркадного ролевого стратегического квеста Star Control II + текстуры в высоком разрешении.
  • OpenJK - движок для Jedi Knight II: Jedi Outcast и Jedi Knight III: Jedi Academy с минимальными измененями, максимально близкий к оригинальному.
  • JediOutcastLinux - ещё один движок для Jedi Knight II: Jedi Outcast.
  • JediAcademyLinux - ещё один движок для Jedi Knight III: Jedi Academy.
  • SDL Sopwith - SDL/GTK+ движок для классического аркадного авиасимулятора Sopwith.
  • Ultimate Stunts - OpenGL движок для классического гоночного симулятора Stunts.
  • Freeserf - SDL-движок для классического симулятора поселенцев The Settlers 1 «Serf City».
  • Return to the Roots - OpenGL-движок для для классического симулятора поселенцев The Settlers II Gold Edition.
  • OpenRaider - OpenGL-движок для серии приключенческих игр Tomb Raider (1-5). 5-я игра серии пока не полностью работоспособна.
  • OpenTomb - ещё один OpenGL-движок для серии приключенческих игр Tomb Raider (1-5).
  • Privateer - Gemini Gold - OpenGL-движок для Wing Commander, основан на кодовой базе Vega Strike.
  • ET: Legacy - модифицированный движок для многопользовательской игры Wolfenstein: Enemy Territory.
  • Zod Engine - движок для уникальной стратегии Z.

Статья на LOR Wiki.

 ,

toney
()

Шок от С. Как склеивать строки?

Форум — Development

Осваиваю си. Всё шло хорошо пока внезапно не понадобилось склеить строки (константные и переменные). Покурил stackoverflow. Предлагают 2 варианта:

Первый - создать char buf[молись_чтобы_хватило] и делать str(n)cat/sprintf в этот buf.

Второй - использовать asprintf, который расширение, нестандарт и вообще.

Вопрос: как вы склеиваете строки? Может есть какая-нибудь общепринятая либа?

Простите за нубский вопрос

 

makoven
()

Следить за изменением псевдофайла в /proc

Форум — Development

Ситуация такая, что есть скрипт на bash, который грепает строчку в псевдофайле в /proc и в зависимости от значения выполняет команду. Проблема в том, что это значение 95% времени одинаковое, а команда все-равно выполняется все время. inotify как выяснилось не может в /proc, может есть способ накостылять что-то с проверкой контрольных сумм? Что подскажете? Вот скрипт:

#!/bin/bash

do_it(){
    RATE="$(grep -E "rate: .*" /proc/asound/card1/pcm0p/sub0/hw_params | awk '{print $2}')"
    case "${RATE}" in
        44100    ) SET="0" ;;
        48000    ) SET="1" ;;
        88200    ) SET="2" ;;
        96000    ) SET="3" ;;
        176400    ) SET="4" ;;
        192000    ) SET="5" ;;
        *        ) SET="0" ;;
    esac
    amixer -c 1 set 'Clock rate Selector' ${SET}
}

while :; do
        do_it && sleep 0.01
done

 

Andrew
()

Годные фантастические книги за последние 15 лет?

Форум — Talks

Рос на классике - Хайнлайн, Азимов, Лем, Филип Дик, Кларк, Брэдбери, Стругацкие итд итп. Ну и современники в лице Симмонса Дэна и Игана Грега по нраву.
Старье перечитывать надоело, захотелось свежатинки. Наугад взял:

  • Падшие Ангелы Мультиверсума - унылый и вторичный поцкиберпансковский шлак.
  • Ложная Слепота - идеи интересные, но вышло слишком затянуто.
  • Распознавание Образов - атмосферно, но вяло.


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

 ,

bubblecore
()

Классификация операторов в Lisp

Форум — Development

Разработчики Common Lisp не зря поменяли традиционный термин «специальная форма» на «специальный оператор». Например, выражение как целое (quote a) является специальной формой, а quote обозначает специальный оператор. Необходимо еще немного прояснить терминологию. Итак, оператор — любой объект, который может находится в голове формы. Ниже представлена классификация операторов:

                           Операторы
             _________________/\__________________________________________
	    |                              |                              |
         Функции                Специальные операторы                  макросы
       ____/\____              ____________/\________________ 
      |          |            |                              |
 встроенные   замыкания     Примитивные                 реификаторы
                        специальные операторы       ________/\_________
                                                   |                   |
                                               частичные             полные

Как можно видеть, я не отношу макросы к категории специальных операторов, т.к. макросы лишь эмулируют специальные операторы.

В соответствии с этой теорией должен быть изменен apply/eval интерпретатор:

(eval выражение окружение продолжение)
(apply-operator оператор аргументы окружение продолжение)
(apply-function функция аргументы продолжение)

Функция eval лишь вычисляет голову формы, а результат (оператор) классифицируется функций apply-operator, которая либо передает управление функции, которая реализует соответствующий специальный оператор, либо функции apply-function. Кроме того, что специальные операторы применяются к невычисленным аргументам (cdr формы), они еще имеют доступ к полному контексту вычислений. Макросы не имеют такого доступа, поэтому, я не классифицирую их как специальные операторы. Функции не имеют доступа к лексическому окружению момента вызова. Следовательно такие функции как set из CL должны рассматриваться как нарушение теории и исключены из Лиспа. Функция set может быть, но только если она будет принимать дополнительный аргумент: (set символ значение окружение).

Частичные реификторы. nlambda получает только cdr формы, vau — cdr формы и окружение.

Полные реификаторы. В работах Brian Cantwell Smith были предложены 3-х аргументные fexpr'ы. В реификаторы Смита передаются не только сырые аргументы и окружение, но и продолжение. Полные реификаторы неотличимы от встроенных специальных операторов.

 

komputikisto
()

Чем прошить модем под онтопиком?

Форум — Linux-hardware

Обычно, вся фигня что находится в инете заточенна под офтопик, есть ли что нибудь под линух?

Модем: HUAWEI 321s.

 

pon4ik
()

Кто «делал» «музыку» на компьютере?

Форум — Talks

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

 ,

mio
()

Интерфейс dwm << awesome

Форум — Development

Возможно ли dwm привести к виду awesome?

Т.к. пришлось создать оверлей для dwm, ибо писать изменения вручную в dwm.c без патчей удобнее. Естессно, предварительно наложил пару патчей(failed правил вручную).. но кое-что - ургенты - не заработало - сказывается писанина на готовеньком - awesome(lua)..

Пока знакомлюсь с базой Си, чтоб понимать суть самого исходника и прилагающейся кучи патчей на suckless-сайте..

Если заметили, на скрине dwm уже подправил надоедливые квадраты на приемлемые глазу линии на тегах.

Что не устраивает в awesome: при всем его гибкости он становится тяжел(на скрине панель свободна для отрисовки, ибо приехала со стаца - отсутсвует гпу+2ядра) даже с шедулером(который явно уменьшил задержки) Что не хватает в dwm: того, что на скрине awesome.. панели, что хочу, то и творю с ними: cairo на awesome, в dwm пока с Xlib можно прекрасно работать(кстати Xcb или Xlib? вроде не одно и тоже)

ЗЫ:: i3 только для дебиана на флехе, wmii был до i3, остальные тайловики щупал в ознакомительных целях(и то давно)..

ЗЫ:: хоть и ОС генту, гентушников не кастую.. с ебилдом более менее разобрался

 ,

TODD
()