воскресенье, 11 октября 2015 г.

О хорошем

Что такое "хороший программист". Мои 50центов.

Наверняка у вас в голове есть тоже какое-то определение. Есть еще всякие слова типа Lead/ведущий, в английском еще странная позиция уровня "Staff engineer", что в иерархии может быть довольно крутым (даже после lead).

Сейчас у нас импортный коллега в импортном офисе в linkedin выставил что он "директор по инфраструктуре и облачным решениям". По факту он единственный сис. админ. Директор - оно конечно звучит, но факт не отменяет.

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

Сейчас в нашей команде 3 человека. Можно выбрать любой титул для linkedin, все равно санитары его не читают. Если что, я им лучше про аппликативные функторы рассказывать буду, чем вице-президентом представляться.

Сейчас (на ближайщий год) мое определение "хорошего программиста" - использование подходящего уровня абстракции и способность переходить/опускаться/подниматься на нужный уровень.

Да, это довольно абстрактно.

Но это лучше чем "я руководил коллективом и 15 программистов", "в начале 2000-х я писал на COM+/драйвера для принтера". Очевидно, что есть куча специализаций, и сравнить вообще что-то просто бессмысленно. Опыт/знание/умение не численный показатель.

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

Есть куча нормальных задач, где надо опускаться сверху вниз. При условии, что вы это сами можете. Двигаться вверх обычно сложнее, и в задачах редко можно шагнуть на 1-2 шага вверх без сложностей.

Двигаться вниз на 2-3 шага довольно занимательно. Но дальше вы снова упретесь в абстракции. Либо там уже аксиоматика, либо абстракции, близкие к аксиомам. Можно опускаться в квантовую механику (заметьте, что "опускаться"). Понятие числа вообще сложно, тем более вещественного. А основания логики и философские основания математики вроде выглядят как "копание вниз", все равно упиратесь. Так что копание вниз и абстрагирование вверх одинаково сложно.

Разные уровни абстракции приводят к разным языкам. И не только в программировании. Порефлексируйте на эту тему самостоятельно.

Вообще, все вышенаписанное применимо в абстрактной форме к тем вещам, где есть абстракции. К землекопам, роющим троншеи для ГВС оно слабо применимо. Можно конечно, перейти из 2d в 3d, но дальше не получится. 

пятница, 2 октября 2015 г.

почти как в одной стране

Кстати, а откуда в числе \pi все есть?

Ну, иррациональное и трасцендентное. В \log{2}{10} как бы тоже, и как континуум других чисел, но в логарифме как-то иначе. А про \pi все говорят/бьют себя в грудь, будь то сами видели. Тут можно вспомнить  бородатый анекдот про Чака Норисса. Что тот в качестве пароля использует последние 8 знаков числа \pi.

Еще меня только на прошлой неделе осенило, что в числе \pi есть число \pi. Причем дважды (очевидно что больше ) ). "Легко видеть, что " если взять первые $n$ знаков числа \pi, то они с какой-то позиции содержатся. Предельный переход по $n$ (не совсем уверен, законно ли это).

Причем та копия, тоже содержит число \pi. Тут уровень рефлексии зашкаливает.

Это все рассуждения, при условии что в \pi содержится любая конечная последовательность.

А та наркомания от Рамануджана, где \sqrt (\pi * \ e / 2) = цепная дробь + гипергеометрический ряд. Оно вообще доказано, либо у Рамы много чего из сонника есть. Следуют ли отсюда какие-то свойства \e ?

Так же недавно еще наркомания в голову пришла. Возможно, многие уже в курсе, что 1+2+3+4+... = -1/12? Если нет, так вот знайте. Даже я знаю про 3 доказательства на уровне школы. Товарищи с МехМата сказали, что это вообще очевидно следует из Гамма-функции, но я не такая.

Так вот, говорят что физики это натянули на теории струн, и наша вселенная вообще 26 мерная, причем из этих -1/12 они взяли 12, помножили на 2 и еще добавили 2. Странные какие-то. Пусть, я своими глазами вообще только проективную геометрию вижу, да и об горячий чайник рукой обжигаюсь.

