Valery V. Vorotyntsev ([info]vorotylo) wrote,
@ 2008-01-24 15:57:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:c++, haskell, job, life

enlarge your Haskell

Меня очень напрягает дурная работа и дурной язык программирования C++. За это платят, но беспросвет угнетающий.

Я очень хочу найти работу Haskell программиста. Только мне вначале нужно подтянуться, побольше на нем покодить... Трудно время находить - рутина высасывает энергию, - но нужно, иначе ж как.

* Ask Reddit: How do I get a job hacking Haskell all day?



(Post a new comment)


[info]yorool_gui
2008-01-24 02:08 pm UTC (link)
"Найти работу" - вариант практически нереальный. Более правильная цель - "создать работу". Я рассчитываю добиться результата с HAppS: запустить на нем несколько проектов и посмотреть, что получается.

(Reply to this)


[info]lionet
2008-01-24 02:39 pm UTC (link)
я пытался принять на работу тех кто знает Erlang или Haskell. ни одного пока не нашёл, видимо их здесь нет таких.

(Reply to this)(Thread)


[info]alexott
2008-01-24 02:48 pm UTC (link)
вы к сожалению далеко - я бы пошел, правда я хаскель не особо хорошо знаю

(Reply to this)(Parent)


[info]vorotylo
2008-01-24 03:10 pm UTC (link)
Странно. Palo Alto, California, Stanford University... Или у меня искаженные представления, или они должны у вас там косяками ходить. :)
Как бы то ни было, интересных job offers в Штатах есть.

> All of the above can be substituted by a good command of Haskell or Erlang.
:) Приятно читать.

> ((function(){})()) idiom
Что за идиома такая? Просвети.

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-24 03:17 pm UTC (link)
Странно. Palo Alto, California, Stanford University... Или у меня искаженные представления, или они должны у вас там косяками ходить. :)

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

Что за идиома такая? Просвети.

Создать пустую функцию (closure), и тут же её исполнить. Обычно именно пустая не применяется, применяется нечто вроде (function(i){return i + 1})(i).

(Reply to this)(Parent)(Thread)


[info]vorotylo
2008-01-24 03:35 pm UTC (link)
lambda какая-то...
i+1 не подходит? :)

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-24 04:22 pm UTC (link)
нет, i+1 не катит ;)

например, почему такой код не работает?

var chs = document.....childNodes;
for(var i = 0; i <= chs.length; i++) {
    var child = chs[i];
    child.onclick = function() {
           child.style.visibility = false;
    }
}


? ;) один из вариантов решения проблемы - завернуть тело for в closure.

(Reply to this)(Parent)(Thread)


[info]migmit.vox.com
2008-01-24 05:49 pm UTC (link)
Ы-ы-ы. Один из нелюбимейших мною косяков в замечательном языке JavaScript. То есть, оно, конечно, не косяк, оно в общую идеологию вписывается замечательно (включая и то, что var child видно извне цикла, причём даже раньше). Но всё равно, ИМХО, контринтуитивно.

(Reply to this)(Parent)


[info]vorotylo
2008-01-24 08:55 pm UTC (link)

Потому что function понятия не имеет о child?

Т.е., надо писать

child.onclick = (function(x) { x.style.visibility = false; })(child);
?

Disclaimer: я ни Java, ни JavaScript не владею... Так что ты меня поправляй. :)

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-24 10:50 pm UTC (link)
да не, child виден внутри function ;) не в этом проблема. child везде виден одинаковый: последний, которым child стал после выхода из цикла.

(Reply to this)(Parent)(Thread)


[info]migmit.vox.com
2008-01-25 07:47 am UTC (link)
Если выход из цикла произошёл раньше события onclick...

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-25 05:08 pm UTC (link)
да. только когда бы это было не так? ;)

(Reply to this)(Parent)(Thread)


[info]migmit.vox.com
2008-01-25 05:25 pm UTC (link)
"Война и мир" на одной странице онлайн-библиотеки и все элементы <p>?

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-25 05:53 pm UTC (link)
не будет все равно. эвенты "ждут" пока цикл закончится.

(Reply to this)(Parent)(Thread)


[info]migmit.vox.com
2008-01-25 06:37 pm UTC (link)
М-м-м... По стандарту? В любом случае, это - именно тот момент, когда я ждал бы подлянки.
Кстати, а если эвент уже идёт, когда исполняется цикл? Скажем, цикл - в обработчике того же эвента для body (в фазе спуска)?

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-25 08:29 pm UTC (link)
так вот, подлянка здесь - не в том когда эвент произошёл, потому что результат будет один и тот же — когда эвент _произойдёт_, у каждого (разного) child в onmouseclick будет child одинаковый.

