LINUX.ORG.RU

Сообщения monk

 

Пиратский линукс

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

  1. https://www.avito.ru/surgut/telefony/smartfon_sony_xperia_xzs_dual_1016942416

    Согласно GPL, продавец телефона должен передать покупателю исходные коды программ под GPL, входящих в версию Android на телефоне.

  2. https://appster.ru/application/sistema/7-zip — программа под LGPL, ссылки на исходники нет
  3. Передача сервера с Linux с одной организации в другую. Формально надо найти исходники для всех программ, установленных на сервере. Причём установочный диск не подойдёт, так как часть программ при обновлении уже не совпадает с установочным диском. Есть для современных Binary Based дистрибутивов какая-нибудь команда с функцией «скачать все исходники установленных программ в заданный каталог»?

Если я неправ, можете указать где?

 , ,

monk
()

Можно ли без промежуточных переменных?

Если в обычном языке есть выражение типа f1() + f2() + f3(), то в Хаскелле, если эти функции имеют побочные эффекты, приходится писать

do
  tmp1 <- f1
  tmp2 <- f2
  tmp3 <- f3
  return tmp1+tmp2+tmp3

Можно ли как-нибудь написать то же самое без промежуточных переменных?

 ,

monk
()

TCP. Как сделать надёжное соединение?

Если связь нестабильна, то tcp соединения часто уходят в какую-то «спячку». При этом второе соединение к тому же серверу успешно открывается, то есть связь есть. Есть возможность в своём клиент-серверном приложении придумать какое-то нормальное решение?

Необходимо оперативно получать оповещение с удалённого компьютера (когда событие произошло, оповещение надо через пару секунд), а получатель оповещения за NAT'ом. Пока придумал только постоянно гонять сообщения, что всё хорошо, а если больше, чем на секунду задержка, то сбрасывать соединение и соединяться заново. Но выглядит как-то костыльно. Кажется, что тогда проще на UDP накостылять свой надёжный протокол.

Есть какие-нибудь идеи?

 

monk
()

Загадка

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

Внезапно у Петра зазвонил телефон. Звонил Фёдор, друг Петра и также бывший одноклассник Петра и Василия. Пётр рассказал Фёдору, что он в гостях у Василия, и что у Василия двое детей и один из них сын. Фёдор предложил пари, что второй ребёнок — девочка. Более того, он согласен был поставить полторы тысячи рублей против тысячи рублей Петра. Пётр ненадолго задумался и согласился.

Пётр понимал, что по теории вероятностей, вероятность того, что оба мальчики вдвое меньше вероятности того, что дети разнополые. Но у него была идея. Положив трубку, он спросил у Василия «Этот сын — старший ребёнок?». Теперь, если ответ «да», то вероятность того, что младший ребёнок — девочка уже 50 на 50. Если ответ «нет», то аналогично то вероятность того, что старший ребёнок — девочка тоже 50 на 50 и Пётр уверен, что его шансы на победу резко выросли.

Как оцениваете, каковы шансы Петра выиграть полторы тысячи рублей?

 ,

monk
()

Как правильно создавать сложные объекты?

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

Как правильно написать конструктор такого объекта? Вроде как банально new myItem(f1, f2, f3, ..., f32) некрасиво. В голову приходит только что-то вроде

i = new myItem();
i.f1 = ...;
i.f2 = ...;
...
i.f32 = ...;
i.init(); // здесь проверяется корректность данных

но это как-то совсем громоздко. Как-то красивее можно?

 ,

monk
()

Оптимизация в Haskell

Пара вопросов

1. Всегда ли чистые функции для одинаковых аргументов выполняются один раз? То есть

f yy = (yy, myCalc $ head yy)

g = (myCalc y, f [y])

и

f yy x = (yy, x)

g = let x = myCalc y
    (x, f [y] x)
обязано ли компилироваться в одно и то же?

2. Какой аналог для i++ в IORef?

   x <- readIORef i
   let y = x + 1
   writeIORef i y
   return y

можно сделать короче?

 ,

monk
()

Такой код читаем?

func = (. map) . (.) . filter	

Его только я понять не могу или это аналог однострочника на PERL? Если только я, то посоветуйте, что почитать или как проще понимать такие функции.

 ,

monk
()

Может ли быть Segmentation Fault в Haskell?

Собственно, вопрос в теме.

 ,

monk
()

ФВП и производительность

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

SBCL:

(declaim (optimize (speed 3) (safety 0)))

