LINUX.ORG.RU

Сообщения monk

 

Зависимые типы, жидкие типы. Что лучше?

Пытаюсь понять тенденции в современных статических языках. Обычного Haskell явно не хватает. Что ожидать на замену?

 , ,

monk ()

1С: Библиотека стандартных подсистем, редакция 3.1

«1С:Библиотека стандартных подсистем» (БСП) предоставляет набор универсальных функциональных подсистем, готовые разделы для пользовательской документации и технологию для разработки прикладных решений на платформе «1С:Предприятие». С применением БСП становится возможной быстрая разработка новых конфигураций с уже готовой базовой функциональностью, а также включение готовых функциональных блоков в существующие конфигурации.

Входящие в БСП подсистемы охватывают такие области, как:

  • Администрирование пользователей и прав доступа;
  • Средства администрирования и обслуживания (установка обновлений, резервное копирование, дополнительные отчеты и обработки, оценка производительности и др.);
  • Сервисные подсистемы (история изменений объектов, заметки и напоминания, печать, полнотекстовый поиск, присоединенные файлы, электронная подпись и др.);
  • Технологические механизмы и программные интерфейсы (процедуры и функции общего назначения, обновление версии ИБ, работа в модели сервиса и др.);
  • Нормативно-справочная информация и классификаторы (адресный классификатор, банки, валюты и др.);
  • Интеграция с другими программами и системами (обмен данными, работа с почтовыми сообщениями, отправка SMS, рассылка отчетов и др.);
  • Прикладные подсистемы и рабочие места пользователей (анкетирование, бизнес-процессы и задачи, взаимодействия, варианты отчетов и др.).

Всего в БСП входит более 60 подсистем.

Исходный код библиотеки распространяется по лицензии Attribution 4.0 International (CC BY 4.0). Текст лицензии доступен по ссылке: https://creativecommons.org/licenses/by/4.0/legalcode  Эта лицензия позволяет вам использовать, распространять, перерабатывать, исправлять и развивать библиотеку в любых, в том числе, в коммерческих целях, при обязательном условии указания авторства библиотеки в вашем программном продукте.

Подробности

Перемещено Shaman007 из opensource

 

monk ()

С++ неожиданный результат выдаёт.

Вот весь код программы:

#include <iostream>
#include <fstream>
#include <string>

bool exists(std::string path)
{
        std::ifstream f(path);
        std::cout << path << ": " << f.good() << std::endl;
        return f.good();
}

int main()
{
        std::ifstream f("settings.txt");
        std::string name, path;
        std::getline(f, name);
        std::getline(f, path);
        std::cout << "path = " << path << std::endl;
        std::cout << "path/run = " << (path + "run") << std::endl;
        std::string pathrun = path + "run";
        std::cout << "prun = " << pathrun << std::endl;
        exists(pathrun);
        return 0;
}

А вот её вывод:

path = /mnt/
runh/run = /mnt/
runn = /mnt/
run: 0

Вижу, что со строками какой-то ужас, но не могу понять, что я сделал не так.

 

monk ()

Новый язык программирования для русскоговорящих

Синтаксис от Хаскеля, семантика от Ракета.

факториал(сч) =
  если (сч == 1)
    1
    сч * факториал (сч - 1)

фибоначчи(сч) =
  если (сч < 3)
       1
       пусть рекурсия (н-1 1 ; н 2; тек-сч 3)
         если (сч == тек-сч) н $ рекурсия н (н + н-1) $ тек-сч + 1

Будет ещё конструкция надо-быстро с семантикой от Си (и использованием gcc).

Исходники: https://github.com/Kalimehtar/russian-lang

Пакет для Ракета: https://pkgd.racket-lang.org/pkgn/package/russian-lang

Документация: https://docs.racket-lang.org/russian-lang/index.html

 , ,

monk ()

Как сделать cdr в std::forward_list?

Хотел сделать что-то вроде библиотечки по работе со списками, аналогичной лисповым для c++, и обнаружил, что в std::forward_list есть front(), но нет функции для получения хвоста списка, аналогичной лисповому cdr.

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

 ,

monk ()

Как узнать, можно ли использовать код?

Предположим, дописываю я что-то в код под GPL. И нужен мне какой-нибудь алгоритм. Нахожу на github.

