LINUX.ORG.RU

Сообщения Zenom

 

Размышления, Scala vs F#

Форум — Talks

Я использую Scala как свой основной рабочий инструмент уже около 8 лет. Вполне достаточно для того, чтобы в голове образовались рельсы, и чтобы, держа в руке молоток, любую задачу считать гвоздём. Для борьбы с этим я стараюсь держать себя в курсе интересных тенденций в дизайне языков. Вот, дошли руки и до F#. Давно уже собирался, а ещё и то, что Microsoft делает с .Net core, вызывает живой интерес.

Честно говоря, от F# я ожидал большего. Вот список того, что мне было бы интересно в нём найти:

  • Type classes. Без них грустно. И если в OCaml это компенсируется мощной системой модулей, то в F# мы имеем босый хрен.
  • Higher kinded types. Ибо без них тайпклассы имеют весьма ограниченный смысл.
  • Call by name. Полезная штука чтобы не писать каждый раз уродство типа fun () -> blah в аргументах функций.
  • Computation expressions для всех монад в стандартной библиотеке из коробки. Ребята, серьёзно? Запилить такую крутую штуку, и не положить в коробку реализацию даже для опций? Ну как это вообще называется?!
  • Макросы.
  • И на правах совсем уж странной хотелки. Доступ к компилятору как к библиотеке. В сочетании с такой прикольной фичей, как code quotations, это была бы бомба. Я недавно реализовывал транслятор SQL-like языка в Scala-код, который затем компилируется и выполняется. Если бы я это делал на F#, то мне пришлось бы гораздо труднее.

Ничего из этого не является dealbreaker'ом, впрочем. И теперь список того, что в F# лучше, чем в Scala.

  • Человеческие ADT. Это вообще must have!
  • Computation expressions. Несмотря на наркоманию с наличием одновременно Yield/Return, Bind/For и т. п. пар, которые делают ровно одно и то же, этот сахарок гораздо слаще for-comprehension в Scala.
  • Автокарринг. Без него бесточечный стиль применим гораздо реже, чем хотелось бы.
  • Типовыводилка. Тема спорная, но мне нравится типовыводилка из ML-ей.
  • Type providers. В Scala это реализуется макросами, но они до сих пор в экспериментальном статусе.
  • Code quotations. В Scala есть quasi-quotations и reify, но это добро вместе с макросами в экспериментальном статусе. Что-то сопоставимое появится только когда зарелизится Dotty.

Такие дела. А теперь давайте устроим высокоинтеллектуальный срач по теме в комментах!

 , ,

Zenom
()

Как с наибольшими удобствами продаться копирастам?

Форум — Talks

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

Но! За свои деньги мне хочется получить то, что нужно мне. А мне нужно, чтобы, купив музла, я мог его удобно скачать на нужное мне устройство без DRM, SMS и использования дополнительного софта. Также хотелось бы иметь возможность выбора кодека и битрейта, но это уже опционально. А вопрос заключается в следующем: какие площадки, торгующие музлом, обеспечат мне мои хотелки и широкий выбор? Вроде бы подходит Bandcamp, но там нет всего, что мне интересно. Что ещё есть?

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

 ,

Zenom
()

Linux on Galaxy

Форум — Talks

https://seap.samsung.com/linux-on-galaxy

Ъ: В Samsung работают над приложением, которое позволит устанавливать любой дистрибутив на Galaxy S8, S8+ и Note 8. Использоваться это будет не на крошечном экране смартфона без привычных устройств ввода, а в связке с док-станцией DeX. Ориентировано это всё, по заявлениям Samsung, на «разработчиков». С этим понятно, надо же обозначить целевую группу, а кому ещё охота красноглазить? Но я считаю, что основная цель в экспериментальной проверке подхода Samsung к работе со «взрослыми» ОС на своих устройствах.

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

PS: создайте тег «dex», этот девайс с такими новостями становится интересным

 , , ,

Zenom
()

Rust, borrow rules и нерекурсивный обход рекурсивной структуры

Форум — Development

Допустим, у нас есть некая рекурсивная структура. Например, n-арное дерево:

enum Tree<'a> {
  Leaf(i32),
  Node(Vec<&'a Tree<'a>>)
}

Допустим, мы хотим метод для получения самого левого потомка и хотим реализовать его нерекурсивно:

impl<'a> Tree<'a> {
  fn leftmost(&self) -> &'a Tree {
    let mut leftmost = self;
    while let Tree::Node(ref children) = *leftmost {
      leftmost = children[0]
    }
    leftmost
  }
}

Проверяем:

fn main() {
  let bottom = Tree::Leaf(42);
  let middle = Tree::Node(vec![&bottom]);
  let top = Tree::Node(vec![&middle]);
  
  if let Tree::Leaf(val) = *top.leftmost() {
    println!("val: {}", val)
  }
}

Печатает val: 42, как и ожидается.

Теперь мы хотим сделать так, чтобы на одного потомка произвольной вершины могли ссылаться несколько слотов родительской вершины, т. е. чтобы потомок был достижим разными путями. Поскольку нам нужно много ссылок на одно значение, нам нужен Rc<Tree>. Поскольку Rc неизменяем, нам нужен Rc<RefCell<Tree>>:

enum RCTree {
  Leaf(i32),
  Node(Vec<Rc<RefCell<RCTree>>>)
}
Пробуем реализовать leftmost:
impl RCTree {
  fn leftmost(&self) -> &RCTree {
    let mut leftmost = self;
    while let RCTree::Node(ref children) = *leftmost {
      // &Ref<RCTree> coerces to &RCTree
      leftmost = &children[0].borrow()
    }
    leftmost
  }
}
И тут нам лупит лопатой по морде borrow checker:
rustc 1.12.1 (d4f39402a 2016-10-19)
error: borrowed value does not live long enough
  --> <anon>:29:19
   |
29 |       leftmost = &children[0].borrow()
   |                   ^^^^^^^^^^^^^^^^^^^^
   |
note: reference must be valid for the anonymous lifetime #1 defined on the block at 25:32...
  --> <anon>:25:33
   |
25 |   fn leftmost(&self) -> &RCTree {
   |                                 ^
note: ...but borrowed value is only valid for the expression at 27:53
  --> <anon>:27:54
   |
27 |     while let RCTree::Node(ref children) = *leftmost {
   |                                                      ^

error: aborting due to previous error
Вопрос: можно ли реализовать таким образом leftmost для RCTree и если можно, то как?

 

Zenom
()

Go с треском пробивает днище

Форум — Talks

[Go] Getenv returns the empty string [if the environment variable isn't set] and continues. Then Go somehow manages to parse the empty string as an empty JSON list and still continues.

Это что, правда?

Источник: http://roscidus.com/blog/blog/2013/06/09/choosing-a-python-replacement-for-0i...

 

Zenom
()

Преобразование моноида в аппликативный функтор, непонятки с типизацией

Форум — Development

Значит так:

Prelude Data.Functor.Constant Control.Applicative> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

Старая добрая всем хорошо известная функция

Дальше:

Prelude Data.Functor.Constant Control.Applicative> Constant "Hello " <*> Constant "world!"
Constant "Hello world!"

Всё хорошо, но почему выражение Constant "Hello " <*> Constant "world!" прошло проверку типов, при том, что <*> ждёт первым аргументом f (a -> b) а реально передан Constant "Hello ", т. е. f a?

 

Zenom
()

Представление типов XML-RPC в Scala

Форум — Development

Допустим, нам нужно написать сериализатор значений для XML-RPC. Спека определяет правила сериализации для примитивов. С этим проблем нет. Заводим трейт

CanRepresentAs[-From, +To]
где определяем метод
def convert(x: From): To
Далее для каждого примитивного типа заводим по implicit занчению типа CanRepresentAs[XXX, scala.xml.Node] с нужной реализацией. Эти значения затем подтягиваются в качестве implicit-параметров в те функции, которые нуждаются в сериализации. С примитивами разобрались, переходим к массивам и структурам. Массив тоже сериализуется очень просто, мы определяем implicit-функцию
implicit def seqAsXML[T](implicit sr: CanRepresentAs[T, scala.xml.Node]): CanRepresentAs[Seq[T], scala.xml.Node]
и дальше всё происходит по той же схеме. А вот со структурами дело обстоит сложнее ввиду их разнородности. Мы не можем представить структуру как Map, потому что её поля имеют разный тип. Логично было бы определить правила сериализации для любого типа, и тогда структуру составляли бы поля произвольно взятого объекта, но из-за контрвариантности CanRepresentAs по типу From это поломает сериализацию примитивов, так как возникнет конфликт при резолюции неявных параметров.

Сейчас я вижу такие варианты решения:

  1. Определить тип-маркер XMLRPCStruct и правила сериализации только для этого типа. Но это какой-то жабизм и вообще говнодизайн.
  2. Генерировать неявные значения макросами. Это ведёт к усложнению структуры проекта.
  3. Сделать аналог CanRepresentAs, только с перламутровыми пуговицами инвариантный. Это дублирование кода. Поправка: это бред.

Какие ещё варианты может предложить лор-коммунити?

 , ,

Zenom
()

О джаббер-клиентах

Форум — Talks

Если я хочу джаббер-клиент под макось, который хранит логи в SQLite, то единственный выбор — собирать вручную Gajim, да?

 ,

Zenom
()

Медленная зарядка батареи в SGS III

Форум — Mobile

Samsung Galaxy S III, Android 4.1.2, официальный.

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

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

Что это может быть и как это решать?

Zenom
()

Простенькая задачка программистам

Форум — Talks

Задача: написать функцию для расчёта n-го числа Фибоначчи в одно выражение и без явного использования рекурсии. Желательно также уместить в одну строку. Мною получена применительно к Scala, но вы пишите на любом языке. Да, и ещё, это должен быть расчёт числа с использованием двух предыдущих, формулу для вычисления n-го числа сразу использовать нельзя.

Zenom
()

Помогите диагностировать проблему с USB-модемом

Форум — General

Купил модем Alcatel X090S. Вот строчка про него из lsusb:

Bus 003 Device 041: ID 1bbb:0000 T & A Mobile Phones

В /dev появились соответствующие устройства:

[zenom@vesta ~]$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2

Т. е. usb_modeswith отрабатывает и проблема не в том, что модем видится как носитель с ФС.

Пользователь входит в группу dialout, которой принадлежат эти устройства. А дальше тишина, NetworkManager этот модем не видит, соединение я создать не могу. Я проверил с телефоном вместо модема, соединение создаётся и работает.

Лог ModemManager-а по ссылке.

Установлена Fedora 15. Что интересно, на машине с Fedora14 всё работает. Помогите разобраться, кто виноват.

Zenom
()

Сообщение от SELinux заставило произвести кирпичей

Форум — Talks

SELinux is preventing /usr/sbin/sshd from search access on the directory /var/spool/mqueue.

***** Plugin catchall (100. confidence) suggests ***************************

If you believe that sshd should be allowed search access on the mqueue directory by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # grep sshd /var/log/audit/audit.log | audit2allow -M mypol # semodule -i mypol.pp

Вот какого хрена он туда полез?

Zenom
()

Scala comes to .Net

Форум — Talks

Miguel Garcia, part of the Scala group at EPFL, has been striving to make the Scala productivity available to .Net developers too. In a project funded by Microsoft, he has now reached a major milestone in delivering that capability. In this interview Miguel tells you how you can now use Scala on .Net and gives an insight into the way this challenging project has been achieved and the future direction.

Пруфлинк

Если кому не лень, напишите мини-новость.

Zenom
()

Присоветуйте экономических стратегий

Форум — Games

Мама попросила ей новых игр поставить. Она предпочитает экономические стратегии. Я с этим жанром как-то очень слабо знаком, поэтому прошу насоветовать. Таких, чтобы были нативно под Linux или под wine работали без проблем.

Zenom
()

Python, GTK и WebKit. Проблемы переносимости.

Форум — Development

Работаю над переносимым приложением на Python. Гуй сделан на PyGTK. Одно из требований — встроенный простенький браузер. Решил сделать его на WebKit. Под Linux всё отлично, а вот под виндой не работают брузерные плагины (Flash, например). Вопросы:

  • Есть ли в природе сборка webkitgtk/pywebkitgtk для винды, поддерживающая плагины?
  • Если нет, то почему и есть ли в принципе возможность собрать самостоятельно без глубокого ковыряния в исходниках WebKit?
  • Если для поддержки плагиов под виндой требуется серьёзная работа, то можно ли заменить pywebkitgtk чем-нибудь столь же легко встраиваемым?
Zenom
()

Scala-2.9.0

Форум — Talks

We are happy to announce the release of the new stable release of the Scala distribution. The new Scala 2.9.0 final is available from our Download Page. The Scala 2.9.0 codebase includes several additions, notably the new Parallel Collections, but it also introduces improvements on many existing features, and contains many bug fixes.

http://www.scala-lang.org/node/9483

Напишите кто-нибудь новость, а то я занят.

Zenom
()

6 лет за порно

Форум — Talks

http://www.gzt.ru/topnews/accidents/-dlya-pokazavshego-pornorolik-v-moskve-prokuror-/353473.html

Жителя Новороссийска Игоря Блинникова, обвиняемого в показе порноролика на рекламном видеоэкране на Садовом кольце в Москве, прокурор требует приговорить к шести годам колонии.

Для сравнения:

Статья 109. Причинение смерти по неосторожности

1. Причинение смерти по неосторожности — наказывается ограничением свободы на срок до трех лет или лишением свободы на тот же срок.

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

Zenom
()

Scala, continuations и тип Nothing

Форум — Development

Проблема в следующем: если в блоке shift объявить продолжение, как возвращающее тип Nothing, то компилятор ругается:

error: type mismatch;
 found   : ((Unit) => Nothing) => (Unit) => Nothing
 required: ((Unit) => B) => (Unit) => Nothing

Минимальный пример, демонстрирующий ошибку:

import scala.util.continuations._

object CTest {
    def loop: Nothing = reset {
        shift {c: (Unit => Nothing) => c()}
        loop
    }

   def main(argv: Array[String]) {loop}
}

Однако, если сделать вот так:

import scala.util.continuations._

object CTest {
    def loop: Nothing = reset {
        shift {c: (Unit => Any) => c.asInstanceOf[Unit => Nothing]()}
        loop
    }

   def main(argv: Array[String]) {loop}
}

то всё работает, как и ожидается (т. е. падает от переполнения стека, гг). Кто знает, чем компилятору не нравится тип Nothing в continuation?

Zenom
()

Java и 7z

Форум — Development

Нужна библиотека для работы с файлами 7z из жабки. Само сжатие LZMA поддерживается родным LZMA SDK, а вот реализация поддержки формата файлов 7z не гуглится (вернее есть что-то, но зависит от нативных библиотек, это не вариант). Так вот, может кто-то писал такую библиотеку самостоятельно и может поделится?

Zenom
()

[СПВ] Чем заменить перекуры

Форум — Talks

Присоветуйте, чем заменить перекуры во время работы. Чтобы встать, пройтись, размяться, всё спокойно обдумать и т. д.

 

Zenom
()

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