(asdf:oos 'asdf:load-op :alexandria)

(defun f (x)
  (+ (+ (+ x 1) 2) 1))

(let ((f-comp
          (alexandria:compose
            (lambda (x) (+ x 1))
            (lambda (x) (+ x 2))
            (lambda (x) (+ x 1)))))
  (defun f-comp (x)
     (funcall f-comp x)))

(defconstant iter 10000000)

(time
 (dotimes (i iter)
   (f i)))

(time
 (dotimes (i iter)
   (f-comp i)))


Evaluation took:
  0.181 seconds of real time
  0.180000 seconds of total run time (0.180000 user, 0.000000 system)
  99.45% CPU
  325,363,554 processor cycles
  0 bytes consed

Evaluation took:
  0.296 seconds of real time
  0.296000 seconds of total run time (0.296000 user, 0.000000 system)
  100.00% CPU
  530,610,480 processor cycles
  0 bytes consed

Racket:

#lang racket
(define (f x)
  (+ (+ (+ x 1) 2) 1))

(define f-comp
  (compose
   (lambda (x) (+ x 1))
   (lambda (x) (+ x 2))
   (lambda (x) (+ x 1))))

(define iter 1000000)

(time 
 (for ([i iter])
   (f i)))

(time 
 (for ([i iter])
   (f-comp i)))

cpu time: 728 real time: 726 gc time: 0
cpu time: 1244 real time: 1244 gc time: 0

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

 , , ,

monk
()

Что это за язык программирования?

Вот скриншот.

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

Кто-нибудь видел что-то похожее?

 

monk
()

Как отключить автонастройку режима по монитору?

Стоит компьютер с KVM. При переключении Linux теряет монитор и выставляет разрешение 1024x768.

Переключаю обратно, разрешение включается не сразу, приходится запускать gnome-control-center display

Можно как-то отключить это автоопределение?

 ,

monk
()

Имена переменных и знание языка

Вроде как надо называть переменные (а также программные файлы) на правильном английском языке даже если программу предполагается использовать только на территории РФ.

В связи с этим вопрос: как вы находите правильные термины?

Вот например, понадобилось сделать печатную форму оборотной ведомости. Иду в гугл и он мне предлагает negotiable bill, иду на yandex — там предлагается turnover sheet. Нутром чую что второй вариант правильней, но доказать не могу. И, самое главное, спросить-то некого. Заказчик отчёта — нормальный русский бухгалтер, знающий кроме русского только немецкий.

Как вы в такой ситуации определяете правильный термин при разработке программы?

 ,

monk
()

Как жить без call/cc? Посоветуйте алгоритм решения

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

Реализация на Scheme:

(define (walk-tree fn tree)
  (if (cons? tree)
      (begin
        (walk-tree fn (car tree))
        (walk-tree fn (cdr tree)))
      (fn tree)))

(define (compare-trees tree1 tree2)
  (call/cc 
   (lambda (return)
     (define caller #f)
     (define (yield-cont)
       (walk-tree proc1 tree1)
       (caller #f))     
     (define (yield)
       (call/cc
        (lambda (k)
          (set! caller k)
          (yield-cont))))
     (define (proc1 x)
       (call/cc
        (lambda (continue)
          (set! yield-cont (lambda () (continue #f)))
          (caller x))))
     (define (proc2 x)
       (unless (eqv? x (yield))
          (return #f)))
      (walk-tree proc2 tree2)
     (return (eq? (yield) #f)))))

Как написать такое без продолжений? Можно на Scheme/Java/C++/чём угодно.

 ,

monk
()

Анализ пользователей Common Lisp и Racket

Common Lisp разрабатывался и используется в предположении, что пользователь программы — программист. Поэтому из языка намеренно исключены сложные для понимания конструкции (пользователь не обязательно квалифицированный программист), поэтому в языке мощнейший отладчик, позволяющий без остановки программы переопределять функции и вообще делать что угодно. Но из-за этого документация по большей части библиотек Common Lisp существует только в виде docstring и комментариев в коде (некоторые вообще считают, что код сам себе документация). Из-за этого обработка ошибок почти всегда оставляется на отладчик (главное сделать рестарт «перезапустить с последней итерации», а там пользователь сам разберётся). Из-за этого в программе проверяется только happy path (пользователь ведь «тоже программист»).

Racket разрабатывался и используется в предположении, что пользователь программы не программист, а задача разработчика написать программу так, чтобы она корректно работала при любых входных данных (если данные некорректны, то сообщала об этом в том месте, где данные были введены). Поэтому в языке эффективная библиотека для написания тестов, система контрактов на уровне модулей, макимально широкий спектр инструментов программирования (разработчик должен быть профессионалом!). Также реализована идея инкапсуляции: считается, что пользователь модуля не должен знать особенности реализации и, более того, не может в своём коде изменить функцию чужого модуля если это явно не разрешено разработчиком того модуля. Исходный код разумеется доступен, но его не требуется смотреть, чтобы использовать модуль. Достаточно документации. Поэтому реализована мощнейшая система документировния Scribble, а при реализации макроса есть возможность обеспечить указание на ошибки в коде, предоставленном макросу пользователем, не показывая потроха макроса.

И поэтому в Racket нет CLOS (есть как минимум две реализации, но не используются) - провоцирует заплаточное программирование (monkey patching), поэтому отладчик намеренно ограничен (если ты отлаживаешь программу, значит ты не знаешь как она должна работать!), поэтому нет разработки в образе (image based) - она провоцирует разработку через отладку (а значит непонимание программы и проверку только happy path).

Таким образом, Racket и Common Lisp несмотря на внешнее сходство являются очень разными языками. И я рекомендую писать на Racket, если только конечными пользователями программы не являются исключительно программисты на Common Lisp.

Взято с http://racket-lang.blog.ru/#post214726099

Хотелось бы знать, что по этому поводу думают пользователи ЛОРа. А также, мне кажется, что для Java и C++ будет где-то такая же разница.

 , ,

monk
()

Как заставить нормально работать stacktrace в Racket?

#lang racket
(define (foo x) (/ 1 x))
(define (bar x) 
  (define res (foo (- x 1))) res)
(bar 1)

В stacktrace попадает вызов bar, определение bar целиком и вызов (/ 1 x).

Как сделать, чтобы попал вызов (foo (- x 1)) ?

 

monk
()

Структура БД, union type

Задача:

есть таблица событий, в ней есть поле source.

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

Источник может относится к одному из около 500 типов. Каждый тип — отдельная таблица.

Насколько я понимаю, в SQL нельзя сделать ссылку, которая содержала бы имя таблицы. Или можно?

Придумывается что-то вроде source_type int, source_id int, где source_type — номер таблицы и source_id — id в той таблице. Но 1) что делать с ссылочной целостностью (забить?) 2) как джойнить, если надо отфильтровать по полю регистратора?

У меня фильтрация получается что-то вроде

select e.* from events e
where (e.source_id, e.source_type) in
(select id, 1 from source1 where key_field = $1
union all
select id, 2 from source2 where key_field = $1
union all
....
union all
select id, 500 from source500 where key_field = $1)

Есть что-то проще? Или лучше для таких задач брать nosql?

 ,

monk
()

Кто хотел лисп, компилирующийся в C++?

Нашёл на просторах Интернета: https://bitbucket.org/ktg/l/src/337c13802c5e?at=master

Умеет макросы

(define-syntax sum
  (syntax-rules ()
    [(sum) 0]
    [(sum a) a]
    [(sum a b) (+ a b)]
    [(sum a b ...) (+ a (sum b ...))]))

(define-syntax-rule (infix a op b) (op a b))

(define-syntax-rule (ret a) (return a))

(defmacro unless (pred a b)
  `(if (not ,pred) ,a ,b))

(main
  (prn (sum 1 2 3 4))
  (prn (infix 1 + 2))
  (unless false (prn "Will print") (prn "Will not print"))
  (ret 1))

Примеры смотреть в https://bitbucket.org/ktg/l/src/337c13802c5e/ex/?at=master

Хвалите и критикуйте!

 , ,

monk
()

Как читать документацию по OpenOffice?

Помогите, может я не туда смотрю?

http://www.openoffice.org/api/docs/common/ref/com/sun/star/sheet/Spreadsheets...

Написано — реализует XIndexAccess, в котором на getByIndex написано «Return type = any, the element at the specified index».

Где найти, какой тип на самом деле возвращается интерфейсом?

 , ,

monk
()

существует ли стабильный ABI для Qt?

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

Когда-то был qt-c. Потом был cpp-кусок от qtjambi. Вроде тоже помер. Сейчас смотрю, что в PyQt свой мегавелосипед (SIP — интерфейс из питона к C++), PerlQt — закончился в 2003 году, RubyQt — требует развернуть mingw.

Qt теперь снова только для С++ (и Python)?

 ,

monk
()

В чём делать шаблоны документов?

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

По ним есть утверждённые формы (шрифты, отступы, изображения...).

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

В связи с этим вопрос: в чём порекомендуете делать шаблоны? Под оффтопиком естественный выбор — офис, но OpenOffice не хочется — как-то не юниксвейно.

Пытаюсь выбрать между html и latex. Вроде latex лучше: результат всё равно ожидается только на печати, но в html проще с шрифтами, да и wysiwyg есть...

Ваши мнения?

 , ,

monk
()

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