Если же паралелльные вселенные существуют, то в них тоже 1+2+3+...=-1/12, тогда если еще и поверить физикам и неведомым струнам, то пространство тоже 26-мерное. Мирок изоморфный нашему получится. Такой же, с инфляцией и ценами на гречку. А это несколько печалит. Хотелось бы что-то иное. Это, если конечно, физики нас со струнами не обманывают. А я только название знаю, и слишком доверчивая.


суббота, 22 августа 2015 г.

flashmob

1. Взять ближайшую книгу.
2. Открыть на странице 69.
3. Найти первое предложение — оно и описывает вашу сексуальную жизнь.
4. Поместить в дневнике вместе с этими инструкциями.
5. Не выбирать книгу, взять ту, которая ближе других в данный момент!

"Дополняя исследования параграфов 15 и 49, приведем еще все типы групп восьмого порядка."

ЗЫ. Больше полугода на столе лежит что попало. Бумажные медленно идут (

среда, 19 августа 2015 г.

scala-cpd, yet another scala copy paste detector

You could treat this post as ad. Because, literally it is.

I have realise that our code contains a little bit copy-pasted blocks. Code in Scala, obviously. So, I was looking for perfect working tools for it (at least, to find those blocks). I found only  two non-working  implementations. One is based on PMD (some classic tool for this topic), I cannot execute other variant because of elder sbt version. 

So... I write my own. It's sbt-plugin. 


The code is pretty simple. Scala 2.10 contains macros/run time aka ToolBox. That means, we have AST for free. After that we traverse tree and put all matched subtrees into dictionary (as strings). All matched substrees are blocks/functions_apply/vals/defs and so on. Yeah, and we don't care about comments, because ToolBox-parser perform only AST for code, not for comments.

If two subtrees are equal (syntactically, by _.toString) and  big enough, it's a problem. Houston. 

Fairly, first version is simple. Next version, I hope, would find val-renaming. It should be simple task while we work with AST, not with code-as-string. 

At least, we use it in out CI-process. For each commits, TeamCity execute task with this plugin, and check that count of copy-pasted-blocks is less or equal than for previous commit. 

It would be a big pleasure, if you also will use it.

PS. 3 years ago we use Simian. It's good enough, but it's not a AST, just strings. 

суббота, 4 июля 2015 г.

Само совершенство (нечетное)

http://mathworld.wolfram.com/OddPerfectNumber.html

Таки наконец-то случайно наткнулся (хотя вообще странно, что мне лень было погуглить што-ле?)

В отечественной научПоповской литературе про ТЧ (как ни странно) есть два мнения, что нечетных совершенных чисел нет и не будет, либо просто отсылка к тому что "типа, никто не знает".

А тут аж библиография на 35 источников.

И еще вот тут http://www.oddperfect.org/ люди таки как-то их ищут. И это несколько забавляет, хотя внутри математики, очевидно, неограниченно. Забавляет скорее факт, что их результат будет вроде "Соверешенное нечетное, если и существует, обязано быть более 10^645" (степень случайна, и брякнута на клавиатуре).

Мерсенн-щиков (тех, кто GIMP гоняет) я тоже не понимаю. Себя я тоже не понимаю, мини-идеи и эксперименты (в виду лени) как-то у меня не шибко идут.

ЗЫ.
Жаль я довольно туп. Хотя бы потому, что не нашел этого ранее.

О дивный, новый мир. Хотя не... спать сегодня спокойно буду.

понедельник, 27 апреля 2015 г.

Принцип двойной записи и псевдовыборы

Тут некое видео, которое показывает тонкие места нашей(все давно понимают, что не нашей) избирательной системы:
https://navalny.com/p/4219/

И так, основной глюк всей этой системы - это "вброс". Проблема, как мне кажется, имеет очевидное решение.

Почти постановка задачи.

На избирательном участке в день выборов проходит не более 2000 человек (мультиплицирующий коэффициент не так важен). Важен факт, что всех этих людей обрабатывают (проверяют в списках/паспорт) вручную.

Если в результате бюллетеней оказывается меньше, чем официально выдано - это формально не проблема. Текущими законами (очевидно, это все с моей точки зрения, так как "закон о выборах" я не читал) не запрещается взять, но не проголосовать.

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

Задача сводится к проверке аутентичности/подлинности бумажки. Очевидно, что если бумажка только содержит галочку и ее можно отпечатать в некоторой типографии, то ничего не получится.

Первое тривиальное решение, которое приходит в голову - это заверять каждую бумажку у Главного(-ых) в избирательной комиссии. Подписи 3-4 человек в углу документа/специальном поле, позволяют отделить выданные от "вброшенных". Круговая порука, 3-4 человека, представляющие разные стороны. По крайне конкретно эту проблему должен решить. Минусы тоже очевидны - замедление процесса, и необходимость в изменении законов/процесса. Лично я - за честность.

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

Варианты с фильтром Блюма, (полу-)центральной выдачей GUID-ов и т. д. возможны, но пока довольно сложны.

ЗЫ. Подделывать подписи 3-4 людей тоже возможно, но таки сложнее. 

воскресенье, 19 апреля 2015 г.

Абстрактнее

https://gist.github.com/noelwelsh/02b9ecf6d21c7b8934e8

Хотя в текущем проекте потенциально null-ы могут придти только из внешних систем (), но писать обработку на всякий случай приходится. Сейчас это только Cassandra и какая-то хреновина для гео-локации по ip (maxmind). Наследие. "В java только дедушки" (с).

null вообще запрещен синтаксически к употреблению в scalaStyle. Приходится в нескольких местах закрывать/открывать проверку стиля.

Вот те две проверки на равенство null теперь можно довольно красиво заменить на (см. ссылку на месте первого абзаца):

> result.?.getOrElse("")

Перфекционизма с возрастом все больше и больше. Это отход от студенчества.

Прошелся по коду. Оказалось, что Option[_] тоже можно глуповато использовать. Очевидно, это лучше чем null. Но и пересолить/переборщить тоже можно. К тому же, если потом в каждом месте match-ить или if-ить. Try[_] там оказался уместнее. Хотя дать волю, то его тоже начнуть match-ить или if-ить, хотя кроме необходимого map/flatMap больше ничего и не надо.

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


понедельник, 30 марта 2015 г.

КопиПаста

Пока не нашел для scala работающей тулзы для поиска копипасты в коде. (Коллега немного грешен, в аду не я по этому поводу гореть буду). Есть 1-2 неработающих, но они на 2.9 и как-то уже несколько лет не активны.

Как всегда, (даже если вас съели) есть два выхода.

Тупой, и в то же время, обычно работающий вариант, смотреть на это все как на строки. И искать плагиат. Баян. Через "а".

А крутой способ - это иметь AST, и искать похожие поддеревья. В чем крутизна, что строить/парсить/лексить scala не надо, начиная с 2.11 тут нормальные механизмы. Пока руки коротки, но скоро все подключу.

Очевидно, что в каждом компиляторе все проходят через шаги c AST. То есть основная задача - это внедриться в процесс и в нужный момент искать копипасту. В реальности проблемы, что обычно это написано как монолитный кусок (тут можно бы добавить, но я тактично промолчу) кода. В C# почти сделали Roslynd, но я уже два года вне темы и C#. В gcc внедряются как-то, но я вообще вне темы. Уровень вхождения там сильно выше.

А в scala видится несложным. Макросы должны быть гораздо проще, но лично мне макросы пока тоже далековаты, хотя в пару мест и можно было бы запихнуть. Тут что-то рефлексией попахивает. В общем, надо копать.

вторник, 17 марта 2015 г.

Режим радиомолчания

Пора уже выходить из радиомолчания. В принципе, писать есть о чем, но в то же время и не хочется. Как в классике: "Начало лекции про ленивые вычисления. -Лекция окончена. У вас есть вопросы?"

Так что ссылка на котиков не будет, вместо этого канал на Wednesday Addams.

http://www.youtube.com/channel/UCyX7977vwwko1lurVlEJszQ

И ленивые вычисления совершенно не причем.