Как узнать, можно ли его использовать, или будут проблемы? Вот, например, Есть репо под лицензией MIT.

Какие риски использования кода из такого источника в opensource проекте?

 ,

monk ()

Есть что-то лучше, чем rsync?

Есть папка с текущими бэкапами. Её надо синхронизировать на удалённый сервер. Объём папки около 8ТБ, между серверами 1Гб/с.

Бэкапы — копии виртуальных жёстких дисков, поэтому между синхронизациями должны изменяться несильно.

Пытаюсь по rsync. Очень долго тупит вначале. Потом медленно-медленно копирует. С диска читает со скоростью 20-30МБ/с, в результате время копирования чуть ли не больше, чем копировать целиком. В процессах показывает, что загружает одной ядро ЦП (из 24) и, похоже, из-за этого тормозит.

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

 ,

monk ()

Scheme SRFI-29

Как правильно его использовать?

В SRFI приведён пример:

(if (not (load-bundle! bundle-name))
                    (begin
                     (declare-bundle! bundle-name (cdr translation))
                     (store-bundle! bundle-name)))) 

Но ведь в этом случае, если translation будет изменён после первого запуска, то при запуске будет использоваться старая версия: (load-bundle! bundle-name) загрузит старую сохранённую версию и вернёт #t.

Просто писать declare-bundle!, а остальное игнорировать? Или делать макрос со сторонним эффектом времени компиляции?

 ,

monk ()

Ошибка в CSS

Появляется горизонтальная прокрутка в теме black при просмотре комментариев. Например, по адресу Верните формат даты взад.

Проверил на Linux (Firefox 65.0.1), Windows (Firefox, Chrome).

Прокрутка пропадает при уменьшении ширины окна примерно до 670 пикселей. Зато появляется прокрутка в этом окне (где я сейчас пишу). Здесь точно вижу, что за границы выходят поля Заглавие и Метки.

Параметры монитора

screen #0:
  dimensions:    3840x2160 pixels (610x343 millimeters)
  resolution:    160x160 dots per inch

 

monk ()

Как в Haskell получить значение из предыдущего цикла?

Простейший пример

main = do
  refval = newIORef 0
  forever $ do
    line <- getLine
    let newval = read line :: Int
    val <- readIORef refval
    writeIORef refval newval
    putStrLn $ show $ newval-val

Как-то можно обойтись без IORef?

 

monk ()

Современный быстрый RPC

Хочу написать программу. Идеологически хочу её сделать как пачку микросервисов, но не хочу привязываться к конкретному языку программирования.

Поэтому нужен протокол для общения между микросервисами. Нашёл https://github.com/hprose : высокая скорость, много поддерживаемых языков. Но хочу уточнить, может есть уже что-то более популярное.

 , ,

monk ()

Повторное использование кода

Как определяется, в какую сторону должно быть обобщение?

То есть, при решении конкретной задачи как определить, что должно быть параметром, а что — неизменяемой частью.

Например, есть задача «получить сумму от 1 до 100».

Самым быстрым решением будет

class Sum1_100
{
  int run() { return 5050; }
}

но в этом случае программист поработал за компьютер. Тривиальное решение с расчётом компьютером

class Sum1_100
{
  int run() 
  { 
    int res = 0; 
    for(int i=1; i<=100; i++) res+=i; 
    return res; 
  }
}

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

class Sum1_n
{
  int n;
  Sum1_n(int _n = 100) { n = _n; };
  int run() 
  { 
    int res = 0; 
    for(int i=1; i<=n; i++) res+=i; 
    return res; 
  }
}

на случай, если потребуется не до 100, а до какого-то другого числа.

И вот здесь у меня вопрос: почему в «получить сумму от 1 до 100» большинство параметризуют именно 100? Посему не «сумму» (тогда параметром будет операция от 100 элементов) или не «от 1 до 100» (тогда параметром будет некая последовательность). Или вообще не всё сразу? С вызовом типа

  auto_ptr<Op> op = new GenOp(operator+, 100);
  auto_ptr<Seq> seq = new Seq(1, 100);
  auto_ptr<Apply> = new GenApply(op, seq);
  result = Main->run();

Как для произвольного алгоритма определяется, что является параметром, а что неизменяемой частью?

 , ,

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 ()

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