это потому что onmouseclick "захватывает" (capture) контекст, где child - это символ, а не значение символа. так как child на момент _исполнения_ клоза (анонимной функции) показывает на последний элемент в массиве (последний раз child указывал на него ведь!), то в onmouseclick child будет везде одинаковый, несмотря на то на каком child этот onmouseclick висит (навешен).

(Reply to this)(Parent)(Thread)


[info]migmit.vox.com
2008-01-25 08:40 pm UTC (link)
Да нет, это-то я понимаю (отписал же выше, что это мой нелюбимейший косяк в жабаскрипте). Я о том, что подобное строго однопоточное поведение - ИМХО не то, на что можно закладываться при разработке.

(Reply to this)(Parent)(Thread)


[info]lionet
2008-01-25 08:54 pm UTC (link)
я думаю что на него закладываться можно и нужно. если поведение будет многопоточным (в качестве ошибки или специально), в этот момент мы получим универсальный вой миллионов программистов на JS, которые перестанут мозгами воспринимать поведение системы.

многопоточное программирование в системах с разделяемой памятью очень и очень опасный зверь,и программисты редко полностью могут сделать систему в которой все потенциальные косяки были бы учтены и обойдены. например, такой момент: где происходит возможное переключение контекста? варианты:
  • на границах функций JS
  • на границах выражений JS
  • на границах операторов JS
  • на границах X интерпретатора JS
    ?
    что будет если одна функция "бежит" по массиву, изменяя его элементы, а другая решит вклиниться (через settimeout или через случайное проскакивание пользовательского эвента и вызов соответствующего обработчика) и начать использовать этот массив?

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

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

    (Reply to this)(Parent)(Thread)


  • [info]migmit.vox.com
    2008-01-25 09:11 pm UTC (link)
    что будет если одна функция "бежит" по массиву, изменяя его элементы, а другая решит вклиниться
    Вот поэтому я и прототипирую жабаскрипт на хаскеле. И пишу потом - с минимумом изменяемых переменных.

    (Reply to this)(Parent)


    [info]migmit.vox.com
    2008-01-25 06:39 pm UTC (link)
    Дополнение: не в обработчике эвента, а в setTimeout внутри этого обработчика.

    (Reply to this)(Parent)(Thread)


    [info]lionet
    2008-01-25 08:26 pm UTC (link)
    эвент полностью обрабатывается не прерываясь на какой-то левый код.
    код полностью завершается не прерываясь на левый эвент.
    то есть, свитчинг между активностями происходить только если активность завершилась. settimeout вызовет обработчик только тогда (по истечению таймаута), когда весь другой js код уже завершится, включая обработчики.

    (Reply to this)(Parent)


    [info]xrgtn
    2008-01-28 09:52 am UTC (link)
    regarding closures cf.

    xrgtn@xrgtn-w4000:~$ perl -wse '
    sub sighgen($) {my ($x) = @_; return sub {print "caught SIG$x\n"}};
    $SIG{$_} = sighgen($_) foreach qw(HUP INT QUIT ABRT PIPE ALRM TERM USR1 USR2);
    sleep(1) while 1'&
    [1] 14865
    xrgtn@xrgtn-w4000:~$ kill -USR1 $!
    xrgtn@xrgtn-w4000:~$ caught SIGUSR1
    xrgtn@xrgtn-w4000:~$ kill -ABRT $!
    xrgtn@xrgtn-w4000:~$ caught SIGABRT

    (Reply to this)(Parent)(Thread)

    closures vs. global/local/my
    [info]xrgtn
    2008-01-28 10:01 am UTC (link)
    more on the subject (after starting each script ctrl-C was pressed):

    xrgtn@xrgtn-w4000:~$ perl -wse '
    local $x = "SHIT";
    sub sighgen($) {($x) = @_; return sub {die "caught SIG$x\n"}};
    $SIG{$_} = sighgen($_) foreach qw(HUP INT QUIT ABRT PIPE ALRM TERM USR1 USR2);
    sleep(1) while 1'
    caught SIGUSR2

    xrgtn@xrgtn-w4000:~$ perl -wse '
    local $x = "SHIT";
    sub sighgen($) {local ($x) = @_; return sub {die "caught SIG$x\n"}};
    $SIG{$_} = sighgen($_) foreach qw(HUP INT QUIT ABRT PIPE ALRM TERM USR1 USR2);
    sleep(1) while 1'
    caught SIGSHIT

    xrgtn@xrgtn-w4000:~$ perl -wse '
    local $x = "SHIT";
    sub sighgen($) {my ($x) = @_; return sub {die "caught SIG$x\n"}};
    $SIG{$_} = sighgen($_) foreach qw(HUP INT QUIT ABRT PIPE ALRM TERM USR1 USR2);
    sleep(1) while 1'
    Name "main::x" used only once: possible typo at -e line 2.
    caught SIGINT

    P.S. everyone's free to draw his/her own conclusion

    (Reply to this)(Parent)(Thread)

    Re: closures vs. global/local/my
    [info]lionet
    2008-01-28 05:39 pm UTC (link)
    пипец, что можо сказать. надо my везде использовать, тем более что он дешевле, чем local.

    а ещё я обнаружил (в исходниках Perl) что он не async-signal-safe.

    http://groups.google.com/group/fido7.ru.unix.prog/msg/a1eee400fda9fcb9

    (Reply to this)(Parent)(Thread)

    Re: closures vs. global/local/my
    [info]vorotylo
    2008-01-28 07:08 pm UTC (link)
    Задам очередной глупый вопрос:
    почему my дешевле local?

    (Reply to this)(Parent)(Thread)

    Re: closures vs. global/local/my
    [info]lionet
    2008-01-28 07:19 pm UTC (link)
           "local($x)" saves away the old value of the global variable $x and
           assigns a new value for the duration of the subroutine which is visible
           in other functions called from that subroutine.  This is done at
           run-time, so is called dynamic scoping.  local() always affects global
           variables, also called package variables or dynamic variables.
    
           "my($x)" creates a new variable that is only visible in the current
           subroutine.  This is done at compile-time, so it is called lexical or
           static scoping.  my() always affects private variables, also called
           lexical variables or (improperly) static(ly scoped) variables.


    То есть, разница между "run-time" и "compile time", плюс общая сложность того, что делает local.

    Это из man perlfaq7, есть ещё man perlsub, в котором ещё есть на
    ту тему.

    (Reply to this)(Parent)

    Re: closures vs. global/local/my
    [info]xrgtn
    2008-01-29 01:27 pm UTC (link)
    я думал, лишнее копирование при создании (сохранение старого значения) и ещё одно - при восстановлении...

    (Reply to this)(Parent)

    Re: closures vs. global/local/my
    [info]vorotylo
    2008-01-28 06:45 pm UTC (link)
    Не понял первый сценарий: каким таким хитрым фигом объявился $x, что он для всех сигналов равен последнему элементу списка..?

    (Reply to this)(Parent)(Thread)

    Re: closures vs. global/local/my
    [info]lionet
    2008-01-28 07:33 pm UTC (link)
    во втором примере функция sighgen "восстанавливает" значение $x каким оно было о вызова этой функции. Видимо, closure захыватывает символ $x, а не значение чение$x, как можно было предполагать в случае "abc$x", а раз так, то после шения sighgen $x в пораждённых лямбдах указывает известно куда.

    то же самое про первый пример, только там просто $x изменяется, и всё. тоже сходит захват символа, а не значения символа.

    (Reply to this)(Parent)

    Re: closures vs. global/local/my
    [info]xrgtn
    2008-01-29 02:04 pm UTC (link)
    В первом сценарии $x - глобальная переменная, local $x = "SHIT" в самом внешнем блоке является misleading, нужно было писать просто $x = "SHIT".

    Далее, в sighgen используется эта самая глобальная переменная $x, и в цикле sighgen изменяет значение $x последовательно на "HUP", "INT",... "USR2". После отработки цикла в $x содержится "USR2", о чём обработчик сигнала честно сообщает.

    Во втором варианте $x локализуется внутри sighgen (сохраняется при входе - восстанавливается при выходе), потому значение $x меняется вот так: "SHIT", "HUP", "SHIT", "INT", "SHIT",... "USR2", "SHIT".

    (Reply to this)(Parent)

    Re: closures vs. global/local/my
    [info]vorotylo
    2008-01-28 07:57 pm UTC (link)
    А приведи, пожалуйста, свою знаменитую ссылку на FAQ по сигналам.

    (Reply to this)(Parent)(Thread)

    Re: closures vs. global/local/my
    [info]xrgtn
    2008-01-29 01:25 pm UTC (link)
    Signals FAQ от Нечаева:
    http://groups.google.com/group/fido7.ru.unix.prog/browse_thread/thread/c4c6a863a6716ed7

    К современному перлу это неприменимо, т.к. там используется deferred signal delivery, т.е. сигналы обрабатыват интерпретатор, устанавливая флаги и проверяя после EINTR каждой операции I/O (см. FAQ), после чего, завершив текущую операцию, интерпретатор дёргает пользовательский код.

    (Reply to this)(Parent)


    [info]jtootf
    2008-01-24 03:08 pm UTC (link)
    Думаю, сейчас только стартап. Зато и возможность проверить реальную мощность языка для выбивания места на рынке (и под солнцем). Beating the averages ?..

    (Reply to this)(Thread)


    [info]lionet
    2008-01-24 04:24 pm UTC (link)
    я в Cisco писал на Haskell... вопрос не в том где писать, а в том кто и что пишет.

    (Reply to this)(Parent)


    Create an Account
    Forgot your login?
    Login w/ OpenID
    English • Español • Deutsch • Русский…