?

Log in

No account? Create an account
Ничем не примечательный ЖЖ
 
[Most Recent Entries] [Calendar View] [Friends]

Below are 20 journal entries, after skipping by the 20 most recent ones recorded in gds' LiveJournal:

[ << Previous 20 -- Next 20 >> ]
Tuesday, January 31st, 2012
11:12 am
actors + пул + протокол
Меня давно волнует это тема, но в последнее время появилась явная практическая необходимость в ней, поэтому от личного и полупубличного обдумывания перейду к публичному.

Хочется мне построить одну систему в идеологии actors (или близкой к ней).
Collapse )
Tuesday, October 25th, 2011
12:35 pm
lcm 6 7.2
Исходный вопрос: nicka_startcev: Какое наименьшее общее кратное у 6 и 7.2 ?
Реализация на C++, обсуждение double: udpn: Дробная арифметика
Реализация на OCaml, чисто для разминки/отвлечения:
Collapse )
$ ./main.byte
(lcm 6 36/5) = 36


Репка тут.
Tuesday, September 20th, 2011
8:15 pm
120.48%
Был очень удивлён, увидев в посте у ребе людей, которым 1. нравится переход на летнее-зимнее время (!), 2. которым он нравится по политическим причинам (!!!111111).
Вывел коэффициент упоротости, равный приблизительно 120.48%. Кстати, исходя из весьма строгих соображений.
Friday, August 19th, 2011
4:06 pm
депрессия -- взгляд дилетанта
Вынесу из обсуждения в жж у metaclass, разговаривали с nekhill:
Collapse )
UPD: грамотное развитие темы от nekhill в сторону стресса и "удачной струи" / "жизненного пути": пост.
Thursday, July 28th, 2011
10:27 pm
извените, но в последнее время я не слишком внимательно читал френдленту.
Если чо либо если вдруг внезапно было что-то важное, мой жаббер gdsfh1@gmail.com, а пишу я в куда-то -- так получается, что чаще, чем сюда, и в более расслабленном формате. Люди меняются. А я такой!
Так-то!
Каменты заскриню (почти единственный раз пригодилось), чтобы не этосамое пока что.
Tuesday, July 5th, 2011
6:39 pm
Я как-то утверждал, что среди хаскеллистов много мудаков. Статистики у меня не было, да и с тех пор с незнакомыми пользователями х-я общался мало. Поэтому будем потихоньку собирать статистику.
(14:01:10) gds: а инфиксные функции вообще усложняют чтение кода.
(15:55:40) klapaucius: "инфиксные функции вообще усложняют чтение кода" Поэтому самый популярный язык программирования - лисп.
Monday, July 4th, 2011
6:14 pm
[само]организация
Понял, что большинство моих проёбов и лишних затрат времени вызваны откровенно хуёвым планированием. Проанализировав частные случаи, пришёл к выводу, что мне нужны 3 штуки.
Collapse )
Так-то. Однако увязать это воедино -- не знаю, как. Всё сложно. А это говорит о том, что такая система будет либо неудобной, либо нестройной, либо сложной в использовании.
Friday, July 1st, 2011
12:53 pm
Вложенные аппликативные функторы
У меня была необходимость разобрать записи, получаемые от реляционки (от постгреса в моём случае), в окамле, который строго типизирован.
Collapse )
Sunday, June 5th, 2011
3:06 pm
аппликативные функторы
Разгрыз аппликативные функторы. Лучше поздно, чем никогда. И не просто в теории, но и на практике тоже.
Хорошая штука для своих применений, главное из которых -- эмуляция "функции с переменным количеством аргументов".
В моём конкретном примере, имея некое окружение (заданное статически пока что, в виде [("a", String "str"); ("b", Int 123); ("c", Bool True)]), код

value () = run &
  (fun f -> f <$> string "a" <*> int "b" <*> bool "c")
  (Printf.printf "a=%S b=%i c=%b")
;


выводит ожидаемое:
a="str" b=123 c=true


