1. Список говнокодов пользователя CHayT

    Всего: 67

  2. Си / Говнокод #20320

    −43

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    Жила-была маленькая либа для некого специфического IPC c Erlang, которую использовали почти все приложениями на большом-пребольшом 
    кластере. Писалась она во времена, когда эрланг был медленным и на прологе писаным. Использовалась приложениями она как-то так:
    
    ...
    libFoo_initialize();
    for(int i = 0; i<9001; i++) {
        libFoo_registerStuff(bar[i]);
    }
    continue_my_own_business_logic();
    ...
    
    В этом году обнаружили мы странный разброс нагрузки на разных узлах кластера. Профилировали-профилировали, да нашли следующее:
    
    void libFoo_initialize(void) 
    {
       do_stuff();
       int nap = srand(5);
       /* Load balancing, prevent simultaneous registration: */
       sleep(nap);
    }
    
    Таким образом, наша маленькая либа балансировала нагрузку этого кластера, полного матанных приложений, сложной контрольной логики и 
    fault-tolerance питушни, десятки лет! Само собой, это никто выпиливать не решился, и фикс был следующим:
    
    void libFoo_initialize2(void (*callback)(void))
    {
       do_stuff();
       int nap = srand(5);
       /* Load balancing, prevent simultaneous registration: */
       sleep(nap);
       callback();
       sleep(5-nap);
    }
    
    Т.е. цикл с libFoo_registerStuff(bar[i]) переносился в этот колбек. Такие дела.

    CHayT, 03 Июля 2016

    Комментарии (8)
  3. Haskell / Говнокод #20287

    −22

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    kobenate :: (MonadVoretion m)
             => Config
             -> Disjunct
             -> RuleZipper
             -> m Disjunct
    kobenate cfg d₀ z = uphill d₀ z 
      where
        climb t x =
          case parent x of
            Just x' -> uphill t x'
            Nothing -> return t
    
        uphill t x =
          case label <$> parent x of
            Just (LinkAnd{}) -> do
              i <- downhill' cfg $ reverse $ before x
              j <- downhill' cfg $ after x
              climb (i \++/ t \++/ j) x
            _ ->
              case label x of
                MultiConnector{} -> do
                  m <- downhill cfg (tree x)
                  let t' = t \++/ m
                  climb t' x
                _ ->
                  climb t x
    
    downhill' :: (MonadVoretion m)
              => Config
              -> [Link]
              -> m Disjunct
    downhill' cfg x = foldl (\++/) ([], []) <$> mapM (downhill cfg) x
    
    downhill :: (MonadVoretion m)
             => Config
             -> Link
             -> m Disjunct
    downhill cfg [email protected](Node label subforest) =
      case label of
        Optional _ ->
          ifR (_decay_optional cfg)
             {-then-} (downhill cfg $ head subforest)
             {-else-} (return ([], []))
        MultiConnector _ ->
          ifR (_decay_multi cfg)
             {-then-} (do
               a <- downhill cfg l0
               b <- downhill cfg $ head subforest
               return $ a \++/ b)
             {-else-} (return ([], []))
        LinkOr{} ->
          downhill cfg =<< pickRandom subforest
        LinkAnd{} ->
          downhill' cfg subforest
        Cost{} ->
          downhill' cfg subforest
        EmptyLink ->
          return ([], [])
        Link{_link=i} -> do
          case _linkDirection i of
            Plus  -> return ([], [Left i])
            Minus -> return ([Left i], [])

    Метод вореции дерева методом вниз, вверх и опять вниз, но сбоку. В индексе храним смещение бата правил, зожатых в отдельный файл. Ворециируем любое подходящее правило из индекса и розжимаем дерево в зиппер. Находим пачку подходящих зипперов, см. http://govnokod.ru/20195, ворециируем любой из них. Вверх идём просто, ничего не ворецируя, ибо нужную кобенацию важно сохранить, а вот сбоку идём вниз, тут уж можно любую кобенацию брать.

    CHayT, 28 Июня 2016

    Комментарии (12)
  4. Haskell / Говнокод #20195

    −24

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    findConnections :: LinkID
                    -> Link
                    -> [RuleZipper]
    findConnections x = go . fromTree
      where go z =
              case label z of
                Link {_link=l}
                  | x' =*= l -> [z]
                  | True     -> []
                _ ->
                  go' (firstChild z) ++ go' (next z)
    
            go' x = (toList x) >>= go
    
            x' = flipLink x

    1) создаём кучу почти полных копий дерева (не совсем полных, т.к. есть какой-никакой tail sharing)
    2) но это фиксится тем, что обход дерева заканчивается преждевременно из-за ошибки!
    изящный код, который можно породить только в 3 ночи под Sabaton

    CHayT, 14 Июня 2016

    Комментарии (82)
  5. Haskell / Говнокод #20153

    −61

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    -- | @'resetT' [email protected] delimits the continuation of any 'shiftT' inside @[email protected]
    --
    -- * @'resetT' ('lift' m) = 'lift' [email protected]
    --
    resetT :: (Monad m) => ContT r m r -> ContT r' m r
    resetT = lift . evalContT
    {-# INLINE resetT #-}
    
    -- | @'shiftT' [email protected] captures the continuation up to the nearest enclosing
    -- 'resetT' and passes it to @[email protected]:
    --
    -- * @'resetT' ('shiftT' f >>= k) = 'resetT' (f ('evalContT' . k))@
    --
    shiftT :: (Monad m) => ((a -> m r) -> ContT r m r) -> ContT r m a
    shiftT f = ContT (evalContT . f)
    {-# INLINE shiftT #-}
    
    .... Usage:
    
    Prelude Control.Monad.Trans.Cont> evalCont $ callCC (\done -> reset (done "Ok") >> return "Fuck you!" )
    "Fuck you!"

    говно прямо в transformers
    плохо зделали, тупо
    хочу, чтобы возвращалось Ok

    CHayT, 07 Июня 2016

    Комментарии (156)
  6. Haskell / Говнокод #20068

    −51

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    data TTree k v =
      TNode {
        _key :: !k
      , _val :: !(Maybe v)
      , _eq :: !(TTree k v)
      , _left :: !(TTree k v)
      , _right :: !(TTree k v)
      , _height :: !Int
      }
      | TTNil
      deriving (Show, Generic)
    instance (Binary k, Binary v) => Binary (TTree k v)
    
    insertWith' :: (Ord k)
                => (v -> v -> v) -- ^ Conflict resolution function
                -> [k]           -- ^ Key
                -> Int           -- ^ Length of the key
                -> v             -- ^ Value
                -> TTree k v     -- ^ Tree
                -> TTree k v
    insertWith' f [email protected](k:kt) h v t =
      case t of
        TTNil ->
          insertWith' f k1 h v $ TNode {
              _key = k
            , _eq = TTNil
            , _left = TTNil
            , _right = TTNil
            , _val = Nothing
            , _height = h
            }
        [email protected]{_key=k0, _height=h0, _val=v0, _eq=eq0, _left=left0, _right=right0} ->
          case compare k0 k of
            EQ | null kt ->
                   node {
                     _val = Just $ maybe v (flip f $ v) v0
                   }
               | True ->
                   node {
                     _eq = insertWith' f kt (h-1) v eq0
                   , _height = max h h0
                   }
            GT ->
               node {
                 _left = insertWith' f k1 h v left0
               , _height = max h h0
               }
            LT ->
               node {
                 _right = insertWith' f k1 h v right0
               , _height = max h h0
               }
    {-# SPECIALIZE insertWith' :: (v -> v -> v) 
                               -> [Char] 
                               -> Int
                               -> v 
                               -> TTree Char v
                               -> TTree Char v
      #-}

    а почему бы не использовать несбалансированное тернанрое дерево для индекса
    вроде ничего стра
    Out of memory: Kill process 2987 (govno) score 265 or sacrifice child

    CHayT, 25 Мая 2016

    Комментарии (18)
  7. Си / Говнокод #20049

    −39

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    <?php include_once "stdio.h"; ?>
    
    int main()
    {
        <?php
            for($i = 0; $i < 20; $i++)
                echo 'printf("%d\n", '.$i.');';
        ?>
    }

    You can use PHP as a C preprocessor. The advantages are:

    very similiar syntax, so syntax highlighting works.
    <? and ?> are not used in standard C (with non-standard C, the only thing that gets broken is old GCC extension operator that returns min/max)
    it's rich in libraries.
    it's turing complete.
    usage of macros is very explicit. (compared to sneaky C preprocessor macros)

    For serious use though, making PHP print the #line directives is needed for debugging preprocessed code.


    http://stackoverflow.com/questions/396644/replacements-for-the-c-preprocessor/16256052#16256052
    ящитаю это гениально

    CHayT, 20 Мая 2016

    Комментарии (45)
  8. Haskell / Говнокод #19959

    −60

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    instance Applicative (Sample m) where
      pure a = Val a
    
      Val{_unVal=f} <*> a = fmap f a
      Fork{..} <*> a = Fork {
          _next = \x -> (_next x) <*> a
        , ..
        }
      Zero <*> _ = Zero
      Random{..} <*> a = Random { -- Crazy-ass weirdo haskeller, why did you define instance Random for ->?!!
          _next = \x -> (_next x) <*> a
        , ..
        }

    CHayT, 07 Мая 2016

    Комментарии (6)
  9. Haskell / Говнокод #19913

    −56

    1. 1
    import Control.Lens

    то неловкое чувство, когда долго боролся с искушением, и таки добавил эту строчку
    https://ro-che.info/ccc/23

    CHayT, 02 Мая 2016

    Комментарии (4)
  10. Куча / Говнокод #19694

    +5

    1. 1
    https://meduza.io/shapito/2016/03/24/iskusstvennyy-intellekt-ot-microsoft-za-sutki-polyubil-gitlera-i-voznenavidel-feministok

    RIP in peace, nazi AI ;_;

    CHayT, 25 Марта 2016

    Комментарии (5)
  11. Haskell / Говнокод #19679

    −54

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    refactorMe ∷ (Monad m) ⇒ (a → b) → Producer a m r → Producer b m r
    refactorMe f p = do
      n ← lift $ next p
      case n of
        Left r → return r
        Right (x, p') → do
          yield $ f x
          refactorMe f p'

    ниасилил pipes

    CHayT, 22 Марта 2016

    Комментарии (28)