Мне эти функторы пригодятся для обработки значений с типом sql_t = [ `Null | `String of string | `Binary of string | ... ].

Конкретику ищите в репке "amall", если представляете, что это.
Monday, May 30th, 2011
10:31 pm
Уйдите прочь из моей френдленты, ментально-ёбаные ленточные ментальные пидарасы обоих полов, пишущие о ёбаных физиологических и одновременно ментальных пидарасах обоих полов.
(ps: если Вы -- физиологически выебанный ментальный пидарас, то это ещё печальнее. Если Вы -- физиологический пидарас мужского пола, это вдвойне печальнее. Так-то!)
(pps: гомоморфизмы не относятся к пидерсиям.)
Monday, April 18th, 2011
5:35 pm
опрос: протокол + байты + json
Предупреждение: вопрос глупый. Слабонервным не читать.

Мы с коллегой проектируем протокол общения двух программ. Общение состоит в том, что одна программа пишет в stdin/пайп/сокет для другой программы сообщение, являющееся валидным json (в строгом смысле слова -- либо массив, либо объект, то есть, self-delimited), другая программа читает, обрабатывает и отсылает ответ обратно, тоже json.
Collapse )
Какой бы формат выбрали вы?

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

Текущие-бегущие итоги:
Collapse )
11:22 am
MapM
Abstract:
В данной статье я расскажу вам про отображающие функции вида map, включающие в себя сайд-эффекты. Тем, кому известен хаскель, эти функции известны как mapM и подобные.
Далее, будет показано, что хаскель, будучи самым распространённым языком из тех, где используются монады (ну, кроме C#/linq и Scala), является непрактичным из-за отсутствия сайд-эффектов. Раньше мне без сайд-эффектов было всего лишь просто неудобно использовать хаскель (требовалось городить лишний код), теперь же я понимаю, что есть некоторые вещи, где с чистотой не получится клёво использовать монады в одном из их применений.
Также будет показано, что тайпклассы -- это не гибко, потому что у одного тайпкласса и у одной функции (например, "функция sequence в монаде IO") может быть только одна реализация, и будет показано, где именно это не гибко.

Collapse )

Кроме того, видел сегодня клёвую статью Modules Matter Most. Она тут упомянута потому, что в ней тоже необоснованно гонят на хаскель, но сама статья хорошая и правильная.
Saturday, March 19th, 2011
6:11 pm
параллельный велосипед
Начал таки делать "параллельный велосипед" -- хотя бы тупой message passing поверх lwt решил сделать, чтобы поверх него оформить нужную мне модель (штук 5 описывал как-то давно, а вот с нужной до сих пор не определился; а может и не надо особо?..). Смотрел на эрланг, а zerthurd хорошо помогал в камлочатике, остальное дочитывал в мануле и на http://erlanger.ru/. Концептуальных внезапных открытий не было, но best practices мне таки было нужно знать. Для окамла, более-менее надёжной штуки поверх монадных тредов и message passing я прикидывал много различных вариантов, но, оказалось, заново выдумал Actors. А от эрланга взял идею о том, что в случае, когда ждёшь синхронный ответ, в труЪ message passing нужно 1. передать информацию о том, куда ждать ответ, 2. как-то специально указать, что вызов таки синхронный, а не просто посылка сообщения.
И пока лично мне нужен случай "message passing в пределах одного процесса ОС", то есть, сериализацию и подобное я оставил на будущее.
Если что, репка -- https://bitbucket.org/gds/parvel.
Tuesday, March 15th, 2011
11:11 pm
я уже на двух работах использую окамл для практических целей. Правда вот, на одной из них окамл считается "практическим минимумом" -- работодатель в идеале хочет agda2. Но пока нет задач под "высокие материи" (а те, что возможно и есть, туда запихивать мало смысла), и пока обходимся так, тупым говнокодом. Я -- неолуддит, откровенно мешающий прогрессу, и уже почти выучил Таблицу Квадратных Уравнений.
Thursday, December 30th, 2010
12:35 pm
банки
Если вам нечем заняться на длинных зимних каникулах, и вам скучно, попробуйте отправить банковский перевод с российского счёта в приднестровье (нерезиденту роисси). Незабываемые ощущения, скандалы, интриги, расследования -- гарантированы (в отличие от результата).
Tuesday, December 21st, 2010
11:29 am
postgresql
Постгрес удивляет, особенно по сравнению с ораклом.
1. Если есть таблица и функция, её использующая, то таблицу можно удалить, только заранее/одновременно удаляя функцию. В оракле удалить таблицу можно независимо от функций -- они просто пометятся как инвалидные, и перекомпиляция (при пересоздании таблицы) всё исправит.
2. Нет named arguments, которые позволили бы функцию вида myfunc(a varchar, b integer, c boolean) запускать как myfunc('asd', c => true, b => 123), и из-за попытки обойти это ограничение -- имеем п.3.
3. Не получилось prepare'ить оператор, содержащий честный pl/pgsql-блок вида:
declare
  r test_sp%rowtype;
begin
  r.the_num := 123;
  r.the_str := 'asd';
  test_sp(r);
end;

4. Удивительна логика исполнителя команд внутри pl/pgsql. Если функция имеет параметр с именем name (допустим, первый), и в функции есть оператор insert into table(id, name) values (123, 'asd'), то токен name заменится на $1 (и к нему будет привязано актуальное значение параметра при вызове функции). Налицо работа халявщиков, не понимающих, где токен является действительно токеном (именем столбца, например), а где является отсылкой к переменной.
5. Нет пакетов (то есть, нет инкапсуляции кода хранимых процедур). Вместо этого предлагают создавать схему, а вместо переменных пакета предлагают использовать временные таблицы. Элегантность на высшем уровне.
Замечу ещё раз: в оракле ничего из этой кривизны нет.
Saturday, December 4th, 2010
12:30 pm
Friday, December 3rd, 2010
12:13 pm
Маленький апдейт к предыдущему посту про ocaml-lazy-labelled.

Научил свою говнобиблиотеку затягивать узлы:

Lazy.rec_data : Label.t -> (Lazy.t 'a -> 'a) -> 'a;

Даже работает. Ограничения -- естественные: из того, что в функцию дают ленивое значение с типом Lazy.t 'a, не следует, что его можно форсировать сразу, до непосредственного создания структуры. С другой стороны, если форсируете, то ожидайте появления указанной метки (с типом Label.t) в цикле, который вам кинется исключением Lazy.Cycle.

Этого (rec_data) мне тоже не хватало при работе с рекурсивными структурами данных.

Ну и поправил там тупой баг, который не вылез сразу, но вылез бы после первого серьёзного использования.
Thursday, December 2nd, 2010
11:48 am
ocaml-lazy-labelled
Ну, вы меня знаете. Не люблю я ленивые рекурсивные вычисления. Хотя бы потому, что они прекрасно умеют зацикливаться, и по словленному исключению CamlinternalLazy.Undefined не определить, между какими данными возник цикл.
Однако один из текущих алгоритмов (в earley parser, вычисление "нуллябельных" нетерминалов), по прикидкам, будет на 100..200 строк кода меньше, если его изобразить в виде ленивых рекурсивных вычислений.
Надо что-то делать. И вчера я таки сообразил, что именно.
Как определить, какие значения формируют цикл вычислений, если они все сами по себе ленивые? Нужно их пометить не-ленивыми значениями, вот и всё. А отлов минимального цикла -- дело техники.
Что меняем в готовом алгоритме для того, чтобы ловить циклы:
  1. при помощи функтора создаём новый модуль Lazy (аргумент функтора содержит тип метки, так как исключения у нас не полиморфные),
  2. при создании вместо lazy (expr) указываем { Lazy.l = your_label; v = lazy (expr) },
  3. вместо ловли CamlinternalLazy.Undefined ловим Lazy.Cycle labels_list со списком меток, образующих цикл.

Репозиторий: http://bitbucket.org/gds/ocaml-lazy-labelled/src
Примеры: http://bitbucket.org/gds/ocaml-lazy-labelled/src/tip/tests.ml
Пока нерешённая проблема с форсированием ленивых значений из разных модулей (для разных типов меток; там получаются перекрёстные L1.force и L2.force, и цикл будет отловлен только по одному из типов меток, и вообще, не факт, что корректно. Поэтому пока так не делайте.)
Да, и модуль не thread-safe, как и стандартный модуль Lazy.
Tuesday, November 30th, 2010
12:30 pm
ocaml iteratees
Зарелизил таки ocaml iteratees. Решил, что времени нормально потестить его у меня не будет в ближайшее время, поэтому пусть тестят пользователи. "Release crap!"
Тут: http://ocaml-iteratees.forge.ocamlcore.org/
Анонс в рассылке получился смешной (ygrek помог замечательно).
[ << Previous 20 -- Next 20 >> ]
About LiveJournal.com